jjdg 发表于 2007-8-3 02:58:36

爆破HTMLPad 2007 Pro 8.1.0.78

【文章标题】: 爆破HTMLPad 2007 Pro 8.1.0.78
【文章作者】: JJDG
【软件名称】: HTMLPad 2007 Pro 8.1.0.78
【软件大小】: 3.83M
【下载地址】: http://dl.onlinedown.net/down/htmlpad8.zip
【保护方式】: 文件头修改+壳
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD PEID
【操作平台】: xp
【软件介绍】: HTMLPad 2004 是个具有强大功能的HTML原始码编辑器
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
HTMLPad 2007 Pro 8.1.0.78
软件大小:3952KB 软件类别:国外软件/主页制作
下载次数:9011 软件授权:共享版
软件语言:英文 运行环境:Win9x/Me/NT/2000/XP/2003
软件评级: 更新时间:2007-7-27 10:19:22
开 发 商:Home Page 联 系 人:未知

软件详细信息
HTMLPad 2004 是个具有强大功能的 HTML 原始码编辑器,专为自动化及加速各式各样的网页文件的研发所设计,尤其是 HTML。特别的是它支援 JavaScript、VBScript、SSI、ASP、Perl,更是一个所见即所得的网页编辑器。

下载安装后,peid查看:什么也没发现
运行程序,有提示音,并且弹出提示剩余使用次数的对话框
进入程序,找不到输入注册码的地方,所以决定直接爆破!

OD载入,提示程序被压缩、加密,然后停在下面:
00A83000 >E8 00000000   CALL htmlpad.00A83005      <---停在这里!
00A83005    58            POP EAX
00A83006    83D8 05         SBB EAX,5
00A83009    89C3            MOV EBX,EAX
00A8300B    83C3 30         ADD EBX,30
00A8300E    8B43 39         MOV EAX,DWORD PTR DS:
00A83011    05 00004000   ADD EAX,htmlpad.00400000               ; ASCII "MZP"
00A83016    8B4B 3D         MOV ECX,DWORD PTR DS:
00A83019    89C6            MOV ESI,EAX
00A8301B    89C7            MOV EDI,EAX
00A8301D    8CD8            MOV AX,DS
00A8301F    8EC0            MOV ES,AX                              ; 段寄存器更改
00A83021    B4 00         MOV AH,0
00A83023    AC            LODS BYTE PTR DS:
00A83024    30E0            XOR AL,AH
00A83026    88C4            MOV AH,AL
00A83028    AA            STOS BYTE PTR ES:
00A83029^ E2 F8         LOOPD SHORT htmlpad.00A83023
00A8302B    8B43 08         MOV EAX,DWORD PTR DS:      <---F4到在这里!      
00A8302E    50            PUSH EAX
00A8302F    C3            RETN
00A83030    0000            ADD BYTE PTR DS:,AL
00A83032    0000            ADD BYTE PTR DS:,AL
00A83034    0000            ADD BYTE PTR DS:,AL
00A83036    0000            ADD BYTE PTR DS:,AL
00A83038    B0 7C         MOV AL,7C
00A8303A    A7            CMPS DWORD PTR DS:,DWORD PTR ES:[ED>
00A8303B    0000            ADD BYTE PTR DS:,AL
00A8303D    0002            ADD BYTE PTR DS:,AL
00A8303F    1A00            SBB AL,BYTE PTR DS:
00A83041    0000            ADD BYTE PTR DS:,AL
00A83043    0000            ADD BYTE PTR DS:,AL
00A83045    0000            ADD BYTE PTR DS:,AL
00A83047    0000            ADD BYTE PTR DS:,AL
一上来就是个CALL啊!什么壳啊?会不会可能是修改了文件头啊?
F7向下,然后F4到00A8302B,F8单步,来到:
00A77CB0    60            PUSHAD                  <---来到这里眼熟的东西出来!
00A77CB1    BE 00208E00   MOV ESI,htmlpad.008E2000
00A77CB6    8DBE 00F0B1FF   LEA EDI,DWORD PTR DS:
00A77CBC    57            PUSH EDI
00A77CBD    89E5            MOV EBP,ESP
00A77CBF    8D9C24 80C1FFFF LEA EBX,DWORD PTR SS:
00A77CC6    31C0            XOR EAX,EAX
00A77CC8    50            PUSH EAX
00A77CC9    39DC            CMP ESP,EBX
00A77CCB^ 75 FB         JNZ SHORT htmlpad.00A77CC8
00A77CCD    46            INC ESI
00A77CCE    46            INC ESI
00A77CCF    53            PUSH EBX
00A77CD0    68 695E6700   PUSH htmlpad.00675E69
00A77CD5    57            PUSH EDI
00A77CD6    83C3 04         ADD EBX,4
00A77CD9    53            PUSH EBX
00A77CDA    68 A65C1900   PUSH 195CA6
00A77CDF    56            PUSH ESI
00A77CE0    83C3 04         ADD EBX,4
00A77CE3    53            PUSH EBX
00A77CE4    50            PUSH EAX
F8一次,
注意寄存器里面ESP的变化,
EAX 00A77CB0 htmlpad.00A77CB0
ECX 00000000
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 00A83030 htmlpad.00A83030
ESP 0012FFA4
EBP 0012FFF0
ESI 008E2400 htmlpad.008E2400
EDI 008E2400 htmlpad.008E2400
EIP 00A77CB1 htmlpad.00A77CB1
C 0ES 0023 32位 0(FFFFFFFF)
P 1CS 001B 32位 0(FFFFFFFF)
A 0SS 0023 32位 0(FFFFFFFF)
Z 0DS 0023 32位 0(FFFFFFFF)
S 0FS 003B 32位 7FFDF000(FFF)
T 0GS 0000 NULL
D 0
O 0LastErr ERROR_SUCCESS (00000000)
EFL 00000206 (NO,NB,NE,A,NS,PE,GE,G)
ST0 empty -UNORM BCE0 01050104 00000000
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 1.0000000000000000000
ST7 empty 1.0000000000000000000
               3 2 1 0      E S P U O Z D I
FST 4000Cond 1 0 0 0Err 0 0 0 0 0 0 0 0(EQ)
FCW 027FPrec NEAR,53掩码    1 1 1 1 1 1
采用ESP定律下硬件访问断点:在ESP 0012FFA4上面右键,数据窗口中跟随,在0012FFA4008E2400.$?   htmlpad.008E2400上面右键,选择断点-硬件访问-字,
F9来到,
00A78835    8D4424 80       LEA EAX,DWORD PTR SS:    <---停在这里!
00A78839    6A 00         PUSH 0
00A7883B    39C4            CMP ESP,EAX
00A7883D^ 75 FA         JNZ SHORT htmlpad.00A78839
00A7883F    83EC 80         SUB ESP,-80                      <---F4到在这里!
00A78842- E9 5DECD9FF   JMP htmlpad.008174A4

F4到00A7883F,F8两次,来到:
008174A4    55            PUSH EBP       好了!这里一看就是delphi的开头!就在这里脱壳!
008174A5    8BEC            MOV EBP,ESP
008174A7    83C4 E0         ADD ESP,-20
008174AA    53            PUSH EBX
008174AB    56            PUSH ESI
008174AC    57            PUSH EDI
008174AD    33C0            XOR EAX,EAX
008174AF    8945 E0         MOV DWORD PTR SS:,EAX
008174B2    8945 E8         MOV DWORD PTR SS:,EAX
008174B5    8945 E4         MOV DWORD PTR SS:,EAX
008174B8    8945 EC         MOV DWORD PTR SS:,EAX
008174BB    B8 8C638100   MOV EAX,htmlpad.0081638C
008174C0    E8 4B04BFFF   CALL htmlpad.00407910
008174C5    33C0            XOR EAX,EAX
008174C7    55            PUSH EBP
008174C8    68 E1778100   PUSH htmlpad.008177E1
008174CD    64:FF30         PUSH DWORD PTR FS:
008174D0    64:8920         MOV DWORD PTR FS:,ESP
008174D3    E8 5C99E3FF   CALL htmlpad.00650E34
008174D8    68 F0778100   PUSH htmlpad.008177F0                  ; ASCII "WeBuilder"
008174DD    6A 00         PUSH 0
008174DF    6A 00         PUSH 0
008174E1    E8 6E08BFFF   CALL htmlpad.00407D54
008174E6    33DB            XOR EBX,EBX
008174E8    E8 B709BFFF   CALL htmlpad.00407EA4                  ; JMP 到 ntdll.RtlGetLastWin32Error

在008174A4脱壳,保存文件!
程序脱壳后可以运行!
PEID检测,Borland Delphi 6.0 - 7.0

下面开始爆破!
OD载入脱壳后的文件,提示程序被压缩,不管了,继续,
先查找ASCII字符串,看看有没有可用的,
仅发现一处有用的:0077A8BB    B8 94A97700   MOV EAX,2.0077A994   ; your free 30-usage trial period has %d uses remaining.
在0077A8BB先下个断点再说
F9一下,程序断下,注意右边寄存器里面的值,
EAX 0000001B               <---仔细看这里!
ECX 00000000
EDX 0012FE08
EBX 014EE2F8
ESP 0012FDF0
EBP 0012FE18
ESI 0000001D
EDI 7C930738 ntdll.7C930738
EIP 0077A8BB 2.0077A8BB
C 0ES 0023 32位 0(FFFFFFFF)
P 1CS 001B 32位 0(FFFFFFFF)
A 0SS 0023 32位 0(FFFFFFFF)
Z 1DS 0023 32位 0(FFFFFFFF)
S 0FS 003B 32位 7FFDF000(FFF)
T 0GS 0000 NULL
D 0
O 0LastErr ERROR_NO_SCROLLBARS (000005A7)
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
ST0 empty -UNORM BCE0 01050104 00000000
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 1.0000000000000000000
ST6 empty -20.322303726834154090
ST7 empty 0.9999884259259259611
               3 2 1 0      E S P U O Z D I
FST 4000Cond 1 0 0 0Err 0 0 0 0 0 0 0 0(EQ)
FCW 1372Prec NEAR,64掩码    1 1 0 0 1 0


F8单步走过几个RetN后,来到
00817676    8B00            MOV EAX,DWORD PTR DS:
00817678    BA 50788100   MOV EDX,2.00817850                     ; ASCII "HTMLPad 2007"
0081767D    E8 32B1C8FF   CALL 2.004A27B4
00817682    6A 00         PUSH 0
00817684    E8 8313BFFF   CALL <JMP.&USER32.MessageBeep>          <---提示音应该就是这个触发的了! F7进去
00817689    33C9            XOR ECX,ECX
0081768B    B2 01         MOV DL,1
0081768D    A1 F0A27700   MOV EAX,DWORD PTR DS:
00817692    E8 C539C8FF   CALL 2.0049B05C
00817697    8B15 BC008200   MOV EDX,DWORD PTR DS:            ; 2.00825AA0来到这里!
0081769D    8902            MOV DWORD PTR DS:,EAX
0081769F    A1 BC008200   MOV EAX,DWORD PTR DS:
008176A4    8B00            MOV EAX,DWORD PTR DS:
008176A6    8B10            MOV EDX,DWORD PTR DS:
008176A8    FF92 EC000000   CALL DWORD PTR DS:      <----NAG   F7进去
008176AE    83F8 02         CMP EAX,2
008176B1    0F84 0F010000   JE 2.008177C6


一路来到00817697,
发现上面有个00817684    E8 8313BFFF   CALL <JMP.&USER32.MessageBeep> ,推测提示音应该就是这个触发的了,
F8一过008176A8,那个讨厌的NAG就出来了,上面提示还有27天,27不就是16进制的1B吗?
在NAG上面点了evaluate后,停在008176AE    83F8 02         CMP EAX,2
F9直接进入程序了,

好!
小结一下:
要爆破这个程序,有3个问题要解决,1,时间的问题;2,提示音的问题;3,NAG的问题

OD重新载入,
因为0077A8BB处,EAX已经赋值为1B,所以重点看它是在上面哪里进行赋值的,于是bp 0077A871
   
另外,下断点,
bp 00817684   <---提示音的问题
bp 008176A8   <---NAG的问题

F9运行,程序断在00817684,F7进去,
00408A0C- FF25 90798200   JMP DWORD PTR DS:[<&USER32.MessageBeep>] ; USER32.MessageBeep
直接改JMP DWORD PTR DS:[<&USER32.MessageBeep>] 为RET,
F8回到00817689    33C9            XOR ECX,ECX,提示音没有了!

继续F9,
程序断在0077A871    8B45 FC         MOV EAX,DWORD PTR SS:
寄存器里面:
EAX 0012FDE8
ECX FFFFFFFE
EDX 0077A938 ASCII "YVjcqrdw`YHlfwjvjcqYRlkajrvYFpww`kqS`wvljkYLkq`wk`q%V`qqlkbvYR`gLA"
EBX 014EE2F8
ESP 0012FDF4
EBP 0012FE18
ESI 00000000
EDI 7C930738 ntdll.7C930738
EIP 0077A871 2.0077A871
C 0ES 0023 32位 0(FFFFFFFF)
P 0CS 001B 32位 0(FFFFFFFF)
A 0SS 0023 32位 0(FFFFFFFF)
Z 0DS 0023 32位 0(FFFFFFFF)
S 1FS 003B 32位 7FFDF000(FFF)
T 0GS 0000 NULL
D 0
O 0LastErr ERROR_NO_SCROLLBARS (000005A7)
EFL 00000282 (NO,NB,NE,A,S,PO,L,LE)
ST0 empty 7.3425752709623960480
ST1 empty 23.352865954566006480
ST2 empty 111.29743639608906400
ST3 empty 2035.6020761245671960
ST4 empty 11345.481353325642430
ST5 empty 1.0000000000000000000
ST6 empty -20.322303726834154090
ST7 empty 0.9999884259259259611
               3 2 1 0      E S P U O Z D I
FST 4000Cond 1 0 0 0Err 0 0 0 0 0 0 0 0(EQ)
FCW 1372Prec NEAR,64掩码    1 1 0 0 1 0

看来,还没有对EAX赋值,F8继续,
0077A871    8B45 FC         MOV EAX,DWORD PTR SS:
0077A874    E8 97FEFFFF   CALL 2.0077A710      F7进去
0077A879    8BF0            MOV ESI,EAX          F8到这里
F8到0077A879的时候,可以看见,EAX被赋值了,
EAX 0000001A
ECX 00000001
EDX 014EE8FC ASCII "\Software\Microsoft\Windows\CurrentVersion\Internet Settings\WebID"
EBX 014EE2F8
ESP 0012FDF4
EBP 0012FE18
ESI 00000000
EDI 7C930738 ntdll.7C930738
EIP 0077A879 2.0077A879
C 0ES 0023 32位 0(FFFFFFFF)
P 0CS 001B 32位 0(FFFFFFFF)
A 0SS 0023 32位 0(FFFFFFFF)
Z 0DS 0023 32位 0(FFFFFFFF)
S 0FS 003B 32位 7FFDF000(FFF)
T 0GS 0000 NULL
D 0
O 0LastErr ERROR_NO_SCROLLBARS (000005A7)
EFL 00000202 (NO,NB,NE,A,NS,PO,GE,G)
ST0 empty 7.3425752709623960480
ST1 empty 23.352865954566006480
ST2 empty 111.29743639608906400
ST3 empty 2035.6020761245671960
ST4 empty 11345.481353325642430
ST5 empty 1.0000000000000000000
ST6 empty -20.322303726834154090
ST7 empty 0.9999884259259259611
               3 2 1 0      E S P U O Z D I
FST 4000Cond 1 0 0 0Err 0 0 0 0 0 0 0 0(EQ)
FCW 1372Prec NEAR,64掩码    1 1 0 0 1 0

看来,关键就在0077A874的CALL 里面,
重新载入程序,
在0077A874用F7进去,
F8向下,同时注意寄存器EAX的变化,
0077A7B4    8BC8            MOV ECX,EAX                  EAX的值就变为00000019,
0077A7B6    83F9 1E         CMP ECX,1E                     1E!这不就是30次吗!?
0077A7B9    7E 02         JLE SHORT 2.0077A7BD         不足30次就跳
0077A7BB    33C9            XOR ECX,ECX
0077A7BD    894D F8         MOV DWORD PTR SS:,ECX   剩余的次数
0077A7C0    85C9            TEST ECX,ECX                   为0就直接跳走
0077A7C2    74 01         JE SHORT 2.0077A7C5
0077A7C4    49            DEC ECX                        还有可用的次数就减少一次
0077A7C5    69C1 82010000   IMUL EAX,ECX,182
0077A7CB    8BC8            MOV ECX,EAX

好了!
只要把0077A7B6    83F9 1E         CMP ECX,1E改为 CMP ECX,ECX
把0077A7C4    49            DEC ECX改为nop    这样次数就不会减少了

F9来到008176A8    FF92 EC000000   CALL DWORD PTR DS:,
F7进去,
0049F4B4    55            PUSH EBP             停在这里!
0049F4B5    8BEC            MOV EBP,ESP
0049F4B7    83C4 E0         ADD ESP,-20
0049F4BA    53            PUSH EBX
0049F4BB    56            PUSH ESI
0049F4BC    33D2            XOR EDX,EDX
0049F4BE    8955 E0         MOV DWORD PTR SS:,EDX
0049F4C1    8945 FC         MOV DWORD PTR SS:,EAX
0049F4C4    33C0            XOR EAX,EAX
0049F4C6    55            PUSH EBP
0049F4C7    68 7CF74900   PUSH 2.0049F77C
0049F4CC    64:FF30         PUSH DWORD PTR FS:
0049F4CF    64:8920         MOV DWORD PTR FS:,ESP
0049F4D2    E8 41F9FDFF   CALL 2.0047EE18
0049F4D7    8B45 FC         MOV EAX,DWORD PTR SS:
0049F4DA    8078 57 00      CMP BYTE PTR DS:,0

把0049F4B4    55            PUSH EBP改为ret,
F8返回,NAG没有出现,程序直接进入操作界面了!

把文件保存一下,关闭OD,直接运行试试!OK!

爆破成功了!

--------------------------------------------------------------------------------
【经验总结】
虽然不知道这个软件的壳到底是什么名字,而且可能程序是在加壳后又修改了文件头,但总的来说,这个壳不难!
对于0077A7B4那部分代码,我们还可以做一些其他的修改,比如改DEC ECX为INC ECX,这样用一次多一次,当然如果NAG被
nop了,就看不到这种用一送一的效果了!
希望菜鸟们都可以练一下!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于PYG技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年07月30日 下午 04:47:59

xuhui906 发表于 2007-8-3 08:54:06

不错哦,谢谢楼主分享了

tigerisme 发表于 2007-8-3 09:10:35

精彩,谢谢兄弟的文章!/:good

mzksoqna7 发表于 2007-8-4 12:08:03

学习一下了 谢谢楼主!!

wangwei628 发表于 2007-8-4 17:31:01

学习了,谢谢分享!

haishi 发表于 2007-8-4 18:36:18

写的很详细,谢谢分享!

gao2008ss 发表于 2007-12-2 10:04:31

deng000 发表于 2007-12-3 00:00:13

相当好的教程啊,谢谢

HCLZ 发表于 2007-12-3 00:51:57

有很多地方不明白具体用意
比如
00A83029^ E2 F8         LOOPD SHORT htmlpad.00A83023
00A8302B    8B43 08         MOV EAX,DWORD PTR DS:      <---F4到在这里!      
00A8302E    50            PUSH EAX
可以把你 的 思路说清楚吗?
为什么这么做,怎么判断的!

zckey09 发表于 2007-12-4 08:23:23

谢谢分享 很详细啊
页: [1] 2
查看完整版本: 爆破HTMLPad 2007 Pro 8.1.0.78