可以在文件中获取特殊内存地址的引用程序集地址吗?

possible to get reference assembly address in file for special memory address?

你好我想学习逆向工程,所以我使用 from process hacker 查看进程内存中的动态字符串...

我得到这样的结果:

Address  Length Result
-----------------------
0x853978 (43): hello
0xfb5e1a8 (86): hello alex !

现在我想知道如何 get/find 为他们提供参考地址?

我尝试使用 WinHex 但我不能,我不知道我该怎么做,是否可以在文件形式的内存地址中找到参考程序集地址(例如:0x853978 ) 或者这是不可能的。

有人可以帮忙吗?

它是 halting problem 的变体,所以这是不可能的,但是一些不完美的弱启发式算法可以在多项式时间内完成以找到共同的模式。

如果代码编写者决定避免加载地址的常见模式,例如出于混淆的原因,它可能是从多项式等计算的。实际上不可能用软件工具找到,所以只能反汇编代码并理解它会有所帮助。

但是......为什么即使在非神秘情况下你也无法使用 winhex。

您没有 post 任何关于您的平台的信息,所以我们猜测它是 x86-64。然后大多数二进制文件都是 PIC,因此引用特定数据的代码是通过添加到当前 rip(指令指针)的相对偏移量来实现的。像lea rdx,[rip+1234] ; rdx = address of string "hello" ..然后+1234字节超出这个指令操作码是第一个字节'h'。因此创建一个工具,将所有可能的组合视为位移偏移并将它们添加到当前虚拟地址可能有助于找到对二进制特定位置的引用。

即使你知道,你正在寻找 1234 位移,x86 是小端,所以 32b 位移常数 1234 == 0x4d2 在内存中存储为 d2 04 00 00

但是在RE中通常也会使用一些反汇编工具来反汇编代码,所以你可以自己检查它,找出它是如何工作的,以及它访问特定内存的位置。反汇编器并不完美(出于同样的原因,正如我在开头提到的),但是最好的反汇编器已经合理地调整了启发式方法以正确检测通用代码并以合理可读的方式反汇编它(尽管如果有人敢于使用一些技巧来制作反汇编程序更难并添加反调试措施,您可能不得不回到旧纸+铅笔并手动模拟它以突破初始防御使其可调试)。

这个答案听起来可能相当悲观和消极,实际上您通常会遇到完全不复杂或混淆不佳的二进制文件,并且大多数专业反汇编工具都会产生合理的结果,只需将它们读取为asm 源代码,调试器也应该适用于大多数二进制文件。虽然如果该代码是由高级语言编译器生成的,将会有数千行代码,并带有剥离的调试信息,因此最好有经验来确定代码的重点位置,因为您无法遍历*所有*在合理的时间内。

编辑:

您还可以在某些平台上使用内存访问断点调试,找出在运行时间内任何"live"引用的指令。这不会显示所有这些,除非您通过所有组合强制代码 运行,但如果您对在特定情况下哪些代码访问它感兴趣,这就足够了。