问这个问题几天后,我意识到我误解了我最初的发现。文件上的 .rdata 部分似乎被直接复制到内存中,但是前 36 个字节被加载程序用 IAT RVA 覆盖。关于添加 96 个字节的错误问题是我没有注意到我在测试中检查的字节序列在文件中重复的结果。
我刚才说的可能仍然不是 100% 准确。调查将在未来几天继续进行。
原始问题
我正在尝试编写一个程序来分析 Windows 可执行文件。我假设可执行文件中的部分直接复制到内存中。我在几个程序中注意到了奇怪的行为。
一个例子是crackme12.exe
。当我检查.rdata
加载到内存中的调试器部分时,我可以看到由于某种原因,在加载到内存中的部分的开头添加了 96 个字节,而可执行文件中并不存在。我花了 2 天时间试图阅读 Windows 可执行文档,但我找不到解释为什么会发生这种情况。
附加信息
我正在尝试在 Wine 下的 Linux 上加载这个文件。我使用的调试器叫做 OllyDbg。文件下载链接:http : //www.reversing.be/easyfile/file.php?show=20080602192337264
我正在尝试用 Common Lisp 编写程序。这是测试文件的链接:https : //github.com/bigos/discompiler/blob/master/test/lisp-unit.lisp
我尝试在 Windows 下加载相同的破解版并得到另一个惊喜。https://github.com/bigos/discompiler/blob/fc3d8432f10c8bd5dfd14a8b5e2b113331db15df/my-reference/images/differences%20between%20lin%20and%20win.png 的屏幕截图 显示 Windows 和 Wine 并排显示。
来自地址 x402060,在屏幕截图中以红色突出显示,显示从文件部分复制的数据。在加载操作系统时插入了 96 个字节。令我惊讶的是 Wine loader 插入了不同的数据。当您比较 Wine 和 Windows 之间的差异时,您会发现前两行有所不同。有人能告诉我发生了什么吗?
结论
结果表明,导入表 RVA 和 IAT RVA 被放置在 x402000 和 x402060 之间的地址处。所以看起来加载程序在这些表之后将部分复制到内存中。
我在我的小程序中添加了一些代码并得到以下输出:
RVAs: (((320 "Import Table RVA" 8228) (324 "Import Table Size" 60) "in memory from" "402024" "to" "402060") ((328 "Resource Table RVA" 16384) (332 " Resource Table Size" 1792) "in memory from" "404000" "to" "404700") ((408 "IAT RVA" 8192) (412 "IAT Size" 36) "in memory from" "402000" "to" " 402024"))