制作一个简单的汇编模拟器

Posted

技术标签:

【中文标题】制作一个简单的汇编模拟器【英文标题】:Making a simple assembly emulator 【发布时间】:2010-01-06 14:21:23 【问题描述】:

我正在研究检测未知病毒的项目,因此我将构建我的小型模拟器,它可以模拟可执行文件的汇编代码,以便检测是否通过将其模拟到虚拟寄存器然后观察发生的情况,它是否是病毒。 所以我需要帮助来获取 c 中每个汇编指令的代码。

【问题讨论】:

如果你这样问,我只能建议你做一些更简单的项目并学习。 到目前为止你做了什么? 您希望如何通过检查寄存器来检测病毒? AFAIK,最先进的防病毒程序使用已知病毒的定义文件。 “自动”检测以前未分类的病毒需要人工智能。 这听起来像是一道作业题——使用 C 实现一个基本的 x86 模拟器。 祝你好运!我记得 90 年代初有一家公司这样做(我的一个朋友参与了早期开发版本的测试)。我相信 AV 软件被称为 Victor Charlie。由于它们似乎不再存在,我猜测这比它看起来更难实现......我的意思是,如果我们甚至不能以编程方式确定给定的代码序列是否曾经“完成”,正确确定恶意意图似乎也是不可能的。 【参考方案1】:

如果你想创建一个 x86 模拟器,你可以看看这个完整的操作码列表: x86 Instruction Set Reference。但这似乎不是检测病毒的好方法。

【讨论】:

实际上,这是进行行为启发式和堆栈模式匹配的绝佳方式。您可以获取一些恶意软件并识别它在解包过程中推送到堆栈的数据模式,然后为其构建签名并模拟应用程序。如果 push/pop 的模式相同,则为启发式匹配。你只需要足够聪明就能避免陷阱(例如,在 EP 上使用 API 调用的 SEH 技巧)。【参考方案2】:

您正在寻找 Bochs,这是一个 LGPL 的 x86 ISA 和通用硬件模拟器。

【讨论】:

【参考方案3】:

寄存器值中没有任何内容表明恶意。你最好放弃那个。大多数试图检测恶意行为的沙盒所做的就是拦截系统/库调用。

使用上下文调用 ftable+1 %eax=1 %ebx=4000 %ecx=3F 也可能意味着发射核导弹,因为它可能意味着打印你好世界。 现在,如果您将自己的函数放在系统和可执行文件之间,您就可以知道发生了什么(将其识别为恶意软件并不那么容易)。

这当然不需要模拟器,所以你最好重新考虑一下,因为编写一个准确的模拟器非常非常困难。

【讨论】:

以上是关于制作一个简单的汇编模拟器的主要内容,如果未能解决你的问题,请参考以下文章

尝试用玩笑制作一个简单的 Axios 模拟

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器模拟执行

利用jshtml以及Css简单制作了一个模拟手机短信发送

ios framework 简单制作

制作简单汽车游戏

8086汇编语言学习 8086汇编开发环境搭建和Debug模式介绍