【文章标题】: 带狗杀TDSD狗并解除自校验,(其实不应该叫解除,应该叫爆破)
【文章作者】: nahum[FCG]
【作者邮箱】: [email]nahum@163.com[/email]
【软件名称】: 商业软件暂时保密
【下载地址】: 无地址
【加壳方式】: 狗壳
【保护方式】: 并口加密狗
【编写语言】: VB
【使用工具】: peid,OD,C32Asm
【操作平台】: XP
【软件介绍】: 商业软件不做介绍了。
【作者声明】: 这个是本人破解的第8只狗了,只从事破解,不进行复制(关键是不会)。只为研究学习和交流,没有任何商业目的,也不从事商业破解。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
无狗可安装,PEID不能识别的壳。运行报错,提示Can't find SoftDog!,好就从他入手吧,使用C32asm
字符串查找到:
::00500B47:: FF05 00605000 INC DWORD PTR [506000] \:BYJMP JmpBy:00500B3B,
::00500B4D:: A1 2A605000 MOV EAX,[50602A]
::00500B52:: 3305 00605000 XOR EAX,[506000]
::00500B58:: A3 26605000 MOV [506026],EAX
::00500B5D:: 833D 7C605000 00 CMP DWORD PTR [50607C],0 \:BYJMP JmpBy:00500B45,
::00500B64:: 74 19 JE SHORT 00500B7F 《 关键位置,看看调用他的CALL
::00500B66:: 68 00100000 PUSH 1000
::00500B6B:: 68 486B5000 PUSH 506B48 \->: Hint
::00500B70:: 68 506B5000 PUSH 506B50 \->: Please Plug SoftDog!
::00500B75:: 6A 00 PUSH 0
::00500B77:: FF15 B8815000 CALL [5081B8] >>>: USER32.DLL:MessageBoxA
::00500B7D:: EB 17 JMP SHORT 00500B96 \:JMPDOWN
::00500B7F:: 68 00100000 PUSH 1000 \:BYJMP JmpBy:00500B64,
::00500B84:: 68 686B5000 PUSH 506B68 \->: Error
::00500B89:: 68 706B5000 PUSH 506B70 \->: Can't find SoftDog!
::00500B8E:: 6A 00 PUSH 0
::00500B90:: FF15 B8815000 CALL [5081B8] >>>: USER32.DLL:MessageBoxA
::00500B96:: 6A FF PUSH -1 \:BYJMP JmpBy:00500B7D,
::00500B98:: FF15 A0815000 CALL [5081A0] >>>: KERNEL32.DLL:ExitProcess
::00500B9E:: 5F POP EDI
::00500B9F:: 5E POP ESI
::00500BA0:: 5B POP EBX
::00500BA1:: C9 LEAVE
::00500BA2:: C3 RETN
调用的call
::004FFD1E:: A3 90715000 MOV [507190],EAX
::004FFD23:: C705 94715000 00000000 MOV DWORD PTR [507194],0
::004FFD2D:: E8 1A160000 CALL 0050134C 看来这里读狗了跟进看看
::004FFD32:: 8945 C0 MOV [EBP-40],EAX EAX为0则有狗,不出现提示,先不动这里
::004FFD35:: 837D C0 00 CMP DWORD PTR [EBP-40],0
::004FFD39:: 74 05 JE SHORT 004FFD40 \:JMPDOWN
::004FFD3B:: E8 EE0D0000 CALL 00500B2E 出错调用,提示无狗。
::004FFD40:: 8B45 C0 MOV EAX,[EBP-40] \:BYJMP JmpBy:004FFD39,
::004FFD43:: EB 00 JMP SHORT 004FFD45 \:JMPDOWN
::004FFD45:: 5F POP EDI \:BYJMP JmpBy:004FFC0B,004FFCED,004FFD43,
::004FFD46:: 5E POP ESI
::004FFD47:: 5B POP EBX
::004FFD48:: C9 LEAVE
::004FFD49:: C3 RETN
跟进的CALL
::0050134C:: 52 PUSH EDX \:BYCALL CallBy:004FFD2D,
::0050134D:: 51 PUSH ECX
::0050134E:: 68 8E145000 PUSH 50148E \->: U嬱婨\x08f?\x04u\x1F隲x01艐\x15恞P
::00501353:: 68 65135000 PUSH 501365 \->: U嬱Vz\x03{\x01?纜\x03}\x01閶M\x08\x0F穃x11呉tR凓\x04t\x1Du\x03t\x01歉U?
::00501358:: 6A 00 PUSH 0
::0050135A:: E8 8A280000 CALL 00503BE9 继续跟进
::0050135F:: 83C4 0C ADD ESP,C
::00501362:: 59 POP ECX
::00501363:: 5A POP EDX
::00501364:: C3 RETN
跟进的call里面有大量花指令,看来到了关键位置,花指令太多,跟踪太困难,干脆下载KILLFOLWER清除花指令后再跟进,这个步骤很关键,下文再说。
跟踪到关键位置
::00504260:: 45 INC EBP
::00504261:: FC CLD
::00504262:: 7A 03 JPE SHORT 00504267 \:JMPDOWN
::00504264:: 7B 01 JPO SHORT 00504267 \:JMPDOWN
::00504266:: 06 PUSH ES
::00504267:: 85C0 TEST EAX, EAX
::00504269:: 0F85 8A030000 JNZ 005045F9 跳则出错,直接修改为NOP
::0050426F:: 70 03 JO SHORT 00504274 \:JMPDOWN
::00504271:: 71 01 JNO SHORT 00504274 \:JMPDOWN
::00504273:: 93 XCHG EAX, EBX
::00504274:: EB 31 JMP SHORT 005042A7 \:JMPDOWN\:BYJMP JmpBy:0050426F,00504271,
::00504276:: 51 PUSH ECX
去狗可运行,好了,感觉完成了。
但是问题出现了,程序运行2分钟后,只要有操作就报错,内存某个地方不可读,地址还是随机的。那里处问题了??
继续看程序,发现就算是带狗运行,只要你修改程序的任意字节,程序就报错。看来是自校验的问题。
网上搜集资料,这方面的不是很多。本人很菜,只能爆破狗,算法根本就不懂弄自校验根本不行。本人一直认为是这个程序的狗壳加入了自校验的程序,而且每两分钟检测一次。如果修改两分钟的限制,延长到长一点的时间,不就能解决问题了。
然而从那里下断点呢? 肯定要读狗那就用greatefilea下断点。
果然截获如下:
00504AD1 6A 00 push 0
00504AD3 68 80000000 push 80
00504AD8 6A 03 push 3
00504ADA 6A 00 push 0
00504ADC 6A 07 push 7
00504ADE 68 000000C0 push C0000000
00504AE3 68 846D5000 push 00506D84 ; ASCII "\\.\LPTDI1"
00504AE8 FF15 3C815000 call dword ptr [<&KERNEL32.CreateFile>; kernel32.CreateFileA 断到这里
00504AEE 83F8 FF cmp eax, -1
00504AF1 8945 08 mov dword ptr [ebp+8], eax
00504AF4 75 1F jnz short 00504B15
00504AF6 FF15 40815000 call dword ptr [<&KERNEL32.GetLastErr>; ntdll.RtlGetLastWin32Error
00504AFC 83F8 05 cmp eax, 5
00504AFF 75 0E jnz short 00504B0F
00504B01 6A 64 push 64
00504B03 FF15 B0815000 call dword ptr [<&KERNEL32.Sleep>] ; kernel32.Sleep
00504B09 46 inc esi
00504B0A 83FE 64 cmp esi, 64
00504B0D ^ 7C C2 jl short 00504AD1
00504B0F 837D 08 FF cmp dword ptr [ebp+8], -1
00504B13 74 51 je short 00504B66
00504B15 33F6 xor esi, esi
00504B17 3935 F46C5000 cmp dword ptr [506CF4], esi
00504B1D 75 41 jnz short 00504B60
00504B1F 8D45 08 lea eax, dword ptr [ebp+8]
00504B22 50 push eax
00504B23 57 push edi
00504B24 E8 95000000 call 00504BBE
00504B29 59 pop ecx
00504B2A 85C0 test eax, eax
00504B2C 59 pop ecx
00504B2D 74 18 je short 00504B47
00504B2F 3D 88660000 cmp eax, 6688
00504B34 75 26 jnz short 00504B5C
00504B36 68 F4010000 push 1F4
00504B3B FF15 B0815000 call dword ptr [<&KERNEL32.Sleep>] ; kernel32.Sleep
00504B41 46 inc esi
00504B42 83FE 03 cmp esi, 3
00504B45 ^ 7C D8 jl short 00504B1F
00504B47 83FE 03 cmp esi, 3
00504B4A 75 14 jnz short 00504B60
00504B4C BE 1A4F0000 mov esi, 4F1A
00504B51 FF75 08 push dword ptr [ebp+8]
00504B54 FF15 48815000 call dword ptr [<&KERNEL32.CloseHandl>; kernel32.CloseHandle
00504B5A EB 5B jmp short 00504BB7
00504B5C 8BF0 mov esi, eax
00504B5E ^ EB F1 jmp short 00504B51
00504B60 837D 08 FF cmp dword ptr [ebp+8], -1
00504B64 75 07 jnz short 00504B6D
00504B66 B8 244E0000 mov eax, 4E24
00504B6B EB 4C jmp short 00504BB9
00504B6D 8B75 0C mov esi, dword ptr [ebp+C]
00504B70 8D45 FC lea eax, dword ptr [ebp-4]
00504B73 6A 00 push 0
00504B75 50 push eax
00504B76 6A 68 push 68
00504B78 56 push esi
00504B79 8D47 08 lea eax, dword ptr [edi+8]
00504B7C 53 push ebx
00504B7D 50 push eax
00504B7E FFB7 84000000 push dword ptr [edi+84]
00504B84 FF75 08 push dword ptr [ebp+8]
00504B87 FF15 A8815000 call dword ptr [<&KERNEL32.DeviceIoCo>; kernel32.DeviceIoControl 这个不陌生吧
00504B8D 85C0 test eax, eax
00504B8F 74 04 je short 00504B95
00504B91 8B36 mov esi, dword ptr [esi]
00504B93 EB 09 jmp short 00504B9E
00504B95 B8 244E0000 mov eax, 4E24
00504B9A 8906 mov dword ptr [esi], eax
00504B9C 8BF0 mov esi, eax
00504B9E FF75 08 push dword ptr [ebp+8]
00504BA1 FF15 48815000 call dword ptr [<&KERNEL32.CloseHandl>; kernel32.CloseHandle
00504BA7 85C0 test eax, eax
00504BA9 75 04 jnz short 00504BAF
00504BAB 834D 08 FF or dword ptr [ebp+8], FFFFFFFF
00504BAF 6A 64 push 64
00504BB1 FF15 B0815000 call dword ptr [<&KERNEL32.Sleep>] ; kernel32.Sleep
00504BB7 8BC6 mov eax, esi
00504BB9 5F pop edi
00504BBA 5E pop esi
00504BBB 5B pop ebx
00504BBC C9 leave
00504BBD C3 retn
查看调用他的call 在网上找call一直往上找,最后找到这个位置:
004FDD55 8B0D 26605000 mov ecx, dword ptr [506026] 这里好像有点意思,跟踪一下看看,下断点。
004FDD5B 330D 2A605000 xor ecx, dword ptr [50602A]
004FDD61 8B45 E0 mov eax, dword ptr [ebp-20]
004FDD64 2B05 08715000 sub eax, dword ptr [507108]
004FDD6A BB E8030000 mov ebx, 3E8
004FDD6F 2BD2 sub edx, edx
004FDD71 F7F3 div ebx
004FDD73 3BC8 cmp ecx, eax
004FDD75 76 13 jbe short 004FDD8A
004FDD77 8B45 E4 mov eax, dword ptr [ebp-1C]
004FDD7A 8945 04 mov dword ptr [ebp+4], eax
004FDD7D 5F pop edi
004FDD7E 5E pop esi
004FDD7F 5A pop edx
004FDD80 59 pop ecx
004FDD81 5B pop ebx
004FDD82 58 pop eax
004FDD83 C9 leave
004FDD84 C3 retn
004FDD85 E9 D5000000 jmp 004FDE5F
004FDD8A 8B45 E0 mov eax, dword ptr [ebp-20]
004FDD8D A3 08715000 mov dword ptr [507108], eax
004FDD92 E8 AF1C0000 call 004FFA46
004FDD97 7E 03 jle short 004FDD9C
004FDD99 7F 01 jg short 004FDD9C
004FDD9B BA A0BE6250 mov edx, 5062BEA0
004FDDA0 0088 45A0C745 add byte ptr [eax+45C7A045], cl
004FDDA6 98 cwde
004FDDA7 0000 add byte ptr [eax], al
004FDDA9 0000 add byte ptr [eax], al
004FDDAB EB 03 jmp short 004FDDB0
004FDDAD FF45 98 inc dword ptr [ebp-68]
004FDDB0 817D 98 0001000>cmp dword ptr [ebp-68], 100
004FDDB7 7D 15 jge short 004FDDCE
004FDDB9 8B45 98 mov eax, dword ptr [ebp-68]
004FDDBC 8A80 DA635000 mov al, byte ptr [eax+5063DA]
004FDDC2 8B4D 98 mov ecx, dword ptr [ebp-68]
004FDDC5 888429 98FEFFFF mov byte ptr [ecx+ebp-168], al
004FDDCC ^ EB DF jmp short 004FDDAD
004FDDCE C745 98 0000000>mov dword ptr [ebp-68], 0
004FDDD5 EB 03 jmp short 004FDDDA
004FDDD7 FF45 98 inc dword ptr [ebp-68]
004FDDDA 817D 98 0001000>cmp dword ptr [ebp-68], 100
004FDDE1 7D 42 jge short 004FDE25
004FDDE3 8B45 98 mov eax, dword ptr [ebp-68]
004FDDE6 33C9 xor ecx, ecx
004FDDE8 8A88 DA625000 mov cl, byte ptr [eax+5062DA]
004FDDEE 8A8429 98FEFFFF mov al, byte ptr [ecx+ebp-168]
004FDDF5 8845 9C mov byte ptr [ebp-64], al
004FDDF8 8B45 98 mov eax, dword ptr [ebp-68]
004FDDFB 33C9 xor ecx, ecx
004FDDFD 8A88 DA625000 mov cl, byte ptr [eax+5062DA]
004FDE03 324D A0 xor cl, byte ptr [ebp-60]
004FDE06 8B45 98 mov eax, dword ptr [ebp-68]
004FDE09 8888 DA625000 mov byte ptr [eax+5062DA], cl
004FDE0F 8A45 9C mov al, byte ptr [ebp-64]
004FDE12 8B4D 98 mov ecx, dword ptr [ebp-68]
004FDE15 33D2 xor edx, edx
004FDE17 8A91 DA625000 mov dl, byte ptr [ecx+5062DA]
004FDE1D 8882 DA635000 mov byte ptr [edx+5063DA], al
004FDE23 ^ EB B2 jmp short 004FDDD7
004FDE25 51 push ecx
004FDE26 31C9 xor ecx, ecx
004FDE28 E3 01 jecxz short 004FDE2B
004FDE2A BF 59833D74 mov edi, 743D8359
004FDE2F 60 pushad
004FDE30 50 push eax
004FDE31 0000 add byte ptr [eax], al
004FDE33 74 09 je short 004FDE3E
004FDE35 833D 78605000 0>cmp dword ptr [506078], 0
004FDE3C 74 14 je short 004FDE52
004FDE3E E8 501D0000 call 004FFB93 找到这个CALL,别着急往上看
关键位置在这里
004FDD55 8B0D 26605000 mov ecx, dword ptr [506026] 返回值是79H正好是121秒
004FDD5B 330D 2A605000 xor ecx, dword ptr [50602A]
004FDD61 8B45 E0 mov eax, dword ptr [ebp-20]
004FDD64 2B05 08715000 sub eax, dword ptr [507108]
004FDD6A BB E8030000 mov ebx, 3E8
004FDD6F 2BD2 sub edx, edx
004FDD71 F7F3 div ebx
004FDD73 3BC8 cmp ecx, eax
004FDD75 76 13 jbe short 004FDD8A 跳则开始读狗。
直接修改为
mov ecx 999999
则程序正常运行。
--------------------------------------------------------------------------------
【经验总结】
通过以上过程总结如下:1、TDSD狗的花指令正是一个很好的标志,花指令多的位置就是关键位置。2、这个是个嵌入式的应
用,所谓嵌入,是加密工具在被加密程序中嵌入一个公共程序,加密程序在整个运行期内以一定的频率执行这个公共程序,
该程序检查软件狗的存在性和一致性。如果对应的软件狗存在,则继续执行原程序,否则终止程序。本加密方式可选。3、
本人很菜只能用笨招来打狗,应该学习点算法知识。技术含量不高,大家凑或看吧。
在此感谢LAOQIAN[FCG],刺猬【DCG】的指教。
--------------------------------------------------------------------------------
【版权声明】: 技术含量不高,大家凑或看吧。本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年09月03日 8:31:01
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!