2014-10-26 52 views
0

我知道這是一個很長的帖子,但它主要是代碼和圖片,它是一個快速閱讀!首先,這是我想要做的:執行字節數組在繞道功能

我想執行一個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的,這讓我有:

enter image description here

這正是我試圖執行的字節數。唯一的問題是它執行時給我一個訪問衝突錯誤...任何想法爲什麼?我會認爲「VirtualProtect(mem,5,PAGE_EXECUTE_READWRITE,& dwProtect);」本來可以安全訪問......感謝您的幫助!

編輯:我只是意識到奇怪的事情正在發生......當我「走進」與OllyDbg的,在MEM指令是正確的,但只要我滾動了一下,他們變回本:

enter image description here

任何想法爲什麼?

+0

你檢查過'VirtualProtect'的返回結果嗎?另外MSDN上的VirtualProtect頁面說修改指令後調用'FlushInstructionCache'。 – 2014-10-26 17:17:41

+0

即使在每次修改指令後調用FlushInstructionCache之後,VirtualProtect的錯誤代碼都是998(對內存位置的訪問無效)。儘管感謝您的幫助! – MyUsername112358 2014-10-26 17:26:09

+0

我發現了一些新東西......編輯我的文章 – MyUsername112358 2014-10-26 18:26:21

回答

0

你已經忘了模塊偏移...

DWORD module = (DWORD)GetModuleHandle(NULL); 
DWORD real_address = module + (DWORD)ADDRESS; 

地址必須相對於你的模塊,當然。 (模塊偏移不總是相同)

而順便說一句。爲什麼在注入DLL的時候需要使用WriteProcessMemory?一個簡單的memcpy就足夠了...