1)PEID检查。MASM32 / TASM32。无壳。
2)试运行程序,任意输入注册信息后没有错误提示。
3)OD载入程序。用超级字符串查找,发现有注册成功的提示信息。
超级字串参考+ , 条目 5
地址=004012D9
反汇编=PUSH CrackMe0.00402108
文本字串=congratulations
双击,来到004012D9处。向上找计算过程开始的地方,
4)OD重新载入程序,任意输入注册信息,确定后。程序被中断
004011D0 |. 68 43204000 PUSH CrackMe0.00402043 c:\
004011D5 |. E8 E8FEFFFF CALL CrackMe0.004010C2 取C盘序列号
004011DA |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX C盘序列号进EBP-4
004011DD |. 6A 05 PUSH 5
004011DF |. FF75 FC PUSH DWORD PTR SS:[EBP-4]
004011E2 |. E8 B1FEFFFF CALL CrackMe0.00401098 C盘序列号左移五位
004011E7 |. 6A 0D PUSH 0D
004011E9 |. 50 PUSH EAX
004011EA |. E8 92FEFFFF CALL CrackMe0.00401081 左移五位后与OD(13)做LSH运算
004011EF |. 68 47204000 PUSH CrackMe0.00402047 d:\
004011F4 |. E8 C9FEFFFF CALL CrackMe0.004010C2 取D盘序列号
004011F9 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
004011FC |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] EBP-8=D盘序列号
004011FF |. FF75 FC PUSH DWORD PTR SS:[EBP-4] EBP-4=C盘序列号
00401202 |. E8 A8FEFFFF CALL CrackMe0.004010AF C盘序列号与D盘序列号相加,结果进EAX
00401207 |. 6A 05 PUSH 5
00401209 |. 50 PUSH EAX
0040120A |. E8 89FEFFFF CALL CrackMe0.00401098 结果左移五位
0040120F |. 6A 0D PUSH 0D
00401211 |. 50 PUSH EAX
00401212 |. E8 6AFEFFFF CALL CrackMe0.00401081 左移五位后与0D(13)做LSH运算,结果进EAX
00401217 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8]
0040121A |. FF75 FC PUSH DWORD PTR SS:[EBP-4]
0040121D |. E8 34FEFFFF CALL CrackMe0.00401056 *将C,D盘序列号进行浮点运算(将运算结果比做“机器码”)
00401222 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
00401225 |. 68 80000000 PUSH 80
0040122A |. 68 04314000 PUSH CrackMe0.00403104
0040122F |. 68 EC030000 PUSH 3EC
00401234 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401237 |. E8 FC000000 CALL <JMP.&user32.GetDlgItemTextA>
00401225 |. 68 80000000 PUSH 80
0040122A |. 68 04314000 PUSH CrackMe0.00403104
0040122F |. 68 EC030000 PUSH 3EC
00401234 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401237 |. E8 FC000000 CALL <JMP.&user32.GetDlgItemTextA> 取注册名
0040123C |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX EAX=注册名位数
0040123F |. 837D F4 04 CMP DWORD PTR SS:[EBP-C],4 比较注册名是否大于四位。小于则跳向失败。
00401243 |. 73 04 JNB SHORT CrackMe0.00401249
00401245 |. C9 LEAVE
00401246 |. C2 1000 RETN 10
00401249 |> 68 04314000 PUSH CrackMe0.00403104 取注册名
0040124E |. E8 E3FDFFFF CALL CrackMe0.00401036 *第一个重要的CALL!进。。。
00401253 |. 6A 01 PUSH 1
00401255 |. 50 PUSH EAX
00401256 |. E8 26FEFFFF CALL CrackMe0.00401081 *第二个重要的CALL!进。。。
0040125B |. 0B45 F0 OR EAX,DWORD PTR SS:[EBP-10] EBP-10等于机器码
0040125E |. 25 FFFFFF0F AND EAX,0FFFFFFF EAX=EAX+0FFFFFFF
00401263 |. 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
00401266 |. 33C9 XOR ECX,ECX ECX清零
00401268 |. 33D2 XOR EDX,EDX EDX清零
0040126A |. 8D35 00304000 LEA ESI,DWORD PTR DS:[403000]
00401270 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00401273 |> 8945 EC /MOV DWORD PTR SS:[EBP-14],EAX EAX=EBP-14=乙1
00401276 |. 6A 10 |PUSH 10
00401278 |. 50 |PUSH EAX
00401279 |. E8 82FDFFFF |CALL CrackMe0.00401000 *第三个重要的CALL!进。。。
0040127E |. 8BC8 |MOV ECX,EAX
00401280 |. 8D3D 73204000 |LEA EDI,DWORD PTR DS:[402073] EAX=ECX=EDX=第三个CALL计算出的余数
00401286 |. 8A0439 |MOV AL,BYTE PTR DS:[ECX+EDI] EDI=71362de9f8ab45c(作为一个固定表)
00401289 |. 8806 |MOV BYTE PTR DS:[ESI],AL 取余数在表中所对应字符的ASCII值
0040128B |. 8B45 EC |MOV EAX,DWORD PTR SS:[EBP-14]
0040128E |. 6A 04 |PUSH 4
00401290 |. 50 |PUSH EAX
00401291 |. E8 86FDFFFF |CALL CrackMe0.0040101C *第四个重要的CALL!进。。。
00401296 |. 8945 EC |MOV DWORD PTR SS:[EBP-14],EAX
00401299 |. 0BC0 |OR EAX,EAX
0040129B |. 74 04 |JE SHORT CrackMe0.004012A1 计算完毕就跳走
0040129D |. 46 |INC ESI 每计算一次ESI+1
0040129E |. 47 |INC EDI 每计算一次EDI+1
0040129F |.^ EB D2 \JMP SHORT CrackMe0.00401273 继续计算
004012A1 |> 68 00010000 PUSH 100
004012A6 |. 8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
004012AC |. 50 PUSH EAX
004012AD |. 68 ED030000 PUSH 3ED
004012B2 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
004012B5 |. E8 7E000000 CALL <JMP.&user32.GetDlgItemTextA>
004012BA |. 0BC0 OR EAX,EAX
004012BC |. 75 04 JNZ SHORT CrackMe0.004012C2
004012BE |. C9 LEAVE
004012BF |. C2 1000 RETN 10
004012C2 |> 68 00304000 PUSH CrackMe0.00403000
004012C7 |. 8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
004012CD |. 50 PUSH EAX
004012CE |. E8 53000000 CALL <JMP.&kernel32.lstrcmpA>
004012D3 |. 0BC0 OR EAX,EAX
004012D5 |. 75 18 JNZ SHORT CrackMe0.004012EF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
先进计算机器码的CALL
00401056 /$ 55 PUSH EBP
00401057 |. 8BEC MOV EBP,ESP
00401059 |. 83C4 FC ADD ESP,-4
0040105C |. 53 PUSH EBX
0040105D |. 56 PUSH ESI
0040105E |. 57 PUSH EDI
0040105F |. 9B WAIT
00401060 |. DBE3 FINIT
00401062 |. DB45 08 FILD DWORD PTR SS:[EBP+8] EBP+8=C盘序列号,转换成十进制。
00401065 |. D9C0 FLD ST ST=C盘序列号转换成十进制后得数字设为A
00401067 |. DEC9 FMULP ST(1),ST A*A=A平方
00401069 |. DB45 0C FILD DWORD PTR SS:[EBP+C] EBP+C=D盘序列号,转换成十进制
0040106C |. D9C0 FLD ST ST=D盘序列号转换成十进制后得数字设为B
0040106E |. DEC9 FMULP ST(1),ST B*B=B平方
00401070 |. DEC1 FADDP ST(1),ST A平方+B平方
00401072 |. D9FA FSQRT 得到结果
00401074 |. DB5D FC FISTP DWORD PTR SS:[EBP-4]
00401077 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 结果转换成10进制数
0040107A |. 5F POP EDI
0040107B |. 5E POP ESI
0040107C |. 5B POP EBX
0040107D |. C9 LEAVE
0040107E \. C2 0800 RETN 8 返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第一个关键CALL
来到这里。。。。。。
00401036 /$ 55 PUSH EBP
00401037 |. 8BEC MOV EBP,ESP
00401039 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] EBP+8=注册名
0040103C |. FC CLD
0040103D |. 33D2 XOR EDX,EDX EDX清零
0040103F |. B8 01000000 MOV EAX,1 给EAX赋一
00401044 |> 0FB60E /MOVZX ECX,BYTE PTR DS:[ESI] 取注册名没一位的ASCII值,放进ECX
00401047 |. 46 |INC ESI 每取一次ESI+1
00401048 |. 0BC9 |OR ECX,ECX
0040104A |. 74 06 |JE SHORT CrackMe0.00401052 计算完了吗。计算完就跳走。
0040104C |. F7E1 |MUL ECX EAX*ECX结果放进EAX
0040104E |. 03C2 |ADD EAX,EDX EAX=EAX+EDX
00401050 |.^ EB F2 \JMP SHORT CrackMe0.00401044 继续计算
00401052 |> C9 LEAVE
00401053 \. C2 0400 RETN 4
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第二个关键CALL (注意:在这里设第一个CALL的运算结果为“甲”)
来到这里。。。。。。
00401081 /$ 55 PUSH EBP
00401082 |. 8BEC MOV EBP,ESP
00401084 |. 53 PUSH EBX
00401085 |. 56 PUSH ESI
00401086 |. 57 PUSH EDI
00401087 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] EBP+8=甲
0040108A |. 8D55 0C LEA EDX,DWORD PTR SS:[EBP+C] EBP+C=1
0040108D |. 8A0A MOV CL,BYTE PTR DS:[EDX] 令CL=1
0040108F |. D3C0 ROL EAX,CL 甲与1做LSH运算。结果放进EAX
00401091 |. 5F POP EDI
00401092 |. 5E POP ESI
00401093 |. 5B POP EBX
00401094 |. C9 LEAVE 计算完毕
00401095 \. C2 0800 RETN 8 返回
***********************注意:设第二步计算的结果为“乙”*******************************************
进入第三个关键CALL
来到这里。。。。。。
00401000 /$ 55 PUSH EBP
00401001 |. 8BEC MOV EBP,ESP
00401003 |. 83C4 FC ADD ESP,-4
00401006 |. 53 PUSH EBX
00401007 |. 56 PUSH ESI
00401008 |. 57 PUSH EDI
00401009 |. 33D2 XOR EDX,EDX EDX清零
0040100B |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] EBP+8=乙
0040100E |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C] EBP+C=定值10
00401011 |. F7F9 IDIV ECX EAX除以ECX,结果进EAX余数进EDX
00401013 |. 8BC2 MOV EAX,EDX
00401015 |. 5F POP EDI
00401016 |. 5E POP ESI
00401017 |. 5B POP EBX
00401018 |. C9 LEAVE 计算完毕
00401019 \. C2 0800 RETN 8 返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入第四个关键CALL
来到这里。。。。。。
0040101C /$ 55 PUSH EBP
0040101D |. 8BEC MOV EBP,ESP
0040101F |. 83C4 FC ADD ESP,-4
00401022 |. 53 PUSH EBX
00401023 |. 56 PUSH ESI
00401024 |. 57 PUSH EDI
00401025 |. 33D2 XOR EDX,EDX
00401027 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
0040102A |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C] EBP+C=定值4
0040102D |. F7F9 IDIV ECX EAX除以ECX,结果进EAX余数进EDX
0040102F |. 5F POP EDI
00401030 |. 5E POP ESI
00401031 |. 5B POP EBX 输出结果
00401032 |. C9 LEAVE 计算完毕
00401033 \. C2 0800 RETN 8 返回
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------------------------------
BY 逍遥风
算法总结:
1)取注册名每一位的ASCII值,将这些值相乘。设结果为“甲”。
2)将甲与1做LSH运算(WINDOWS自带得计算器就可以计算,注意计算都是16进制下的计算)。设结果为“乙”。
3)将乙在与机器码进行OR运算。再加上0FFFFFFF。设为(乙1)
4)将(乙1)除以一个定值10,得到一个余数。把余数转化成对应的十进制数。在固定表071362de9f8ab45c中寻找与这个 十进制数相对应的字符。设为“丙”
5)再将(乙1)除以定值4,得到一个商。把这个商作为下次计算的除数(相当于第一步的“乙1”)
6)计算过程循环进行12次。把每次计算所的的“丙”合并就是注册码。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
机器码的计算过程(主要过程):
1)分别取C盘D盘的序列号。
2)将两盘序列号转换成浮点数。求两盘序列号浮点数平方的和。将结果转换成十进制数即为“机器码”
----------------------------------------------------
有疏漏或错误的地方请大家多多指正。谢谢
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课