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

2023-11-30

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


Snapshots: The black byte cannot be read or written to although visaul studio can display it


Visual studio can read the address Visual studio can read the address



Can't read byte inside program Can't read byte inside program


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

为什么会发生这种情况?


你可以很好地处理一个非常常见的场景Software Breakpoints. Software breakpoints实际上是通过用断点指令替换要断点的指令来设置的。

大多数 CPU 中都存在断点指令,并且通常与最短指令一样短,因此只需one byte on x86 (0xCC, INT 3).

由于我不知道您的源代码中是否存在任何断点,因此我只能假设这是您的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改内存区域 - 返回 0xCC VC++ 的相关文章

随机推荐

  • ggplot2:Stat_function 对数刻度的错误行为

    我正在尝试绘制对数缩放的点直方图 用点而不是条形显示值的直方图 结果应该是这样的 MWE 让我们模拟一些数据 set seed 123 d lt data frame x rnorm 1000 为了获得点直方图 我需要首先计算直方图数据 h
  • 在Python中使用类定义调用实例方法

    最近 我一直在研究Python的类实例化过程 以真正理解发生了什么在引擎盖下创建类实例时 但是 在玩测试代码时 我遇到了一些我不明白的事情 考虑这个虚拟类 class Foo def test self print I m using te
  • 如何将变量传递到此 Codeigniter 3 应用程序中的 Twig 视图?

    我正在研究一个在线报纸 博客应用程序 with 代码点火器 3 1 8和 Bootstrap 4 我决定向其中添加主题 该应用程序是not HMVC 只有MVC The themes目录在外部应用如下图所示 Inside themes我有主
  • Python递归函数不返回[重复]

    这个问题在这里已经有答案了 我正在尝试解决我儿子在大学计算机科学课上遇到的问题 以提高我的 Python 新手技能 目标是创建一个使用递归来处理列表的函数 该函数必须接受任意长度的列表并返回一个新列表 其中每个元素都是其自身及其右侧元素的总
  • 如何从 Roslyn 中的 using 指令获取完全限定的命名空间?

    当您将鼠标悬停在 简化 上时usingVS2015 中的指令 它会显示完全限定名称 我如何通过 Roslyn 插件获取此信息 是否会使用一个DiagnosticAnalyzer A CodeFixProvider 浏览 source ros
  • EJB 无状态会话 Bean 和有状态会话 Bean

    我阅读了各种有关有状态和无状态会话 bean 以及它们如何工作的书籍 我想知道这些 ejb 的真正用法以及相对于使用普通 java 类的优势 基本上什么时候使用无状态 ejb 什么时候使用有状态 ejb 我想要一个实时应用程序 这些类型的
  • 为什么字典和集合中的顺序是任意的?

    我不明白如何通过 任意 顺序循环遍历 python 中的字典或集合 我的意思是 它是一种编程语言 因此该语言中的所有内容都必须 100 确定 对吗 Python 必须有某种算法来决定选择字典或集合的哪一部分 第一部分 第二部分等等 我缺少什
  • 如何从c#中的构造函数调用其他构造函数?

    我有一个像这样的构造函数 public Blah string a string b public Blah string a string b string c this a a this b b this c c 如何从第一个构造函数调
  • 在 GIT 中仅强制将一个文件作为二进制文件

    我需要将文件添加到 git 存储库 并且需要正确类型的行结尾 无论如何 我只会使用 t binary 强制文件为二进制 但我不知道如何在 GIT 中将文件设置为二进制 存储库相当大 所以我不想进行全局更改 新文件是 html 我已经有数千个
  • 子窗体跟随主窗体

    如何让子窗体跟随主窗体 例如 打开一个winform net2 winform打开form 如果mainform在移动 form会跟随mainform Use the LocationChanged来自 MainForm 的事件始终设置 C
  • iTextPDF 库 - 找不到类“com.itextpdf.text.pdf.PdfAWriter”

    在最新版本的 itextpad v5 4 0 中找不到类 com itextpdf text pdf PdfAWriter 我什至尝试下载额外的罐子 但无济于事 任何帮助将不胜感激 正如 Bruno 所说 PDF A 库位于不同的 jar
  • Java 每 n 行添加换行符

    String names new String 18 names 0 James Raider names 1 Calm Hain names 2 Ewds Ashby names 3 Gedge Taylor names 4 Hay Fi
  • Auth::attempt($credentials) 始终返回 false

    您好 我是 Laravel 新手 我正在尝试编写登录表单的功能 代码如下 这就是我创建新用户的方式 效果很好 public function action newuser email Input get email password Inp
  • 为什么这些不同的编码不允许我正确显示葡萄牙语?

    我正在做一些涉及葡萄牙语文本的文本挖掘 我的一些自定义文本挖掘函数中还包含其他特殊字符 我不是这个话题的专家 当我的很多字符开始显示不正确时 我认为我需要更改文件编码 我试过 ISO 8858 1 ISO 8858 7 UTF 8 WIND
  • 从 python 代码创建适用于 Windows 的独立可执行文件

    我有一个 python 代码 它使用 pygkt gtk ctypes os 和其他一些模块 我使用 pyinstaller 创建了代码的独立执行程序 在ubuntu上运行得很好 现在我想为Windows平台创建另一个独立的执行程序 我使用
  • Android 改造 POST ArrayList

    正在尝试发送List
  • 从 Kafka 读取时使用 KeyBy 与 reinterpretAsKeyedStream()

    我有一个简单的 Flink 流处理应用程序 Flink 版本 1 13 Flink 应用程序从 Kakfa 读取数据 对记录进行状态处理 然后将结果写回 Kafka 阅读完 Kafka 主题后 我选择使用reinterpretAsKeyed
  • 通过分组变量折叠列(以基数为单位)

    我有一个文本变量和一个分组变量 我想按因子将文本变量折叠为每行一个字符串 合并 所以只要群栏里说m我想将文本分组在一起等等 我在之前和之后提供了一个示例数据集 我正在为一个包编写此内容 到目前为止已经避免了对其他包的所有依赖 除了wordc
  • 2.7.4 上的 Python / 和 // 运算符

    我是Python新手 我开始学习基础知识 我是一名 C 人员 所以 运算符是新的东西 根据我正在读的一本书 gt gt 4 2 2 0 gt gt 2 4 0 5 gt gt 5 4 2 gt gt 2 4 0 问题是当我写的时候5 4当我
  • 修改内存区域 - 返回 0xCC VC++

    我正在修改 dll 中编译的可执行代码的某些部分 但是我正在修改的整个段中固定地址处的单个字节无法更改 甚至无法读取 代码很简单 SEGMENT DATA segInfo getSegmentInfo mHandle segmentName