能力值:
( LV2,RANK:10 )
|
-
-
3 楼
00401525 8B5D C4 MOV EBX,DWORD PTR [EBP-3C]
00401528 8BCB MOV ECX,EBX
0040152A E8 51710200 CALL CRACKME3.00428680 ----应该是通过ECX来取名和码地址的,没细看
0040152F 8378 08 02 CMP DWORD PTR [EAX+8],2 ----码长度>2跳到名验证
00401533 0F87 A6000000 JA CRACKME3.004015DF
00401539 8B4D C8 MOV ECX,DWORD PTR [EBP-38]
0040153C E8 3F710200 CALL CRACKME3.00428680
00401541 8B70 08 MOV ESI,DWORD PTR [EAX+8]
00401544 8BCB MOV ECX,EBX
00401546 E8 35710200 CALL CRACKME3.00428680
0040154B 3B70 08 CMP ESI,DWORD PTR [EAX+8] ----名长度>码长度跳到名验证
0040154E 0F87 8B000000 JA CRACKME3.004015DF ----不跳奔错误而去。
此段判断有错误。我们可以直接写3位码通过(名验证的地方又有错误,下边详说),或超过2位的名和2位的码通过。(为什么是2位码不是1位码?1位码的验证不是更简单么?下边详说)
用户名验证
004015E4 8BCF MOV ECX,EDI ----此处开始循环取名的字符
004015E6 E8 95700200 CALL CRACKME3.00428680
004015EB 3B70 08 CMP ESI,DWORD PTR [EAX+8] ----如果取到最后1位
004015EE /73 53 JNB SHORT CRACKME3.00401643----跳出循环(如果我们的名是空的,那么直接就跳了)
004015F0 |8BCF MOV ECX,EDI
004015F2 |E8 89700200 CALL CRACKME3.00428680
004015F7 |8B40 04 MOV EAX,DWORD PTR [EAX+4]
004015FA |85C0 TEST EAX,EAX
004015FC |75 07 JNZ SHORT CRACKME3.00401605
004015FE |B8 C8A74B00 MOV EAX,CRACKME3.004BA7C8
00401603 |EB 02 JMP SHORT CRACKME3.00401607
00401605 |03C6 ADD EAX,ESI
00401607 |0FBE08 MOVSX ECX,BYTE PTR [EAX]
0040160A |51 PUSH ECX
0040160B |E8 99130900 CALL CRACKME3.004929A9 ----大写转换小写
00401610 |83C4 04 ADD ESP,4
00401613 |83F8 61 CMP EAX,61
00401616 |7C 2B JL SHORT CRACKME3.00401643----如果不是小写字母a-z跳出循环
00401618 |8BCF MOV ECX,EDI
0040161A |E8 61700200 CALL CRACKME3.00428680
0040161F |8B40 04 MOV EAX,DWORD PTR [EAX+4]
00401622 |85C0 TEST EAX,EAX
00401624 |75 07 JNZ SHORT CRACKME3.0040162D
00401626 |B8 C8A74B00 MOV EAX,CRACKME3.004BA7C8
0040162B |EB 02 JMP SHORT CRACKME3.0040162F
0040162D |03C6 ADD EAX,ESI
0040162F |0FBE10 MOVSX EDX,BYTE PTR [EAX]
00401632 |52 PUSH EDX
00401633 |E8 71130900 CALL CRACKME3.004929A9 ----大写转换小写
00401638 |83C4 04 ADD ESP,4
0040163B |83F8 7A CMP EAX,7A
0040163E |7F 03 JG SHORT CRACKME3.00401643----如果不是小写字母a-z跳出循环
00401640 |46 INC ESI ----如果是小写a-z,计数器+1
00401641 ^|EB A1 JMP SHORT CRACKME3.004015E4----循环
00401643 \8BCF MOV ECX,EDI
00401645 E8 36700200 CALL CRACKME3.00428680
0040164A 3B70 08 CMP ESI,DWORD PTR [EAX+8] ----比较字符个数与名长度(其实就是判断名里是否都是大小写字母)
0040164D 0F83 8B000000 JNB CRACKME3.004016DE ----跳到码验证。不跳又进错误代码段。此处应该判断是否=0,我们名是空的,也跳。
注册码验证
004016DE 8BCB MOV ECX,EBX
004016E0 E8 9B6F0200 CALL CRACKME3.00428680
004016E5 8B40 04 MOV EAX,DWORD PTR [EAX+4] ----取码
004016E8 85C0 TEST EAX,EAX
004016EA 75 05 JNZ SHORT CRACKME3.004016F1
004016EC B8 C8A74B00 MOV EAX,CRACKME3.004BA7C8 ----为空就置0
004016F1 50 PUSH EAX
004016F2 E8 A7120900 CALL CRACKME3.0049299E ----码字符串转换成整数
004016F7 50 PUSH EAX
004016F8 E8 03F9FFFF CALL CRACKME3.00401000 ----计算CALL,在下边
004016FD 83C4 08 ADD ESP,8
00401700 84C0 TEST AL,AL ----判断是否0
00401702 ^ 0F84 4BFFFFFF JE CRACKME3.00401653 ----0跳到错误代码
=============
计算的CALL
00401000 56 PUSH ESI
00401001 8B7424 08 MOV ESI,DWORD PTR [ESP+8] ----码转换的整数
00401005 83FE 02 CMP ESI,2 ----判断是否=2
00401008 /75 04 JNZ SHORT CRACKME3.0040100E----不=2跳,进行下一步运算
0040100A |B0 01 MOV AL,1 ----=2,AL置1,注册成功
0040100C |5E POP ESI
0040100D |C3 RET
0040100E \85F6 TEST ESI,ESI
00401010 74 42 JE SHORT CRACKME3.00401054
00401012 83FE 01 CMP ESI,1
00401015 74 3D JE SHORT CRACKME3.00401054
00401017 8BC6 MOV EAX,ESI
00401019 25 01000080 AND EAX,80000001
0040101E /79 05 JNS SHORT CRACKME3.00401025----奇偶校验
00401020 |48 DEC EAX
00401021 |83C8 FE OR EAX,FFFFFFFE
00401024 |40 INC EAX
00401025 X74 2D JE SHORT CRACKME3.00401054 ----不为奇跳到返回,AL=0,注册失败
00401027 DB4424 08 FILD DWORD PTR [ESP+8]
0040102B D9FA FSQRT
0040102D E8 B6170900 CALL CRACKME3.004927E8 ----平方根
00401032 8BC8 MOV ECX,EAX ----传给ECX
00401034 83F9 03 CMP ECX,3
00401037 7C 11 JL SHORT CRACKME3.0040104A ----ECX<3跳到返回,AL=0,注册失败
00401039 8BC6 MOV EAX,ESI ----码转换的整数,开始循环
0040103B 99 CDQ ----余数传给EDX
0040103C F7F9 IDIV ECX ----整除ECX
0040103E 85D2 TEST EDX,EDX ----EDX=0跳出循环,因为ECX>=3,所以AL=0,注册失败
00401040 74 08 JE SHORT CRACKME3.0040104A
00401042 83E9 02 SUB ECX,2 ----ECX每次-2
00401045 83F9 03 CMP ECX,3 ----ECX>=3循环
00401048 ^ 7D EF JGE SHORT CRACKME3.00401039
0040104A 33C0 XOR EAX,EAX
0040104C 83F9 03 CMP ECX,3
0040104F 0F9CC0 SETL AL ----如果ECX>3,AL=1,注册成功
00401052 5E POP ESI
00401053 C3 RETN
00401054 32C0 XOR AL,AL
00401056 5E POP ESI
00401057 C3 RETN
========================
接0040164D处代码
00401708 8BCB MOV ECX,EBX
0040170A E8 716F0200 CALL CRACKME3.00428680
0040170F 8B40 08 MOV EAX,DWORD PTR [EAX+8]
00401712 33DB XOR EBX,EBX
00401714 8D78 FF LEA EDI,DWORD PTR [EAX-1]
00401717 3BDF CMP EBX,EDI
00401719 0F8F C7000000 JG CRACKME3.004017E6
0040171F 8B4D C4 MOV ECX,DWORD PTR [EBP-3C]
00401722 E8 596F0200 CALL CRACKME3.00428680
00401727 8B40 04 MOV EAX,DWORD PTR [EAX+4]
0040172A BE C8A74B00 MOV ESI,CRACKME3.004BA7C8
0040172F 85C0 TEST EAX,EAX
00401731 74 03 JE SHORT CRACKME3.00401736
00401733 8D3418 LEA ESI,DWORD PTR [EAX+EBX]
00401736 8B4D C4 MOV ECX,DWORD PTR [EBP-3C]
00401739 E8 426F0200 CALL CRACKME3.00428680
0040173E 8B40 04 MOV EAX,DWORD PTR [EAX+4]
00401741 85C0 TEST EAX,EAX
00401743 75 07 JNZ SHORT CRACKME3.0040174C
00401745 B8 C8A74B00 MOV EAX,CRACKME3.004BA7C8
0040174A EB 02 JMP SHORT CRACKME3.0040174E
0040174C 03C7 ADD EAX,EDI
0040174E 8A0E MOV CL,BYTE PTR [ESI]
00401750 8A10 MOV DL,BYTE PTR [EAX]
00401752 3ACA CMP CL,DL
00401754 75 04 JNZ SHORT CRACKME3.0040175A
00401756 4F DEC EDI
00401757 43 INC EBX
00401758 ^ EB BD JMP SHORT CRACKME3.00401717
这块没什么好说的,从码的两头取字符比较,直到中间,都一样的跳到注册成功
流程
先判断名是否都是字母,否注册失败
码先转换整数,判断奇偶,为偶注册失败
用转换的整数的平方根取整做除数(每次-2),用转换的整数去除,如果除数在>3前可以整除,注册失败
从码的两头取字符比较,直到中间,有不同的注册失败。
简单注册的方法
首先在00401005处,我们可以让ESI=2来达到目的,码直接写2,因为码<3位必须名比码长才可以过判断,因此可以用2个或以上的字母做名。
可以用简单的口算得出注册码,比如名XXX,码11。名空,码111、131、313、333等。
时间有限,看的不是很仔细,见笑了。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
已经找到了一个注册的方式。
用户名: 输入A~z的任何字母2位以上
密码 : 2
不过,开始的时候不知道在哪下断..
发现有三个 提示字符串, 不知道要看哪个..
后来才找到关键.. 累. 本人小菜鸟. 希望大家多交流
|