对于逆向工程师来说,直接从逆向分析的二进制文件中调用函数得到结果,这样可以绕过很多不必要的工作量。虽然某些情况下可以理解函数逻辑并用更高级的语言重新实现它,但这并不是一直可行的,而且原始函数的逻辑越复杂就越行不通。在处理自定义散列和加密时,这是一个特别痛苦的问题——计算中某处的单个错误将导致最终输出的完全分歧,这是一项艰巨的调试工作。
Miniduke病毒恶意软件使用了自定义的SHA1算法,该算法在原始和修改后的 SHA1 中使用的常量都相同,因此差异必然出现在函数的 1,241 条汇编指令之一中的某处。我们不能说这种调整是否是故意引入的,但事实仍然是恶意软件作者越来越喜欢插入这样的“惊喜”,而处理它们的责任就落在了分析师身上。为此,我们必须首先了解函数期望其输入并产生其输出的形式。
本文将介绍使用unicorn执行Miniduke病毒自定义的SHA1算法,得到其输出结果。
上下文环境
本文模拟执行的函数是IDA中名称为SHA1Hash_407108的函数,该函数实现了Miniduke病毒自定义的SHA1算法。经实际分析调试发现,SHA1Hash_407108函数使用自定义调用约定,其中要进行处理的散列的缓冲区长度在ecx寄存器中传递,缓冲区本身的地址在edi。eax是固定值0xffffffff,我们可以将它视为一个常量。有趣的是,恶意软件还会在每次调用此函数时将缓冲区长度 ( ecx)设置为仅对缓冲区的第一个字节进行哈希处理,如图中的0x40。
在代码中体现为:
一、SHA1BUFF_LEN = 0x40
二、 CONSTVAL = 0xffffffff
三、EDI赋值为BUFFERADDR的地址