我知道这是一个很长的帖子,但它主要是代码和图片,这是一个快速阅读!首先,这是我正在尝试做的事情:
我正在尝试在绕道函数中执行BYTE数组,以便回到原始代码,好像我没有绕道而行这是我的代码:
DllMain(DetourAddress就是这么重要):
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
AllocConsole();
freopen("CONOUT$", "w", stdout);
DetourAddress((void*)HookAddress, (void*)&DetourFunc);
case DLL_PROCESS_DETACH:
FreeConsole();
break;
}
return TRUE;
}
DetourAddress(代码是不言自明的,我认为):
void DetourAddress(void* funcPtr, void* hook)
{
// write jmp
BYTE cmd[5] =
{
0xE9, //jmp
0x00, 0x00, 0x00, 0x00 //address
};
// make memory readable/writable
DWORD dwProtect;
VirtualProtect(funcPtr, 5, PAGE_EXECUTE_READWRITE, &dwProtect);
// read bytes about to be replaced
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, mem, 5, NULL);
// write jmp in cmd
DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); // (dest address) - (source address) - (jmp size)
memcpy(&cmd[1], &offset, 4); // write address into jmp
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, cmd, 5, 0); // write jmp
// reprotect
VirtualProtect(funcPtr, 5, dwProtect, NULL);
}
DetourFunc:
_declspec(naked) void DetourFunc()
{
__asm
{
PUSHFD
PUSHAD
}
printf("function detoured\n");
__asm
{
POPAD
POPFD
}
// make memory readable/writable
DWORD dwProtect;
VirtualProtect(mem, 6, PAGE_EXECUTE_READWRITE, &dwProtect);
pByteExe();
// reprotect
VirtualProtect(mem, 6, dwProtect, NULL);
__asm
{
jmp HookReturnAddress
}
}
最后是全局变量,pByteExe()的typedef并包含:
#include <Windows.h>
#include <cstdio>
DWORD HookAddress = 0x08B1418,
HookReturnAddress = HookAddress+5;
typedef void ( * pFunc)();
BYTE mem[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0xC3 };
pFunc pByteExe = (pFunc) &mem
正如您在DetourFunc中看到的,我正在尝试直接执行我的字节数组(mem)。使用OllyDbg,这让我在那里:
这正是我正在尝试执行的字节。唯一的问题是它在执行时给了我一个访问冲突错误...任何想法为什么?我会想到“VirtualProtect(mem,5,PAGE_EXECUTE_READWRITE,&amp; dwProtect);”本来可以安全访问...感谢您的帮助!
编辑:我刚刚意识到发生了一些奇怪的事情...当我用ollydbg“进入”时,mem指令是正确的,但是只要我滚动一点,他们就会改回来:
知道为什么吗?
答案 0 :(得分:0)
你忘记了模块偏移......
DWORD module = (DWORD)GetModuleHandle(NULL);
DWORD real_address = module + (DWORD)ADDRESS;
ADDRESS当然必须与您的模块有关。 (模块偏移量总是不一样)
顺便说一下。注入DLL时为什么要使用WriteProcessMemory?需要一个简单的memcpy ......