如何在可执行文件中使用 .rdata

逆向工程 艾达 可执行
2021-06-30 08:43:00

在对可执行文件进行逆向工程时,我遇到了感兴趣的特定字符串,其中位于 .rdata 部分:

在此处输入图片说明

底层汇编代码如何使用这些常量字符串?是否在运行时动态计算相关字符串的偏移量(因为 ASLR)并使用?

1个回答

Windows 下 32 位 x86 的标准方案是编译器/链接器将虚拟地址直接插入代码中,这些虚拟地址是根据可执行文件的首选加载地址计算的(对于 EXEn 通常为 0x400000,对于 DLL 则为 0x10000000)。

如果可执行文件可以在其首选地址加载,那么一切都可以保持原样,并且不会使用重定位表;否则,重定位将应用于嵌入在代码和数据中的所有地址值(例如,当存在地址冲突和 ASLR 时)。

但是,当您使用像 IDA 这样的反汇编程序分析可执行文件时,二进制文件通常会加载到其首选地址,以便您可以直接跳转到(或通过)表中包含的偏移量,并且您还可以搜索原始地址字节以查找 IDA 可能遗漏的引用。

IDA 还允许指定不同的加载地址,以便您可以毫不费力地匹配基于 ASLR 的 rip。要破解 ASLR 加载的图像,您需要在找到实际加载地址后自己进行重新定位(重新定位)。

当然,像 MS VC++ 和 Watcom 这样有能力的编译器允许从高级语言中使用各种不同的寻址方案,例如相对(基于)偏移寻址等。所以以上只是一个粗略的指导方针。

基于表的引用在分析过程中带来了额外的困难:IDA 通常能够在数据(即表本身)中找到字符串的引用,但通常不容易找到引用的代码大多数单独的表条目似乎悬而未决。通常,您可以使用此类表的常规结构来推测它们的开头,通常您会发现第一个条目是从代码中的某处引用的。

但是,嵌入在表条目中的地址不必是条目中的第一项,因此与您正在查看的嵌入地址相比,对表基址的引用可能略有偏差。通过优化编译器,它会变得更加棘手 - 嵌入代码中的地址可能指的是表格之后的第一个地址,或者某些记录的中间,甚至是表格​​外几英里的地址。

在任何情况下,一旦您确定了表的范围并将其声明为数组(通常通过将第一个条目格式化为记录然后设置记录计数),IDA 应该能够帮助您。一旦你这样做了,IDA 就知道所有对表所涵盖地址的引用实际上以某种方式属于该表,通常你已经可以看到一个很好的外部参照链接供你点击。如果没有,那么您可以手动调用交叉引用。

注意:下面的设置

选项 | 一般... [Cross-references] 交叉引用深度

影响 IDA 发现外部参照的能力,这些外部参照位于数据项内部的某处,而不是指向它们的开头。有时我将值增加到 1000,当我处理大型结构时......