破解实战-第八战
本帖最后由 我是用户 于 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
真心支持一下,继续更新,加油!!!! 陷阱还真不少,分析起来有点难度,膜拜了。。。 把你破解的都看完了 太详细了 谢谢 太可惜了,分和热心都加完了,ASp壳,下载弄过几次,在看雪下载一个,搞死人了,结果还是出错。 这么多陷阱只有干瞪眼的份,这么厉害只有膜拜的份 小雨细无声 发表于 2013-6-12 22:30 static/image/common/back.gif
太可惜了,分和热心都加完了,ASp壳,下载弄过几次,在看雪下载一个,搞死人了,结果还是出错。
用脱壳机,轻轻松松搞定
好东西,,支持了 感谢大神回复,在看雪下载练手,机脱手脱修复都出错。
新手受教了。。。