挂钩游戏的IAT功能

时间:2017-01-20 08:31:46

标签: c++ hook portable-executable

我正在搞乱一些dll注射/挂钩。 我已经尝试在我自己的应用程序中挂起IAT的Sleep功能,它工作得非常好,但后来我尝试在计算机游戏中做同样的操作而不是崩溃。

因为我注入了一个dll并从我的dll挂起了可执行模块的IAT,所以我看不到错误(日志),但是我把这个错误钉在了这个迭代IAT的部分:

while (impDesc->FirstThunk) {
    auto thunkData = getMemoryPointer<IMAGE_THUNK_DATA>((LPVOID)(baseAddress + impDesc->OriginalFirstThunk));
    int n = 0;

    while (thunkData->u1.Function) {
        char* importFuncName = getMemoryPointer<char>((LPVOID)(baseAddress + (DWORD)thunkData->u1.AddressOfData + 2));  //the function name is stored at .AddressOfData + 2
        if (strcmp(importFuncName, funcName) == 0) {
            auto vfTable = getMemoryPointer<DWORD>((LPVOID)(baseAddress + impDesc->FirstThunk));
            DWORD original = vfTable[n];
            auto oldProtection = protectMemory<DWORD>((LPVOID)&vfTable[n], PAGE_READWRITE);
            vfTable[n] = newFunc;
            protectMemory<DWORD>((LPVOID)&vfTable[n], oldProtection);
            return original;
        }
        n++;
        thunkData++;
    }
    impDesc++;
}

执行第一个循环之前和之后的代码,以及第二个循环中的代码。但if永远不会被调用,并且循环之后的代码也永远不会被调用,所以不知何故代码在这个循环之一中断,但我不知道如何或为什么。

我已经尝试检查impDesc或thunkData是否为NULL,但如果情况永远不会被执行。我想从IAT挂钩的功能是睡眠功能。

有没有人知道为什么这个循环会破坏?因为我在自己的应用程序上测试它并且在那里工作得很好。

这就是impDesc:

auto impDesc = getMemoryPointer<IMAGE_IMPORT_DESCRIPTOR>((LPVOID)(baseAddress + IAT.VirtualAddress));
编辑:我发现thunkData-&gt; u1的地址在崩溃之前是8000000e。因此,当u1的值为8000000e时,它会在thunkData-&gt; u1.Function或char * importFuncName = getMemoryPointer ...崩溃。为什么?

EDIT2: Okey我按照建议更新我的while循环以忽略序数。这是更新版本:

while (impDesc->FirstThunk) {
    IMAGE_THUNK_DATA* thunkData = getMemoryPointer<IMAGE_THUNK_DATA>((LPVOID)(baseAddress + impDesc->OriginalFirstThunk));
    int n = 0;

    while (thunkData->u1.Function) {
        if (IMAGE_SNAP_BY_ORDINAL(thunkData->u1.Function)) {
            n++;
            thunkData++;
            continue;
        }

        auto importFuncName = getMemoryPointer<char>((LPVOID)(baseAddress + (DWORD)thunkData->u1.AddressOfData + 2));   //the function name is stored at .AddressOfData + 2
        if (strcmp(importFuncName, funcName) == 0) {
            auto vfTable = getMemoryPointer<DWORD>((LPVOID)(baseAddress + impDesc->FirstThunk));
            DWORD original = vfTable[n];
            auto oldProtection = protectMemory<DWORD>((LPVOID)&vfTable[n], PAGE_EXECUTE_READWRITE);
            vfTable[n] = newFunc;
            protectMemory<DWORD>((LPVOID)&vfTable[n], oldProtection);
            return original;
        }
        n++;
        thunkData++;
    }
    impDesc++;
}

但是现在它在这些线之间崩溃了:

auto oldProtection = protectMemory<DWORD>((LPVOID)&vfTable[n], PAGE_EXECUTE_READWRITE);
vfTable[n] = newFunc;
protectMemory<DWORD>((LPVOID)&vfTable[n], oldProtection);

Atleast我现在可以在IAT中找到Sleep功能:) 但不知怎的,我不能用我的功能取而代之。有人知道为什么? 当我为自己的应用程序执行此操作时,它仍在工作

0 个答案:

没有答案