共计 1643 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 这篇文章主要介绍了 AutoIt 脚本的反编译和代码格式化问题分析, 需要的朋友可以参考下 |
最近集中冒出一波 AutoIt 的恶意脚本来,也就多看了几个这类的样本。AutoIt 脚本是以“.au3”为扩展名的明文脚本,但病毒作者自然不会把明文的脚本放出来。所以自然用到了 AutoIt 自带的这个 Au2Exe 的工具:
可以看到 AutoIt 允许用户将 au3 的明文脚本编译成 exe 文件或者 a3x 文件。exe 文件自不必赘述,就是我们平时熟悉的 PE 文件,但如果编译成 exe 文件,则失去了 AutoIt 脚本在恶意程序领域的优势(懂的自然懂,不细说),所以目前捕获的大多数恶意样本都是将脚本编译成 a3x 文件。
网上比较多的是 Exe2Au3 的反编译工具(据说早期版本的 AutoIt 是自带这个工具的,后来不带了),但下了几个,都很耿直——真的都只能反编译 Exe 文件,而对 a3x 文件表示无力。最后才找到了一个叫做 Autoit3 Decompiler GUI 的工具(https://www.jb51.net/softs/390596.html):
用这个工具,就能很简单的将 a3x 文件反编译成 au3 的明文脚本了。BUT——为什么万事总有个 BUT——反编译出来的脚本看着有些忧桑……
就这代码格式……几十行还可以忍,一两百行已经是上限了……恶意代码动不动几千行,看着脑袋都大啊……本着磨刀不误砍柴工的思想,果断写了一个自动格式化脚本(by Python),贴出来和大家分享下。
说明:对 AutoIt 了解不多,仅针对我目前见过的脚本,做一个比较粗陋而暴力的格式化工作而已
#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-
_AU3 = ';./sample.au3';
_AU3_OUT = ';./format.au3';
_INDENT = ';'; * 4
def au3formater(line, indent):
line = line.strip().lower()
next_indent = indent
if (line.startswith(';end';) or
line.startswith(';until';) or
line in (';next';, ';wend';)):
indent -= 1
next_indent -= 1
elif line.startswith(';if';) and line.endswith(';then';):
next_indent += 1
elif (line.startswith(';func';) or
line.startswith(';for';) or
line.startswith(';select';) or
line.startswith(';switch';) or
line.startswith(';while';) or
line == ';do';):
next_indent += 1
elif line.startswith(';else';) or line.startswith(';case';):
indent -= 1
new_line = _INDENT * indent + line
return new_line, next_indent
def main():
with open(_AU3, ';r';) as fp:
with open(_AU3_OUT, ';w';) as fpw:
indent = 0
line = fp.readline()
while line:
new_line, indent = au3formater(line, indent)
fpw.write(';%s\n'; % new_line)
line = fp.readline()
if __name__ == ';__main__';:
main()
格式化完成后,看着就舒服多了(不确定是否是我个人的强迫症而已……):
当然,即便是看着舒服些了,即便是明文脚本,几千行的代码看着也是很忧桑的