繁体   English   中英

修改内存区域 - 返回0xCC VC ++

[英]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;

观察:

  1. 在修改内存之前,我使用PAGE_EXECUTE_READWRITE标志“取消保护”该区域。
  2. visual studio中的Memory View清楚地显示了该特定地址的值。 甚至更奇怪的是,在第二个我从调试器手动修改值,我的代码也能够更改该值。
  3. 示例代码中的temp变量包含值0xCC
  4. 这个字节实际上是唯一一个在其他数百个字节中保持不变的字节。 它是Memory View中唯一标记为黑色的字节(其余为红色,因为它们已被更改)
  5. Dll在Debug / x86中编译。 / MTd标志设置。 没有随机地址(/ DYNAMICBASE:NO,/ FIXED:NO)。 没有整个程序优化。
  6. 未修改的字节不是变量。 所以它不能“未初始化”。 它实际上是一个非常重要的字节:它是指令操作码。 一切都在那个字节上崩溃了。
  7. 解密例程(XOR代码)对错误没有影响。 我进入代码并在到达xor之前查看temp的值。 这意味着永远不会使用解密密钥,因此它不会导致问题。
  8. 虚拟保护成功。


快照 虽然visaul工作室可以显示黑色字节,但无法读取或写入黑色字节


Visual Studio可以读取地址 Visual Studio可以读取地址



无法读取程序内的字节 无法读取程序内的字节


我知道这不是导致问题的单个地址的字节值(因为我发现其他字节具有相同的值,已成功处理)。 也许这个字节仍然“受到保护”?

为什么会这样?

您可以很好地处理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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM