在绕行函数中执行BYTE数组

时间:2014-10-26 17:04:28

标签: c++ windows winapi byte hook

我知道这是一个很长的帖子,但它主要是代码和图片,这是一个快速阅读!首先,这是我正在尝试做的事情:

我正在尝试在绕道函数中执行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,这让我在那里:

enter image description here

这正是我正在尝试执行的字节。唯一的问题是它在执行时给了我一个访问冲突错误...任何想法为什么?我会想到“VirtualProtect(mem,5,PAGE_EXECUTE_READWRITE,&amp; dwProtect);”本来可以安全访问...感谢您的帮助!

编辑:我刚刚意识到发生了一些奇怪的事情...当我用ollydbg“进入”时,mem指令是正确的,但是只要我滚动一点,他们就会改回来:

enter image description here

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

你忘记了模块偏移......

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

ADDRESS当然必须与您的模块有关。 (模块偏移量总是不一样)

顺便说一下。注入DLL时为什么要使用WriteProcessMemory?需要一个简单的memcpy ......