您好我尝试学习逆向工程,所以我使用process hacker
来查看流程内存中的动态字符串......
我得到这样的东西:
Address Length Result
-----------------------
0x853978 (43): hello
0xfb5e1a8 (86): hello alex !
现在我想知道如何获取/找到它们的参考地址?
我尝试使用WinHex
,但我不知道,我不知道我该怎么做,是否可以在文件格式的内存地址中找到参考汇编地址(例如:0x853978
)或者这是不可能的。
任何人都可以提供帮助吗?
答案 0 :(得分:3)
halting problem的变异,所以不可能,但可以在多项式时间内完成一些不完美的弱启发式算法,以找到常见的模式。
如果代码编写者决定避免加载地址的常见模式,例如出于混淆的原因,它可能是从多项式等计算出来的。用软件工具实际上是不可能找到的,所以只能拆解代码和了解它有帮助。
但是......为什么即使在非神秘的情况下你也不能使用winhex。
您没有发布有关您平台的任何信息,因此请猜测它的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"在运行时期间引用指令。这不会显示所有这些,除非你强制代码运行所有组合,但如果你感兴趣哪个代码在特定情况下访问它,这就足够了。