好友
阅读权限40
听众
最后登录1970-1-1
|
我是用户
发表于 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 [Registered] -> Alexey Solodovnikov [Overlay]的壳,用脱壳机或者
脚本脱都可以.脱完之后显示是用Delphi写的.
如图2:
2.去自效验
基本上每个程序脱完壳之后都会有自效验,这个程序的自效验不难,但是烦人,要改的地方很多。
打开脱完壳的程序,点击Try按钮,程序会自动关闭。
如图3:
我们将其载入OD,然后下PostQuitMessage断点,运行,程序断下。
相关代码如下:
[C++] 纯文本查看 复制代码 00576B2C . 90 nop
00576B2D . 90 nop
00576B2E . 90 nop
00576B2F . 90 nop
00576B30 > 803D DA835900>cmp byte ptr ds:[0x5983DA],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:[0x5983DB],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:[0x5947E0]
00576B54 . 8B00 mov eax,dword ptr ds:[eax]
00576B56 > . E8 5152F1FF call PdfSplit.0048BDAC ; PostQuitMessage
00576B5B . FF05 F8835900 inc dword ptr ds:[0x5983F8]
00576B61 > 803D DC835900>cmp byte ptr ds:[0x5983DC],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:[0x5983DB],0xC2,我们可以知道,
[0x5983DB]的数值和C2比较,如果相等的话就跳过验证,那么[0x5983DB]的数值是怎么来的吗?我们往上翻,在翻的过程中,我们会看到如下代码:
[C++] 纯文本查看 复制代码 0057689F . A3 04845900 mov dword ptr ds:[0x598404],eax ; PdfSplit.00598400
005768A4 > 803D D3835900>cmp byte ptr ds:[0x5983D3],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:[0x5983FC]
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:[0x5983F4],eax ; PdfSplit.00598400
005768DA > 8D45 D0 lea eax,dword ptr ss:[ebp-0x30]
注意到005768B2代码处的字符串没,倒过来读就是DO not crack me!。看来作者是知道我们要破解他,所以告诉我们不要有这种想法,在下面的验证中会出现很多次这样的语句,如果我们不从源头上改的话,去跟那么代码很是烦人。我们继续往上翻。
相关代码如下:
[C++] 纯文本查看 复制代码 00576608 321D 0C845900 xor bl,byte ptr ds:[0x59840C]
0057660E . 881D CC835900 mov byte ptr ds:[0x5983CC],bl
00576614 . 881D CD835900 mov byte ptr ds:[0x5983CD],bl
0057661A . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
0057661F . A2 CE835900 mov byte ptr ds:[0x5983CE],al
00576624 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576629 . A2 CF835900 mov byte ptr ds:[0x5983CF],al
0057662E . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576633 . A2 D0835900 mov byte ptr ds:[0x5983D0],al
00576638 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
0057663D . A2 D1835900 mov byte ptr ds:[0x5983D1],al
00576642 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576647 . A2 D2835900 mov byte ptr ds:[0x5983D2],al
0057664C . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576651 . A2 D3835900 mov byte ptr ds:[0x5983D3],al
00576656 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
0057665B . A2 D4835900 mov byte ptr ds:[0x5983D4],al
...省略相关代码
00576769 . A2 EF835900 mov byte ptr ds:[0x5983EF],al
0057676E . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576773 . A2 F0835900 mov byte ptr ds:[0x5983F0],al
00576778 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
0057677D . A2 F1835900 mov byte ptr ds:[0x5983F1],al
00576782 . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576787 . A2 F2835900 mov byte ptr ds:[0x5983F2],al
0057678C . A0 CC835900 mov al,byte ptr ds:[0x5983CC]
00576791 . A2 F3835900 mov byte ptr ds:[0x5983F3],al
00576796 . FF05 F4835900 inc dword ptr ds:[0x5983F4]
0057679C . 803D CC835900>cmp byte ptr ds:[0x5983CC],0x11
005767A3 . 74 0A je short PdfSplit.005767AF
00576608代码处通过xor bl,byte ptr ds:[0x59840C]来得出bl的值来,
然后将bl处分别赋值给0x5983CC-0x5983F3的数据区间。
如图4:
然后将0x5983CC-0x5983F3的每一个值分别进行比较,如0057679C所示,而自效验就因此在这
每一个比较之中,如果我们一个个的找非得累死不得,所以我们必须找到正确的bl值,至于比较就交给程序自行判断,反正我们的值是正确的,怕什么。
bl=bl xor [0x59840C],我们继续上翻代码:
[C++] 纯文本查看 复制代码 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:[0x5983F4]
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:[ebp-0x1C]
005765A5 > . E8 76CDE8FF call PdfSplit.00403320 ; ->System.@PStrCpy
005765AA . 8D45 E0 lea eax,dword ptr ss:[ebp-0x20]
005765AD . 8B15 10845900 mov edx,dword ptr ds:[0x598410]
005765B3 . 8A52 04 mov dl,byte ptr ds:[edx+0x4]
005765B6 . 8850 01 mov byte ptr ds:[eax+0x1],dl
005765B9 . C600 01 mov byte ptr ds:[eax],0x1
005765BC . 8D55 E0 lea edx,dword ptr ss:[ebp-0x20]
005765BF . 8D45 E4 lea eax,dword ptr ss:[ebp-0x1C]
005765C2 . B1 02 mov cl,0x2
005765C4 > . E8 27CDE8FF call PdfSplit.004032F0 ; ->System.@PStrNCat;
005765C9 . 8D55 E4 lea edx,dword ptr ss:[ebp-0x1C]
005765CC . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
005765CF > . E8 4CCDE8FF call PdfSplit.00403320 ; ->System.@PStrCpy
005765D4 . 8D45 E0 lea eax,dword ptr ss:[ebp-0x20]
005765D7 . 8B15 10845900 mov edx,dword ptr ds:[0x598410]
005765DD . 8A52 05 mov dl,byte ptr ds:[edx+0x5]
005765E0 . 8850 01 mov byte ptr ds:[eax+0x1],dl
005765E3 . C600 01 mov byte ptr ds:[eax],0x1
005765E6 . 8D55 E0 lea edx,dword ptr ss:[ebp-0x20]
005765E9 . 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
005765EC . B1 03 mov cl,0x3
005765EE > . E8 FDCCE8FF call PdfSplit.004032F0 ; ->System.@PStrNCat;
005765F3 . 8D55 DC lea edx,dword ptr ss:[ebp-0x24]
005765F6 . 8D45 E8 lea eax,dword ptr ss:[ebp-0x18]
005765F9 > . E8 86E7E8FF call PdfSplit.00404D84 ; ->System.@LStrFromString(String;String;ShortString;ShortString);<+>
005765FE . 8B45 E8 mov eax,dword ptr ss:[ebp-0x18]
00576601 > . E8 3253E9FF call PdfSplit.0040B938 ; ->SysUtils.StrToInt
00576606 . 8BD8 mov ebx,eax ; PdfSplit.00598400
通过以上代码我们可以知道,程序先用SetFilePointer函数,将文件指针至于0x9694,然后将通过
ReadFile将0x9694处的一个字节读出,并存在byte ptr ds:[0x59840C]中,我们通过C32定位下0x9694处的值
原文件如图5:
脱壳后的文件如图6:
原文件的值是0x79,脱壳后的文件的值是0xFF.
至于bl的值,他与文件无关,所以我们不必管他。
我们将[0x59840C]的值改为0x79,与bl进行异或,就能得出正确的值来。
修改如下:
00576608 . 321D 0C845900 xor bl,byte ptr ds:[0x59840C]
改为mov bl,0xC2即可。
如图7:
如下的错误还很多,比如说:
如图8:
如图9(进入死循环):
等等等等....
要修改的地方大概有十四处,我们可以通过SetFilePointer来定位:
[C++] 纯文本查看 复制代码 第一处:
00576608 . 321D 0C845900 xor bl,byte ptr ds:[0x59840C]
bl=C2(正确的值)
第二处:
00574538 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=F1
第三处:
0057F7BC . 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=12
第四处:
00580686 . 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=C1
第五处:
0057562D . 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=94
第六处:
0057898D |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=C7
第七处:
005771CE |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=21
第八处:
00577E99 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=F5
第九处:
0057EA20 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=85
第十处:
005792A4 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=6C
第十一处:
0057A0A4 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=F6
第十二处:
0057AB14 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=5F
第十三处:
0057BC93 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=09
第十四处
0057CBB8 |. 3205 0C845900 xor al,byte ptr ds:[0x59840C]
al=6F
修改完后保存,程序下正常运行。
3.爆破。
这个简单了,未注册的生成的PDF有水印
如图10:
爆破点如下:
标志位:
[C++] 纯文本查看 复制代码 0056A287 /75 06 |jnz short PdfSplit.0056A28F 改成nop
0056A289 |. C645 F3 01 |mov byte ptr ss:[ebp-0xD],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
|
免费评分
-
查看全部评分
|