| 关键词: nbsp 一下 正确 代码 堆栈 输入 一个 EAX FeiQ 程序 |
这是一篇适合初学者并且非常简单的软件破解过程。如果读者希望从中学习到高深的破解技术,那估计要另你失望了,本文主要采用暴破伎俩来破解一些常规的软件,即没有使用反调试、加密、加壳 、虚拟机等相关技术。其目的主要叙述一下软件的采用爆破的简单过程。 作者假设读者熟悉一下相关知识 1. 了解汇编,能看懂简单汇编代码. 2.熟悉最少一门调试工具 这里我们采用Ollydbg。 4.知道一些常用用语,比如 什么时爆破、对API下断等。 3.对破解有浓厚的兴趣。认识到破解时一门艺术,而非商业利益(....) 声明:对本文使用的软件,我们只是拿来练习,只是为了更好的学习破解这门艺术,并未侵犯原作者的版权及其他事宜。再次声明。 下面让我们来一步步走完我们这次的爆破之旅吧! 实验对象: 飞秋(FeiQ) 一款局域网既是通讯工具。这里我们的版本是ver2.4 首先让我们先感谢老卢为我们提供这款功能强大的软件。怎么也得先感谢一下,因为我们将要对他的作品开刀做手术啊。飞秋有着和QQ非常炫的功能,至于其他的就不说了,用了就知道. 再次支持老卢。 begin: 这里我们提的是飞秋的等级设置功能。将自己的头像设置为一个太阳是否很帅啊。是很帅,但不能想设就设。因为老卢。。。。。!需要授权码,随便输入一个 肯定不对 “授权码不正确” 蹬蹬。。 该我们出场了吧。 拿出OD 因为弹出对话框所以我们先对MessageBoxA下断。 (下断会吧。插件下 输入bp MessageBoxA) 在输入,断点后到 user32模块中 , F8 步步执行 到弹出注册失败对话框后 回到程序领空发现了什么? ..... (未完待续。。。) (ps: 不是不想一下子说完。好多原因。。包括 机器啊,时间啊 (家里是有机器但不能上网 汗...) 请大家多多包涵 今天就到这 因为现在没有截图工具,因为针对新手,没图显然不好理解,下次补上, 第一次写这类文章,写到不好 请新手们见谅,大鸟们别笑。我们的目标和追求是一样滴..) 当然最后也希望大家多支持。。。没人支持 写东西也是浪费...、 破解艺术 二 在上一篇之中,我们忘了破解的第一步 就是先分析一下目标是用什么语言编写,程序有没有加壳等。在这里我们分析一下,我们工具是PEiD.exe。 分析一下飞秋。效果如图。 可知飞秋用VC6++编写,没有加壳,这当然是最方便的。 在对飞秋depends一下。看看飞秋都导入了什么DLL。请自己查看。 上一篇 我们说到当我们断点到MessageBoxA 回到应用程序领空后看到效果图 如下: 上面弹出授权码错误对话框后,接着就JMP走,当然就注册失败了,但我们发现飞秋下面就是正确的授权码。于是我们想如果改一下流程会怎么样。改是肯定改因为要爆破吗!不过不要急先看一下代码。分析一下流程。 以下是OD copy的部分代码。 结合上图 TEST EAX,EAX ;测试eax JE SHORT 飞秋FeiQ.0046352A ;ZF =1跳转 请留意跳转语句 00463503处代码 每次输入授权码 他都不跳,接着执行下面代码,结果弹出错误对话框,为了让其跳转我们将je改为jne 接着看效果。哈哈 授权码正确。接着看头像,哇有星星了。恩 在改一个太阳。感觉是否很爽? 》不过你先等一下,你先试一下将飞秋退出在打开! 》干什么呢?我正爽呢? 》你先退出在打开 试.. 一 ..下. 嘛 我实在不忍看你这样。 》吼。什么,我的太阳没了? 》这个。。。 别打我啊。不是我啊。 哈哈 给大家开个玩笑。软件注册和未注册版本都有标示,一般通过注册表、配置文件等手段。这个相必大家都知道。飞秋则通过配置文件来保存注册信息,在目录下打开FeiqCfg.xml文件 找到SerialNo节点 其是保存授权码。(同时请留意一下其下的另外两个节点UserDenji和ShowDenji 后面用到 标示用户等级和显示等级)当飞秋在启动时会用他。这个是错误的,所以我们的太阳没了,怎么办呢?聪明的你肯定立刻想到,只要我们找到和授权吗比较代码并将其修改,那不就。。。。 嘿嘿。不错,寻找比较代码就是我们所要做的工作。去那找呢?这可难不到聪明的你吧! 》找什么找,我每次设置一下不行吗? 》啊。。。。你太。。聪明啦,这也行。 不过不专业。 》我喜欢。我就每次改。 》汗。只要你愿意。 对。我们当然要专业。岂能每次手工修改,这可不是我们作风。 破解艺术 三 破解软件不仅需要扎实得编程功底,更需要灵活善变得思维,要懂得揣摩作者得意图。要引发蝴蝶效应。 在上一篇中我们修改了一个跳转JE XXXX语句。很自然的我们可以这样认为,即是将输入的授权码和正确的授权码做比较。我们看看JE XXXX以上的代码。 Copy OD 部分代码 调试时请结合OD 他的强大和反汇编就不用我说了吧! MOV ESI,DWORD PTR DS:[EDI+64] ;寄存器 显示是我们自己输入的授权码 MOV EAX,DWORD PTR SS:[ESP+C] ;寄存器 显示一字符串 推测为正确的授权码 MOV DWORD PTR SS:[ESP+1C],0 MOV DL,BYTE PTR DS:[EAX] ;取eax第一个字符 MOV BL,BYTE PTR DS:[ESI] ;取esi第一个字符 MOV CL,DL ;给cl CMP DL,BL ;比较 JNZ SHORT 飞秋FeiQ.004634FC ;不等跳 TEST CL,CL ;结束? JE SHORT 飞秋FeiQ.004634F8 ;结束跳 MOV DL,BYTE PTR DS:[EAX+1] ;取下个字符 MOV BL,BYTE PTR DS:[ESI+1] ;取下个字符 MOV CL,DL ; 给cl CMP DL,BL ;比较 JNZ SHORT 飞秋FeiQ.004634FC ;不等跳 ADD EAX,2 ;下个字符地址 ADD ESI,2 ;下个字符地址 TEST CL,CL JNZ SHORT 飞秋FeiQ.004634D4 ;典型的循环比较 由此证实eax为正确授权码! XOR EAX,EAX JMP SHORT 飞秋FeiQ.00463501 SBB EAX,EAX SBB EAX,-1 // TEST EAX,EAX // JE SHORT 飞秋FeiQ.0046352A ;我们修改得跳转指令 其上是比较结果 终于找到了的授权码,让我们测试一下,拷贝授权码重新注册(在没有修改的目标运行) 果然正确。退出在打开。太阳已然在。哈哈。 》我爽歪歪。 》不过你先等一下,你先试一下。。。(被打断) 》吼,又怎么啦? 》不好意思,你在修改一下级别。 》改什么改,我注册成功了,什么。怎么又不正确?靠 》郁闷 又打我! 哈哈 让大家开心一下而已。 还是拿处OD 断点到MOV EAX,DWORD PTR SS:[ESP+C] 恩?发现一个问题 不同的级别授权码不一样 怪不得呢?怎么办呢? 大家想没想这样一个问题,授权码随便输入一个我照样能设置级别,为什么还费这劲找正确的授权码呢?不错这样确实可以设置,但我们要找的是在程序启动的时候比较授权码部分,这个怎么找呢?方式有很多种 1.你可以单步执行 分析逻辑流程,理论上可以找到,但相当困难 2.可以根据程序类型推测位置 如MFC程序 可以在 APP::InitInstance, CMainFrame::OnCreatezh中。以及其他可能认为初始化地方。 3. 授权码在文件,所以可以对文件API下断。分析相关程序 4. ……. 当然还有有一些其他的,只不过笔者不知道而已,不过就上述几个而言工作量已是相当大了,软件破解就像做题一样,计算出来的结果大家都正确,但是采用的方法不同,那么工作量、复杂度也不同。一个好方法和坏方法所引发的蝴蝶效应可大不同。如灯泡的容量计算,人脸的识别系统,空肥皂盒的检查。。。。 》喂喂,干什么呢? 》啊 不好意思跑题了。 意思是告诉大家,采用正确的方法,可以使问题简单化。 分析一下我们用的方法。一般授权码不可能明文出现在程序中,都是经过某种复杂算法计算出来的,很显然我们可以利用这一点。在注册时候程序要计算出正确授权码,以便和输入的授权码做比较,那么在初始启动时也必然要和配置文件中的授权码做比较。但他要先得到正确的输入吗,一般这两块计算是相同的,我们建立这种假设。 看看比较输入码之前都做了些什么? 注意这两句代码 MOV ESI,DWORD PTR DS:[EDI+64]//输入的授权码 MOV EAX,DWORD PTR SS:[ESP+C]。 //正确的授权码 可知在比较之前授权码已存在堆栈中。那就看一下什么时候产生, 我们只要注意赋值给eax之前的代码,F8单步跟踪,注意OD的堆栈窗口,我们发现当执行完CALL 飞秋FeiQ.004938D0 堆栈中出现授权码。由此断定该函数计算授权码。 缩小范围 看看CALL 飞秋FeiQ.004938D0 都做了些什么、(代码太多,就不在copy了 免的占地方 请在OD中查看) 这么多怎么看呢?其实我们不必仔细分析每个指令用途,(当然你也可以分析,不过增加工作量而已)这里我们用查看堆栈/寄存器方法来缩小范围,而不是分析指令。从上面分析我们得知该函数返回之前堆栈中已存在正确输入吗,所以在跟踪时只要注意堆栈就行,看什么时候其被填值的。以下是跟踪过程 a. CALL 飞秋FeiQ.00493B60 指令后堆栈中出现授权码. b. CALL 飞秋FeiQ.00568C0E 后将授权码全部转换为大写。 c. 继续跟踪a 步骤出来的地址 缩小范围。 d. 在00493D87 LEA ECX,DWORD PTR SS:[ESP+30] ecx 中显示授权码。 到这里基本上算跟踪完成了,授权码在[ESP+30]中,由此可推测其以上代码为计算授权码代码,粗略看一下,fxxx指令 乘法 除法 循环,关键字有 30 39 41 5a 61 7a 也有点像。先不管 是不是,试一下便知。 对可疑地址下断。这时你可能会问对谁下断呢?00493B60是计算授权码地方 他的断点肯定的有,有因为他是从004938D0开始调用的,即当我们注册的时候是先调用004938D0,又经过几层调用,最后来到00493B60 处,所以可以认为004938D0做了一些其他的操作,(实时也如此其中将授权码全部转换为大写就是在004938D0 中调用另一个函数做的)而00493B60才是真实计算授权码地方。所以也对004938D0也下断。 重新启动程序看是否调用,嘿嘿 果然断到了,先走004938D0 后来到00493B60计算授权码码的地方。恩接着我们看看是谁调用。来到调用处。我们推断这是初始化地方 代码很多我们大致看一下。多亏了OD 其已经给我们列出了 前面提到配置文件FeiqCfg.xml中所有节点,当然我们所关心的级别ShowDenji也在之中,(在编程过程中起一个意义名字,对大家都有好处不是吗?)也肯定了程序根据配置文件来初始化的, 找到ShowDenji节点。如下代码 PUSH 飞秋FeiQ.005E7F5C ; ASCII "ShowDenji" // OD显示 CALL 飞秋FeiQ.00507C90 ;判断操作 CMP DWORD PTR DS:[ESI],EBX ;ebx 0 JE 飞秋FeiQ.00408F87 ;zf=1 跳。即授权码不正确跳,正确则显示等级。 到这里大家应该都知道怎么弄了把。JE修改为JNE 很简单不是吗? 最后让我们总结一下: 整个过程只修改了两个命令,第一个是在注册时候,为了显示授权成功并且初始级别,我们修改一跳指令,这时级别可以随意设置,但是下次启动时候,程序通过配置文件会再次比较授权码,这时我们的级别就没了,所以我们就有修改了比较授权码指令!到此为止你可以随意改变级别,且下次启动时级别依然在。 我承认我骗了你,本文所述方法并没有什么艺术可言,也没有高深技术。他只演示了爆破软件一些思路、一些小伎俩,讲一些爆破软件的思路,怎么找可疑地址,希望对大家有一些帮助。 当然在实际破解过程中,不可能如此简单,一切是不会这么容易的,必然回遇到各种各样障碍,加密、加壳、反调试、虚拟机等各种技术,但万变不离其总,只要具备扎实的编程功底,不灭的毅力,良好的思维,平时多动手,多积累经验,相信都不是问题,这篇文章就当给我们新手打打气把。相信我们自己。我们能行。 (PS我们找到了生成授权码的地方,有兴趣的朋友可以写个注册机,对自己应该是个很大的提高,同时也希望讲自己的心得体会分给大家,谢谢!) 笔者也是个大大的菜鸟,错误不对之出在所难免,敬请见谅。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|