我是用户 发表于 2013-6-12 21:27

破解实战-第八战

本帖最后由 我是用户 于 2013-6-19 23:18 编辑

【软件名称】: A-PDF Split
【下载地址】: 见附件
【加壳方式】: ASProtect
【使用工具】: OD
【操作平台】: XP SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

1.查壳
用PEID对PdfSplit.exe进行查壳.
如图1:

ASProtect 1.2x - 1.3x -> Alexey Solodovnikov 的壳,用脱壳机或者
脚本脱都可以.脱完之后显示是用Delphi写的.
如图2:



2.去自效验
基本上每个程序脱完壳之后都会有自效验,这个程序的自效验不难,但是烦人,要改的地方很多。
打开脱完壳的程序,点击Try按钮,程序会自动关闭。
如图3:

我们将其载入OD,然后下PostQuitMessage断点,运行,程序断下。
相关代码如下:
00576B2C   .90            nop
00576B2D   .90            nop
00576B2E   .90            nop
00576B2F   .90            nop
00576B30   >803D DA835900>cmp byte ptr ds:,0xCC
00576B37   .74 0A         je short PdfSplit.00576B43
00576B39   .B8 00845900   mov eax,PdfSplit.00598400
00576B3E > .E8 CDDFE8FF   call PdfSplit.00404B10                   ;* Reference to: System.@LStrClr(void;void);
00576B43   >803D DB835900>cmp byte ptr ds:,0xC2
00576B4A      74 15         je short PdfSplit.00576B61               //关键跳
00576B4C   .90            nop
00576B4D   .90            nop
00576B4E   .90            nop
00576B4F   .A1 E0475900   mov eax,dword ptr ds:
00576B54   .8B00          mov eax,dword ptr ds:
00576B56 > .E8 5152F1FF   call PdfSplit.0048BDAC                   ;PostQuitMessage
00576B5B   .FF05 F8835900 inc dword ptr ds:
00576B61   >803D DC835900>cmp byte ptr ds:,0x62
00576B68   .74 10         je short PdfSplit.00576B7A
00576B6A   .90            nop
00576B6B   .90            nop
00576B6C   .90            nop
00576B6D   .90            nop

我们将00576B4A处je short PdfSplit.00576B61 改为jmp就可跳过该验证。但是这个程序之后的验证还有很多,大概会有十四处,但每一处并不是都是PostQuitMessage,有的是程序进入死循,有的则是程序弹出错误对话框,我们一个个定位是很麻烦的,所以我们要搞清楚他是根据什么来进行自效验的,从源头的来解除它。
通过代码00576B43   >803D DB835900>cmp byte ptr ds:,0xC2,我们可以知道,
的数值和C2比较,如果相等的话就跳过验证,那么的数值是怎么来的吗?我们往上翻,在翻的过程中,我们会看到如下代码:
0057689F   .A3 04845900   mov dword ptr ds:,eax          ;PdfSplit.00598400
005768A4   >803D D3835900>cmp byte ptr ds:,0x14
005768AB   .74 61         je short PdfSplit.0057690E
005768AD   .B8 FC835900   mov eax,PdfSplit.005983FC
005768B2   .BA 8C705700   mov edx,PdfSplit.0057708C                ;ASCII "!em kcarc ton oD"
005768B7 > .E8 A8E2E8FF   call PdfSplit.00404B64                   ;* Reference to: System.@LStrAsg(void;void;void;void);
005768BC   .B8 00845900   mov eax,PdfSplit.00598400
005768C1 > .E8 4AE2E8FF   call PdfSplit.00404B10                   ;* Reference to: System.@LStrClr(void;void);
005768C6   .A1 FC835900   mov eax,dword ptr ds:
005768CB > .E8 10E5E8FF   call PdfSplit.00404DE0                   ;* Reference to: System.@LStrLen(String):Integer;
005768D0   .83F8 01       cmp eax,0x1
005768D3   .7C 39         jl short PdfSplit.0057690E
005768D5   .A3 F4835900   mov dword ptr ds:,eax          ;PdfSplit.00598400
005768DA   >8D45 D0       lea eax,dword ptr ss:

注意到005768B2代码处的字符串没,倒过来读就是DO not crack me!。看来作者是知道我们要破解他,所以告诉我们不要有这种想法,在下面的验证中会出现很多次这样的语句,如果我们不从源头上改的话,去跟那么代码很是烦人。我们继续往上翻。
相关代码如下:
00576608      321D 0C845900 xor bl,byte ptr ds:
0057660E   .881D CC835900 mov byte ptr ds:,bl
00576614   .881D CD835900 mov byte ptr ds:,bl
0057661A   .A0 CC835900   mov al,byte ptr ds:
0057661F   .A2 CE835900   mov byte ptr ds:,al
00576624   .A0 CC835900   mov al,byte ptr ds:
00576629   .A2 CF835900   mov byte ptr ds:,al
0057662E   .A0 CC835900   mov al,byte ptr ds:
00576633   .A2 D0835900   mov byte ptr ds:,al
00576638   .A0 CC835900   mov al,byte ptr ds:
0057663D   .A2 D1835900   mov byte ptr ds:,al
00576642   .A0 CC835900   mov al,byte ptr ds:
00576647   .A2 D2835900   mov byte ptr ds:,al
0057664C   .A0 CC835900   mov al,byte ptr ds:
00576651   .A2 D3835900   mov byte ptr ds:,al
00576656   .A0 CC835900   mov al,byte ptr ds:
0057665B   .A2 D4835900   mov byte ptr ds:,al
...省略相关代码
00576769   .A2 EF835900   mov byte ptr ds:,al
0057676E   .A0 CC835900   mov al,byte ptr ds:
00576773   .A2 F0835900   mov byte ptr ds:,al
00576778   .A0 CC835900   mov al,byte ptr ds:
0057677D   .A2 F1835900   mov byte ptr ds:,al
00576782   .A0 CC835900   mov al,byte ptr ds:
00576787   .A2 F2835900   mov byte ptr ds:,al
0057678C   .A0 CC835900   mov al,byte ptr ds:
00576791   .A2 F3835900   mov byte ptr ds:,al
00576796   .FF05 F4835900 inc dword ptr ds:
0057679C   .803D CC835900>cmp byte ptr ds:,0x11
005767A3   .74 0A         je short PdfSplit.005767AF

00576608代码处通过xor bl,byte ptr ds:来得出bl的值来,
然后将bl处分别赋值给0x5983CC-0x5983F3的数据区间。
如图4:


然后将0x5983CC-0x5983F3的每一个值分别进行比较,如0057679C所示,而自效验就因此在这
每一个比较之中,如果我们一个个的找非得累死不得,所以我们必须找到正确的bl值,至于比较就交给程序自行判断,反正我们的值是正确的,怕什么。
bl=bl xor ,我们继续上翻代码:
005763A3   .BA 01000000   mov edx,0x1
005763A8   .B8 80825900   mov eax,PdfSplit.00598280
005763AD > .E8 8ED2E8FF   call PdfSplit.00403640                   ;
005763B2   .E8 49C8E8FF   call PdfSplit.00402C00
005763B7   .FF05 F4835900 inc dword ptr ds:
005763BD   .BA 94960000   mov edx,0x9694
005763C2   .B8 80825900   mov eax,PdfSplit.00598280
005763C7 > .E8 90D2E8FF   call PdfSplit.0040365C                   ;设置文件指针
005763CC   .E8 2FC8E8FF   call PdfSplit.00402C00
...无用nop
00576561   .BA 0C845900   mov edx,PdfSplit.0059840C
00576566   .B8 80825900   mov eax,PdfSplit.00598280
0057656B > .E8 7CCFE8FF   call PdfSplit.004034EC                   ;读文件
00576570   .E8 8BC6E8FF   call PdfSplit.00402C00
...无用nop
0057657E   .B8 80825900   mov eax,PdfSplit.00598280
00576583 > .E8 10CDE8FF   call PdfSplit.00403298                   ;关闭文件
00576588   .E8 73C6E8FF   call PdfSplit.00402C00
...无用nop
0057659D   .BA 80705700   mov edx,PdfSplit.00577080
005765A2   .8D45 E4       lea eax,dword ptr ss:
005765A5 > .E8 76CDE8FF   call PdfSplit.00403320                   ;->System.@PStrCpy
005765AA   .8D45 E0       lea eax,dword ptr ss:
005765AD   .8B15 10845900 mov edx,dword ptr ds:
005765B3   .8A52 04       mov dl,byte ptr ds:
005765B6   .8850 01       mov byte ptr ds:,dl
005765B9   .C600 01       mov byte ptr ds:,0x1
005765BC   .8D55 E0       lea edx,dword ptr ss:
005765BF   .8D45 E4       lea eax,dword ptr ss:
005765C2   .B1 02         mov cl,0x2
005765C4 > .E8 27CDE8FF   call PdfSplit.004032F0                   ;->System.@PStrNCat;
005765C9   .8D55 E4       lea edx,dword ptr ss:
005765CC   .8D45 DC       lea eax,dword ptr ss:
005765CF > .E8 4CCDE8FF   call PdfSplit.00403320                   ;->System.@PStrCpy
005765D4   .8D45 E0       lea eax,dword ptr ss:
005765D7   .8B15 10845900 mov edx,dword ptr ds:
005765DD   .8A52 05       mov dl,byte ptr ds:
005765E0   .8850 01       mov byte ptr ds:,dl
005765E3   .C600 01       mov byte ptr ds:,0x1
005765E6   .8D55 E0       lea edx,dword ptr ss:
005765E9   .8D45 DC       lea eax,dword ptr ss:
005765EC   .B1 03         mov cl,0x3
005765EE > .E8 FDCCE8FF   call PdfSplit.004032F0                   ;->System.@PStrNCat;
005765F3   .8D55 DC       lea edx,dword ptr ss:
005765F6   .8D45 E8       lea eax,dword ptr ss:
005765F9 > .E8 86E7E8FF   call PdfSplit.00404D84                   ;->System.@LStrFromString(String;String;ShortString;ShortString);<+>
005765FE   .8B45 E8       mov eax,dword ptr ss:
00576601 > .E8 3253E9FF   call PdfSplit.0040B938                   ;->SysUtils.StrToInt
00576606   .8BD8          mov ebx,eax                              ;PdfSplit.00598400
通过以上代码我们可以知道,程序先用SetFilePointer函数,将文件指针至于0x9694,然后将通过
ReadFile将0x9694处的一个字节读出,并存在byte ptr ds:中,我们通过C32定位下0x9694处的值
原文件如图5:


脱壳后的文件如图6:

原文件的值是0x79,脱壳后的文件的值是0xFF.
至于bl的值,他与文件无关,所以我们不必管他。
我们将的值改为0x79,与bl进行异或,就能得出正确的值来。
修改如下:
00576608   .321D 0C845900 xor bl,byte ptr ds:
改为mov bl,0xC2即可。
如图7:


如下的错误还很多,比如说:
如图8:


如图9(进入死循环):


等等等等....
要修改的地方大概有十四处,我们可以通过SetFilePointer来定位:
第一处:
00576608   .321D 0C845900 xor bl,byte ptr ds:
bl=C2(正确的值)

第二处:
00574538|.3205 0C845900 xor al,byte ptr ds:
al=F1

第三处:
0057F7BC   .3205 0C845900 xor al,byte ptr ds:
al=12

第四处:
00580686   .3205 0C845900 xor al,byte ptr ds:
al=C1

第五处:
0057562D   .3205 0C845900 xor al,byte ptr ds:
al=94

第六处:
0057898D|.3205 0C845900 xor al,byte ptr ds:
al=C7

第七处:
005771CE|.3205 0C845900 xor al,byte ptr ds:
al=21

第八处:
00577E99|.3205 0C845900 xor al,byte ptr ds:
al=F5

第九处:
0057EA20|.3205 0C845900 xor al,byte ptr ds:
al=85

第十处:
005792A4|.3205 0C845900 xor al,byte ptr ds:
al=6C

第十一处:
0057A0A4|.3205 0C845900 xor al,byte ptr ds:
al=F6

第十二处:
0057AB14|.3205 0C845900 xor al,byte ptr ds:
al=5F

第十三处:
0057BC93|.3205 0C845900 xor al,byte ptr ds:
al=09
第十四处
0057CBB8|.3205 0C845900 xor al,byte ptr ds:
al=6F

修改完后保存,程序下正常运行。

3.爆破。
这个简单了,未注册的生成的PDF有水印
如图10:


爆破点如下:
标志位:
0056A287   /75 06         |jnz short PdfSplit.0056A28F改成nop
0056A289|.C645 F3 01    |mov byte ptr ss:,0x1   
将0056A287   /75 06         |jnz short PdfSplit.0056A28F改成nop即可
注册成功后,不会出现注册NAG,和生成的PDF无水印。
如图11:


最后祝大家端午节快乐!

=================================================================

传送门:
         破解实战-第一战:http://www.52pojie.cn/thread-197281-1-1.html
         破解实战-第二战:http://www.52pojie.cn/thread-197598-1-1.html
         破解实战-第三站:http://www.52pojie.cn/thread-197957-1-1.html
         破解实战-第四站:http://www.52pojie.cn/thread-198203-1-1.html
         破解实战-第五战:http://www.52pojie.cn/thread-198365-1-1.html
         破解实战-第六战:http://www.52pojie.cn/thread-198930-1-1.html
         破解实战-第七战:http://www.52pojie.cn/thread-199459-1-1.html
         破解实战-第八战:http://www.52pojie.cn/thread-199834-1-1.html
         破解实战-第九战:http://www.52pojie.cn/thread-200655-1-1.html         
         破解实战-第十战:http://www.52pojie.cn/thread-200798-1-1.html


loveliuhao323 发表于 2013-6-12 22:19

真心支持一下,继续更新,加油!!!!

混小子 发表于 2013-6-12 21:42

陷阱还真不少,分析起来有点难度,膜拜了。。。

475905793 发表于 2013-6-12 21:40

把你破解的都看完了 太详细了 谢谢

小雨细无声 发表于 2013-6-12 22:30

太可惜了,分和热心都加完了,ASp壳,下载弄过几次,在看雪下载一个,搞死人了,结果还是出错。

qq7156792 发表于 2013-6-12 22:47

这么多陷阱只有干瞪眼的份,这么厉害只有膜拜的份

我是用户 发表于 2013-6-12 23:04

小雨细无声 发表于 2013-6-12 22:30 static/image/common/back.gif
太可惜了,分和热心都加完了,ASp壳,下载弄过几次,在看雪下载一个,搞死人了,结果还是出错。

用脱壳机,轻轻松松搞定

boteli 发表于 2013-6-12 23:11

好东西,,支持了

小雨细无声 发表于 2013-6-12 23:49

感谢大神回复,在看雪下载练手,机脱手脱修复都出错。

明天会更好 发表于 2013-6-13 00:39

新手受教了。。。
页: [1] 2 3 4 5 6
查看完整版本: 破解实战-第八战