- UID
- 5183
注册时间2005-12-14
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
第七课的还没有仔细的弄一下 先把这个给弄上来吧 免得老大把我给踢出学员区了(:L前几课的作业还没有交呢) 这个算法分析中还有一些问题 希望高手能帮我解决了
crackme 下载地方ftp://fqinyuan1@79222.com/czcrackme_09.rar
【破文标题】CZCrackme09算法分析
【破文作者】IceCrack
【作者邮箱】IceCrack@163.com
【作者主页】www.chinapyg.com
【破解工具】oDbyDYK
【破解平台】xp sp2
【软件名称】CZCrackme09
【软件简介】就是一个crackme 没有什么好说的.
------------------------------------------------------------------------
0040136A |. E8 77030000 call <jmp.&USER32.GetDlgItemTextA> ; \得到用户名长度
0040136F |. 83F8 04 cmp eax, 4 ; 试炼码长度要大于4
00401372 |. 0F8E CC000000 jle czCrackM.00401444
00401378 |. A3 BF304000 mov dword ptr ds:[4030BF], eax ; 试炼码长度入4030bf
0040137D |. FF35 C3304000 push dword ptr ds:[4030C3] ; /hWnd = 0047023C (class='Edit',parent=003C0234)
00401383 |. E8 AC030000 call <jmp.&USER32.SetFocus> ; \SetFocus
00401388 |. BF 30314000 mov edi, czCrackM.00403130 ; ASCII "icecrack"
0040138D |. BE 30314000 mov esi, czCrackM.00403130 ; ASCII "icecrack"
00401392 |> AC /lods byte ptr ds:[esi]
00401393 |. 0C 00 |or al, 0
00401395 |. 74 05 |je short czCrackM.0040139C
00401397 |. 0C 20 |or al, 20 ; 用户名大写变小写
00401399 |. AA |stos byte ptr es:[edi]
0040139A |. EB F6 \jmp short czCrackM.00401392
0040139C |> BF 70314000 mov edi, czCrackM.00403170 ; ASCII "812/="
004013A1 |. BE 70314000 mov esi, czCrackM.00403170 ; ASCII "812/="
004013A6 |. 8D1D 30314000 lea ebx, dword ptr ds:[403130]
004013AC |> AC /lods byte ptr ds:[esi]
004013AD |. 0C 00 |or al, 0
004013AF |. 74 0A |je short czCrackM.004013BB
004013B1 |. 8A13 |mov dl, byte ptr ds:[ebx]
004013B3 |. 2AD0 |sub dl, al ; 小写的用户名逐位减去试炼码 比较次数是试炼码长度
004013B5 |. 8AC2 |mov al, dl
004013B7 |. AA |stos byte ptr es:[edi]
004013B8 |. 43 |inc ebx
004013B9 |. EB F1 \jmp short czCrackM.004013AC
004013BB |> 8B0D BF304000 mov ecx, dword ptr ds:[4030BF]
004013C1 |> 80C9 00 /or cl, 0
004013C4 |. 74 60 |je short czCrackM.00401426
004013C6 |. 51 |push ecx
004013C7 |. 68 70314000 |push czCrackM.00403170 ; ASCII "812/="
004013CC |. E8 83020000 |call czCrackM.00401654 ; 算法call
004013D1 |. F7E1 |mul ecx ; ecx以密码长度逐减小
004013D3 |. 68 B0314000 |push czCrackM.004031B0
004013D8 |. 50 |push eax
004013D9 |. E8 BE020000 |call czCrackM.0040169C
004013DE |. BF B0314000 |mov edi, czCrackM.004031B0
004013E3 |. BE B0314000 |mov esi, czCrackM.004031B0
004013E8 |> AC |/lods byte ptr ds:[esi]
004013E9 |. 0C 00 ||or al, 0
004013EB |. 74 06 ||je short czCrackM.004013F3
004013ED |. 83E0 0F ||and eax, 0F ; 高四位清零
004013F0 |. AA ||stos byte ptr es:[edi]
004013F1 |. EB F5 |\jmp short czCrackM.004013E8
004013F3 |> 8B0D BF304000 |mov ecx, dword ptr ds:[4030BF]
004013F9 |. D1E9 |shr ecx, 1 ; 密码长度逻辑右移1位 也就是除以二
004013FB |. BF F0304000 |mov edi, czCrackM.004030F0
00401400 |. BE B0314000 |mov esi, czCrackM.004031B0
00401405 |. 8D99 B0314000 |lea ebx, dword ptr ds:[ecx+4031B0] ; 4031b2
0040140B |> 80C9 00 |/or cl, 0
0040140E |. 74 12 ||je short czCrackM.00401422
00401410 |. AC ||lods byte ptr ds:[esi]
00401411 |. 33D2 ||xor edx, edx
00401413 |. 8A13 ||mov dl, byte ptr ds:[ebx]
00401415 |. 02C2 ||add al, dl ; 4031b0与4031b2相加
00401417 |. 8A17 ||mov dl, byte ptr ds:[edi]
00401419 |. 02C2 ||add al, dl ; 004030f0前面的相加 004030F0初值为0
0040141B |. 24 0F ||and al, 0F ; 高四位清零
0040141D |. AA ||stos byte ptr es:[edi] ; 结果放到004030f0
0040141E |. 49 ||dec ecx
0040141F |. 43 ||inc ebx
00401420 |. EB E9 |\jmp short czCrackM.0040140B
00401422 |> 59 |pop ecx
00401423 |. 49 |dec ecx
00401424 |. EB 9B \jmp short czCrackM.004013C1
00401426 |> BE F0304000 mov esi, czCrackM.004030F0
0040142B |. 8B1D BF304000 mov ebx, dword ptr ds:[4030BF]
00401431 |. 8BCB mov ecx, ebx
00401433 |. D1E9 shr ecx, 1
00401435 |> 8A06 /mov al, byte ptr ds:[esi]
00401437 |. 80C9 00 |or cl, 0
0040143A |. 74 39 |je short czCrackM.00401475
0040143C |. 38D8 |cmp al, bl
0040143E |. 75 04 |jnz short czCrackM.00401444
00401440 |. 46 |inc esi
00401441 |. 49 |dec ecx
00401442 |. EB F1 \jmp short czCrackM.00401435
--------------------------------004013CC |. E8 83020000 |call czCrackM.00401654 -----------------------------------------
00401654 /$ 55 push ebp
00401655 |. 8BEC mov ebp, esp
00401657 |. 51 push ecx
00401658 |. 57 push edi
00401659 |. 52 push edx
0040165A |. 56 push esi
0040165B |. 33C9 xor ecx, ecx
0040165D |. 8B7D 08 mov edi, dword ptr ss:[ebp+8]
00401660 |. FF75 08 push dword ptr ss:[ebp+8] ; /String
00401663 |. E8 FC000000 call <jmp.&KERNEL32.lstrlenA> ; \密码长度
00401668 |. EB 23 jmp short czCrackM.0040168D
0040166A |> 33D2 /xor edx, edx
0040166C |. 8A17 |mov dl, byte ptr ds:[edi] ; 运算812/=逐位放到dl中
0040166E |. 80EA 30 |sub dl, 30 ; 都减去30
00401671 |. 8BF0 |mov esi, eax ; 当前密码长度给esi
00401673 |. 4E |dec esi
00401674 |. 50 |push eax
00401675 |. 8BC2 |mov eax, edx ; 运算后的给eax
00401677 |. 53 |push ebx
00401678 |. BB 0A000000 |mov ebx, 0A ; 把0a给ebx
0040167D |. EB 03 |jmp short czCrackM.00401682
0040167F |> F7E3 |/mul ebx ; 密码长度乘以0a
00401681 |. 4E ||dec esi
00401682 |> 83FE 00 | cmp esi, 0
00401685 |. 77 F8 |\ja short czCrackM.0040167F
00401687 |. 5B |pop ebx
00401688 |. 03C8 |add ecx, eax ;ecx原来的值7C80C710
0040168A |. 58 |pop eax
0040168B |. 47 |inc edi
0040168C |. 48 |dec eax
0040168D |> 0BC0 or eax, eax
0040168F |. 75 D9 \jnz short czCrackM.0040166A
00401691 |. 8BC1 mov eax, ecx ; 把总算出来的给eax
00401693 |. 5E pop esi
00401694 |. 5A pop edx
00401695 |. 5F pop edi
00401696 |. 59 pop ecx
00401697 |. C9 leave
00401698 \. C2 0400 retn 4
算法总结
用户名逐位与0x20或运算 然后再逐位减去试验码 结果为M1
;下面的循环密码长度次
{ M1再逐位的减去0x30 M2=(Am1*a^密码长+Bm1*a^密码长减1.............)+7c80c710
M3=M2*密码长(逐次减1) M3逐位与0F与运算 也就是高四位清零 [ M3的第一位和密码长度/2的位相加 得到M4 M5=(M4+004030F0)的高四位)] 循环密码长度/2次
}
最后 得到的004030b0与004020F0逐位比较密码长度/2次
相等则注册成功
------------------------------------------------------------------------
这个是我第一次算法分析 搞的我头都大了 弄了两天了才弄明白怎么弄的 而且知道算法了 也不知道怎么构造注册码 他的循环对我来说太多了
00401688 |. 03C8 |add ecx, eax ;ecx原来的值7C80C710
这个ecx的值是怎么来的啊
------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[ 本帖最后由 IceCrack 于 2006-1-6 18:32 编辑 ] |
|