Перейти к содержанию

Рекомендуемые сообщения

Написал трейнер для AS1, на бессмертие. Всё примитивно: нашел значение, посмотрел что пишет, убил инструкцию, нашёл сижки, сделал трейнер на убийство инструкции.

Трейнер примитивнейший. МОжет быть я что-то намудрил? Пишу на с++, .dll формат.

 

Upd: Нашёл баг, у меня оказывается поиск сижек уходил в никуда. Удалил всю чепуху по поводу автоматического базового адреса, сделал свой кастомный. Ну и длинну скана увеличил.

Образовался новый баг... Теперь при перехвате клавиши он делате сразу два условия. Т.е. и вкл и выкл, но останавливается на выкл.

Скорее всего в логике кода баг. Как доработать систему "переключателя"? Чтобы при нажатии клавиши менялась "полярность" булевой переменной и выбиралась одна из функций: либо вкл, либо выкл.

#include <windows.h>#include <TlHelp32.h>#include <fcntl.h>#include <stdio.h>#include <io.h>#include "Memory.h"using namespace std;DWORD WINAPI AS_thread(LPVOID);DWORD APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved){	if (ul_reason == DLL_PROCESS_ATTACH)	{		CreateThread(NULL, NULL, AS_thread, NULL, NULL, NULL);	}	return true;}void CreateConsole(){	int hConHandle = 0;	HANDLE lStdHandle = 0;	FILE *fp = 0;	AllocConsole();	SetConsoleTitle("Assassin's Creed Cheat");	lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);	hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT);	fp = _fdopen(hConHandle, "w");	*stdout = *fp;	setvbuf(stdout, NULL, _IONBF, 0);}DWORD WINAPI AS_thread(LPVOID){	DWORD pID = FindProcessByName("AssassinsCreed_Dx10.exe");	DWORD oldProtect = 0;	bool switcher = false; //тут мы создаём наш переключатель	DWORD addr = FindPattern(0x401000, 0x1288000, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx"); //сижка на поиск адреса	CreateConsole();// создаём консольку	printf("I am Starting!"); //и пишем, что всё нормально	for (;; Sleep(75))	{			if (GetAsyncKeyState(VK_F1) == true) //клавиша		{			switcher != switcher; //меняем полярность переменной, т.е. если true - то false, если false - то true			Beep(300, 500);			if (switcher == false) //выключенное состояние функции, т.е. оригинальные байты			{				Beep(300, 500);				printf("Health: OFF");				VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);				memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5);				VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);			}			else if (switcher == true) //включенное состояние, затираем нупами.			{				Beep(100, 500);				printf("Health: ON \n Get Fun!!!");				VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);				memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5);				VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);			}		}	}} 
Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

Исправил баг! Теперь вместо смены полярности в каждой ветке условия будет меняться полярность по своему, таким образом работа с функцией более приятна.

Но появился ещё один баг... Незнаю с какой это стороны... Теперь когда меня бьют - игра вылетает. Т.е. что-то не так с функцией замены байтов...

Ссылка на комментарий
Поделиться на другие сайты

базу модуля нормально получи:

 

#include "psapi.h"

 

MODULEINFO ModuleInfo;

GetModuleInformation(GetCurrentProcess(),GetModuleHandle(0),&ModuleInfo,sizeof(ModuleInfo));

DWORD addr = FindPattern(ModuleInfo.lpBaseOfDll, ModuleInfo.SizeOfImage, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx");

 

или 0x1288000 это не размер? lol

+ выброси FindProcessByName. юзай GetCurrentProcess

Изменено пользователем gmz
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

базу модуля нормально получи:

 

#include "psapi.h"

 

MODULEINFO ModuleInfo;

GetModuleInformation(GetCurrentProcess(),GetModuleHandle(0),&ModuleInfo,sizeof(ModuleInfo));

DWORD addr = FindPattern(ModuleInfo.lpBaseOfDll, ModuleInfo.SizeOfImage, (PBYTE)"\x89\x46\x14\x7D\x33", "xxxxx");

 

или 0x1288000 это не размер? lol

+ выброси FindProcessByName. юзай GetCurrentProcess

Спасибо, очень информативно! (P.s. в следующий раз заключай код в специальный тег)

P.s.s. куда в твой код втыкать свой? Т.е. условие, если клавиша нажата - то нужно выполнить запись байтов. Куда её вставлять?

P.s.s.s. компилятор ругается на твой код, "Использована неинициализированная переменная KeySwitch01 && KeyStatus01"

char KeySwitch01;char KeyStatus01;char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){KeyStatus01 = 1;} else {KeyStatus01 = 0;}}}
Изменено пользователем RockHammer
Ссылка на комментарий
Поделиться на другие сайты

выше DllMain:

char KeySwitch01;char KeyStatus01;

после "Sleep(75))"  весь кусок замени:

char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){                Beep(100, 500);                printf("Health: ON \n Get Fun!!!");                VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);                memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5);                VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 1;} else {                Beep(300, 500);                printf("Health: OFF");                VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);                memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5);                VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 0;}}}
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

 

выше DllMain:

char KeySwitch01;char KeyStatus01;

после "Sleep(75))"  весь кусок замени:

char Key;Key = (GetAsyncKeyState(VK_F1) >> 8);if (KeySwitch01 != Key){KeySwitch01 = (Key);if (Key){if (!KeyStatus01){                Beep(100, 500);                printf("Health: ON \n Get Fun!!!");                VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);                memcpy((void*)addr, (PBYTE)"0x90, 0x90, 0x90, 0x90, 0x90", 5);                VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 1;} else {                Beep(300, 500);                printf("Health: OFF");                VirtualProtect((LPVOID)addr, (size_t)5, PAGE_EXECUTE_READWRITE, &oldProtect);                memcpy((void*)addr, (PBYTE)"\x89\x46\x14\x7D\x33", 5);                VirtualProtect((LPVOID)addr, 5, oldProtect, &oldProtect);KeyStatus01 = 0;}}}

Получается, только на зажатой клавише будет работать функция?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.