2017-10-16 128 views
0

你好,我努力学习逆向工程,所以我从process hacker用来查看进程的内存动态串...可能获得特殊内存地址文件中的引用程序集地址?

我得到这样的:

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

现在我想知道如何能我得到/找到他们的参考地址?

我试用WinHex但我不能,我不知道我该怎么做,是否有可能找到文件形式的内存地址参考汇编地址(例如:0x853978)或这是不可能的任何方式。

任何人都可以提供帮助吗?

回答

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源代码,调试器也应该能够与大多数二进制文件一起使用。尽管如果代码是由高级语言编译器生成的,将会有成千上万行代码,带有剥离的调试信息,因此有经验可以精确定位代码的焦点位置,这是很好的,因为您无法通过* all * of它在合理的时间。

编辑:

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