【破文标题】CRACKME算法分析
【破文作者】逍遥风
【作者邮箱】tc-xb@163.com
【破解工具】OD peid
【破解平台】WINXP
【破解声明】一次锻炼耐性的好机会
----------------------------------------------------------------------
00430C58 /. 55 PUSH EBP
00430C59 |. 8BEC MOV EBP,ESP
00430C5B |. B9 05000000 MOV ECX,5
。。。。。。省略一些代码。
00430CA7 |. 8B86 DC010000 MOV EAX,DWORD PTR DS:[ESI+1DC]
00430CAD |. E8 669FFEFF CALL ocrackme.0041AC18 ; 取注册名位数
00430CB2 |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00430CB5 |. 8B86 E0010000 MOV EAX,DWORD PTR DS:[ESI+1E0]
00430CBB |. E8 589FFEFF CALL ocrackme.0041AC18 ; 取注册码位数
00430CC0 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00430CC3 |. E8 702CFDFF CALL ocrackme.00403938
00430CC8 |. 83F8 06 CMP EAX,6 ; 注册名位数与6比较
00430CCB |. 7D 0F JGE SHORT ocrackme.00430CDC
00430CCD |. B8 F40E4300 MOV EAX,ocrackme.00430EF4 ; name must be at least 6 characters long
00430CD2 |. E8 65DEFFFF CALL ocrackme.0042EB3C
00430CD7 |. E9 E8010000 JMP ocrackme.00430EC4
00430CDC |> 837D F8 00 CMP DWORD PTR SS:[EBP-8],0 ; 输入注册吗了吗
00430CE0 |. 75 34 JNZ SHORT ocrackme.00430D16
00430CE2 |. B8 240F4300 MOV EAX,ocrackme.00430F24 ; enter a serial #
00430CE7 |. E8 50DEFFFF CALL ocrackme.0042EB3C
00430CEC |. E9 D3010000 JMP ocrackme.00430EC4
00430CF1 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; 开始第一步计算,作用就是把注册名进行倒序
00430CF4 |. E8 3F2CFDFF |CALL ocrackme.00403938 ; 取注册名
00430CF9 |. 2BC3 |SUB EAX,EBX ; EAX=EAX-EBX
00430CFB |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
00430CFE |. 8A5402 FF |MOV DL,BYTE PTR DS:[EDX+EAX-1] ; 倒序取注册名的ASCII码
00430D02 |. 8D45 E4 |LEA EAX,DWORD PTR SS:[EBP-1C]
00430D05 |. E8 562BFDFF |CALL ocrackme.00403860
00430D0A |. 8B55 E4 |MOV EDX,DWORD PTR SS:[EBP-1C]
00430D0D |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00430D10 |. E8 2B2CFDFF |CALL ocrackme.00403940
00430D15 |. 43 |INC EBX ; 每计算一次EBX+1
00430D16 |> 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00430D19 |. E8 1A2CFDFF |CALL ocrackme.00403938
00430D1E |. 3BD8 |CMP EBX,EAX ; 计算完了吗?
00430D20 |.^ 7C CF \JL SHORT ocrackme.00430CF1 ; 没有就继续计算。
00430D22 |. BB 01000000 MOV EBX,1 ; 使EBX=1
00430D27 |. EB 36 JMP SHORT ocrackme.00430D5F ; 设第一步结果为“甲”
00430D29 |> FF75 EC /PUSH DWORD PTR SS:[EBP-14] ; 开始第二步计算
00430D2C |. 8D45 E4 |LEA EAX,DWORD PTR SS:[EBP-1C]
00430D2F |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
00430D32 |. 8A541A FF |MOV DL,BYTE PTR DS:[EDX+EBX-1]
00430D36 |. E8 252BFDFF |CALL ocrackme.00403860
00430D3B |. FF75 E4 |PUSH DWORD PTR SS:[EBP-1C]
00430D3E |. 8D55 E0 |LEA EDX,DWORD PTR SS:[EBP-20]
00430D41 |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C]
00430D44 |. 0FB64418 FF |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1] ; 按顺序取甲每一位的ASCII值
00430D49 |. E8 2A5AFDFF |CALL ocrackme.00406778 ; 将每一位的ASCII码转换成对应的十进制数
00430D4E |. FF75 E0 |PUSH DWORD PTR SS:[EBP-20]
00430D51 |. 8D45 EC |LEA EAX,DWORD PTR SS:[EBP-14]
00430D54 |. BA 03000000 |MOV EDX,3 ; 令EDX=3
00430D59 |. E8 9A2CFDFF |CALL ocrackme.004039F8 ; 注册名与十进制数按对应位置相交叉组成一个字符串
00430D5E |. 43 |INC EBX ; 每计算一次EBX+1
00430D5F |> 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00430D62 |. E8 D12BFDFF |CALL ocrackme.00403938
00430D67 |. 3BD8 |CMP EBX,EAX ; 计算完了吗?
00430D69 |.^ 7C BE \JL SHORT ocrackme.00430D29 ; 没有就继续计算。
00430D6B |. BB 01000000 MOV EBX,1 ; 使EBX=1
00430D70 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] ; 设第二步结果为“乙”。
00430D73 |. E8 4429FDFF CALL ocrackme.004036BC
00430D78 |. EB 4D JMP SHORT ocrackme.00430DC7 ; 开始第三步计算
00430D7A |> 8D45 DC /LEA EAX,DWORD PTR SS:[EBP-24] ; 第三步计算就是从乙的第2位开始重复取每一位到倒数第2位
00430D7D |. 8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14]
00430D80 |. 8A141A |MOV DL,BYTE PTR DS:[EDX+EBX]
00430D83 |. 8850 01 |MOV BYTE PTR DS:[EAX+1],DL
00430D86 |. C600 01 |MOV BYTE PTR DS:[EAX],1
00430D89 |. 8D55 DC |LEA EDX,DWORD PTR SS:[EBP-24]
00430D8C |. 8D45 D8 |LEA EAX,DWORD PTR SS:[EBP-28]
00430D8F |. E8 581AFDFF |CALL ocrackme.004027EC ; 取乙的每一位
00430D94 |. 8D45 D4 |LEA EAX,DWORD PTR SS:[EBP-2C]
00430D97 |. 8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14]
00430D9A |. 8A141A |MOV DL,BYTE PTR DS:[EDX+EBX]
00430D9D |. 8850 01 |MOV BYTE PTR DS:[EAX+1],DL
00430DA0 |. C600 01 |MOV BYTE PTR DS:[EAX],1
00430DA3 |. 8D55 D4 |LEA EDX,DWORD PTR SS:[EBP-2C]
00430DA6 |. 8D45 D8 |LEA EAX,DWORD PTR SS:[EBP-28]
00430DA9 |. B1 02 |MOV CL,2 ; 使CL=2
00430DAB |. E8 0C1AFDFF |CALL ocrackme.004027BC ; 重复取乙的每一位
00430DB0 |. 8D55 D8 |LEA EDX,DWORD PTR SS:[EBP-28]
00430DB3 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10]
00430DB6 |. E8 212BFDFF |CALL ocrackme.004038DC
00430DBB |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00430DBE |. 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
00430DC1 |. E8 7A2BFDFF |CALL ocrackme.00403940
00430DC6 |. 43 |INC EBX ; 每计算一次EBX+1
00430DC7 |> 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00430DCA |. E8 692BFDFF |CALL ocrackme.00403938
00430DCF |. 48 |DEC EAX ; 每计算一次EAX-1
00430DD0 |. 3BD8 |CMP EBX,EAX ; 计算完了吗?
00430DD2 |.^ 7C A6 \JL SHORT ocrackme.00430D7A ; 没有就继续计算。
00430DD4 |. BB 01000000 MOV EBX,1 ; 使EBX=1
00430DD9 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] ; 设第三步结果为“丙”
00430DDC |. E8 DB28FDFF CALL ocrackme.004036BC
00430DE1 |. EB 1C JMP SHORT ocrackme.00430DFF ; 开始第四步计算
00430DE3 |> 8D55 E4 /LEA EDX,DWORD PTR SS:[EBP-1C] ; 第四步计算就是把丙除最后一位舍去都转换成相应的十进制数
00430DE6 |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C]
00430DE9 |. 0FB64418 FF |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1] ; 取丙每一位的ASCII值
00430DEE |. E8 8559FDFF |CALL ocrackme.00406778 ; 每一位的ASCII值转换成对应的十进制数
00430DF3 |. 8B55 E4 |MOV EDX,DWORD PTR SS:[EBP-1C]
00430DF6 |. 8D45 EC |LEA EAX,DWORD PTR SS:[EBP-14]
00430DF9 |. E8 422BFDFF |CALL ocrackme.00403940 ; 将每一位的十进制数顺次合并
00430DFE |. 43 |INC EBX ; 每计算一次EBX+1
00430DFF |> 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00430E02 |. E8 312BFDFF |CALL ocrackme.00403938
00430E07 |. 3BD8 |CMP EBX,EAX ; 计算完了吗?
00430E09 |.^ 7C D8 \JL SHORT ocrackme.00430DE3 ; 没有就继续计算。
00430E0B |. BB 03000000 MOV EBX,3 ; 使EBX=3
00430E10 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] ; 设第四步结果为“丁”
00430E13 |. E8 A428FDFF CALL ocrackme.004036BC
00430E18 |. 83FB 30 CMP EBX,30
00430E1B |. 7D 22 JGE SHORT ocrackme.00430E3F ; 开始第五步计算
00430E1D |> 8D45 E4 /LEA EAX,DWORD PTR SS:[EBP-1C] ; 第五步计算就是从丁第三位开始隔3位取一个数,取到48位为止
00430E20 |. 8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14]
00430E23 |. 8A541A FF |MOV DL,BYTE PTR DS:[EDX+EBX-1] ; 取丁中与EBX的值相对应位数
00430E27 |. E8 342AFDFF |CALL ocrackme.00403860
00430E2C |. 8B55 E4 |MOV EDX,DWORD PTR SS:[EBP-1C]
00430E2F |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00430E32 |. E8 092BFDFF |CALL ocrackme.00403940
00430E37 |. 83C3 03 |ADD EBX,3 ; 每计算一次EBX+3
00430E3A |. 83FB 30 |CMP EBX,30 ; 取到EBX=48为止
00430E3D |.^ 7C DE \JL SHORT ocrackme.00430E1D ; 设第五步计算结果为“戊”
00430E3F |> BB 01000000 MOV EBX,1 ; 使EBX=1
00430E44 |. EB 5B JMP SHORT ocrackme.00430EA1 ; 开始第六步计算
00430E46 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; 取注册名
00430E49 |. E8 EA2AFDFF |CALL ocrackme.00403938 ; 取注册名位数
00430E4E |. 03C3 |ADD EAX,EBX ; EAX=EAX+EBX
00430E50 |. 8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14] ; EBP-14=丁
00430E53 |. 8A5402 FD |MOV DL,BYTE PTR DS:[EDX+EAX-3] ; 取丁中与EAX值对应位数的值的ASCII值。
00430E57 |. 8D45 E4 |LEA EAX,DWORD PTR SS:[EBP-1C]
00430E5A |. E8 012AFDFF |CALL ocrackme.00403860
00430E5F |. 8B45 E4 |MOV EAX,DWORD PTR SS:[EBP-1C]
00430E62 |. E8 4159FDFF |CALL ocrackme.004067A8 ; 使EAX等于丁中对应位数的值
00430E67 |. 50 |PUSH EAX
00430E68 |. 8D45 E4 |LEA EAX,DWORD PTR SS:[EBP-1C]
00430E6B |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]
00430E6E |. 8A541A FF |MOV DL,BYTE PTR DS:[EDX+EBX-1] ; 取戊每一位的ASCII值
00430E72 |. E8 E929FDFF |CALL ocrackme.00403860
00430E77 |. 8B45 E4 |MOV EAX,DWORD PTR SS:[EBP-1C]
00430E7A |. E8 2959FDFF |CALL ocrackme.004067A8 ; 使EAX等于戊中对应位数的值
00430E7F |. 5A |POP EDX
00430E80 |. 2BC2 |SUB EAX,EDX
00430E82 |. 99 |CDQ
00430E83 |. 33C2 |XOR EAX,EDX
00430E85 |. 2BC2 |SUB EAX,EDX ; EAX=EAX-EDX,结果为A
00430E87 |. 8D55 E8 |LEA EDX,DWORD PTR SS:[EBP-18]
00430E8A |. E8 E958FDFF |CALL ocrackme.00406778
00430E8F |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00430E92 |. E8 712CFDFF |CALL ocrackme.00403B08 ; 取戊
00430E97 |. 8B55 E8 |MOV EDX,DWORD PTR SS:[EBP-18]
00430E9A |. 8A12 |MOV DL,BYTE PTR DS:[EDX]
00430E9C |. 885418 FF |MOV BYTE PTR DS:[EAX+EBX-1],DL ; 用An替换戊中对应位数的值
00430EA0 |. 43 |INC EBX ; 每计算一次EBX+1
00430EA1 |> 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00430EA4 |. E8 8F2AFDFF |CALL ocrackme.00403938 ; 取戊的位数
00430EA9 |. 3BD8 |CMP EBX,EAX ; 计算完了吗?
00430EAB |.^ 7E 99 \JLE SHORT ocrackme.00430E46 ; 没有就继续计算。
00430EAD |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; EBP-C=注册码
00430EB0 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00430EB3 |. E8 902BFDFF CALL ocrackme.00403A48 ; 比较CALL,
00430EB8 |. 75 0A JNZ SHORT ocrackme.00430EC4 ; 不相等就跳向失败
00430EBA |. B8 400F4300 MOV EAX,ocrackme.00430F40 ; you got it!!! :)
------------------------------------------------------------------------
算法总结:
1)注册名不得小于6位。
2)算法分为6步。
第一步:将输入的注册名进行倒序。结果设为‘甲’
第二步:取‘甲’每一位的ASCII值,再转换成对应的十进制数。把注册名与十进制数每间隔三位交叉。得到‘乙’
第三步:将乙掐头去尾(首尾两位舍弃)重复取中间部分(如A变为AA。。。)。结果设为‘丙’位数为N
第四步:取丙的前N-1位的ASCII值,并转换成相对应的十进制数,结果设为‘丁’
第五步:从丁的第三位开始,每隔三位取一个数。将这些数合并。结果设为‘戊’
第六步:在丁和戊中取一定位数的值,经过计算后将新的计算结果替换戊中原来的数字。结果即是注册码。
例,注册名:lovetc
第一步:ctevol
第二步:l99o116v101e118t111 注意:第一位是L
第三步:9999oo111166vv110011ee111188tt1111
第四步:57575757111111494949495454118118494948484949101101494949495656116116494949
第五步:571149441149491
第六步:004638330000003
所以,
注册名:lovetc
注册码:004638330000003
总算搞出些头绪了,头都大了.该回宿舍了,回去晚了会被看门大叔打PP的:)
算法不难,就是比较麻烦。
在网吧完成的,所以比较仓促,有疏漏请大家指出
----------------------------------------------------------------------
【版权声明】欢迎交流,请保留作者及文章完整性。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课