在过去的几年中,我使用了一些反汇编程序并尝试了一些反编译器,如今关于深度学习和AI的讨论和内容太多了,我想知道是否可以将某些任务用于这些任务(经过一些人工培训),以及是否有一些已经使用它的工具。

评论

我喜欢这个问题,最近才真正想到它。虽然它与RE相关,但我认为ai.stackexchange.com可能更相关,因为此问题更多地与AI目标定义和培训有关,而不是与反汇编/反编译程序的实际过程有关。
拆卸的机械过程(纯粹是解码指令)保持不变;没有什么可以让人工智能做得更好。 AI可以帮助确定要分解的内容,即,区分代码和数据的旧问题,然后仅针对那些显然不是可执行代码的一部分或一部分的路径。线性扫描和递归反汇编都可以标记大量的“实际代码”和“(可能根本不是)代码”,但是中间的灰色区域是问题所在。 ..(ctd)

..我不认为AI可以告诉我们的不仅仅是纯粹的机械过程。也就是说,最好的反汇编程序应该能够“运行”整个程序并检查所有可能的代码路径,这是纯粹的机械练习。尚未这样做的唯一原因(是)是因为从根本上说这是一个NP问题。另外,如果所有代码都写成100%正确,那么您将永远不会崩溃。

@ usr2564301我认为观察反汇编代码有很多模式工作,如今有不错的工具可以绘制功能分支的位置图,但是我认为AI有助于猜测/建议功能的作用,正在检查的数据

#1 楼

首先,您必须先定义AI的含义才能回答这个问题。因为这可能是计算机科学领域中最差的名称。当人们想到“模仿人类推理的程序”时,现实更多地是“自动启发式算法识别大量样本中的模式” ...

因此,我将采用更准确的AI定义,就是说,我假设一个AI程序可以识别出可能无法理解人类的模式,并且它们可以自我训练以实现这一目标。问题绝对不在于识别模式,而是重建可以在二进制文件中找到的所有执行路径。因此,选择一个AI算法根本就不会引起人们的兴趣,因为一条执行路径比另一个更有价值,因为它们都很有趣(因为反汇编程序需要详尽地找到所有路径)。

最后,谈到反编译,这是您可能希望使用AI识别某些模式的领域,例如:与恶意软件数据库中的另一个示例相似;
对软件的架构(复杂的数据结构(数组,记录),函数,对象,模块,包,... ),即使经过模糊处理后也没问题;
认识到最常见的功能及其可能的用途;
...可能还有许多其他可以自动化的猜测...

但是,这里的要点是我们都被卡在了拆卸问题上(这是一个相当大的问题!!!)并且要走得更远,我们首先需要有一个合理可靠的方法d /算法/工具以达到下一个级别(反编译)。在Google上只有1000万):



机器学习辅助的二进制代码分析,Nathan Rosenblum,Xiaojin Zhu,Barton Miller和Karen Hunt,NIPS 2007。 2015.

使用递归神经网络进行反编译,作者Deborah S.Katz,Jason Ruchti和Eric Sc​​hulte,SANER 2018,

进化反编译器,作者Matt Noonan,2018; br />

#2 楼

尽管我最初投票决定以主要基于观点的观点来结束这个问题,但是鉴于两个答案都具有相同的一般答案(“否!”),我也会回答。我只是喜欢当恶魔的拥护者。

一般立场

这个问题很难回答。作为一个来自安全领域的人,过去曾从事过许多与机器学习相关的项目,我知道很难诚实地预测是否有可能使用机器学习解决我们领域的问题。 ML / AI研究通常是关于反复试验的。

AI反汇编程序

尽管反汇编字节序列的操作非常简单,但是如今,通过一些巧妙的启发式方法可以解决许多问题。这些问题包括:


识别函数边界。
对代码VS数据进行分类。
从汇编中推断结构和更高级别的结构。 >以及更多。

随着时间的流逝,大部分此类问题已得到改善,主要是通过为反汇编程序创建和改进手动编写的试探法和逻辑准则来解决。主要是基于人类经验和过去看到的错误结果。

但是,看到全自动反汇编器中的错误仍然很普遍,并且有证据表明我们可以看到反汇编器将重点放在反向工程师身上,以手动校正和调整自动化分析。有人可能会说ML / AI方法可能会创建相似或更好的启发式方法,以及更复杂/更准确的规则。一般认为,即使进行了完美的拆卸,反编译也很难完成。它在很大程度上依赖于推断更高层次的结构,例如结构,对象,类和继承。它要求更准确的数据类型识别以及对抽象对象的更苛刻的理解和推理。即使是人类,也难以手动识别,更不用说使用自动规则和启发法了。因此,反编译可能会证明是进行此类改进的沃土。

关于流行语的说法

现在,当初创公司基于在营销中使用正确的流行语而兴衰时很容易陷入使用此类流行语而不是准确描述,而迫使问题解决的问题,而不是为眼前问题找到最佳解决方案。

#3 楼

不!

原因是AI愚蠢,比您想象的要愚蠢得多。它所能做的就是匹配模式以预定输出。这是使用它来反编译代码或重新创建“可读”源代码的两个主要问题:


此匹配并不完美。例如,如果您具有mov, eax 0x10,则可以将其解释为i=8;,因为AI没有此粒子训练集,但它具有mov, eax 0x8
另一个大问题是如何养活AI。在翻译工具中使用句子,在图像识别中使用来自整个图像的特征。在代码中使用什么?操作码很少?多少?从哪儿开始?

总而言之,人工智能(在现阶段和不久的将来)在此方面几乎没有用。

#4 楼

我想说是,但我必须说不。问题是计算机抓住了我们编写的程序并对其进行了优化,而这些程序通常对人类几乎没有意义。您会看到事情成倍增加,并且正在使用数组,您可以了解正在发生的事情,但是以这种方式处理数据是非常不明智的。计算机和人类的想法大相径庭。

我认为AI可能会执行以下操作:


抓取装配体并进行转换,或者使它们更清晰供
人理解。
进行几乎可用的组装。 (也许...。因为我们会保持计算机对相关数据的完整理解。)

举个简单的例子:

MOV v7, DWORD PTR [v7 + 0x8]


将转换为

v7 = *(_DWORD *)(v7 + 8);


然后转换为

v7 = *(v7 + 8)


这可能实际上与源代码完全不同。

您可能会在其中看到类似

mov eax, dword ptr ds: [ESI*deadbeef+0b0] 


,并且计算机会认为
>


int a = somefoovar[v5].someint


都是正确的...如果该数组中没有变化的数据。

但是当它可能是暂时的东西时,计算机可能会将其视为单个变量。另外我还注意到,在我自己的反编译工作中,您将获得最初启动时的更多静态变量。曾经碰到过函数的某些部分并且可能不了解所有事件路径。

我个人想了解一下AI可以带来什么。拥有代码的伪翻译器可能会很好。但是我知道我将不得不对其进行清理并更正它的理解。