我正在考虑一种反编译方法,该方法使用二进制可执行文件的运行时行为来提取可用的编译数据。分析运行时行为(即在每条cpu指令之后进行陷阱并检查它的作用),我们可以获得许多其他信息,例如: “ .text”)和二进制asm
附加信息,哪种数据类型位于哪个寄存器或全局/局部变量(指针,浮点数和整数)中,其中cpu指令从此处开始堆栈行为,我们可以得到非常有用的启发式方法,函数/内部函数在哪里以及它们具有多长时间/什么类型的参数。不会那么远。

有可能吗?是否已经存在能够执行此操作的任何工具/软件?

评论

您所说的听起来像是funcap和Hex-Rays Decompiler的组合。

@JasonGeffner谢谢!听起来很有趣。

在莫斯科大学,有一个员工使用补丁版本的qemu破解了我严重混淆的破解程序,以模拟代码并跳过反调试代码。

@Stolas我认为,如果正常的二进制文件(无需故意设置反Dissm陷阱)可反编译,一开始就足够了。例如,如果甚至可以创建一个asm代码,那么它已经可以转换为等效的C代码,该代码也可以在其他体系结构上进行编译。

@peterh如果您要构建这样的东西,我曾经以libemu为基础制作了一个裸版本。我用它来模拟代码并将其作为libemu运行。

#1 楼

此问题与图灵机上的停止问题有关(已知这是不确定的)。

通过仿真处理反编译假设您必须至少遍历软件的所有分支,并且如果必须经历(可能)无限循环,则无法保证达到所有可能的程序点。 。

但是,这是一个理论上的问题,您在现实生活中不太可能发现(除非故意将其种植在这里以防止通过仿真进行全面探索)。

但是,从更实际的角度来看,只有在您可以在运行时轻松浏览所有路径的情况下,才能进行所有路径的浏览,而要求用户解决挑战(可能是在线的),例如给出密码,其哈希值存储在程序中,或者通过签署消息并将其返回给软件来证明他拥有私钥。

评论


我认为在条件分支的情况下,条件的方向也可以否定以映射替代方向。当然,这可能会导致软件故障,但对于二进制文件中的每个条件跳转,都应该只执行一次,这不会太多。

–peterh-恢复莫妮卡
2015年9月13日下午16:26

除了您实际上是否需要结果来处理其余软件(除非说它从用户输入生成密钥并使用它来解密其余程序的汇编代码)外。

–恐怖
2015年9月13日在16:57



我正在考虑一个两阶段的解决方案:1)运行未修改的软件,并尽可能收集尽可能多的数据2)使用收集到的数据,仅需要重新访问没有映射到两个方向的条件分支。

–peterh-恢复莫妮卡
2015年9月13日下午17:00