前两个星期内,我虽然仅仅只学习了程序逆向里的动态分析技术,但在前面的学习中,我们不难看出动态分析技术的强大,从程序的一般逆向,到程序的脱壳,再到动态密钥的破解,都能够迎刃而解。不过,这也不意味着动态分析技术就是万能的,静态分析技术就没有用武之地。这次,我们一起来看看静态分析技术相对动态分析技术的优势在哪里吧。

这里,我把我的一位要好的网友使用C++语言给我编写了一个练习程序作为样本来进行破解。

运用动态分析技术破解

首先,老样子,我们使用x64dbg进行调试程序,并运行到断点附近:

程序逆向(反编译)技术学习日记四——从动态分析到静态分析1.jpg

在断点附近,我们看到了4015F0h处对应的字符串”114514abc”像是密钥,并且附近没有比较正常的字符串了,所以我们基本就可以判断这个字符串就是我们想要的密钥了。

当我们满怀欣喜去输入密钥时,发现密钥竟然错误:

程序逆向(反编译)技术学习日记四——从动态分析到静态分析2.jpg

看样子,真正的密钥似乎被隐藏起来了,或者有可能就在我们眼前,只是我们没有搞懂其中的逻辑呢?接下来,静态分析技术的用武之处就体现出来了。

运用静态分析技术破解

接下来,我们使用静态分析常用的软件IDA进行分析源码,使用F5键将汇编代码转换成类C语言,便于我们分析:

程序逆向(反编译)技术学习日记四——从动态分析到静态分析3.jpg

从上面标注,我们可以看出,If语句后面的”“前面是“==”逻辑符,也就是判断语句。那么,要想Print出”OK”字样,就要满足变量是v4或者v5特指的字符串。再继续往上分析,v4是和v7还有v8绑定的,而且”“前面的运算符为”+”,并且v4再最前面,也就是变量,所以说,v4 = v7 + v8,相当于我们找到v7和v8对应的字符串,然后完成加法运算,就是我们想要的真正的密钥v4了。

再往上查找,v7对应的是字符串“63跦彈”,v8对应的则是”萃”,而字符串”114514abc”对应的是v6,在程序运行过程中没有任何的引用,所以这就是程序员故意设置的干扰密钥。

综上所述,我们要找的密钥就是”63跦彈萃”。

我们输入密钥,破解成功:

程序逆向(反编译)技术学习日记四——从动态分析到静态分析4.jpg

所以,有些程序员为了防止别人使用动态分析技术提取字符串然后破解程序,一般会设置干扰变量,然后使用难辨认的汉字设置密钥片段,并进行简单的运算,这样动态分析技术就不能完全胜任了。所以,在逆向程序的时候,要学会运用动态分析加静态分析的方式进行综合分析,然后破解。