[英]Modifying region of memory - returns 0xCC VC++
我正在修改在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
xor
之前查看temp
的值。 这意味着永远不会使用解密密钥,因此它不会导致问题。 我知道这不是导致问题的单个地址的字节值(因为我发现其他字节具有相同的值,已成功处理)。 也许这个字节仍然“受到保护”?
为什么会这样?
您可以很好地处理Software Breakpoints
的非常常见的情况。 Software breakpoints
实际上是通过用断点指令替换要断点的指令来设置的。
断点指令存在于大多数CPU中,通常与最短指令一样短,因此one byte on x86 (0xCC, INT 3)
只有one byte on x86 (0xCC, INT 3)
。
由于我不知道你的源代码中是否有任何断点,我只能假设这是你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.