我正在搞乱一些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功能:) 但不知怎的,我不能用我的功能取而代之。有人知道为什么? 当我为自己的应用程序执行此操作时,它仍在工作