我正在修改在dll中编译的可执行代码的某些部分。但是我修改的整个段中固定地址上的单个字节无法更改,甚至无法读取。
代码很简单:
SEGMENT_DATA segInfo = getSegmentInfo(mHandle, segmentName);
if (segInfo.inFileSegmentAddr == 0) return false;
DWORD mOlProtection;
DWORD mOlProtection_1;
if (segInfo.architecture != MY_ARCH) {
printf(" Not the same architecture!\n");
return 0;
}
if(VirtualProtect((LPVOID)segInfo.segmentAddr, segInfo.segmentSize, PAGE_EXECUTE_READWRITE, &mOlProtection)==0) return false;
DWORD i=0;
for (size_t k = 0; k < segInfo.segmentSize; k++) {
BYTE *lpByteValue = (BYTE*)(segInfo.segmentAddr + k);
BYTE temp = *lpByteValue;
*lpByteValue = temp ^ lDecryptionKey[i];
i++;
i %= decryptionKeyLength;
}
if(VirtualProtect((LPVOID)segInfo.segmentAddr, segInfo.segmentSize, mOlProtection, &mOlProtection_1)==0) return false;
观察
:PAGE_EXECUTE_READWRITE
标志“取消保护”该区域。temp
变量包含值0xCC
temp
到达xor
之前先看一下它的值。这意味着永远不会使用解密密钥,因此不会导致问题。
我知道不是单个地址上的字节值引起了问题(因为我发现其他具有相同值的字节已被成功处理)。也许字节仍然是“受保护的”?
为什么会这样?
答案 0 :(得分:3)
您可以很好地处理Software Breakpoints
的非常常见的情况。
实际上,Software breakpoints
是通过用断点指令替换要断点的指令来设置的。
断点指令存在于大多数CPU中,通常与最短指令一样短,因此只有one byte on x86 (0xCC, INT 3)
。
由于我不知道您的源代码中是否有任何断点,所以我只能假设这是您的问题。