Apr
20

07-11-9

Bigman's Crackme6 总结:
刁民(chenyihao)
1.输入假用户名和注册码进行调试时,要及时调整用户名和注册码使之满足条件,

从而使调试继续进行下去。-----------------------------------------------------------------------------
如:
(1)
0040153E |. 89C3 MOV EBX,EAX ; 送输入的用户名长度,记作nl
00401540 |. 09DB OR EBX,EBX ; 用户名输入是否空
00401542 |. 75 04 JNZ SHORT unpacked.00401548
00401544 |. 31C0 XOR EAX,EAX
00401546 |. EB 50 JMP SHORT unpacked.00401598
00401548 |> BF BC020000 MOV EDI,2BC
0040154D |. BE 30000000 MOV ESI,30
00401552 |. B8 48000000 MOV EAX,48
00401557 |. 99 CDQ ; EAX符号扩展,双字扩展到四字
00401558 |. F7FB IDIV EBX ; 48H除以输入用户名的长度,16进制的除法
0040155A |. 29C6 SUB ESI,EAX ; 30-48/nl
0040155C |. 8D34B6 LEA ESI,DWORD PTR DS:[ESI+ESI*4] ; ESI值乘以5,(30-48/nl)*5=M1
0040155F |. 29F7 SUB EDI,ESI ; 减2BC-M1
00401561 |. 6BFF 6B IMUL EDI,EDI,6B ; (2BC-M1)*6B
00401564 |. 81EF 6CCF0000 SUB EDI,0CF6C
0040156A |. 81FF 00230000 CMP EDI,2300 ; EDI=(2bc-(30-48/namelen)*5)*6b-cf6c
00401570 |. 7F 08 JG SHORT unpacked.0040157A
-----------------------------------------------------------
00401572 |. 81FF 90010000 CMP EDI,190
00401578 |. 7D 04 JGE SHORT unpacked.0040157E
0040157A |> 31C0 XOR EAX,EAX
0040157C |. EB 1A JMP SHORT unpacked.00401598
0040157E |> 8D85 00FFFFFF LEA EAX,DWORD PTR SS:[EBP-100] ; EDI必须在190-2300之间,否则就挂
00401584 |. 50 PUSH EAX ; 保存输入的用户名地址
00401585 |. 53 PUSH EBX ; 保存用户名长度
00401586 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401589 |. E8 77FDFFFF CALL unpacked.00401305
0040158E |. 83C4 0C ADD ESP,0C
00401591 |. 09C0 OR EAX,EAX
00401593 |. 74 03 JE SHORT unpacked.00401598
00401595 |. 31C0 XOR EAX,EAX
00401597 |. 40 INC EAX
00401598 |> 5F POP EDI
00401599 |. 5E POP ESI

如果EDI=(2bc-(30-48/namelen)*5)*6b-cf6c不满足190-2300,都必将执行
0040157C |. EB 1A JMP SHORT unpacked.00401598,这样就over,所以就要调整输入的用户名了。。。

同样下面的例子就对注册码进行了约束:
(2)
004013AF |. E8 84030000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
004013B4 |. 09C0 OR EAX,EAX ; 输入的注册码是否为空
004013B6 |. 0F84 48010000 JE unpacked.00401504
004013BC |. B8 CF110000 MOV EAX,11CF
004013C1 |. 0FB68D E1FCFF>MOVZX ECX,BYTE PTR SS:[EBP-31F] ; 送注册码的首位ascii,转到数据窗口12F5D5查看
004013C8 |. 99 CDQ
004013C9 |. F7F9 IDIV ECX
004013CB |. 83FA 17 CMP EDX,17
004013CE |. 74 07 JE SHORT unpacked.004013D7 ; 11CF除以注册码首位ascii,余数17H则跳,否则over,我首位输6
004013D0 |. 31C0 XOR EAX,EAX
004013D2 |. E9 2D010000 JMP unpacked.00401504
004013D7 |> 31DB XOR EBX,EBX
004013D9 |. EB 0B JMP SHORT unpacked.004013E6
004013DB |> 8B45 10 /MOV EAX,DWORD PTR SS:[EBP+10] ; 取输入用户名的地址

这里004013CE |. 74 07 JE SHORT unpacked.004013D7 ,11CF除以注册码首位ascii,余数17H则跳,否则over。所以我原先输的025010就不行了,改成6025010,就可以通过了。。

当然,你也可以改变跳转的条件,如这里把JE 改成JNE也可以通过。。。

2.关注数据窗口------------------------------------------------------------------

004013B4 |. 09C0 OR EAX,EAX ; 输入的注册码是否为空
004013B6 |. 0F84 48010000 JE unpacked.00401504
004013BC |. B8 CF110000 MOV EAX,11CF
004013C1 |. 0FB68D E1FCFF>MOVZX ECX,BYTE PTR SS:[EBP-31F] ; 送注册码的首位ascii,转到数据窗口12F5D5查看
004013C8 |. 99 CDQ
004013C9 |. F7F9 IDIV ECX
004013CB |. 83FA 17 CMP EDX,17
004013CE |. 74 07 JE SHORT unpacked.004013D7 ; 11CF除以注册码首位ascii,余数17H则跳,否则over,我首位输6
004013D0 |. 31C0 XOR EAX,EAX
004013D2 |. E9 2D010000 JMP unpacked.00401504
004013D7 |> 31DB XOR EBX,EBX
004013D9 |. EB 0B JMP SHORT unpacked.004013E6
004013DB |> 8B45 10 /MOV EAX,DWORD PTR SS:[EBP+10] ; 取输入用户名的地址
004013DE |. 0FBE0418 |MOVSX EAX,BYTE PTR DS:[EAX+EBX] ; 依次取用户名下个字节,name[ebx]
004013E2 |. 0145 FC |ADD DWORD PTR SS:[EBP-4],EAX ; 相加的值存放在12F8F0
004013E5 |. 43 |INC EBX
004013E6 |> 3B5D 0C CMP EBX,DWORD PTR SS:[EBP+C] ; EBX与输入的用户名长度比较,到达用户名长度跳出循环
004013E9 |.^ 7C F0 \JL SHORT unpacked.004013DB ; 把用户名每位的ASCII值相加,结果在12F850
004013EB |. 31DB XOR EBX,EBX
004013ED |. E9 83000000 JMP unpacked.00401475
004013F2 |> 8B55 10 /MOV EDX,DWORD PTR SS:[EBP+10] ; 取输入用户名的地址,12F914
004013F5 |. 0FBE3C1A |MOVSX EDI,BYTE PTR DS:[EDX+EBX] ; 依次取用户名各个字节,name[i]
004013F9 |. 8B75 FC |MOV ESI,DWORD PTR SS:[EBP-4] ; 03B8,用户名各位ascii之和,{SUM name[i]}
004013FC |. 89D9 |MOV ECX,EBX
004013FE |. C1E1 02 |SHL ECX,2 ; i*4
00401401 |. 89DA |MOV EDX,EBX
00401403 |. 42 |INC EDX
00401404 |. 29D1 |SUB ECX,EDX ; i*4-(i+1)
=============================================================
00401406 |. 0FB68C0D E1FE>|MOVZX ECX,BYTE PTR SS:[EBP+ECX-11F]

; 12F7D5,2.C----3.F----4.I........list[]=ABCDEFGHIJKLMNOPQRSTUVWXYZ
0040140E |. 89FA |MOV EDX,EDI ; EDX=name[i]
00401410 |. 31CA |XOR EDX,ECX ; N2=name[i] xor list[i*3-1]
00401412 |. 89F1 |MOV ECX,ESI
00401414 |. 0FAFCB |IMUL ECX,EBX ; ECX=3B8*i={SUM name[i]}*i
00401417 |. 29F1 |SUB ECX,ESI ; N1=ECX=3B8*EBX-3B8={SUM name[i]}*(i-1)
00401419 |. 89CE |MOV ESI,ECX
0040141B |. 83F6 FF |XOR ESI,FFFFFFFF ; FFFFFFFF XOR N1
0040141E |. 8DB432 4D0100>|LEA ESI,DWORD PTR DS:[EDX+ESI+14D] ; ESI=N2+N1+14D=N3
00401425 |. 8B4D 0C |MOV ECX,DWORD PTR SS:[EBP+C] ; 用户名长度nl
00401428 |. 89DA |MOV EDX,EBX
0040142A |. 83C2 03 |ADD EDX,3 ; i+3
0040142D |. 0FAFCA |IMUL ECX,EDX ; nl*(i+3)
00401430 |. 0FAFCF |IMUL ECX,EDI ; ECX=nl*(i+3)*name[i]=N4
00401433 |. 89F0 |MOV EAX,ESI
00401435 |. 01C8 |ADD EAX,ECX ; EAX=N3+N4
00401437 |. B9 0A000000 |MOV ECX,0A
0040143C |. 31D2 |XOR EDX,EDX
0040143E |. F7F1 |DIV ECX ; EAX除以0A
00401440 |. 83C2 30 |ADD EDX,30 ; 余数加30H,EDX=(N3+N4) % A +30=N5
00401443 |. 88941D FCFEFF>|MOV BYTE PTR SS:[EBP+EBX-104],DL ; 存放在12F8F4-104
0040144A |. 0FB6BC1D FCFE>|MOVZX EDI,BYTE PTR SS:[EBP+EBX-104]
00401452 |. 81F7 ACAD0000 |XOR EDI,0ADAC ; N6=N5 XOR 0ADAC=EDI
00401458 |. 89DE |MOV ESI,EBX

标签:


随机文章:

最近阅读过此文章的网友:

Pages: 1 2

Tags:

没人甩我?!

到此一游

注意: 你可以使用如下标签代码: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

| || |
由yo2提供博客服务 |Theme created by In My Pad.