--------------------------------------------------------------------------------
【破解作者】 CSLIU
【使用工具】 Ollydbg1.10, C32asm ,PEid 0.94
【破解平台】 Windows XP SP2
【软件名称】 NO NAMES
【软件简介】 绿色软件
【加壳方式】 nspack v1.4
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
由于本人确实非常菜,所以很多地方还没有明白,所以就只是把破解的过程描述了一下,也请大家多多指教。
由于前两天刚刚问过大家,怎么作也不知道怎么作,还被有人骂着脱壳白痴,现在写这个我都还心有余悸,请大家多多包涵,我确实什么都不懂,但是我偏要脱壳,偏要破解。难道一定什么都懂,才能破解吗?至少我认为不是!
回想现在当初开始搞破解都一两个月了(也就是从我在看雪注册的时候算起),当然开始就是改跳转,也不叫什么真正的破解了。^_^,写这个只是想和大家交流交流。当然现在我也什么都不懂,什么加密算法,调试工具使用技巧,加密壳等什么的我都只是知道有这么回事而已,其他的 都不懂了,但是到现在也破解了好几个软件(当然都是没有加壳的,而且都是爆破的,^_^),这个软件是我第一次对有壳软件的破解,也算一种突吧!
我觉得在这个破解的道路上,最令我深刻的就是破解的第一个软件,没有加壳,用vc6.0编译的,只有时间限制,破解这个软件花了我好像五天左右的时间,因为刚开始什么都不懂,对软件本身进行修改的事情,感觉好神秘,而且特别有成就感,也许这就是我一直努力的动力吧!这个软件的破解其实也很具有偶然性,当初是我们这里有个试用软件,但是有个时间限制,我们大家又都不懂破解,根本就没有这个意识,“原来软件可以破解”。刚开始居然有人说把文件打开,改改时间就行了,后来可想而知,根本没有找到时间。
当然我不会如此理解,至少我还是学校里出来的撒。知道这个要对程序进行修改,也就是破解或者爆破吧。怎么打开程序,怎么修改呢。我从google到baidu,搜索了无数多个网站,最后终于我眼前一亮,找到了看雪,找到了一个真正的关于加密与解密的网站――看雪。找到了很多工具,调试的,反汇编的,脱壳的等等。而且搞了好久才知道,调试工具不能修改软件,一退出就又还原了。只有反汇编的才可以修改软件。^_^,可以修改软件了,但是不能乱来撒,怎么去掉时间限制呢,我想了想,只要找到时间就行了撒,这个太简单了撒。可是用的hiew,怎么也找不到2005年,这个数字,想了一下,是十六进制的,应该换算成:07D5h,当时,我不知道调试,就只有慢慢找这个字符拉,还好软件不是很大,找了半个小时,找到了。然后就把时间改掉,这个就被我破解了。^_^,其实我觉得第一个破解是非常重要的,有破解和没有破解就是1和0的区别,这个时候我才有了一点感性的认识。
后来的几个软件也是没有加壳的,当是其他的保护吧,比第一个都要难一些,但是有了第一个的经验之后,反而越来越简单了。遇到问题就到看雪论坛上找答案,还有就是找看雪论坛收藏看,还是都有理有据的,有一点不爽就是,不够形象,比如说都是文字说的,还是不清楚,而且对于我们这些菜鸟而言,完全是天书,对于高手而言,说得就更简约了。像我们这些鸟,工具都不怎么会用,到现在我连od都不怎么会用,怎么能理解老大们的精髓呢。
而且我不大认为有些人说的学习过程,说首先要很熟练调试(要开始爆破,再能得到注册码,再写注册机),再学习脱壳。我认为需求才是学习的根本动力,这些软件都是我需要,我才来学习破解的。而且不一定非要什么都了解透,只要能正常使用就行了。需要什么我就学习什么,这是我的一贯原则。
我有一个建议,希望看雪老大能考虑考虑,很多人都提议过,就是把各种经典的破解方法和手段录为视频,好让我们这些菜鸟进步的更快。最好视频还是那种渐进性的,便于学习。
好像废话说得太多了,现在说一下我的脱壳经历吧。
我有个绿色软件,有两个文件,一个exe(应用程序)文件和dll(动态链接库)文件,用peid检测,都是用nspack v1.4加的壳,有壳那就必须先脱壳撒,这个在看雪上把nspack的脱壳工具下下来试一试,maybe your target is not packet by nspack!我晕,这种事都有,明明是nspack就不能脱壳,没办法,只好把所有脱壳工具都下下来试一试了,什么通用脱壳,aspack脱壳的,asprotect脱壳的等等,只有一个结果,统统不能脱这个的壳。那就只好手动脱壳了,但是感觉好像很难吧,在看雪上搜索了一下,谈到dll加壳,好像都很难脱壳似的,而且很多谈到nspack脱壳,好像都只有谈到exe加的壳,并没有谈到dll加壳的问题,这个怎么办呢,先到调试版那里转了转,把软件调试基础知识看了一遍,讲了一些理论知识,感觉好像对我破解这个软件没有什么用处,什么PE格式,加壳什么的好像一点兴趣都没有,就继续找吧,又翻了翻看雪精华收藏,居然是nspack v2.0以上的,还是不行啊,实在找不到了,没有办法就只有在论坛上发贴了,虽然看了“发贴必看――好像叫提问的智慧吧!”,知道提问题要有水平,高手也许才会给一点建议,没有办法,谁叫自己这么菜呢,只好有病乱投医了,就随便发了个贴问问吧,没想到第一个人回帖就骂我脱壳白痴,我晕,看来贴不是菜鸟们能乱发的,不然就跟我一样了,是说不得论坛上发贴问问题的这么少,原来原因在这里所。还好看雪老大发现,安慰了我一下,让我看看基础知识!
没有办法,贴是不能发了,不然其他的骂名又出来了,只好去看雪的那个群聊聊,求助了,好心人还是有的,让我去fly的网站(什么萧雨吧,我忘了,对不起啊,fly兄)看看,我去了,发了贴,还好这里没有人骂,^_^,fly也给了我回复,答案就是不要脱壳了,做其他简单点的。但是因为这个软件是我必需的,所以这个我必须进行做下去。
看来没有戏了,这个实在做不下去了,能力有限啊,说到脱壳,要什么dump,要输入表重建,要清除自校验等,弄得我头大。我只好在看雪上溜达了,无疑中发现fly所说的脱壳工具quick unpack,我忽然柳暗花明,这个脱壳工具超好用,好像是老毛子的,这个能脱好多壳,我这个也可以了,现在我终于可以爆破这个软件了。但是我还是不甘心,因为花了这么多时间还是找个工具脱壳,感觉自己没有什么作用,那就进行找方法手动脱壳吧,在google上找了找,看到了一个nspack v1.4的脱壳视频,就下下来看了几遍,终于有了一点视觉上的感受,就用这个软件试了试,不知道能不能用,而且这个不是把dll也加壳了的嘛,没有办法,死马当活马医了。
首先用od把exe文件打开,来到这里:
0066F229 > 9C pushfd
0066F22A 60 pushad
0066F22B E8 00000000 call 0066F230
0066F230 5D pop ebp
0066F231 B8 B1854000 mov eax, 004085B1
0066F236 2D AA854000 sub eax, 004085AA
0066F23B 2BE8 sub ebp, eax
0066F23D 8DB5 03FCFFFF lea esi, [ebp-3FD]
0066F243 8B06 mov eax, [esi]
0066F245 83F8 00 cmp eax, 0
0066F248 74 11 je short 0066F25B
0066F24A 8DB5 0FFCFFFF lea esi, [ebp-3F1]
0066F250 8B06 mov eax, [esi]
0066F252 83F8 01 cmp eax, 1
0066F255 0F84 F1010000 je 0066F44C
0066F25B C706 01000000 mov dword ptr [esi], 1
0066F261 8BD5 mov edx, ebp
0066F263 8B85 DFFBFFFF mov eax, [ebp-421]
0066F269 2BD0 sub edx, eax
0066F26B 8995 DFFBFFFF mov [ebp-421], edx
0066F271 0195 F7FBFFFF add [ebp-409], edx
0066F277 8DB5 13FCFFFF lea esi, [ebp-3ED]
0066F27D 0116 add [esi], edx
0066F27F 8B36 mov esi, [esi]
0066F281 8BFD mov edi, ebp
0066F283 60 pushad
我不知道这里是那里,不知道也不要问,不然别人会骂你白痴,这就是我总结的结果。我理解就是程序开始的地方,或者什么其他的意思吧,不管了,这个是那里都没有关系。
随便介绍几个命令,od(工具中的第一个调试的工具就是)中的F7,F8,F9。
F7就是程序依次执行,感觉和F8差不多,所不同的就是,遇到call命令,F7跟进去继续执行,而F8呢就不跟进去,不知道F8执行这个过程没有呢?忘那位仁兄指点指点哈,^_^,F9就是一直进行下去。
到这里之后,按两个F7就可以了,F8也可以,这时里就可以看看od的右边,就是寄存器区那里,esp的值是0012FFA0,这时候,你就在命令栏里,输入hr=0012FFA0,就是esp的值(随便问问,那位兄台知道hr是什么意思哦?),按空格键,再按F9键,就可以了。
来到这里:
0066F44D 9D popfd
0066F44E - E9 A922D9FF jmp 004016FC
0066F453 8BB5 DBFBFFFF mov esi, [ebp-425]
0066F459 0BF6 or esi, esi
0066F45B 0F84 97000000 je 0066F4F8
0066F461 8B95 DFFBFFFF mov edx, [ebp-421]
0066F467 03F2 add esi, edx
0066F469 833E 00 cmp dword ptr [esi], 0
0066F46C 75 0E jnz short 0066F47C
0066F46E 837E 04 00 cmp dword ptr [esi+4], 0
0066F472 75 08 jnz short 0066F47C
0066F474 837E 08 00 cmp dword ptr [esi+8], 0
0066F478 75 02 jnz short 0066F47C
0066F47A EB 7A jmp short 0066F4F6
0066F47C 8B5E 08 mov ebx, [esi+8]
0066F47F 03DA add ebx, edx
0066F481 53 push ebx
0066F482 52 push edx
这里好像就是他们所说的真正的程序入口了,所谓的eop吧,但是你还要按F7或者F8两次,有个突变的样子,来到这里:
004016FC EB db EB
004016FD 10 db 10
004016FE 66 db 66 ; CHAR 'f'
004016FF 62 db 62 ; CHAR 'b'
00401700 3A db 3A ; CHAR ':'
00401701 43 db 43 ; CHAR 'C'
00401702 2B db 2B ; CHAR '+'
00401703 2B db 2B ; CHAR '+'
00401704 48 db 48 ; CHAR 'H'
00401705 4F db 4F ; CHAR 'O'
00401706 4F db 4F ; CHAR 'O'
00401707 4B db 4B ; CHAR 'K'
00401708 90 db 90
00401709 E9 db E9
0040170A 98 db 98
0040170B F0 db F0
0040170C 55 db 55 ; CHAR 'U'
0040170D 00 db 00
0040170E A1 db A1
0040170F 8B db 8B
00401710 F0 db F0
00401711 55 db 55 ; CHAR 'U'
00401712 00 db 00
就是感觉这里和以前那里的内容不一样了。也许这里就是他们所说的虚拟地址区域什么的吧。
然后,在这个地方按鼠标右键,选择dump debugged process 保存这个exe文件为你选择的地方,就行了(这个好像就是他们说的狭义esp定律吧,不知道是不是)。好像这个不需要重建输入表和清除自校验。
这时你用peid检测它,就可以看到:Borland C++ 1999,多么兴奋的事情啊!
现在到了爆破的时候了,刚开始用od调试的时候,有这些问题,不知道那位兄台解释一下,加没有加壳都可以用od调试,而且脱了壳之后,一共遇到六处下断的地方,是这样的,连续按F8运行,到跳出需要填入注册码的地方前一个地方下断(下断点就是在汇编代码前的那个区域双击,或者说是四个方框中的第二个方框双击,也是机器码的地方,因为前面一个是地址,第二个是机器码,第三个是汇编码,第四个就是诸事区,就是你自己添什么都可以的!),一共好像有六个吧,而且每个都是:call 地址 ,这种地方弹出来的,所以每次都只有跟进去了,就按F7跟进去撒,搞到最后好像还循环了一样,弄得我头都大了(希望那位大虾知道的告诉我一声),没办法,这个方法不行了。
这时候,我就用C32asm了,这个其实很好的,我觉得比W32dsm还好用,而且是国产的,这个就用来打开脱壳的那个exe文件(dll不管,好像不需要,exe也可以运行),然后点 查看 字符串,你就可以看到很多汉字,因为我这个软件会根据不用的电脑生成各种序列号,这个是固定的,跳出来的那个方框需要输入用户名和注册码(用户名是虚的,没有任何意义),我想了一下,这个应该就是根据序列号生成注册码,这个注册算法对我来说太难,太花时间了,我只是想要用软件而已,不一定什么都得做,对吧,所以我分析了一下,第一次需要注册码,注册了之后,就不需要输入注册码了撒,那么第一次怎么找注册码呢,怎么分析注册算法呢,我想到一个简单方法,那就是,不管你输入什么,程序要判断这个注册码是否正确撒,你就可以把它改成相反的条件,就是你输入错误的注册码,你就注册成功了。
这个一般在程序开始不远的地方的,第一次注册会有两个支路,一个就是注册成功,一个就是注册失败。一般是这种:
cmp al al
je 地址
或者其他比较,如果是je你只需要改成jne,很简单是吧,那怎么用C32asm修改程序文件呢,你就在需要修改的地方,点鼠标右键,选择 “对应hex编辑”,然后按“Ctrl+Q”,再按“shift+A”,就可以了。想怎么改就怎么改!
也许有人要问怎么找到这个比较的地方,就是那个cmp al al的地方,一般每个程序都有汉字说明,我这个程序也是。在使用C32asm的时候,你点查看 字符串就可以看到很多汉字,这里面有很多有用信息,你看了就知道了,比如我这个软件吧,需要注册撒,你输入注册,就会看到注册成功,注册失败等,
而且注册成功和注册失败两个地方很近,那么你就可以发现他们的联系了撒
45 8C MOV EAX,DWORD PTR [EBP-74]
::004192F7:: 8B80 10030000 MOV EAX,DWORD PTR [EAX+310]
::004192FD:: E8 C2351100 CALL 0052C8C4 \:JMPDOWN
::00419302:: 837D B8 00 CMP DWORD PTR [EBP-48],0
::00419306:: EB 05 JMP SHORT 0041930D \:JMPDOWN
::00419308:: 8B55 B8 MOV EDX,DWORD PTR [EBP-48]
::0041930B:: EB 05 JMP SHORT 00419312 \:JMPDOWN
::0041930D:: BA 51995600 MOV EDX,569951 \:BYJMP JmpBy:00419306,
::00419312:: B9 46995600 MOV ECX,569946 \:BYJMP JmpBy:0041930B, \->: 注册成功 !
::00419317:: A1 54A85700 MOV EAX,DWORD PTR [57A854]
::0041931C:: 8B00 MOV EAX,DWORD PTR [EAX]
::0041931E:: E8 4D391400 CALL 0055CC70 \:JMPDOWN
::00419323:: FF4D AC DEC DWORD PTR [EBP-54]
::00419326:: 8D45 B8 LEA EAX,DWORD PTR [EBP-48]
::00419329:: BA 02000000 MOV EDX,2
::0041932E:: E8 953B1400 CALL 0055CEC8
4D391400 CALL 0055CC70 \:JMPDOWN
::00419323:: FF4D AC DEC DWORD PTR [EBP-54]
::00419326:: 8D45 B8 LEA EAX,DWORD PTR [EBP-48]
::00419329:: BA 02000000 MOV EDX,2
::0041932E:: E8 953B1400 CALL 0055CEC8 \:JMPDOWN
::00419333:: EB 6C JMP SHORT 004193A1 \:JMPDOWN
::00419335:: 6A 00 PUSH 0 \:BYJMP JmpBy:00419105,
::00419337:: 66:C745 A0 7400 MOV WORD PTR [EBP-60],74
::0041933D:: 33C9 XOR ECX,ECX
::0041933F:: 894D B4 MOV DWORD PTR [EBP-4C],ECX
::00419342:: 8D55 B4 LEA EDX,DWORD PTR [EBP-4C]
::00419345:: FF45 AC INC DWORD PTR [EBP-54]
::00419348:: 8B45 8C MOV EAX,DWORD PTR [EBP-74]
::0041934B:: 8B80 10030000 MOV EAX,DWORD PTR [EAX+310]
::00419351:: E8 6E351100 CALL 0052C8C4 \:JMPDOWN
::00419356:: 837D B4 00 CMP DWORD PTR [EBP-4C],0
::0041935A:: 74 05
7D B4 00 CMP DWORD PTR [EBP-4C],0
::0041935A:: 74 05 JE SHORT 00419361 \:JMPDOWN
::0041935C:: 8B55 B4 MOV EDX,DWORD PTR [EBP-4C]
::0041935F:: EB 05 JMP SHORT 00419366 \:JMPDOWN
::00419361:: BA 5D995600 MOV EDX,56995D \:BYJMP JmpBy:0041935A,
::00419366:: B9 52995600 MOV ECX,569952 \:BYJMP JmpBy:0041935F, \->: 注册失败 !
::0041936B:: A1 54A85700 MOV EAX,DWORD PTR [57A854]
::00419370:: 8B00 MOV EAX,DWORD PTR [EAX]
::00419372:: E8 F9381400 CALL 0055CC70 \:JMPDOWN
::00419377:: FF4D AC DEC DWORD PTR [EBP-54]
::0041937A:: 8D45 B4 LEA EAX,DWORD PTR [EBP-4C]
::0041937D:: BA 02000000 MOV EDX,2
::00419382:: E8 413B1400 CALL 0055CEC8 \:JMPDOWN
::00419387:: EB 18 JMP SHORT 004193A1 \:JMPDOWN
::00419389:: 6A 00 PUSH 0 \:BYJMP JmpBy:004190C1,
::0041938B:: B9 6B995600 MOV ECX,56996B \->: 注册失败 !
::00419390:: BA 5E995600 MOV EDX,56995E \->: 请输入注册码
::00419395:: A1 54A85700 MOV EAX,DWORD PTR [57A854]
通过以上代码 你可以发现他们在一起,你只要把两个支路的条件改过来就行了。怎么改了,就是上面说的改je为jne,其他情况也差不多。你其实可以发现在注册成功和注册失败的中间有这么一行代码:
::00419335:: 6A 00 PUSH 0 \:BYJMP JmpBy:00419105,
你想想看,这个无条件转移就是它上面的顶点,就是这两个支路的顶点,这里有个判断语句就是我们所说的比较条件,改成相反条件就行了。那么地址就是00419105撒,哈哈,是不是很简单呢!
为什么还要脱壳呢,为什么不直接改呢,这个我理解是,没有脱壳的时候,用C32asm打开程序,查看 字符串全是乱码,这个就根本不能改了。
好像说得比较乱,希望没有耽误大家时间,在这里说了我的一些感受和心得,同时有句话,希望看雪老大考虑考虑视频的问题,而且文件不是很大,视觉感受很好,不是有人说过,人的视觉接受了人所获信息的80%嘛(忘记是70%还是80%了)。就这样了,有错误的地方或者不足的地方,希望大家多多指正。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课