用于反混淆 Astaroth/Guildma 注入器 DLL 的 IDA Python 脚本
在尝试分析近期 Astaroth/Guildma 攻击活动中使用的注入器 DLL 时(感谢 SANS ISC 的这篇日记),我遇到了一个极其烦人的混淆手段。
有一个函数(我在下图中将其命名为 time_waster_3000)在整个 DLL 中被调用了 1,000 多次(!!!)。该函数将六个硬编码字符串作为参数,外加一个随机的 word。就我目前所知,这个函数本身就是一个毫无实际用途的算术无底洞(除了浪费逆向工程师的时间)。以下是在这些烦人的调用存在时 DLLEntry 的样子:
这个 IDA Python 脚本的目的是隐藏所有涉及调用这个垃圾函数及其参数的代码块。以下是运行脚本后 DLLEntry 的样子:
该脚本通过查找对填充函数的调用来工作,在脚本中以 call sub_CHANGEME 表示。因此,你需要将其重命名为你所处理样本上找到的函数名。例如,将 idc.print_operand(x, 0) == 'sub_CHANGEME' 改为 idc.print_operand(x, 0) == 'sub_431000'。
我选择遍历 call sub_CHANGEME 指令,而不是遍历参数压栈指令。原因很简单:硬编码字符串在二进制文件中多处存在;因此,当我尝试通过涉及这些字符串偏移量的 push 指令进行搜索时,脚本无法找到这些垃圾数据的所有实例。
该脚本之前的工作方式是将每次参数传递和调用填充函数作为一个折叠块隐藏起来。由于该函数被连续多次调用,这导致反汇编视图中出现巨大的空白区域。我已经对其进行了更新,将连续的填充实例隐藏在一个单一的折叠块中,这确实大大提高了可读性。