Привет, сегодня мы будем вызывать игровую функцию из exe.
Пример вызова в dll:
C++:
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
void AddMessageJumpQ(char *text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
((void(__cdecl *)(char *, unsigned int, unsigned short, bool))FUNC_CMessages__AddMessageJumpQ)(text, time, flag, bPreviousBrief);
}
AddMessageJumpQ("hello", 500, NULL,false); // вызываем
Для вызова из exe мы будем использовать:
-OpenProcess
-VirtualAllocEx
-WriteProcessMemory
-CreateRemoteThread
Создаем структуру для передачи аргументов в удаленный поток(CreateRemoteThread):
C++:
struct Struct
{
char text[256];
unsigned int time;
unsigned short flag;
bool bPreviousBrief;
DWORD pAdr;
}FuncArgs;
C++:
typedef void(__cdecl *_SendMSG)(char*, unsigned int, unsigned short, bool);
C++:
DWORD __stdcall RemoteThread(Struct *sArg)
{
_SendMSG msg = (_SendMSG)sArg->pAdr; // передаем адрес
msg(sArg->text, sArg->time, sArg->flag, sArg->bPreviousBrief); // вызываем
return 0;
}
void __stdcall RemoteThread_end() {}
C++:
strcpy(FuncArgs.text, "Hello world!");
FuncArgs.time = 500;
FuncArgs.flag = NULL;
FuncArgs.bPreviousBrief = false;
FuncArgs.pAdr = 0x69F1E0;
C++:
DWORD GetProcId(const char* procname)
{
PROCESSENTRY32 pe;
HANDLE hSnap;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(hSnap, &pe)) {
do {
if (strcmp(pe.szExeFile, procname) == 0)
break;
} while (Process32Next(hSnap, &pe));
}
return pe.th32ProcessID;
}
C++:
// получаем хэндл процесса
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcId("gta_sa.exe"));
// Выделяем память под наш поток в gta_sa
LPVOID pRemoteThread = VirtualAllocEx(hProcess, NULL, (DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// Записываем его
WriteProcessMemory(hProcess, pRemoteThread, (LPVOID)RemoteThread, ((DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread), 0);
// Выделяем память для нашего объекта в gta_sa
Struct *myArg = (Struct*)VirtualAllocEx(hProcess, NULL, sizeof(Struct), MEM_COMMIT, PAGE_READWRITE);
// Записываем его
WriteProcessMemory(hProcess, myArg, &FuncArgs, sizeof(Struct), NULL);
// Запускаем наш поток pRemoteThread с аргументами myArg
HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, myArg, 0, 0);
// Закрываем дескриптор потока
CloseHandle(hThread);
// Освобождаем выделенную память
VirtualFreeEx(hProcess, myArg, sizeof(Struct), MEM_RELEASE);
// Закрываем дескриптор процесса
CloseHandle(hProcess);
Получаем:
Пример с WinAPI(Beep):
Создаем структуру и прототип:
C++:
typedef BOOL(__stdcall *__Beep)(DWORD, DWORD);
struct sBeep
{
DWORD Freq;
DWORD Duration;
DWORD pAdr;
} myBeep;
Заполняем структуру:
C++:
myBeep.Freq = 500;
myBeep.Duration = 50;
HMODULE kernel = LoadLibrary("Kernel32.dll"); // Получаем адрес kernel32
myBeep.pAdr = (DWORD)GetProcAddress(kernel,"Beep"); // получаем адрес функции Beep
FreeLibrary(kernel);
C++:
DWORD __stdcall RemoteThread(sBeep *sArg)
{
__Beep msg = (__Beep)sArg->pAdr;
msg(sArg->Freq, sArg->Duration);
return 0;
}
void __stdcall RemoteThread_end() {}
C++:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcId("gta_sa.exe"));
// Выделяем память под наш поток в gta_sa
LPVOID pRemoteThread = VirtualAllocEx(hProcess, NULL, (DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
// Записываем его
WriteProcessMemory(hProcess, pRemoteThread, (LPVOID)RemoteThread, ((DWORD_PTR)RemoteThread_end - (DWORD_PTR)RemoteThread), 0);
// Выделяем память для нашего объекта в gta_sa
sBeep *myArg = (sBeep*)VirtualAllocEx(hProcess, NULL, sizeof(sBeep), MEM_COMMIT, PAGE_READWRITE);
// Записываем его
WriteProcessMemory(hProcess, myArg, &myBeep, sizeof(sBeep), NULL);
// Запускаем наш поток pRemoteThread с аргументами myArg
HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, myArg, 0, 0);
// Закрываем дескриптор потока
CloseHandle(hThread);
// Освобождаем выделенную память
VirtualFreeEx(hProcess, myArg, sizeof(sBeep), MEM_RELEASE);
// Закрываем дескриптор процесса
CloseHandle(hProcess);
Последнее редактирование: