【发布时间】:2021-12-02 21:35:36
【问题描述】:
我想为游戏编写汽车。我使用 Cheat Engine 并找到以下汇编代码:
push 014656DC
call 00633940
add esp,04
ret
我使用 Cheat Engine 将这段代码注入到应用程序中,并且它始终有效。
现在,我想使用 C++ 代码,所以我写了一个 DLL:
- 头文件:
#ifdef DIVLIB_EXPORTS
#define DIVLIB_API __declspec(dllexport)
#else
#define DIVLIB_API __declspec(dllimport)
#endif
extern "C" {
DIVLIB_API void ClickID();
}
- 源文件:
void ClickID()
{
_asm {
push esi;
push eax;
mov esi, 0x014656DC;
mov eax, 0x00633940;
push esi;
call eax;
add esp, 0x04;
}
}
我有 Main.exe 来调用这个 DLL
auto h_process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
char dll[] = "D:\\project\\DivHook\\divhook\\Debug\\divlib.dll";
HMODULE hinstDLL = LoadLibraryA(dll);
LPVOID LoadLibAddress = (LPVOID)GetProcAddress(hinstDLL, "ClickID");
LPVOID MemAlloc = (LPVOID)VirtualAllocEx(h_process, NULL, strlen(dll)+1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(h_process, (LPVOID)MemAlloc, dll, strlen(dll) + 1, NULL);
CreateRemoteThread(h_process, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddress, (LPVOID)MemAlloc, NULL, NULL);
CloseHandle(h_process);
VirtualFreeEx(h_process, (LPVOID)MemAlloc, 0, MEM_RELEASE | MEM_DECOMMIT);
但是,当Main.exe 运行时,我的游戏总是崩溃。
我用作弊引擎反复尝试了上述程序集,并确保它可以完美运行,但 C++ 代码总是崩溃。
【问题讨论】:
-
如果您不检查返回码是否有错误,您将不得不通过艰难的方式找到错误。
-
公平警告这是非常重要的,尤其是在具有 DEP 和 CFG 的现代系统上。 Cheatengine 可能会自行处理。手动操作会很丑。
-
您提供的代码基本上是任意跳转。您确定每次程序运行时
0x00633940都有效吗?二进制文件很可能使用随机寻址。您尝试注入此代码的目的是什么? -
推送不需要弹窗?
-
据我所知,您加载的 dll 不正确。我假设您在任意进程中注入它!?您将 dll 路径写入其他进程内存,但您不使用 LoadLibrary 加载它,而是在您自己的进程中使用 LoadLibrary。
标签: c++ cheat-engine