MT unlocker 是一个手机解锁软件,它的加密方式是用hardlock加密狗加密,这种加密狗是一种外壳型加密狗,和HASP很相象。
小弟没有接触过外壳的狗,所以破解时用最原始的方法:跟踪。
工具: TRW2000
我们先安装好程序和狗驱动程序,然后运行TRW,选择TRW菜单中的“TRnewTCB”功能,然后运行程序,中断后就会显示程序的入
口:
016F:008E240 PUSH EBP <=====中断在这里
016F:008E0241 MOV EBP,ESP
016F:008E0243 PUSH EBX
016F:008E0244 PUSH ESI
016F:008E0245 PUSH EDI
016F:008E0246 PUSHA
016F:008E0247 MOV EAX,ESP
016F:008E0249 MOV [008E04C4],EAX
016F:008E024E MOV EAX,008E04E0
016F:008E0253 SUB EAX,[008E0500]
016F:008E0259 MOV [008E0500],EAX
016F:008E025E CMP DWORD [008E04C0],BYTE +00
016F:008E0265 JZ NEAR 008E027F
016F:008E026B MOV EAX,[008E04C4]
016F:008E0270 PUSH EAX
然后一直按F10,直到下面:
016F:008E0301 MOV EDI,[008E04E8]
016F:008E0307 MOV ECX,06
016F:008E030C REP MOVSD
016F:008E030E MOV EAX,[008E04C4]
016F:008E0313 PUSH EAX
016F:008E0314 CALL NEAR [008E04C0] <=====F8进入,以后凡是遇到象这样的CALL都要按F8进入
016F:008E031A ADD ESP,BYTE +04
进入后继续按F10,在中间会进入hardlook的狗驱动程序内,它的进入方式很特殊,至今我都不明白它是怎么进入的,就象是我们运
行程序出错时会被TRW中断一样,在TRW的命令栏中会出现"Break Due On Fault 03
FaultCode=A000"的字样,我们不管它,只管按F10和F12返回到主程序中,如下:
016F:008F611E MOV EAX,[EBP-50]
016F:008F6121 PUSH EAX
016F:008F6122 CALL NEAR [EBP-54]
016F:008F6125 TEST EAX,EAX <=====返回到这里
016F:008F6127 JNZ NEAR 008F6140
016F:008F612D MOV EAX,[EBP-50]
然后就是一直F10了,这个过程是解压缩判断狗的代码,为了加快追踪,当遇到象下面的代码时,将光标直接移到JNA指令所指向的地
址,然后按F7键,在以后的地方有很多类似这样的指令,你一样可以按这种方法跳过它:
016F:008F61F1 ADD DWORD [EBP-5C],BYTE +02
016F:008F61F5 ADD DWORD [EBP-64],BYTE +02
016F:008F61F9 MOV EAX,[EBP-68]
016F:008F61FC MOV ECX,[EBP-5C]
016F:008F61FF CMP [EAX+04],ECX <======
016F:008F6202 JNA NEAR 008F626B <======注意这条指令
016F:008F6208 MOV EAX,[EBP-64]
016F:008F620B XOR ECX,ECX
016F:008F620D MOV CX,[EAX]
016F:008F6210 AND ECX,F000
016F:008F6216 MOV [EBP+FFFFFF70],ECX
GO,GO,GO....GO TO:
6F:008F64B3 MOV EAX,`DOSMGR_BackFill_Allowed`
016F:008F64B9 MOV EAX,[EAX]
016F:008F64BB MOV `DOSMGR_BackFill_Allowed`,EAX
016F:008F64C1 MOV EAX,[EBP+08]
016F:008F64C4 PUSH EAX
016F:008F64C5 CALL NEAR [008F67CC] <=====F8进入
016F:008F64CB ADD ESP,BYTE +04
016F:008F64CE JMP 008F64D3
016F:008F64D3 MOV ECX,[EBP-10]
016F:008F64D6 MOV `DOSMGR_BackFill_Allowed`,ECX
进入CALL后会第二次进入到狗驱动程序,按上面的方法返回到主程序:
016F:008F8411 PUSH EAX
016F:008F8412 CALL NEAR [EBP-54]
016F:008F8415 TEST EAX,EAX <=====返回到这里
016F:008F8417 JNZ NEAR 008F8430
016F:008F841D MOV EAX,[EBP-50]
016F:008F8420 PUSH EAX
016F:008F8421 CALL NEAR [EBP-58]
016F:008F8424 MOV DWORD [EBP-28],08
一直按F10,到下面的地方:
016F:008F87A3 MOV EAX,`DOSMGR_BackFill_Allowed`
016F:008F87A9 MOV EAX,[EAX]
016F:008F87AB MOV `DOSMGR_BackFill_Allowed`,EAX
016F:008F87B1 MOV EAX,[EBP+08]
016F:008F87B4 PUSH EAX
016F:008F87B5 CALL NEAR [008F8ABC] <=====F8进入
016F:008F87BB ADD ESP,BYTE +04
进入后按一阵F10,就到了判断加密狗的地方了:
016F:008E5A67 MOV EDI,[008EFA68]
016F:008E5A6D MOV ECX,06
016F:008E5A72 REP MOVSD
016F:008E5A74 MOV EAX,[EBP+08]
016F:008E5A77 PUSH EAX
016F:008E5A78 CALL NEAR [008EFA10]
016F:008E5A7E ADD ESP,BYTE +04
016F:008E5A81 JMP 008E5B7F
016F:008E5A86 CALL 008E5EC8
<=====注意这个CALL,这个就是检测加密狗的CALL,当没有找到狗时,EAX就会返回6,怎样判断它是检测狗的CALL呢?我的经验是,如
果一个CALL很明显的比其它的CALL花费的时间要多,那么这个CALL九成是读狗的CALL,在我破解的狗中,几乎是所有读狗的CALL都
会花比较多的时间,大概是1-3秒吧,所以这个可以做为判断读狗的一个依据
016F:008E5A8B MOV [008EFA28],EAX <=====运行到这里后,用R指令修改EAX的数值,将EAX改为0,改完后你按F5后,你发
现程序已经能够正常运行了,但我们的目标是要脱掉狗保护,所以就继续F10了
016F:008E5A90 CMP DWORD [008EFA28],BYTE +00
016F:008E5A97 JZ NEAR 008E5AD6
016F:008E5A9D MOV EAX,[008EFA14]
016F:008E5AA2 PUSH EAX
016F:008E5AA3 MOV EAX,[008EFA28]
继续按F10,在这个过程中就是主程序的解压缩了,中间有三个CALL要F8进去的,同样可以用上来所说的加快跟踪的方法来跟踪下去
,当出现下面的指令时,解压缩就基本上完成了:
016F:008FE97D MOV [009006B0],EAX
016F:008FE982 PUSH DWORD 009005A4
016F:008FE987 MOV EAX,[00900498]
016F:008FE98C PUSH EAX
016F:008FE98D CALL `KERNEL32!GetProcAddress` <=====当出现这些指令时,就要放慢跟踪的速度了
016F:008FE993 MOV [009006C0],EAX
016F:008FE998 PUSH DWORD 009005B8
016F:008FE99D MOV EAX,[00900498]
016F:008FE9A2 PUSH EAX
016F:008FE9A3 CALL `KERNEL32!GetProcAddress`
<=====
016F:008FE9A9 MOV [009006BC],EAX
016F:008FE9AE PUSH DWORD 009005CC
016F:008FE9B3 MOV EAX,[00900498]
016F:008FE9B8 PUSH EAX
016F:008FE9B9 CALL `KERNEL32!GetProcAddress`
<=====
注意下面的代码,这些代码我估计是反跟踪的,因为我跟踪下去的时候,程序就会出现一个警告对话框,说程序是不能运行在调试状
态下的,我没有办法去掉它,因为我的跟踪技术还不是很好,哪位高手来帮我补充怎么样去掉这些反跟踪代码,在这里我先谢谢了.
代码如下:
16F:008FEBDF JMP 008FEC88
016F:008FEBE4 CMP DWORD [009004BC],BYTE +00
016F:008FEBEB JZ NEAR 008FEC64
016F:008FEBF1 CMP DWORD [009004C8],BYTE +00
016F:008FEBF8 JNZ NEAR 008FEC64
016F:008FEBFE PUSH DWORD 008FF9C2
016F:008FEC03 MOV EAX,[009004BC]
016F:008FEC08 PUSH EAX
016F:008FEC09 PUSH BYTE +00
016F:008FEC0B PUSH BYTE +00
016F:008FEC0D CALL `USER32!SetTimer` <====设置系统定时器,如果程序在跟踪状态,程序就会退出
016F:008FEC13 MOV [00900520],EAX
016F:008FEC18 CMP DWORD [00900520],BYTE +00
016F:008FEC1F JNZ NEAR 008FEC64
016F:008FEC25 MOV DWORD [009004A8],03
我们不管它了,继续F10,中间有两个CALL要F8进入,进入后按F10直到出现下面的代码:
016F:008E1FF3 JMP 008E2003
016F:008E1FF8 POP EDI <=====光标停在这里
016F:008E1FF9 POP ESI
016F:008E1FFA POP EBX
016F:008E1FFB POP EBP
016F:008E1FFC PUSH DWORD [008E2050]
016F:008E2002 RET
016F:008E2003 POP EDI
016F:008E2004 POP ESI
016F:008E2005 POP EBX
016F:008E2006 LEAVE
016F:008E2007 RET 0C
016F:008E200A ADD [EAX],AL
016F:008E200C ADD [EAX],AL
016F:008E200E ADD [EAX],AL
在地址016F:008E1FF8处停下来,我们已经可以DUMP出文件了,下指令 PEDUMP d:\temp\crack.exe,至此,我们已经破掉hardlook的
外壳狗了,但是由于我没有学过脱壳,所以脱出来的文件竟然有4M(脱壳前只有1M多一点),而且我不知道怎么样修正Import表,让程
序能在win2000下运行,不知哪位大虾对脱壳很有经验的话,能否指点小弟一两招呢,小弟感激涕零.
通过我们对这个程序的破解,我们应该清楚,在破解外壳型的加密狗时,关键在于你是否有耐心,还要有一双明亮的眼睛,外壳狗并
不可怕.同时也再次证明,无论是怎么好的狗,如果开发商不好好利用的话,结果是整个加密方案以失败告终.
- 标 题:Hardlock加密狗破解过程-----外壳型加密狗的破解方法 (7千字)
- 作 者:crackjack
- 时 间:2001-10-15 18:52:44
- 链 接:http://bbs.pediy.com