你如何开始分析?您是从主要开始并从那里扩展,还是您有更好的方法?
从详尽的基本分析(动态和静态)开始 - 枚举导出、导入、函数使用、系统调用、winapi、互斥体、dll 依赖项、字符串和一些 grepping。对基本沙箱进行动态分析得出一些结论,虽然是局部的并且可能有些错误,但您现在可以对executable/dll的一些主要功能提出几个理论。
也就是说,如果我们谈论的是 java/.net 等——当然——反编译它们,但在这种环境中使用恶意软件并没有常见的做法。
如果你发现函数调用了一些可疑的东西——假设 exec 试图写入一些关键的系统文件/注册表值,或者部署奇怪的命名文件——你应该担心(或高兴,取决于你的帽子颜色:))
您如何找到和识别重要功能或您感兴趣的特定功能?
字符串很有帮助——你可以发现一些可疑的东西,比如以 cmd.exe 开头的字符串......甚至主机名、用户密码组合,以及其他资源黑客和依赖步行者是枚举导出、导入和包含的资源的基本工具。最重要的功能几乎总是必须在 IDA 或类似的静态分析工具中进行逆向工程。
您如何绘制高级控制流?
如果上述所有方法都失败了,IDA 的绘图功能非常好,可以用于它。
您如何管理已确定的辅助例程?我觉得书签不够用,记事本太原始。
IDA 有评论系统、着色选项、重命名等等。对于整个过程,我喜欢在需要时将事情绘制出来,这是最清晰的方法——即使在 visio 上也是如此。
如何避免在汇编代码的雪崩中迷失方向?
您几乎从未在 asm 级别上对所有可用代码进行工程改造。有些在动态分析方面效率更高(Olly 和 Immunity 很棒——Immunity 是一个有很多曲折的 Olly 分支),而且你永远不需要为了弄清楚它而反转所有代码。我在 IDA 中有一个颜色编码,并不断将已经反转的部分重命名为比“loc_402BBD”更合理的名称
处理此类任务的任何其他技巧/提示?
- 永远不要陷入一种思维状态,它会给你带来很多麻烦——想想分析代码几天,而不是得到一些完全改变你看待事物方式的部分,太可怕了。
- 练习,很多,没有什么比得上的,相信我。