1)PEID检查,Borland Delphi 6.0 - 7.0。无壳
2)试运行程序,任意输入注册信息后,有错误提示。
3)用OD的超字符串查找错误提示,
超级字串参考+ , 条目 47
地址=0040867F
反汇编=MOV EDX,CrackMe.004087DC
文本字串=继续努力! 双击来到0040867F处,向上找到计算过程开始的地方,下断
4)OD重新载入程序,任意输入注册信息后程序中断
0040860E |. 50 PUSH EAX
0040860F |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
00408612 |. A1 98A74000 MOV EAX,DWORD PTR DS:[40A798]
00408617 |. E8 6CFDFFFF CALL CrackMe.00408388 ; 算法CALL,跟进。
0040861C |. 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20] ; |
0040861F |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; |
00408622 |. 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX ; |
00408625 |. C645 E8 00 MOV BYTE PTR SS:[EBP-18],0 ; |
00408629 |. 8D55 E4 LEA EDX,DWORD PTR SS:[EBP-1C] ; |
0040862C |. 33C9 XOR ECX,ECX ; |
0040862E |. B8 B4874000 MOV EAX,CrackMe.004087B4 ; |%d
00408633 |. E8 A0DAFFFF CALL CrackMe.004060D8 ; \CrackMe.004060D8
00408638 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0040863B |. A1 9CA74000 MOV EAX,DWORD PTR DS:[40A79C]
00408640 |. E8 47B9FFFF CALL CrackMe.00403F8C
00408645 |. 75 36 JNZ SHORT CrackMe.0040867D
00408647 |. 8BC3 MOV EAX,EBX
00408649 |. BA C0874000 MOV EDX,CrackMe.004087C0 ; 恭喜您,注册成功!
0040864E |. E8 9DBAFFFF CALL CrackMe.004040F0
00408653 |. E8 9CA7FFFF CALL CrackMe.00402DF4
00408658 |. E8 CF9FFFFF CALL CrackMe.0040262C
0040865D |. BA A0A74000 MOV EDX,CrackMe.0040A7A0
00408662 |. A1 70934000 MOV EAX,DWORD PTR DS:[409370]
00408667 |. E8 04A5FFFF CALL CrackMe.00402B70
0040866C |. A1 70934000 MOV EAX,DWORD PTR DS:[409370]
00408671 |. E8 66A5FFFF CALL CrackMe.00402BDC
00408676 |. E8 B19FFFFF CALL CrackMe.0040262C
0040867B |. EB 34 JMP SHORT CrackMe.004086B1
0040867D |> 8BC3 MOV EAX,EBX
0040867F |. BA DC874000 MOV EDX,CrackMe.004087DC ; 继续努力!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
来到算法CALL。。。
00408388 /$ 55 PUSH EBP
00408389 |. 8BEC MOV EBP,ESP
0040838B |. 83C4 F4 ADD ESP,-0C
0040838E |. 53 PUSH EBX
0040838F |. 56 PUSH ESI
00408390 |. 57 PUSH EDI
00408391 |. 33C9 XOR ECX,ECX
00408393 |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
00408396 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00408399 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0040839C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040839F |. E8 8CBCFFFF CALL CrackMe.00404030
004083A4 |. 33C0 XOR EAX,EAX
004083A6 |. 55 PUSH EBP
004083A7 |. 68 41844000 PUSH CrackMe.00408441
004083AC |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004083AF |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004083B2 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004083B5 |. E8 86BCFFFF CALL CrackMe.00404040
004083BA |. E8 25D8FFFF CALL CrackMe.00405BE4 ; 取注册名位数
004083BF |. 8BD8 MOV EBX,EAX
004083C1 |. D1EB SHR EBX,1 ; 注册名位数除以2
004083C3 |. 4B DEC EBX ; EBX-1
004083C4 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004083C7 |. E8 68B8FFFF CALL CrackMe.00403C34
004083CC |. 8BFB MOV EDI,EBX
004083CE |. 85FF TEST EDI,EDI
004083D0 |. 7C 51 JL SHORT CrackMe.00408423
004083D2 |. 47 INC EDI ; EDI+1
004083D3 |. 33F6 XOR ESI,ESI ; ESI清零
004083D5 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
004083D8 |. E8 63BCFFFF |CALL CrackMe.00404040
004083DD |. 8BD6 |MOV EDX,ESI
004083DF |. 83F2 02 |XOR EDX,2 ; 使EDX=2
004083E2 |. 8A1C10 |MOV BL,BYTE PTR DS:[EAX+EDX] ; 取注册名第n+1位的HEX值
004083E5 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
004083E8 |. E8 53BCFFFF |CALL CrackMe.00404040
004083ED |. 8BD6 |MOV EDX,ESI ; EDX清零
004083EF |. 83F2 02 |XOR EDX,2 ; 使EDX=2
004083F2 |. 8A4410 FF |MOV AL,BYTE PTR DS:[EAX+EDX-1] ; 取注册名第n位的HEX值
004083F6 |. 0AD8 |OR BL,AL
004083F8 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
004083FB |. E8 40BCFFFF |CALL CrackMe.00404040
00408400 |. E8 DFD7FFFF |CALL CrackMe.00405BE4 ; 取注册名位数
00408405 |. 02D8 |ADD BL,AL ; 注册名位数与第n+1位的HEX值相加
00408407 |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
0040840A |. 8BD3 |MOV EDX,EBX
0040840C |. E8 EFB9FFFF |CALL CrackMe.00403E00
00408411 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]
00408414 |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]
00408417 |. E8 A0BAFFFF |CALL CrackMe.00403EBC
0040841C |. 8B45 F8 |MOV EAX,DWORD PTR SS:[EBP-8]
0040841F |. 46 |INC ESI 每计算一次ESI+1
00408420 |. 4F |DEC EDI 每计算一次EDI-1
00408421 |.^ 75 B2 \JNZ SHORT CrackMe.004083D5
00408423 |> 33C0 XOR EAX,EAX
00408425 |. 5A POP EDX
00408426 |. 59 POP ECX
00408427 |. 59 POP ECX
00408428 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0040842B |. 68 48844000 PUSH CrackMe.00408448
00408430 |> 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00408433 |. E8 FCB7FFFF CALL CrackMe.00403C34
00408438 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0040843B |. E8 F4B7FFFF CALL CrackMe.00403C34
00408440 \. C3 RETN
00408441 .^ E9 16B2FFFF JMP CrackMe.0040365C
00408446 .^ EB E8 JMP SHORT CrackMe.00408430
00408448 . 5F POP EDI
00408449 . 5E POP ESI
0040844A . 5B POP EBX
0040844B . 8BE5 MOV ESP,EBP
0040844D . 5D POP EBP
0040844E . C3 RETN
------------------------------------------------------------------------BY 逍遥风
算法总结:
经过跟踪代码,了解到作者的算法本意是:
1)取注册名的位数除以2的商A作为循环计算的次数。
2)以A-1和当前循环计算次数减1,做XOR运算,结果设为n.
3)取注册名第n+1位和第n位的HEX值做OR运算。运算结果加上注册名位数。并循环计算。最终结果设为B
4)B再转换成相应的十进制数,就为注册码。
但实际算法输出的结果是。
1)取注册名第3位和第2位的HEX值。
2)将两个值做OR运算。将这个运算结果与注册名位数相加(16进制)。
3)相加后的和再转换成相应的十进制数就为注册码。
也就是说只要注册名位数一定,第2和第3位相同注册码就一样。不清楚是程序问题还是作者有意而为。。。
例
注册名 tcxb
1) x对应78 ,c对应63.
2) 78or63=7B,7B+4=7F
3)7F转换成相应的十进制数就是127
所以 注册名tcxb
注册码127
注册名 lovewxt
1) v对应76,o对应6F
2)76or6F=7F,7F+7=86
3)86转换成相应的十进制数就是134
所以 注册名lovewxt lovezyz love123
注册码都是134
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)