如何在 Windows PE 32 位可执行文件中为我的代码洞腾出空间

2023-12-05

所以我想在minesweeper.exe(典型的Windows XP扫雷游戏,链接:扫雷舰)。所以我通过CFF Explorer修改了文件的PE头以增加文件的大小.text部分。

Segs

我尝试增加原始大小.text分段1000h(新大小为3B58),但Windows无法找到入口点,游戏无法启动。然后我尝试增加大小.rsrc部分,添加新部分,增加图像大小,但这些尝试都没有成功,Windows 说“这不是 x32 可执行文件”。

那么问题来了:如何为我的代码洞腾出空间?我不想搜索编译器留下的空白空间,我想为我的代码提供干净整洁的 1000h 字节。如果有一个教程以及如何在不损坏游戏的情况下做到这一点的详细解释,那就太棒了! (是的,我实际上正在破解扫雷器)


您无法在不使后续部分无效的情况下增加部分的大小(通常是因为它会使这些部分中的偏移量和地址无效)。这仍然是可能的,但它非常容易出错,并且当您有更简单的解决方案时,不值得这么麻烦。

通常,您只需要添加一个部分在最后PE 的并从代码部分跳转到那里。代码部分(代码洞)末尾通常有一点空间,因此您可以将 JMP(或一些代码存根)放在那里以重定向到新部分。您还可以添加其他新的数据部分或新资源或任何您想要的内容。


注意:我使用两个工具:CFF explorer 作为 PE 浏览器;十六进制编辑器。

该文件非常特殊,因此添加新部分比平常要困难一些。

开始吧!

下面是数组的十六进制视图IMAGE_SECTION_HEADER:

Section headers

通常有一些空间可以添加新的部分,但在这种特殊情况下,没有空间......最后一个部分标题后面紧跟着一些东西。

从内容来看,这很可能是一个绑定的导入目录,在CFF explorer中确认了这一点(绑定目录的偏移量为0x248):

Bound import directory

绑定的导入目录现在没有用处,特别是对于 ASLR,因此我们可以将整个目录归零(其大小为 0xA8 字节,如上一个屏幕截图所示):

Zeroed bound import directory

您还可以将数据目录中的绑定导入目录 RVA 清零,尽管这不是严格要求的:

enter image description here

现在,是时候添加新部分了。

添加新部分

扫雷默认有 3 个部分,因此将部分数量从 3 增加到 4:

Increment number of sections

转到节标题并添加一个新节(您可以直接在 CFF 资源管理器中执行此操作;我将其命名为我的,.foobar,请注意部分名称是at most8 个字符并且不需要以 NULL 字节结尾):

New section

您需要选择两个数字:

  • 新部分的原始大小(我选择了 0x400);它must是的倍数FileAlignment(在本例中为 0x200)。

  • 新部分的虚拟大小(我选择0x1000);它must是的倍数SectionAlignement(对于这个二进制文件来说是 0x1000)。

现在我们“需要计算另外两个成员,Virtual Address and Raw Address.

虚拟地址

让我们以第一部分和第二部分为例。

第一部分从虚拟地址 0x1000 开始,虚拟大小为 0x3A56。下一节虚拟地址must对齐于SectionAlignement(0x1000)所以计算是(这里使用python):

>>> def round_up_multiple_of(number, multiple):
    num = number + (multiple - 1)
    return num - (num % multiple)

>>> hex(round_up_multiple_of(0x1000 + 0x3a56, 0x1000))
'0x5000'

给出的 0x5000 是正确的(.data 部分从虚拟地址 0x5000 开始)。

现在,我们的最后一部分应该从哪里开始?

.rsrc 部分从 0x6000 开始,大小为 0x19160:

>>> hex(round_up_multiple_of(0x6000 + 0x19160, 0x1000))
'0x20000'

所以它必须从虚拟地址0x20000开始。把那个数字放进去Virtual Address.

原始地址

(通常不需要这样做,因为所有部分都已经对齐,最后一部分必须从文件末尾开始,但我们会这样做)。

提醒一下,原始地址是文件中的地址(而不是内存中的地址)。

让我们从一个例子开始(第一部分和第二部分):

第一部分的原始地址是 0x400,其原始大小是 0x3c00。FileAlignement是 0x200,因此:

>>> hex(round_up_multiple_of(0x400 + 0x3c00, 0x200))
'0x4000'

第二部分应从文件开始(其Raw address)在 0x4000 处,这是正确的。

因此,对于我们的新部分,计算如下:

  • .rsrc 部分在文件中的 0x4200 处开始
  • 文件上的 .rsrc 部分大小为 0x19200
  • FileAligment是 0x200

计算如下:

>>> hex(round_up_multiple_of(0x4200 + 0x19200, 0x200))
 '0x1d400'

我们的最后一部分从文件中的原始地址 0x1d400 开始,该地址已通过十六进制编辑器确认:

Last section location

最后步骤

还需要最后一步,计算SizeOfImage可选标头中的字段。根据 PE 规范,该字段为:

图像的大小(以字节为单位),包括所有标题,如图像 已加载到内存中。它必须是SectionAlignment 的倍数。

因此计算可以简化为:VirtualAddress + VirtualSize最后一部分,对齐SectionAlignment(0x1000):

>>> hex(round_up_multiple_of(0x20000 + 0x1000, 0x1000))
'0x21000'

New size of image

现在,在 CFF 资源管理器中保存所有修改并退出。

为新部分添加空间

最后一步是为最后一部分添加所需的字节。当我选择一个Raw size0x400,我在处插入0x400字节Raw Address(0x1d400) 使用十六进制编辑器。

保存您的文件。如果您遵循了所有步骤,它必须按原样工作(在 Win 10 上测试),并且您可以启动修改后的可执行文件而不会出现任何错误。

如果 0x400 不够,请尝试对新部分使用不同的原始大小。

现在你有了一个新的空部分,剩下的就由你来修改代码了:)

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

如何在 Windows PE 32 位可执行文件中为我的代码洞腾出空间 的相关文章

  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • Windows Workflow Foundation 4 (WF4) 延迟

    我正在与 Visual Studio 2010 的候选版本一起使用 Wf4 编写一个用于批准资源请求的新工作流程 在我的工作流程中 如果请求未获得批准 我希望请求在几天后过期 我们在 WF 3 5 Visual Studio 2008 中通
  • Windows7上python3.5无法安装BeautifulSoup4

    我已经从下载了 beautifulsoup4 4 5 3 tar gzhttps www crummy com software BeautifulSoup bs4 download 4 5 https www crummy com sof
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • Windows 上的 Openssl 错误 0x02001005 和 0x2006D002?

    我正在尝试使用 openssl 将 cer 证书转换为 p12 证书 这是我正在使用的命令 C OpenSSL Win32 bin gt openssl x509 inform der in developer identity cer o
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 由于图形处理单元配置,不支持 Windows Phone 模拟器(Mac 上的 Windows 7)

    启动 Windows Phone 模拟器时出现错误 不支持 Windows Phone 模拟器 因为您的计算机没有所需的图形处理单元配置 如果没有图形处理单元 XNA 框架页面将无法运行 您想继续启动模拟器吗 当我尝试访问网页 任何网页 时
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • Kerberos 双跳

    我们遇到了臭名昭著的 Kerberos 双跳问题 这是一个全新的域 是从以前使用模拟和委派的另一个提供商迁移而来的 我们已将操作系统升级到最新的 SQL 服务器 2017 WPF 应用程序 使用域凭据 gt Web 服务 IIS 10 上的
  • 需要 TensorFlow 依赖项。如何在 Windows 上运行 TensorFlow

    我有兴趣让 TensorFlow 在 Windows 上运行 但目前我意识到这是不可能的 因为某些依赖项无法在 Windows 上使用 例如巴泽尔 之所以出现这种需求 是因为据我目前了解 从 TensorFlow 访问 GPU 的唯一方法是
  • 如何从Windows阻止社交媒体[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想根据时间阻止我的电脑上的社交媒体 晚上 9 点后屏蔽 上午 11 点后解锁 如家长控制 我尝试过关注但失败了 创建了
  • Windows 窗口对接

    我想知道如何在 Windows 中将窗口停靠 捕捉到屏幕的一侧 最好使用直接的 Win32 API 我正在寻找的效果就像任务栏 一个在屏幕上有保留空间的窗口 因此最大化另一个窗口会使该窗口占据屏幕的其余部分 但使我的窗口保持在适当的位置并可
  • 从 64 位 nasm 代码接收 32 位寄存器

    我正在学习 64 位 nasm 我通过执行以下操作来汇编 nasm 文件 该文件仅包含 64 位寄存器 nasm f elf64 HelloWorld nasm o HelloWorld o 并链接它执行以下操作 ld HelloWorld
  • x86 中有加速 SHA (SHA1/2/256/512) 编码的指令吗?

    一个例子 在x86 是硬件加速 AES 的指令集 http en wikipedia org wiki AES instruction set 但是x86中是否有加速SHA SHA1 2 256 512 编码的指令 以及在x86上编码SHA
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • 将 CrashDumps 转储到应用程序运行所在的同一文件夹中

    我编写了一个应用程序 我希望对其进行一定程度的自动调试 我想使用 Windows 错误报告将故障转储输出到应用程序运行所在的同一文件夹中 我的想法是 我可以让我的应用程序在它自己的文件夹中查找任何 dmp 文件 然后根据需要上传它们进行分析
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔

随机推荐

  • 嵌套对象初始值设定项语法

    Resharper 刚刚向我建议了以下重构 Constructor initializes InitializedProperty but the UninitializedSubproperty is uninitialized var
  • 最近 VSO 更新后,将 Ranorex CodedUI 测试链接到 MTM/VSO 2013 CI 时出现问题

    我们已经建立了 CI 流程 将 118 个 Ranorex 测试用例链接到 MTM 测试用例 并在专用自动化 VM 上运行它们 该 VM 由 Visual Studio 中的定时构建触发 CI 流程仍然正常工作 但我刚刚尝试添加另一个测试
  • 如何在 C# 中计算整数的除法和模数?

    如何在 C 中计算整数的除法和模数 这是来自MSDN 文档 当您将两个整数相除时 结果始终是一个整数 例如 7 3 的结果是 2 要确定 7 3 的余数 请使用余数运算符 int a 5 int b 3 int div a b quotie
  • 递归函数中的 Catch 块重复执行

    我有一个递归函数 用于从 AWS 上的 CodeCommit 存储库获取 SQL 文件并按顺序运行它们 我们需要等待上一个文件完成才能运行下一个文件 如果其中一个 SQL 文件失败 我需要 catch 块来返回有关失败文件的信息 目前我在代
  • 如何使用正则表达式删除方括号及其之间的任何内容?

    如何删除方括号之间和方括号本身的文本 例如 我需要 hello quote im sneaky world 成为 hello world 这是我尝试使用的 但它没有达到目的 preg replace str 我刚刚结束 hello quot
  • 处理外部文件的 getResourceAsStream

    我的 getResourceAsStream 方法有问题 由于目录错误 它返回 null 问题是我不知道如何定义目录 我的项目结构看起来像这样 Project src com package ExampleClass java dll My
  • 如何查询数据库中用户的排名,但只考虑每个用户的最新条目?

    假设我有一个名为 Scrape 的数据库表 可能设置如下 UserID int UserName varchar Wins int Losses int ScrapeDate datetime 我试图根据用户的赢 输比对他们进行排名 但是
  • 按钮点击计数器 [PHP]

    我尝试创建一个变量来存储单击按钮的计数 不幸的是我收到这个错误 Undefined variable counter 这是我的代码 if SERVER REQUEST METHOD POST counter isset POST count
  • MySQL处于“正在发送数据”状态是什么意思?

    如果 Mysql 查询 SHOW PROCESSLIST 在 状态 列中返回 正在发送数据 我想这意味着查询已经执行并且MySQL正在向客户端发送 结果 数据 但我想知道为什么它花费了这么多时间 最多一个小时 谢谢 这是一个相当具有误导性的
  • 下面的代码中实习生是如何工作的?

    String a abc String b a substring 1 b intern String c bc System out println b c 这个问题可能很愚蠢 因为实习生在这里没有主要用途 但我仍然对这个事实感到困惑 为
  • 在android中通过Loaders插入记录

    这个问题将是被问者的后续问题内容解析器与游标加载器答案清楚地说明了如何使用 Content Resolver 将记录插入到 sqlite Db 中 我的问题如下 我可以使用加载器 普通加载器 来实现此功能吗 eg public Loader
  • 使用java将HTML转换为图像

    我在使用 java 将 html 转换为图像时遇到一些问题 我正在使用 html2image java 它创建一个图像 但问题是它只在 html 的一小部分上创建图像 我怎样才能制作整个 html 的图像 谢谢 这是我的代码 import
  • 如何使用 Nokogiri 用

    标签包装 HTML 无标签文本?

    我必须将 HTML 文档解析为不同的新文件 问题是有一些文本节点没有被包裹起来 p 标签 而不是他们有 br 每个段落末尾的标签 我想用以下文字换行 p p 使用 Nokogiri 的标签 p div b Footnote 15 b Cat
  • 在Python中复制多个文件

    如何使用 Python 将一个目录中存在的所有文件复制到另一个目录 我有源路径和目标路径作为字符串 您可以使用os listdir 获取源目录中的文件 os path isfile 查看它们是否是常规文件 包括 nix 系统上的符号链接 以
  • 如何递归替换对象中的键名称?

    我试图弄清楚如何使用递归将对象的键名称替换为新的键名称 这也包括嵌套对象内部的键名称 我觉得这与我在第一个 if 条件语句中重新分配给 newObj 的方式有关 有什么建议么 到目前为止 这是我的代码 24 Find all keys in
  • azure 搜索按分数排序和过滤

    我想知道如何使用 azure 搜索按分数过滤和排序结果 我试过 https domaine net indexes indexName email protected 20desc count true Return object stdC
  • 如何在网页中的特定 div 中垂直向下滚动

    我搜索了所有论坛 但没有得到我的问题的正确答案 我要测试的网页下面隐藏了一个链接 我尝试通过使用 xpath 或元素的 ID 属性搜索它来手动找到它 但在运行 Web 驱动程序脚本时找不到它 即使它没有在该元素上给出任何错误 我也会在下一个
  • 如何“git show”合并提交的差异?

    当我进行合并提交并运行时git show
  • FFmpeg:从 RTSP 读取时如何控制控制台输出?

    所以我创建了简单的Consol应用程序 FFmpeg RTSP视频流阅读器 仅使用通用FFmpeg C API 但是当ffmpeg从RTSP读取时它会显示大量信息 我没有询问是否 至少不是全部 那么我如何过滤 ffmpeg 输出的内容 我的
  • 如何在 Windows PE 32 位可执行文件中为我的代码洞腾出空间

    所以我想在minesweeper exe 典型的Windows XP扫雷游戏 链接 扫雷舰 所以我通过CFF Explorer修改了文件的PE头以增加文件的大小 text部分 我尝试增加原始大小 text分段1000h 新大小为3B58 但