Вызов внутренних функций через dll injection - ошибка времени выполнения


0

Я пытаюсь изменить закрытый клиент игры с исходным кодом, который работает с моим игровым сервером. Целью этого является возможность добавления новых графических элементов в клиент.

Я прочитал много учебников о длл инъекции и в конце концов Theres код, который я сделал:

// dllmain.cpp : Defines the entry point for the DLL application. 
#include "stdafx.h" 
#include <windows.h> 

#define BASE_ADDR 0x00400000 

DWORD WINAPI MyThread(LPVOID); 
DWORD g_threadID; 
HMODULE g_hModule; 
void __stdcall CallFunction(int&, int&, int&, int&, int&, int&, int&, int&); 
void __stdcall typeText(int&, const char*); 


//must be at least one function to prevent crash 
__declspec(dllexport) int APIENTRY Func(LPVOID lpParam) 
{//empty function 
    return 0; 
} 


//main func 
BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 

    DWORD myThreadID; 
    HANDLE myHandle; 


    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     g_hModule = hModule; 
     DisableThreadLibraryCalls(hModule); 
     CreateThread(NULL, NULL, &MyThread, NULL, NULL, &g_threadID); 
     break; 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 
    return TRUE; 
} 


DWORD WINAPI MyThread(LPVOID) 
{ 
    int i1 = 1; 
    int i2 = 10; 
    int i3 = 10; 
    int i4 = 200; 
    int i5 = 200; 
    int i6 = 60; 
    int i7 = 0; 
    int i8 = 0; 


    while (true) 
    { 
     if (GetAsyncKeyState(VK_F3) & 1) //Set F3 as hotkey 
     { 
      // call GUI window (do it before login) 
      CallFunction(i1, i2, i3, i4, i5, i6, i7, i8); 


      //display text from char (do it after login) 
      //typeText(i1, "halo halo"); 
     } 
     else if (GetAsyncKeyState(VK_F4) & 1) 
      break; 
     Sleep(100); 
    } 
    FreeLibraryAndExitThread(g_hModule, 0); 


    /* another way to call function? 
    typedef void tipo(int& p1, int& p2, int& p3, int& p4, int& p5, int& p6, int& p7, int& p8); 
    void(*func)(int& p1, int& p2, int& p3, int& p4, int& p5, int& p6, int& p7, int& p8); 
    func = (tipo*)0x490C60; 
    func(i1, i2, i3, i4, i5, i6, i7, i8); 
    */ 

    return 0; 
} 

//0x004067C0, pattern = (int, char*) 
void __stdcall typeText(int& type, const char* text) 
{ 
    typedef void(__stdcall *pFunctionAddress)(int&, const char*); 
    pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004067C0); 
    pMySecretFunction(type, text); 
} 

//const DWORD DrawSkinExAddress =0x490C60;. 
//typedef void TF_DRAWSKIN(int nSurface, int X, int Y, int W, int H, int SkinId, int dX, int dY); 
void __stdcall CallFunction(int& p1, int& p2, int& p3, int& p4, int& p5, int& p6, int& p7, int& p8) 
{ 
    typedef void(__stdcall *pFunctionAddress)(int&, int&, int&, int&, int&, int&, int&, int&); 
    pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x490C60); 
    pMySecretFunction(p1,p2,p3,p4,p5,p6,p7,p8); 
} 

Я могу успешно внедрить его и запустить клиент. Когда я пытаюсь вызвать определенную функцию (нажмите F3, чтобы сделать это), клиент сработает. появляется ошибка времени выполнения (ошибка представления изображения: https://imgur.com/a/ANIq0) и сбои клиентов. Я думаю, что проблема theres с методом, который я называю функциями. Адреса и переменные в порядке, я думаю, потому что, если я попытаюсь сделать это на других случайных адресах, клиент просто рухнет нормально (приложение не отвечает).

Я попытался заменить stdcall на cdecl, но ничего не изменилось.

+2

Где вы получаете адрес функции, которую хотите позвонить? Это не должно быть жестким кодом. 22 ноя. 172017-11-22 12:14:23

-1

Адрес, который я использовал, был неправильным: |