目标:ArtCursors 4.01
壳:ASProtect 1.23 RC4
没办法,偶特别喜欢32位色的精美小图标、光标,懂得一点PhotoShop,可是PhotoShop竟不支持图标、光标格式!于是上网狂找能编辑32位色图标、光标的软件,结果发现:怎么那些好用的图标编辑软件都那么喜欢穿Aspr牌的马甲呢?网上pj版又不好找,很吊胃口啊,不行,欲火焚身,非把她们的马甲脱光光再插插了不可~~~~~~~~~~~~~唉,偶等菜鸟不会分析注册算法,只能手忙脚乱地拿着各种工具干危险的力气活——爆破
一、脱壳
用stripper2.07,秒杀Aspr!
================================================================================
二、修补
偷走的代码被变形了,Stripper就新增加一个段,把变形的入口代码抄下来放这里,实在不爽,不过天助我也,这个软件的早期版本我脱过,Delphi5写的,他们的入口代码的格式我都能背熟了:
PUSH EBP
MOV EBP,ESP
ADD ESP,-0C
MOV EAX,xxxxxx
CALL xxxxxx
CALL [xxxxxx] 〈=被偷走的代码执行完后来到这里
只要在合适的时候找到EAX是多少就好了。
载入原版跟踪,闯过26处SEH,然后在按Alt-M打开内存镜象,在code段设置内存访问断点,断下后来到这里:
0040692C - FF25 B0E25400 JMP DWORD PTR DS:[54E2B0] 〈=断在这里
00406932 8BC0 MOV EAX,EAX
00406934 - FF25 ACE25400 JMP DWORD PTR DS:[54E2AC]
0040693A 8BC0 MOV EAX,EAX
0040693C - FF25 A8E25400 JMP DWORD PTR DS:[54E2A8]
00406942 8BC0 MOV EAX,EAX
00406944 - FF25 A4E25400 JMP DWORD PTR DS:[54E2A4]
0040694A 8BC0 MOV EAX,EAX
清除内存访问断点后,继续F8跟踪,来到这里:
00406A34 BA 08615400 MOV EDX,ARTCUR.00546108
00406A39 52 PUSH EDX
00406A3A 8905 DCD45400 MOV DWORD PTR DS:[54D4DC],EAX
00406A40 8942 04 MOV DWORD PTR DS:[EDX+4],EAX
00406A43 C742 08 0000000>MOV DWORD PTR DS:[EDX+8],0
00406A4A C742 0C 0000000>MOV DWORD PTR DS:[EDX+C],0
00406A51 E8 8AFFFFFF CALL ARTCUR.004069E0
00406A56 5A POP EDX
00406A57 58 POP EAX
00406A58 E8 C7D0FFFF CALL ARTCUR.00403B24 〈=在此处记下EAX值:544d9c
00406A5D C3 RETN
从406a5d处返回到545244 CALL [54BC14]
上面的代码片段执行了一部分54523F CALL 00406A2C里的代码,因此可以在这个call里合适的时机找到EAX的值。
00545233 0000 ADD BYTE PTR DS:[EAX],AL 〈=被偷走的代码
00545235 0000 ADD BYTE PTR DS:[EAX],AL
00545237 0000 ADD BYTE PTR DS:[EAX],AL
00545239 0000 ADD BYTE PTR DS:[EAX],AL
0054523B 0000 ADD BYTE PTR DS:[EAX],AL
0054523D 0000 ADD BYTE PTR DS:[EAX],AL
0054523F E8 E817ECFF CALL ARTCUR.00406A2C 〈=断不下来
00545244 FF15 14BC5400 CALL DWORD PTR DS:[54BC14] 〈=断在这里
现在补上被偷走的代码:
00545234 55 PUSH EBP
00545235 . 8BEC MOV EBP,ESP
00545237 . 83C4 F4 ADD ESP,-0C
0054523A . B8 9C4D5400 MOV EAX,00544D9C
然后用LordPE修正入口点为145234,再把最后一个节删掉,并用winhex把该节所对应的尾部数据删掉(从该节的Roffset:183600开始到尾部)。
===================================================================================
三、拆引信
用Stripper脱壳的文件,运行时总是提示时间到了,只能跟原版比较跟踪。
在545244处,
545244 CALL DWORD [54BC14]
原版call进544c48,而脱壳版call进544d44,于是把脱壳文件的54BC14处对应的文件偏移处数据改为48 4c 54 00,保存,运行,轰~~~~~~~来到一个除法“炸弹”:
004FF0F3 |. E8 5429F6FF CALL dump.00461A4C
004FF0F8 |. 8BD8 MOV EBX,EAX
004FF0FA |. 81FB 40420F00 CMP EBX,0F4240
004FF100 |. 7E 34 JLE SHORT dump.004FF136 〈=要跳
004FF102 |. E8 D9EEF7FF CALL dump.0047DFE0
004FF107 |. 85C0 TEST EAX,EAX
004FF109 |. 7E 2B JLE SHORT dump.004FF136
004FF10B |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004FF10E |. 33C0 XOR EAX,EAX
004FF110 |. E8 9F39F0FF CALL dump.00402AB4
004FF115 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004FF118 |. E8 2F29F6FF CALL dump.00461A4C
004FF11D |. 2BD8 SUB EBX,EAX
004FF11F |. B8 17000000 MOV EAX,17
004FF124 |. 99 CDQ 〈=异常
原版跟踪发现004FF100处在原版是跳的,不然也会异常,就把脱壳版的004FF100处机器码改成EB 34,保存,运行。。。
轰!!!!!!!!!!!!!!!!!!!!!!!!!!!!
一个窗口炸弹被引爆了!无限的脱壳版程序在运行,系统资源耗尽!
重起,继续跟踪,发现炸弹引信在此:
004FF01A |. E8 2D2AF6FF CALL dump.00461A4C
004FF01F |. 3D 804F1200 CMP EAX,124F80
004FF024 |. 7E 30 JLE SHORT dump.004FF056 〈=不跳就挂
004FF026 |. E8 B5EFF7FF CALL dump.0047DFE0
004FF02B |. 85C0 TEST EAX,EAX
004FF02D |. 7E 27 JLE SHORT dump.004FF056
004FF02F |. 6A 05 PUSH 5
004FF031 |. 6A 00 PUSH 0
004FF033 |. 6A 00 PUSH 0
004FF035 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004FF038 |. 33C0 XOR EAX,EAX
004FF03A |. E8 753AF0FF CALL dump.00402AB4
004FF03F |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004FF042 |. E8 CD51F0FF CALL dump.00404214
004FF047 |. 50 PUSH EAX ; |FileName
004FF048 |. 6A 00 PUSH 0 ; |Operation = NULL
004FF04A |. 6A 00 PUSH 0 ; |hWnd = NULL
004FF04C |. E8 D369F5FF CALL <JMP.&shell32.ShellExecuteA> ; \ShellExecuteA
就是4FF04C处的ShellExecuteA不断调用自己,造成窗口炸弹!好阴险的家伙!
原版的4FF024处也是跳的,不然也是窗口炸弹。
保存修改,再运行,哈,点掉NAG,主界面出来了!不过老是闪,看来还有地方有问题,经过跟踪发现,上面两个”炸弹“的”引信”(条件跳转语句)前的call,都是调用461a4c处的代码,461a4c肯定有问题!
在461a4c里,用两个OD经过漫长的跟踪比较各个寄存器的值,发现这些代码很可疑:
00408E64 |. 54 PUSH ESP ; /pLocalFileTime
00408E65 |. 8D43 2C LEA EAX,DWORD PTR DS:[EBX+2C] ; |
00408E68 |. 50 PUSH EAX ; |pFileTime
00408E69 |. E8 F2DCFFFF CALL <JMP.&kernel32.FileTimeToLocalFileT>; \FileTimeToLocalFileTime
00408E6E |. 53 PUSH EBX ; /pDOSTime
00408E6F |. 8D43 02 LEA EAX,DWORD PTR DS:[EBX+2] ; |
00408E72 |. 50 PUSH EAX ; |pDOSDate
00408E73 |. 8D4424 08 LEA EAX,DWORD PTR SS:[ESP+8] ; |
00408E77 |. 50 PUSH EAX ; |pFileTime
00408E78 |. E8 DBDCFFFF CALL <JMP.&kernel32.FileTimeToDosDateTim>; \FileTimeToDosDateTime
经过这些代码后,原版和脱壳版的EAX寄存器的值不一样,脱壳版cmp指令比较eax值,触发“引信”。继续跟踪发现上面代码经过几次ret后,有这么一个语句:
004FF0A2 |. 3D A0BB0D00 CMP EAX,0DBBA0
004FF0A7 |. 0F9CC3 SETL BL 〈=好象是说,如果大于,就设置BL为1
发现只要把SETL BL改成mov bl,1就搞定了,至此脱壳+修复完全搞定,时间限制解除,运气好啊~~~~~~~~~
接下来就是搞定NAG了,偶累了,下次再说O_o