我正在研究一个混淆的二进制文件,作为crackme挑战的一部分。它有一系列push
,pop
和nop
指令(重复数千次)。从功能上讲,这些块对程序没有任何影响。但是,他们非常努力地生成CFG和逆转过程。
有关于如何将指令更改为nop的解决方案,以便我可以删除它们。但在我的情况下,我想完全剥离这些指令,以便我可以更好地了解CFG。如果指令被剥离,我理解必须修改内存偏移量。据我所知,没有工具可以直接实现这一目标。
我正在使用IDA Pro评估版。我也对使用其他逆向工程框架的解决方案持开放态度。如果它是可编写脚本的,则是可取的。
我经历了similar question但是,建议的解决方案不适用于我的情况。
答案 0 :(得分:7)
我想完全剥离这些说明......我知道内存偏移也必须修改......
一般来说,这实际上是不可能的:
如果二进制文件导出任何动态符号,则必须更新.dynsym
(这些可能是您正在考虑的偏移量)。
您必须找到每个静态分配的函数指针,并使用新地址更新它,但没有有效的方法来查找此类指针。
计算GOTO
和switch语句创建函数指针表,即使程序源中没有。
正如Peter Cordes指出的那样,可以编写在两个汇编标签之间使用delta的程序,并使用这些增量(直接编码为指令的小立即值)来控制程序流。
你的目标程序可能没有上述所有复杂情况,但是花费大量精力在一项仅适用于该程序的技术上似乎很浪费。