时不时的有一些人会提交一个关于受保护或混淆过的AutoIt脚本的有趣的挑战。今天我想展示一些AutoIt反混淆的基本方法。我将使用一个非常简单的叫作AutoGuardIt的保护软件和一个来自于Tuts4You论坛中由其保护的carckme作为目标对象。如果你没有权限从Tuts4You下载的话,这里有一个可供选择的下载链接:https://www.mediafire.com/?qs52emp7tkk472g。
一般来说,在反编译AutoIt脚本方面没什么困难。AutoIt脚本解释器由于其设计方式的原因,很容易将P-Code转换回脚本格式。还有一个叫作tidy.exe的工具,可以处理难看的手写脚本,将其重新排版,变得很美观。以上两点使得写反混淆器变得容易多了,因为你可以从一个具有良好版式的AutoIt脚本开始,并且你的反混淆器可以包含一些简单的正则表达式和字符串替换,可能不会是非常完美的代码,但是将会很管用。
当我准备这个博客帖子的时候,SmilingWolf 发出了一个Python语言的全功能的解决方案。这个方案不错,但是该方案没有解释它是如何工作以及为什么会起作用。所以,在这篇文章里我将解释保护方法是如何工作的,展示一些基本的技术和击败这些保护步骤的示例源代码。至于如何制作一个全功能的反混淆器,将作为练习留给读者来做。
所需工具
*C#编译器。我所有的示例在是在VisualStutio2010下进行测试的,但是任易最近的版本都应该适用。
*MyAutToExe。我在使用的是我自己修改的myAutToExe。你可以从Bitbucket: https://bitbucket.org/kao/myauttoexe上面来下载。
*用于测试正则表达式的工具。我使用的是 http://regexr.com/
*一些脑力。如果你不能独立思考的话,你不可能成为一个reverser。
反编译脚本
有两个公开的工具用来提取编译过的 AutoIt 脚本:MyAutToExe 和Exe2Aut.
Exe2Aut使用动态方法获得脚本--它通过运行文件,从进程内存中得到经过解密、解压缩的脚本。那一般是最简单的方法,但是你不会真得想要在你的计算机上运行通过运行一款恶意软件来获取其脚本。
MyAutToExe使用的是静态方法--它通过分析文件,尝试从文件中定位、解密、解压缩脚本。那是一种安全一些的方法,但是容易被使用不同的加壳工具,修改过的脚本标记器等方式击败。从本文中的crackme中提取脚本,我使用的是我自己的MyAutToExe (见上面的“所需工具”部分)。
分析混淆
一旦脚本被提取和反编译后,它的样子起来很奇怪并且很难读懂。
我们来逐一看一下每种混淆技术,看它们如何工作,如何来打败它们。
整数分解
AutoGuardIt 处理常数并将它们转换成一系列的数学运算。
反混淆器应该能够处理这些表达式,计算求值然后使用正确的值来替代相应的表达式。
这里存在的最大的问题是计算的优选级(乘法、除法应该比加法、减法优先进行),所以你不能从一行的开始起一次一步的进行计算。。这将是错误的:
在一些思考和Google搜索之后,我找到了一个LoreSoft.MathExpressions动态库可以为我做这些艰苦的工作。:)
下面的c#代码片段将会找到所有的数学表达式,提取,计算并使用计算得到的值来替换掉相应的表达式。
伪随机整数
这是很奇怪的保护,依赖一个事实,Autoit的Random函数实际小是伪随机数生成器。如果你提供相同的种子,将得到相同的结果,示例:
通常来说,这不是一个好的想法,因为你无法保证下一版本的Autoit随机数生成器不会改变。但是就当前的版本来说这种方法依然生效。
由于我已经使用了myAutToExe,我决定使用其打包文件中的RanRot_MT.dll 。
小整数可以使用StringLen函数进行混淆。
为了清除它们,可以使用一个简单的正则:
最终结果:
一些字符串在运行时被分解为字节,每个字节被调用Chr函数进行加密。
另一个简单的正则表达式能够杀死这种加密方式:
这一结果是可用的,但是仍然不便于阅读:
再额外使用另一个简单的查寻-替换可以用来修复:
最终结果:
If 1 Then
一旦你去除了整数混淆,你将会看到很多像这样无用的声明:
这个条件一直为真,所以我们可以把If和EndIf都去掉来提高可读性。
此处的问题是If语句可以嵌套,你不能简单的去除所遇到的第一个EndIf。考虑一下这个例子:
把以上所有的考虑在内,我写出了这个很丑但是有效的代码:
* –看下面,在一些场景中,这个代码在可能会失效。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)