探索黑客技术攻防,实战研究与安全创新

导航菜单

最简单的逆向工程基础

看着这么多的产品被逆向工程,大家是不是觉得很不可思议?其实任何事物的发展都是自身矛盾斗争的结果,没有黑客,就没有现在日渐完善的网络建设,没有逆向工程者,也就没有软件加密技术的迅速的提高,和对系统研究的日益深入,逆向工程技术只要运用得当,对弈IT的发展,其推动作用是巨大的,所以在本期栏目中正是开始之前,我再次重申,大家学习中一定要把握好学习的方向和目的,如果误入歧途,不管对自己还是对社会,都是一个悲哀的结果。

走近逆向工程

前面几期基础知识栏目的介绍相信看的大家有点不耐烦了吧?想真刀真枪的来自己亲手跟踪一个软件试试了?好,这一期我们就来一次手把手的教学,正式走入逆向工程的殿堂。

逆向工程一般是利用调试器,从汇编代码的级别研究软件的运行机制,所以,对于汇编语言的掌握和调试器的使用的熟练程度,很大程度上决定了逆向工程研究的顺利与否。所以我会在讲解中穿插一些WIN32Asm的具体知识,希望能对大家理解代码有些帮助。关于win32asm的具体资料公开出版的并不是很多,据我所知,市面上只有一本地质出版社出版的《windows环境下汇编语言程序设计》是具体讲述win32asm的

Chinapub和华储都有邮购,需要的朋友可以去了解一下具体的情况,我在这里只将一些最基本的东西讲清楚,有利于后文对具体代码的理解。

由于大家是第一次入门,我们就以TRW2000为例,这个调试器比Soft-ICE小巧,简单。不过功能却一点都不输给Soft-ICE,唯一的缺点就是不支持win98以上的操作系统

还没有TRw的朋友可以去下载TRW的各个版本,版本的升级主要针对兼容性,具体的操作并没有什么不同。

我们现在第一个最简单的目标是Crackine01.

对于比较简单的保护体系,静态反汇编分析往往比动态跟踪调试更快找到保护体系的关键点。所以,我们先来静态分析一下Crackine01.

在静态反汇编工具选择上,对于简单的保护体系,没有必要选择IDA Pro这中专家级别的反汇编器。W32dasm就足够了,打开w32dasm我们可以见到界面如图一

图片1.png

点击图中所示的按钮,选择要反汇编的文件,我们在选择Crackine01.exe选择好后,w32dasm自动开始反汇编的工作,但会变完成后,界面如图2所示

图片2.png

点击途中所示“串式数据参考”的按钮,就可以查看软件中的字符串资源,在Crackine01中,字符串资源很明显,大家一看就知道了,然后双击其中一个字符串资源,就可以调到引用该字符串的地方,而对于大一些,复杂一些的软件的保护体系,我们需要有耐心,慢慢翻看“字符串参考”窗口中所有列出的字符串,找到和注册相关的信息,然后双击找到的字符串资源,就可以找到引用改字符串的地方,因为我们找的是和注册相关联的字符串,所以,找到的代码,十有八九也和软件的注册保护体系密切相关,对于简单的保护体系,找到一两处代码,差不多就可以看出个八九不离十了,而对于大部分软件来说,其保护体系的墙布都不算低,所以,需要我们找到多处代码,结合win32asm我知识,综合考虑各种情况,流程,从而把握住软件的保护流程。

对于Crackme01,我们双击“抱歉,输入的注册码错误”一项可以看到如下代码:

图片3.png

图片4.png

图片5.png

要大致看懂上面的代码,相信学过汇编的朋友都没有太大的问题,可是Win32Asm和DOS下的汇编有着巨大的区别,为了让大家以后的学习更加轻松,我爸上面的代码每一句都加上了注释。并且在这里做如下说明:

1.基本上所有的Windows API调用的参数传递形式都是StdCall型,也就是说参数的压栈顺序是从右压倒左,以最简单的Messagebox函数为例;在Msdn中,对messagebox的描述是这样的;

图片6.png

在Stdcall的参数传递规则下,用Asm调用Messagebox的代码应该如下所示:

图片7.png

大家看清楚了吗?从右到左,一次压栈,基本上,所有的WinAPI都可以照着这个规则用ASM来进行调用——只有一个例外:wsprintfA,这个函数的参数是不定的,具体情况可以参考罗云斌写的:《汇编语言中参数传递的格式》一问

2.一个函数的返回值,基本上所有的翻译器都会吧函数的返回值放到EAX和EDX中来进行返回。返回值为32位的时候,放在EAX中,返回值为64位的时候,放在EDX:EAX中。

了解返回值的概念对于理解大部分软件的加密体系的工作原理是大有好处的,大部分软件的加密体系都遵循如下结构:

取得用户输入的注册码→变换→和软件内部条件对比→正确则注册成功,否则失败。

很明显,该流程最关键的一环就是“和软件内部条件对比”这一步,到底对比了以后,如何算是正确,如何算是错误呢?大部分的软件都是用一个子函数的返回值来代表正确或者错误的。而在跟踪调试的时候,我们看到的返回值,就是子程序出口处的EAX的值,所以掌握了返回值的意义,就能很容易的了解保护体系的工作原理。

Win32Asm的基础讲解暂时到此为止,让我们回到我们的Crackme01

很明显,程序在401086处,调用了GetDlgitem TextA函数来取得我们输入的注册码。存放在地址为403038的缓冲区里面,403038是怎么来的,很具我的注释可以看的很清楚吧?不需要在细讲了吧?紧接着,程序使用lstrcinp的手段来进行注册码比较,在上面的代码里面,很明显,把我们输入的数据(地址为403038)和软件自身的数据(地址为40309C)进行了比较,根据比较的结果来确定注册正确与否。

那我们来看看地址为40309C的地址到底存放了什么数据呢?

看数据之前,让我们搞清楚一个概念:VA,

VA:虚拟地址。Windows运行于保护模式下面,每一个程序有自己独立的4GB的地址空间,代码运行时,EIP指向的地址为保护模式下的地址,也即虚拟地址,要经过选择子转换和地址页表转换机制才能转化成为真正的物理地址,所以,在同一时刻,程序A和程序B可以同时运行于某个相同的地址,这在DOS下面是不可能发生的事情,我们在反汇编代码中看到的40309C等地址就是这个软件的虚拟地址——VA

可是知道了VA,在静态分析的时候,我们没有办法得到这个VA指向的数据是什么,因为,16进制编辑工具只是提供了文件偏移——File OFFset的数据查找功能,所以,我们需要把VA转换成为Offset

VA→Offset的转换,方法无非两种

1.手工转换,前提是你了解PE文件格式,对PE头,部首,RVA等概念了解深刻,然后就可以自己进行转换。

2.借助软件转换,这个方法方便很多W32Dasm本身提供了VA→Offset的转换功能(见图三),大名鼎鼎的PEeditor,LordPe等也可以进行这种转换图三中所示的W32Dasm转换VA的方法,有个缺陷,就是只能转换代码代码段的VA,而我们

图片8.png

要转换的40309C在数据当中,不能用这种方法转换,所以我们要用到LordPE这个对付PE文件的核武器的PLC功能。

详细的操作如下:

1.打开LORDPE,见到界面如图4所示。

2.点击途中的PE Editor按钮,选择我们的Crackme01.exe以后,点击FLC,开始VA和OFFSET的转换

输入我们要转换的VA的数据,看到界面如图5所示

图片9.png

注:该图中还有RVA一项,由于这个概念比较复杂,现在先不做介绍,以后介绍“壳”的时候,给大家详细讲解它的概念。

在图5中,我们可以看到VA=40309C的offset=89C,在以前,我们就需要用89C这个数,到WINHEX中查看该地址的数据,可是,现在的LORDPE给我们提供了非常方便的HexEditt功能,只要点击途中所示的HEX EDIT按钮,就可以看到图6

图片10.png

图6中,我们很清楚的看到40309C存放的数据是:“Simplest!”所以该Crackme的助手册吗就是Simplest!

输入Simplest!后,可以看到注册成功的界面如图7所示

图片11.png

以上介绍的就是静态分析破解的步骤,虽然这个Crackine很简单,但是,在解决这个Crackme的过程中,我们的Crack思路,使用的工具,分析问题的方法,最后解决问题的手段,都是静态分析软件最基础的东西,大家照着上面的步骤亲自操作一次,一定能体会到其中的乐趣,也一定能有自己新的独特的理解。

看过上一起密界寻踪的朋友一定会记得我曾经写过,静态反汇编的工具最强大的要属IDA,W32Dasm只是小巧,好用,不过由于这个Crackme是入门级别的,保护体系及其简单,所以,我们没有必要清楚IDA这个老大哥,用W32Dasm进行分析就足够了,在以后分析到复杂CRACKME的时候,我自然会采用IDA作为分析的工具,给大家讲解IDA的使用

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。