所以最近几天我开始学习c ++,因为我想参与一些游戏黑客和逆向工程。我通过基本的绕道方法尝试了运气,只需在目标程序内存中的功能中插入一个jmp即可。但是,我想开始使用Microsoft的绕行库并尝试一下。我现在唯一的目标是每次调用该函数时都要注册。
由于某种原因,我的DLL将错误的地址写入内存以进行跳转,从而导致程序崩溃。
The jump, the address attached leads to empty memory
它写到正确的地址,但是没有跳到正确的位置。我对C ++很陌生,所以这可能是我的错,但我无法使其正常工作。
#include "stdafx.h"
#include <detours.h>
#include <windows.h>
#include <iostream>
DWORD AddressOfFunc;
typedef int (__cdecl* func)(int x);
int hookFunc(int x) {
std::cout << "TRIGGERED!" << std::endl;
func originalFunc = (func)AddressOfFunc;
return originalFunc(x);
}
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
AddressOfFunc = (DWORD)GetModuleHandleA("Borderlands2.exe") + 0xA18940;
if (dwReason = DLL_PROCESS_ATTACH) {
AllocConsole();
FILE* fp;
freopen_s(&fp, "CONOUT$", "w", stdout);
std::cout << "Injected!" << std::endl;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)&AddressOfFunc, &hookFunc);
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(LPVOID&)AddressOfFunc, &hookFunc);
DetourTransactionCommit();
}
}
IdaPro告诉我该函数需要一个int并返回一个int,但是我几乎没有经验能够验证任何此信息,因此将不胜感激。
答案 0 :(得分:0)
当您使用MS Detours时,我认为它没有为jmp写错跳转地址。您的代码是正确的,除了我有2个小问题
您正在使用PVOID *,这应该不会引起任何问题,但是它是多余的。 PVOID被定义为void *,因此,当您编写PVOID *时,实际上是在做void **,这没有任何意义。
与我通常使用MS Detours的方式有一些小的语法差异
这就是我使用它时的样子:
typedef int (__cdecl* tFunc)(int x);
tFunc oFunc = nullptr;
int hkFunc(int x)
{
//stuff
}
oFunc = (tFunc)(DWORD)GetModuleHandleA("Borderlands2.exe") + 0xA18940;
DetourAttach(&(PVOID &)oFunc, hkFunc);
如果这些更改不能解决您的问题,我认为您正在使用的调用约定(cdecl)是错误的。您不能总是信任IDA Pro,有时必须手动确认调用约定的参数和返回类型。
如果需要其他帮助,请发布更多信息,我们需要在通话前后查看10条说明,以及被叫方的前10条和后10条指令。