• 标 题:带狗杀Tdmd狗 (7千字)
  • 作 者:bug.soft  
  • 时 间:2003-08-14 23:35:08
  • 链 接:http://bbs.pediy.com

带狗杀Tdmd狗

【软件名称】商业,为了避免麻烦不写了

【软件限制】加密狗

【 破解人 】emb & bug.soft     Email:yzz2000@sina.com  QQ:50540415

【破解工具】Trw2000,ws2dasm,UltraEdit,FI3.01,hiew,大老的加密狗类型检测工具2.0

【软件简介】行业软件(CAD),小弟干这一行。无狗可安装,运行则无任何提示。彩虹天地的Tdmd.vxd狗,狗里面有大量花指令。

==================================================================================

【分析过程】

用FI3.01检测,提示Borland C++,无壳。

用“大老的加密狗类型检测工具2.0”检测软件,它竟然说没找到任何狗。大老称此版本支持检测的狗有“rockey4 sense3 tdsd(rc-dlgs-mh rcokey5 深思4 彩虹SENTINEL hasp系列 hardlock系列”,竟不认识微狗,看来有待改进。

这次杀狗用带狗杀狗方法,破解狗的常用断点:bpio 378,bpx deviceiocontrol,bpx createfilea,今天我们用bpx createfilea do "d *esp+4)" 这个断点来破它。从跟踪中可以发现,用 CreateFileA / DeviceIoControl 从Tdmd.VXD中获取数据。

运行软件,被Trw2000断下,观察数据窗口,不是Tdmd按F5继续,显业Tdmd停下,说明马上要读狗狗了。按F12 返回.

:00405F23 6A00                    push 00000000
:00405F25 6800000004              push 04000000
:00405F2A 6A00                    push 00000000
:00405F2C 6A00                    push 00000000
:00405F2E 6A00                    push 00000000
:00405F30 6A00                    push 00000000
:00405F32 6874F34A00              push 004AF374

* Reference To: KERNEL32.CreateFileA, Ord:0000h
                                  |
:00405F37 E8B4790A00              Call 004AD8F0
:00405F3C EB01                    jmp 00405F3F-------返回到这里
:00405F3E 81                      BYTE 81-------花指令,说明与狗笼共舞

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405F3C(U)
|
:00405F3F 83F8FF                  cmp eax, FFFFFFFF
:00405F42 750A                    jne 00405F4E
:00405F44 EB01                    jmp 00405F47
:00405F46 81                      BYTE 81


连续按F10,来到这里。看见程序用DeviceIoControl读取狗中数据。

:00406423 68CC000000              push 000000CC
:00406428 57                      push edi
:00406429 68F0000000              push 000000F0
:0040642E 55                      push ebp
:0040642F 53                      push ebx
:00406430 FF74241C                push [esp+1C]

* Reference To: KERNEL32.DeviceIoControl, Ord:0000h
                                  |
:00406434 E8AB740A00              Call 004AD8E4
:00406439 8BD8                    mov ebxeax
:0040643B EB01                    jmp 0040643E
:0040643D 81                      BYTE 81

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040643B(U)
|
:0040643E 85DB                    test ebxebx
:00406440 741B                    je 0040645D
:00406442 EB01                    jmp 00406445
:00406444 81                      BYTE 81

返回到42AE25 (call 00407001),发现没有花指令,说明已跳出狗笼,这就是花指令巨大作用。经过数天连续12小时工作,发现call 00407001负责从狗里读数据,几乎每个操作都有涉及到这个子程序,分析call 00407001,发现它需要两个参数,一个是offset,大概是狗里数据的偏移,二个是buffer,是读数据的缓冲区,每次读4个字节,成功的话返回值为0。


* Possible StringData Ref from Data Obj ->"?I@%d"
                                  |
:0042ADE6 C7053CD34C00444B4C00    mov dword ptr [004CD33C], 004C4B44-------缓
冲区buffer

* Possible StringData Ref from Data Obj ->"noname"
                                  |
:0042ADF0 68657C4B00              push 004B7C65
:0042ADF5 68A4074D00              push 004D07A4

* Reference To: cw3220._strcpy, Ord:0000h
                                  |
:0042ADFA E8D32A0800              Call 004AD8D2
:0042ADFF 83C408                  add esp, 00000008
:0042AE02 C70534D34C00C40C0000    mov dword ptr [004CD334], 00000CC4

* Possible Reference to Dialog: DialogID_0004 
                                  |
:0042AE0C C70530D34C0004000000    mov dword ptr [004CD330], 00000004----------读取字节数
:0042AE16 C7052CD34C003F000000    mov dword ptr [004CD32C], 0000003F]-------偏移Offset
:0042AE20 E8DCC1FDFF              call 00407001
:0042AE25 85C0                    test eaxeax   ----------判断返回值有狗为0
:0042AE27 750A                    jne 0042AE33    ----------跳则死
:0042AE29 C70540D34C002B010000    mov dword ptr [004CD340], 0000012B

拉出ws2dasm,有时候静态分析,视野比较开阔。总共有19处调用狗。

* Referenced by a CALL at Addresses:
|:0042AE20   , :0042B099   , :0042B0BB   , :0042B0DC   , :0042B0FC   
|:0042B11D   , :0042B19B   , :0042B1EE   , :0042B2D1   , :0043D4AA   
|:0043D4FF   , :0044ADDC   , :0044DA4C   , :0044E34E   , :0044E399   
|:0044E5EB   , :0045DFC8   , :0045E382   , :0049EE9B   
|
:00407001 51                      push ecx
:00407002 EB00                    jmp 00407004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407002(U)
|
:00407004 EB0C                    jmp 00407012
:00407006 8DA94B464090            lea ebpdword ptr [ecx+9040464B]
:0040700C 871B                    xchg dword ptr [ebx], ebx
:0040700E 8E10                    mov ss, [eax]
:00407010 149F                    adc al, 9F

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407004(U)
|
:00407012 EB01                    jmp 00407015
:00407014 81                      BYTE 81

我们随意取一处看看。

:0044E5CE C7052CD34C0054000000    mov dword ptr [004CD32C], 00000054]-------偏移Offset

* Possible Reference to Dialog: DialogID_0004 
                                  |
:0044E5D8 C70530D34C0004000000    mov dword ptr [004CD330], 00000004----------读取字节数
:0044E5E2 8D4DFC                  lea ecxdword ptr [ebp-04]
:0044E5E5 890D3CD34C00            mov dword ptr [004CD33C], ecx-------缓冲区buffer
:0044E5EB E8118AFBFF              call 00407001
:0044E5F0 817DFC6B5EF904          cmp dword ptr [ebp-04], 04F95E6B---------判断读出来的数据
:0044E5F7 7407                    je 0044E600----------正确则跳,狗里读出的数据作为校验使用,因此存在爆破的可能
:0044E5F9 33C0                    xor eaxeax
:0044E5FB A308074D00              mov dword ptr [004D0708], eax

因为有狗,带狗运行,进行所有的操作,以参数offset索引,把参数buffer中4个字节记录成表。给程序打补丁时,以参数offset索引,根据表里索引填入buffer中数据。追进call 00407001,以call 00406358为打补丁突破口。

|:0040703C(U)
|
:0040703F E814F3FFFF              call 00406358

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040702C(U), :0040703A(U)
|
:00407044 59                      pop ecx
:00407045 C3                      ret


改成call 004063BD。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040703C(U)
|
:0040703F E879F3FFFF              call 004063BD

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040702C(U), :0040703A(U)
|
:00407044 59                      pop ecx
:00407045 C3                      ret

把19处所得数据放在406358~4063bb中。以参数offset索引取数据。补丁代码如下。

:004063BD 60                      pushad----------保存环境
:004063BE BE58634000              mov esi, 00406358----------表基址
:004063C3 8B053CD34C00            mov eaxdword ptr [004CD33C]-------缓
冲区buffer
:004063C9 8BF8                    mov edieax
:004063CB 33C9                    xor ecxecx
:004063CD 8A0D30D34C00            mov clbyte ptr [004CD330]----------读取字节数
:004063D3 33C0                    xor eaxeax
:004063D5 8A052CD34C00            mov albyte ptr [004CD32C]----------表索引
:004063DB 03F0                    add esieax
:004063DD 90                      nop
:004063DE F3                      repz
:004063DF A4                      movsb----------取数据
:004063E0 61                      popad----------恢复环境
:004063E1 90                      nop
:004063E2 33C0                    xor eaxeax----------有狗标志
:004063E4 C3                      ret

【后记】 

好了,到这里TDMD狗就被我们破掉了。前几天我放在看雪初学者论坛上“深思洛克3和飞天诚信狗加壳NOTEPAD.EXE ”,不知大家研究了吗?可来信与我交流。第一次写文章好累!如觉我写得可以,支持一下,我会接着写飞天诚信狗打狗篇。