我知道這是一個很長的帖子,但它主要是代碼和圖片,它是一個快速閱讀!首先,這是我想要做的:執行字節數組在繞道功能
我想執行一個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
}
}
而且finaly全局變量,的typedef pByteExe(),包括:
#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,& dwProtect);」本來可以安全訪問......感謝您的幫助!
編輯:我只是意識到奇怪的事情正在發生......當我「走進」與OllyDbg的,在MEM指令是正確的,但只要我滾動了一下,他們變回本:
任何想法爲什麼?
你檢查過'VirtualProtect'的返回結果嗎?另外MSDN上的VirtualProtect頁面說修改指令後調用'FlushInstructionCache'。 – 2014-10-26 17:17:41
即使在每次修改指令後調用FlushInstructionCache之後,VirtualProtect的錯誤代碼都是998(對內存位置的訪問無效)。儘管感謝您的幫助! – MyUsername112358 2014-10-26 17:26:09
我發現了一些新東西......編輯我的文章 – MyUsername112358 2014-10-26 18:26:21