第一:先来解决它的固定序列号
1)PEID检查,MASM32 / TASM32。无壳。
2)任意输入序列号,有错误提示“sorry, please try again”.。
3)OD重新载入程序。用超级字符串查找,找到有两处错误的提示。先看第一处。
超级字串参考+ , 条目 20
地址=004013D9
反汇编=PUSH CrackMe0.00403067
文本字串=sorry, please try again. 双击来到004013D9处。看到前面有一处调用了GetWindowTextA,就在那里下断
4)OD重新载入程序,在HardCoded栏任意输入11111后确定,程序中断
0040135D |> \6A 20 PUSH 20 ; /Count = 20 (32.)
0040135F |. 68 15324000 PUSH CrackMe0.00403215 ; |Buffer = CrackMe0.00403215
00401364 |. FF35 90344000 PUSH DWORD PTR DS:[403490] ; |hWnd = 003201A4 (class='Edit',parent=00340274)
0040136A |. E8 BB030000 CALL <JMP.&USER32.GetWindowTextA> ; \GetWindowTextA
0040136F |. 8D05 53134000 LEA EAX,DWORD PTR DS:[401353]
00401375 |. 8D1D 15324000 LEA EBX,DWORD PTR DS:[403215] F8到这里时注意看寄存器中
省略一些代码。。。。。。
004013D2 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004013D4 |. 68 0A304000 PUSH CrackMe0.0040300A ; |splish, splash
004013D9 |. 68 67304000 PUSH CrackMe0.00403067 ; |sorry, please try again.
004013DE |. 6A 00 PUSH 0 ; |hOwner = NULL
004013E0 |. E8 63030000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
到00401375时,寄存器XEAX 00401353 ASCII "HardCoded"
这里的HardCoded就是正确序列号。
重新打开程序,在HardCoded栏中输入HardCoded。出现正确提示,成功。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二:解决它的注册算法
1)任意输入注册信息,有错误提示“sorry, please try again”
2)OD重新载入程序。用超级字符串查找,“sorry, please try again”,这次看第二处
超级字串参考+ , 条目 33
地址=004016E9
反汇编=PUSH CrackMe0.00403067
文本字串=sorry, please try again. 双击来到004016E9处,有两处调用了GetWindowTextA,在第一处那里下断。
3)OD重新载入程序,任意输入注册信息后,程序中断
004015E4 /$ 55 PUSH EBP
004015E5 |. 8BEC MOV EBP,ESP
004015E7 |. 6A 20 PUSH 20 ; /Count = 20 (32.)
004015E9 |. 68 42324000 PUSH CrackMe0.00403242 ; |Buffer = CrackMe0.00403242
004015EE |. FF75 0C PUSH DWORD PTR SS:[EBP+C] ; |hWnd
004015F1 |. E8 34010000 CALL <JMP.&USER32.GetWindowTextA> ; \GetWindowTextA
004015F6 |. 85C0 TEST EAX,EAX ; 取假码位数
004015F8 |. 0F84 95000000 JE CrackMe0.00401693
004015FE |. A3 67344000 MOV DWORD PTR DS:[403467],EAX
00401603 |. 6A 0B PUSH 0B ; /Count = B (11.)
00401605 |. 68 36324000 PUSH CrackMe0.00403236 ; |Buffer = CrackMe0.00403236
0040160A |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040160D |. E8 18010000 CALL <JMP.&USER32.GetWindowTextA> ; \GetWindowTextA
00401612 |. 85C0 TEST EAX,EAX ; 取注册名位数
00401614 |. 74 68 JE SHORT CrackMe0.0040167E
00401616 |. A3 63344000 MOV DWORD PTR DS:[403463],EAX
0040161B |. 33C9 XOR ECX,ECX ; ECX清零
0040161D |. 33DB XOR EBX,EBX ; EBX清零
0040161F |. 33D2 XOR EDX,EDX ; EDX清零
00401621 |. 8D35 36324000 LEA ESI,DWORD PTR DS:[403236] ; 注册名进ESI
00401627 |. 8D3D 58324000 LEA EDI,DWORD PTR DS:[403258]
0040162D |. B9 0A000000 MOV ECX,0A ; 令ECX=0A
00401632 |> 0FBE041E /MOVSX EAX,BYTE PTR DS:[ESI+EBX] ; 取注册名每一位的16进制值
00401636 |. 99 |CDQ
00401637 |. F7F9 |IDIV ECX ; ECX=EAX/0A 商进EAX,余数进EDX
00401639 |. 33D3 |XOR EDX,EBX ; EBX=计算次数-1做XOR运算
0040163B |. 83C2 02 |ADD EDX,2 ; 余数加2
0040163E |. 80FA 0A |CMP DL,0A ; 所得的值与OA相比
00401641 |. 7C 03 |JL SHORT CrackMe0.00401646
00401643 |. 80EA 0A |SUB DL,0A ; 大于则余数减去OA
00401646 |> 88141F |MOV BYTE PTR DS:[EDI+EBX],DL
00401649 |. 43 |INC EBX ; 每计算一次EBX+1
0040164A |. 3B1D 63344000 |CMP EBX,DWORD PTR DS:[403463] ; 计算完了吗
00401650 |.^ 75 E0 \JNZ SHORT CrackMe0.00401632 ; 没有则继续
00401652 |. 33C9 XOR ECX,ECX
00401654 |. 33DB XOR EBX,EBX
00401656 |. 33D2 XOR EDX,EDX
00401658 |. 8D35 42324000 LEA ESI,DWORD PTR DS:[403242]
0040165E |. 8D3D 4D324000 LEA EDI,DWORD PTR DS:[40324D]
00401664 |. B9 0A000000 MOV ECX,0A ; 令ECX=0A
00401669 |> 0FBE041E /MOVSX EAX,BYTE PTR DS:[ESI+EBX] ; 取假码每一位对应的16进制数
0040166D |. 99 |CDQ
0040166E |. F7F9 |IDIV ECX ; ECX=EAX/0A 商进EAX,余数进EDX
00401670 |. 88141F |MOV BYTE PTR DS:[EDI+EBX],DL
00401673 |. 43 |INC EBX ; EBX+1
00401674 |. 3B1D 67344000 |CMP EBX,DWORD PTR DS:[403467] ; 计算完了吗
0040167A |.^ 75 ED \JNZ SHORT CrackMe0.00401669 ; 没有则继续
0040167C |. EB 2A JMP SHORT CrackMe0.004016A8
0040167E |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401680 |. 68 0A304000 PUSH CrackMe0.0040300A ; |splish, splash
00401685 |. 68 A0304000 PUSH CrackMe0.004030A0 ; |please enter your name.
0040168A |. 6A 00 PUSH 0 ; |hOwner = NULL
0040168C |. E8 B7000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401691 |. EB 62 JMP SHORT CrackMe0.004016F5
00401693 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401695 |. 68 0A304000 PUSH CrackMe0.0040300A ; |splish, splash
0040169A |. 68 B8304000 PUSH CrackMe0.004030B8 ; |please enter your serial number.
0040169F |. 6A 00 PUSH 0 ; |hOwner = NULL
004016A1 |. E8 A2000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
004016A6 |. EB 4D JMP SHORT CrackMe0.004016F5
004016A8 |> 8D35 4D324000 LEA ESI,DWORD PTR DS:[40324D]
004016AE |. 8D3D 58324000 LEA EDI,DWORD PTR DS:[403258]
004016B4 |. 33DB XOR EBX,EBX
004016B6 |> 3B1D 63344000 /CMP EBX,DWORD PTR DS:[403463] ;
004016BC |. 74 0F |JE SHORT CrackMe0.004016CD
004016BE |. 0FBE041F |MOVSX EAX,BYTE PTR DS:[EDI+EBX]
004016C2 |. 0FBE0C1E |MOVSX ECX,BYTE PTR DS:[ESI+EBX]
004016C6 |. 3BC1 |CMP EAX,ECX 比较计算的结果,相等则注册成功
004016C8 |. 75 18 |JNZ SHORT CrackMe0.004016E2
004016CA |. 43 |INC EBX
004016CB |.^ EB E9 \JMP SHORT CrackMe0.004016B6
004016CD |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004016CF |. 68 0A304000 PUSH CrackMe0.0040300A ; |splish, splash
004016D4 |. 68 42304000 PUSH CrackMe0.00403042 ; |good job, now keygen it.
004016D9 |. 6A 00 PUSH 0 ; |hOwner = NULL
004016DB |. E8 68000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
004016E0 |. EB 13 JMP SHORT CrackMe0.004016F5
004016E2 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
004016E4 |. 68 0A304000 PUSH CrackMe0.0040300A ; |splish, splash
004016E9 |. 68 67304000 PUSH CrackMe0.00403067 ; |sorry, please try again.
004016EE |. 6A 00 PUSH 0 ; |hOwner = NULL
004016F0 |. E8 53000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
----------------------------------------------------------------------
BY 逍遥风
算法总结:
程序采用的是F`(注册名)=F'(注册码)的方式,对注册码进行验证的。
1)对注册名的算法是:
取注册名每一位对应的16进制数,除以0A,余数与对应的计算次数减一后的值进行XOR运算,运算结果再加2。
以注册名位数为运算次数,作循环计算。最终结果设为甲
若,最终结果大于0A,那么就用甲-0A的差作为最终结果
2)对注册码的算法是:
去假码每一位对应的16进制数,除以0A。以假码位数为运算次数,作循环计算。最后取假码第一位对应的16进制数,除以0A的余数作为最终结果,设为乙。
3)甲等于乙则注册成功。
找到最简单的一组符合算法的数
注册名 1。 1--31-(除以0A,余9)--(9XOR运算次数-1=0,即9 XOR 0=9)--(9+2=B)--(B>0A,B-0A=1)--1甲
注册码 3。 3--33-(除以0A,余1)--1乙
甲=乙
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)