crackme_zapline分析

 【破文标题】crackme_zapline 分析
【破文作者】CloAk
【作者邮箱】@qq.com
【作者主页】
【破解工具】OD,...
【破解平台】Windows
------------------------------------------------------------------------
【破解过程】//zaplineCreackme 分析 // 首先, 程序没有按钮 目测使用 bp GetWindowText // 早先已经调试过, 但是因为没仔细看, 研究了半天 // 首先下 bp GetWindowTextW 断下返回来到下面, 00EBCA12 |. PUSH ESI ; /Count = 0x8
00EBCA13 |. PUSH EAX ; |Buffer =
00EBCA14 |. 8B03 MOV EAX, DWORD PTR DS:[EBX] ; |
00EBCA16 |. PUSH EAX ; |hWnd =
00EBCA17 |. FF15 E002ED00 CALL DWORD PTR DS:[<&USER32.GetWindowTex>; \GetWindowTextW
00EBCA1D |. 8BF0 MOV ESI, EAX
00EBCA1F |. 83FE FF CMP ESI, -0x1
00EBCA22 |. JNZ SHORT 00EBCA37 // 上面的地方没有上来, 走到retn 来到下面 00EBCA60 /$ PUSH EBX
00EBCA61 |. PUSH ESI
00EBCA62 |. 8BF1 MOV ESI, ECX
00EBCA64 |. PUSH EDI
00EBCA65 |. 8DBE LEA EDI, DWORD PTR DS:[ESI+0x378]
00EBCA6B |. PUSH EDI
00EBCA6C |. 8D8E LEA ECX, DWORD PTR DS:[ESI+0x384]
00EBCA72 |. E8 59FFFFFF CALL 00EBC9D0 ; // 读取注册名
00EBCA77 |. 8D86 7C030000 LEA EAX, DWORD PTR DS:[ESI+0x37C] ; ** 来到这里
00EBCA7D |. PUSH EAX
00EBCA7E |. 8D8E LEA ECX, DWORD PTR DS:[ESI+0x388]
00EBCA84 |. E8 47FFFFFF CALL 00EBC9D0 ; // 读取代码
00EBCA89 |. 8D9E LEA EBX, DWORD PTR DS:[ESI+0x380]
00EBCA8F |. PUSH EBX ; // 这两个参数是一样的 所以先不管了
00EBCA90 |. PUSH EDI ; // 继续走过这个call 这个里边你可以自己跟一下
00EBCA91 |. E8 1AFDFFFF CALL 00EBC7B0 ; // compare?
00EBCA96 |. 83C4 ADD ESP, 0x8
00EBCA99 |. 84C0 TEST AL, AL
00EBCA9B |. JE SHORT 00EBCAD0
00EBCA9D |. 8B4E MOV ECX, DWORD PTR DS:[ESI+0x4]
00EBCAA0 |. 6A PUSH 0x35 ; /TimerID = (.)
00EBCAA2 |. PUSH ECX ; |hWnd = NULL
00EBCAA3 |. FF15 3003ED00 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
00EBCAA9 |. 8B56 MOV EDX, DWORD PTR DS:[ESI+0x4]
00EBCAAC |. 6A PUSH 0x36 ; /TimerID = (.)
00EBCAAE |. PUSH EDX ; |hWnd = 009D0000
00EBCAAF |. FF15 3003ED00 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
00EBCAB5 |. PUSH EDI
00EBCAB6 |. 8BCB MOV ECX, EBX
00EBCAB8 |. E8 83EDFEFF CALL 00EAB840
00EBCABD |. 8B46 MOV EAX, DWORD PTR DS:[ESI+0x4]
00EBCAC0 |. 6A PUSH 0x0 ; /Timerproc = NULL
00EBCAC2 |. C8000000 PUSH 0xC8 ; |Timeout = . ms
00EBCAC7 |. 6A PUSH 0x34 ; |TimerID = (.)
00EBCAC9 |. PUSH EAX ; |hWnd = NULL
00EBCACA |. FF15 F002ED00 CALL DWORD PTR DS:[<&USER32.SetTimer>] ; \SetTimer
00EBCAD0 |> 5F POP EDI ; 009DF938
00EBCAD1 |. 5E POP ESI ; 009DF938
00EBCAD2 |. 5B POP EBX ; 009DF938
00EBCAD3 \. C3 RETN // 走过retn来到下面这里
00EBCAE0 /$ PUSH EBX
00EBCAE1 |. PUSH ESI
00EBCAE2 |. PUSH EDI
00EBCAE3 |. 8BF1 MOV ESI, ECX
00EBCAE5 |. E8 76FFFFFF CALL 00EBCA60 ; ** 在这里
00EBCAEA |. 8B96 MOV EDX, DWORD PTR DS:[ESI+0x378] ; 读取注册名
00EBCAF0 |. 8B4A F4 MOV ECX, DWORD PTR DS:[EDX-0xC] ; 长度
00EBCAF3 |. 33DB XOR EBX, EBX
00EBCAF5 |. 33C0 XOR EAX, EAX
00EBCAF7 |. 85C9 TEST ECX, ECX
00EBCAF9 |. 7E 1A JLE SHORT 00EBCB15
00EBCAFB |. EB JMP SHORT 00EBCB00
00EBCAFD | 8D49 LEA ECX, DWORD PTR DS:[ECX]
00EBCB00 |> 85C0 /TEST EAX, EAX
00EBCB02 |. |JS SHORT 00EBCB48
00EBCB04 |. 3BC1 |CMP EAX, ECX
00EBCB06 |. 7F |JG SHORT 00EBCB48
00EBCB08 |. 0FB73A |MOVZX EDI, WORD PTR DS:[EDX]
00EBCB0B |. |INC EAX
00EBCB0C |. 03DF |ADD EBX, EDI
00EBCB0E |. 83C2 |ADD EDX, 0x2
00EBCB11 |. 3BC1 |CMP EAX, ECX
00EBCB13 |.^ 7C EB \JL SHORT 00EBCB00 ; 累加用户名ascii码
00EBCB15 |> 8BB6 7C030000 MOV ESI, DWORD PTR DS:[ESI+0x37C]
00EBCB1B |. 8B4E F4 MOV ECX, DWORD PTR DS:[ESI-0xC]
00EBCB1E |. 33FF XOR EDI, EDI
00EBCB20 |. 33C0 XOR EAX, EAX
00EBCB22 |. 85C9 TEST ECX, ECX
00EBCB24 |. 7E JLE SHORT 00EBCB3D
00EBCB26 |. 8BD6 MOV EDX, ESI
00EBCB28 |> 85C0 /TEST EAX, EAX
00EBCB2A |. 1C |JS SHORT 00EBCB48
00EBCB2C |. 3BC1 |CMP EAX, ECX
00EBCB2E |. 7F |JG SHORT 00EBCB48
00EBCB30 |. 0FB732 |MOVZX ESI, WORD PTR DS:[EDX]
00EBCB33 |. |INC EAX
00EBCB34 |. 03FE |ADD EDI, ESI
00EBCB36 |. 83C2 |ADD EDX, 0x2
00EBCB39 |. 3BC1 |CMP EAX, ECX
00EBCB3B |.^ 7C EB \JL SHORT 00EBCB28 ; 累加注册码ascii码
00EBCB3D |> 33C0 XOR EAX, EAX
00EBCB3F |. 3BDF CMP EBX, EDI ; 比较累加的数值对不对
00EBCB41 |. 5F POP EDI ; 009DF938
00EBCB42 |. 5E POP ESI ; 009DF938
00EBCB43 0F94C0 SETE AL // 这里可以改 setnt
00EBCB46 |. 5B POP EBX ; 009DF938
00EBCB47 |. C3 RETN // 然后继续走过这个call 00EBCCCE |. E8 0DFEFFFF CALL 00EBCAE0
00EBCCD3 |. 85C0 TEST EAX, EAX ; ** 来到这里
00EBCCD5 4D JE SHORT 00EBCD24
00EBCCD7 |. 8B46 MOV EAX, DWORD PTR DS:[ESI+0x4]
00EBCCDA |. 6A PUSH 0x34 ; /TimerID = (.)
00EBCCDC |. PUSH EAX ; |hWnd =
00EBCCDD |. FF15 3003ED00 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
00EBCCE3 |. 8B4E MOV ECX, DWORD PTR DS:[ESI+0x4]
00EBCCE6 |. 6A PUSH 0x0 ; /Timerproc = NULL
00EBCCE8 |. C8000000 PUSH 0xC8 ; |Timeout = . ms
00EBCCED |. 6A PUSH 0x35 ; |TimerID = (.)
00EBCCEF |. PUSH ECX ; |hWnd = 009DFAD8
00EBCCF0 |. FF15 F002ED00 CALL DWORD PTR DS:[<&USER32.SetTimer>] ; \SetTimer
00EBCCF6 |. 5E POP ESI ; // 上面开始了时钟看到下面的0x35
00EBCCF7 |. 5D POP EBP ; // 果断在 0xEBCCFB下断
00EBCCF8 |. C2 RETN 0x4
00EBCCFB |> 83F8 CMP EAX, 0x35
00EBCCFE JNZ SHORT 00EBCD24
00EBCD00 |. E8 5BFEFFFF CALL 00EBCB60 ; // 又是比较F7
00EBCD05 |. 85C0 TEST EAX, EAX
00EBCD07 |. 1B JE SHORT 00EBCD24
00EBCD09 |. 8B56 MOV EDX, DWORD PTR DS:[ESI+0x4]
00EBCD0C |. 6A PUSH 0x35 ; /TimerID = (.)
00EBCD0E |. PUSH EDX ; |hWnd = ('吾爱破解2012CM大赛作品',class='ATL:00ED82E8')
00EBCD0F |. FF15 3003ED00 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
00EBCD15 |. 6A PUSH 0x1
00EBCD17 |. EE030000 PUSH 0x3EE
00EBCD1C |. 8D4E LEA ECX, DWORD PTR DS:[ESI+0x50]
00EBCD1F |. E8 BCFEFFFF CALL 00EBCBE0 ; 成功标志
00EBCD24 |> 5E POP ESI ; 009DFAD8
00EBCD25 |. 5D POP EBP ; 009DFAD8
00EBCD26 \. C2 RETN 0x4 // 来到0x00EBCD00, 看到类似刚才的代码我有些被弄混了!!
00EBCB79 |. /7E 1A JLE SHORT 00EBCB95
00EBCB7B |. |EB JMP SHORT 00EBCB80
00EBCB7D | |8D49 LEA ECX, DWORD PTR DS:[ECX]
00EBCB80 |> |85C0 /TEST EAX, EAX
00EBCB82 |. | |JS SHORT 00EBCBCD
00EBCB84 |. |3BC1 |CMP EAX, ECX
00EBCB86 |. |7F |JG SHORT 00EBCBCD
00EBCB88 |. |0FB73A |MOVZX EDI, WORD PTR DS:[EDX]
00EBCB8B |. | |INC EAX
00EBCB8C |. |03DF |ADD EBX, EDI
00EBCB8E |. |83C2 |ADD EDX, 0x2
00EBCB91 |. |3BC1 |CMP EAX, ECX
00EBCB93 |.^|7C EB \JL SHORT 00EBCB80
00EBCB95 |> \8BB6 7C030000 MOV ESI, DWORD PTR DS:[ESI+0x37C]
00EBCB9B |. 8B4E F4 MOV ECX, DWORD PTR DS:[ESI-0xC]
00EBCB9E |. 33FF XOR EDI, EDI
00EBCBA0 |. 33C0 XOR EAX, EAX
00EBCBA2 |. 85C9 TEST ECX, ECX
00EBCBA4 |. 7E JLE SHORT 00EBCBBD
00EBCBA6 |. 8BD6 MOV EDX, ESI
00EBCBA8 |> 85C0 /TEST EAX, EAX
00EBCBAA |. |JS SHORT 00EBCBCD
00EBCBAC |. 3BC1 |CMP EAX, ECX
00EBCBAE |. 7F 1D |JG SHORT 00EBCBCD
00EBCBB0 |. 0FB732 |MOVZX ESI, WORD PTR DS:[EDX]
00EBCBB3 |. |INC EAX
00EBCBB4 |. 03FE |ADD EDI, ESI
00EBCBB6 |. 83C2 |ADD EDX, 0x2
00EBCBB9 |. 3BC1 |CMP EAX, ECX
00EBCBBB |.^ 7C EB \JL SHORT 00EBCBA8
00EBCBBD |> \8D045B LEA EAX, DWORD PTR DS:[EBX+EBX*] ; **注册码累加的值 *
00EBCBC0 |. 33C9 XOR ECX, ECX
00EBCBC2 |. 3BC7 CMP EAX, EDI
00EBCBC4 |. 0F94C1 SETE CL
00EBCBC7 |. 5F POP EDI ; crackme_.00EBCD05
00EBCBC8 |. 5E POP ESI ; crackme_.00EBCD05
00EBCBC9 |. 5B POP EBX ; crackme_.00EBCD05
00EBCBCA |. 8BC1 MOV EAX, ECX
00EBCBCC |. C3 RETN // 当上面的判断比较成功的话 即出现注册成功, 但是因为自己没细心看, 浪费了很多时间 ------------------------------------------------------------------------
【破解总结】参考sdzzb大神的破文
http://www.52pojie.cn/forum.php?mod=viewthread&tid=146265 // 总结
对每一个retn后的数据需要仔细观察! , 特别是多层嵌套的call , 不要弄混了!
------------------------------------------------------------------------
【版权声明】
上一篇:React native 无法弹出调试控件的问题


下一篇:转】Nginx+tomcat配置集群负载均衡