------------------------------------------------------------
1)PEID查壳,Borland Delphi 6.0 - 7.0,无壳。
2)试运行程序,任意输入注册信息后没有错误提示。
3)OD载入程序,用“超级字符串查找”发现有注册成功的提示。
超级字串参考+ , 条目 62
地址=00408E6D
反汇编=PUSH CodeFant.00408FB8
文本字串=恭喜您,注册码正确!
4)找到突破口了,双击来到00408E6D处,
发现有两个地方使用了GetDlgItemTextA,好!那就在第一处(00408DDC)这里下断。
运行程序,任意输入信息后,点击确定程序被中断。
00408DDC |> \68 FF000000 PUSH 0FF ; /Count = FF (255.); Case 3EA of switch 00408DBB
00408DE1 |. 68 9CA24000 PUSH CodeFant.0040A29C ; |Buffer = CodeFant.0040A29C
00408DE6 |. 68 F2030000 PUSH 3F2 ; |ControlID = 3F2 (1010.)
00408DEB |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; |
00408DEE |. 50 PUSH EAX ; |hWnd
00408DEF |. E8 68B9FFFF CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00408DF4 |. 8D45 B4 LEA EAX,DWORD PTR SS:[EBP-4C] ; 取注册名位数
00408DF7 |. BA 9CA24000 MOV EDX,CodeFant.0040A29C
00408DFC |. B9 FF000000 MOV ECX,0FF
00408E01 |. E8 6AAAFFFF CALL CodeFant.00403870
00408E06 |. 837D B4 00 CMP DWORD PTR SS:[EBP-4C],0
00408E0A |. 0F84 9E000000 JE CodeFant.00408EAE
00408E10 |. 68 FF000000 PUSH 0FF ; /Count = FF (255.)
00408E15 |. 68 9CA34000 PUSH CodeFant.0040A39C ; |Buffer = CodeFant.0040A39C
00408E1A |. 68 F3030000 PUSH 3F3 ; |ControlID = 3F3 (1011.)
00408E1F |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; |
00408E22 |. 50 PUSH EAX ; |hWnd
00408E23 |. E8 34B9FFFF CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA
00408E28 |. 8D45 AC LEA EAX,DWORD PTR SS:[EBP-54] ; 取注册码位数
00408E2B |. BA 9CA24000 MOV EDX,CodeFant.0040A29C
00408E30 |. B9 FF000000 MOV ECX,0FF
00408E35 |. E8 36AAFFFF CALL CodeFant.00403870
00408E3A |. 8B45 AC MOV EAX,DWORD PTR SS:[EBP-54]
00408E3D |. 8D55 B0 LEA EDX,DWORD PTR SS:[EBP-50]
00408E40 |. E8 23FCFFFF CALL CodeFant.00408A68 ; 算法CALL,进!
00408E45 |. 8B45 B0 MOV EAX,DWORD PTR SS:[EBP-50]
00408E48 |. 50 PUSH EAX
00408E49 |. 8D45 A8 LEA EAX,DWORD PTR SS:[EBP-58]
00408E4C |. BA 9CA34000 MOV EDX,CodeFant.0040A39C
00408E51 |. B9 FF000000 MOV ECX,0FF
00408E56 |. E8 15AAFFFF CALL CodeFant.00403870
00408E5B |. 8B55 A8 MOV EDX,DWORD PTR SS:[EBP-58]
00408E5E |. 58 POP EAX
00408E5F |. E8 84ABFFFF CALL CodeFant.004039E8 这个CALL作用是将注册码和输入的假码进行比较
00408E64 |. 75 48 JNZ SHORT CodeFant.00408EAE 若不相等则跳向失败,相等则成功
00408E66 |. 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00408E68 |. 68 AC8F4000 PUSH CodeFant.00408FAC ; |注册提示
00408E6D |. 68 B88F4000 PUSH CodeFant.00408FB8 ; |恭喜您,注册码正确!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入00408E40 处的CALL,来到这里
00408A68 /$ 55 PUSH EBP
。。。。。。省略一些无关的代码。
00408AAB |. 7E 28 JLE SHORT CodeFant.00408AD5
00408AAD |. BE 01000000 MOV ESI,1
00408AB2 |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] EBP-4=用户名
00408AB5 |. 33DB |XOR EBX,EBX EBX清零
00408AB7 |. 8A5C30 FF |MOV BL,BYTE PTR DS:[EAX+ESI-1] 取用户名每一位进行计算
00408ABB |. 43 |INC EBX EBX+1 注意这里的+1
00408ABC |. 8D45 D8 |LEA EAX,DWORD PTR SS:[EBP-28]
00408ABF |. 8BD3 |MOV EDX,EBX
00408AC1 |. E8 2EADFFFF |CALL CodeFant.004037F4
00408AC6 |. 8B55 D8 |MOV EDX,DWORD PTR SS:[EBP-28]
00408AC9 |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00408ACC |. E8 D3ADFFFF |CALL CodeFant.004038A4
00408AD1 |. 46 |INC ESI ESI+1
00408AD2 |. 4F |DEC EDI EDI-1
00408AD3 |.^ 75 DD \JNZ SHORT CodeFant.00408AB2 计算完了吗?没有则继续
00408AD5 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00408AD8 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] EBP-C=第一步计算的结果设为A
00408ADB |. E8 E0ABFFFF CALL CodeFant.004036C0
00408AE0 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00408AE3 |. E8 40ABFFFF CALL CodeFant.00403628
00408AE8 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00408AEB |. E8 ACADFFFF CALL CodeFant.0040389C
00408AF0 |. 8BF8 MOV EDI,EAX
00408AF2 |. 85FF TEST EDI,EDI
00408AF4 |. 7E 2A JLE SHORT CodeFant.00408B20
00408AF6 |. BE 01000000 MOV ESI,1
00408AFB |> 8B45 F0 /MOV EAX,DWORD PTR SS:[EBP-10] EBP-10=将注册名计算的结果,设为A
00408AFE |. 33DB |XOR EBX,EBX EBX清零
00408B00 |. 8A5C30 FF |MOV BL,BYTE PTR DS:[EAX+ESI-1] 取A的每一位进行计算
00408B04 |. 83C3 02 |ADD EBX,2 每计算一次EBX+2 注意这里的+2
00408B07 |. 8D45 D4 |LEA EAX,DWORD PTR SS:[EBP-2C]
00408B0A |. 8BD3 |MOV EDX,EBX
00408B0C |. E8 E3ACFFFF |CALL CodeFant.004037F4
00408B11 |. 8B55 D4 |MOV EDX,DWORD PTR SS:[EBP-2C]
00408B14 |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00408B17 |. E8 88ADFFFF |CALL CodeFant.004038A4
00408B1C |. 46 |INC ESI ESI+1
00408B1D |. 4F |DEC EDI EDI-1
00408B1E |.^ 75 DB \JNZ SHORT CodeFant.00408AFB 计算完了吗?没有则继续
00408B20 |> 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
00408B23 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] EBP-C=将A计算的结果,设为B
00408B26 |. E8 95ABFFFF CALL CodeFant.004036C0
00408B2B |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00408B2E |. E8 F5AAFFFF CALL CodeFant.00403628
00408B33 |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00408B36 |. E8 61ADFFFF CALL CodeFant.0040389C
00408B3B |. 8BF8 MOV EDI,EAX
00408B3D |. 85FF TEST EDI,EDI
00408B3F |. 7E 2A JLE SHORT CodeFant.00408B6B
00408B41 |. BE 01000000 MOV ESI,1
00408B46 |> 8B45 EC /MOV EAX,DWORD PTR SS:[EBP-14] EBP-14=B
00408B49 |. 33DB |XOR EBX,EBX EBX清零
00408B4B |. 8A5C30 FF |MOV BL,BYTE PTR DS:[EAX+ESI-1] 取B的每一位进行计算
00408B4F |. 83C3 03 |ADD EBX,3 每计算一次EBX+3 注意这里的+3
00408B52 |. 8D45 D0 |LEA EAX,DWORD PTR SS:[EBP-30]
00408B55 |. 8BD3 |MOV EDX,EBX
00408B57 |. E8 98ACFFFF |CALL CodeFant.004037F4
00408B5C |. 8B55 D0 |MOV EDX,DWORD PTR SS:[EBP-30]
00408B5F |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00408B62 |. E8 3DADFFFF |CALL CodeFant.004038A4
00408B67 |. 46 |INC ESI ESI+1
00408B68 |. 4F |DEC EDI EDI-1
00408B69 |.^ 75 DB \JNZ SHORT CodeFant.00408B46 计算完了吗?没有则继续
00408B6B |> 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
00408B6E |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] EBP-C=将B计算的结果,设为C
00408B71 |. E8 4AABFFFF CALL CodeFant.004036C0
00408B76 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
00408B79 |. E8 AAAAFFFF CALL CodeFant.00403628
00408B7E |. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
00408B81 |. E8 16ADFFFF CALL CodeFant.0040389C
00408B86 |. 8BF8 MOV EDI,EAX
00408B88 |. 85FF TEST EDI,EDI
00408B8A |. 7E 2A JLE SHORT CodeFant.00408BB6
00408B8C |. BE 01000000 MOV ESI,1
00408B91 |> 8B45 E8 /MOV EAX,DWORD PTR SS:[EBP-18] EBP-18=C
00408B94 |. 33DB |XOR EBX,EBX EBX清零
00408B96 |. 8A5C30 FF |MOV BL,BYTE PTR DS:[EAX+ESI-1] 取C的每一位进行计算
00408B9A |. 83C3 04 |ADD EBX,4 每计算一次EBX+4 注意这里的+4
00408B9D |. 8D45 CC |LEA EAX,DWORD PTR SS:[EBP-34]
00408BA0 |. 8BD3 |MOV EDX,EBX
00408BA2 |. E8 4DACFFFF |CALL CodeFant.004037F4
00408BA7 |. 8B55 CC |MOV EDX,DWORD PTR SS:[EBP-34]
00408BAA |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00408BAD |. E8 F2ACFFFF |CALL CodeFant.004038A4
00408BB2 |. 46 |INC ESI ESI+1
00408BB3 |. 4F |DEC EDI EDI-1
00408BB4 |.^ 75 DB \JNZ SHORT CodeFant.0040 P-1C] 计算完了吗?没有则继续
00408BB9 |. E8 6AAAFFFF CALL CodeFant.00403628
00408BBE |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] EBP-C=将C计算后的结果,设为D
00408BC1 |. E8 D6ACFFFF CALL CodeFant.0040389C
00408BC6 |. 8BF8 MOV EDI,EAX
00408BC8 |. 4F DEC EDI
00408BC9 |. 85FF TEST EDI,EDI
00408BCB |. 7C 4E JL SHORT CodeFant.00408C1B
00408BCD |. 47 INC EDI
00408BCE |. 33F6 XOR ESI,ESI
00408BD0 |> 8D45 DC /LEA EAX,DWORD PTR SS:[EBP-24]
00408BD3 |. 50 |PUSH EAX
00408BD4 |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C] EBP-C=D
00408BD7 |. 0FB60430 |MOVZX EAX,BYTE PTR DS:[EAX+ESI] 将D的每一位转换成对应的16进制数
00408BDB |. 8945 C4 |MOV DWORD PTR SS:[EBP-3C],EAX EBP-3C=转换后的结果设为E
00408BDE |. C645 C8 00 |MOV BYTE PTR SS:[EBP-38],0
00408BE2 |. 8D55 C4 |LEA EDX,DWORD PTR SS:[EBP-3C]
00408BE5 |. 33C9 |XOR ECX,ECX ECX清零
00408BE7 |. B8 608C4000 |MOV EAX,CodeFant.00408C60
00408BEC |. E8 1FD1FFFF |CALL CodeFant.00405D10
00408BF1 |. 8B45 DC |MOV EAX,DWORD PTR SS:[EBP-24]
00408BF4 |. E8 A3ACFFFF |CALL CodeFant.0040389C
00408BF9 |. 48 |DEC EAX
00408BFA |. 75 10 |JNZ SHORT CodeFant.00408C0C
00408BFC |. 8D45 DC |LEA EAX,DWORD PTR SS:[EBP-24]
00408BFF |. 8B4D DC |MOV ECX,DWORD PTR SS:[EBP-24]
00408C02 |. BA 6C8C4000 |MOV EDX,CodeFant.00408C6C
00408C07 |. E8 DCACFFFF |CALL CodeFant.004038E8
00408C0C |> 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20]
00408C0F |. 8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24]
00408C12 |. E8 8DACFFFF |CALL CodeFant.004038A4
00408C17 |. 46 |INC ESI ESI+1
00408C18 |. 4F |DEC EDI EDI-1
00408C19 |.^ 75 B5 \JNZ SHORT CodeFant.00408BD0 计算完了吗?没有则继续
00408C1B |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00408C1E |. 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
00408C21 |. E8 56AAFFFF CALL CodeFant.0040367C
00408C26 |. 33C0 XOR EAX,EAX
00408C28 |. 5A POP EDX
00408C29 |. 59 POP ECX
00408C2A |. 59 POP ECX
00408C2B |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00408C2E |. 68 508C4000 PUSH CodeFant.00408C50
00408C33 |> 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34]
00408C36 |. BA 0B000000 MOV EDX,0B
00408C3B |. E8 0CAAFFFF CALL CodeFant.0040364C
00408C40 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00408C43 |. E8 E0A9FFFF CALL CodeFant.00403628
00408C48 \. C3 RETN 将E出栈并返回
------------------------------------------------------------------------BY 逍遥风
算法很简单,
1)分别取注册名的每一位进行计算,将结果合并成一个字符串。
2)根据“常用字符ASCII值表”的顺序进行计算。(加密界密第2版)第2页就有这张表。
从0123456789到xyz { | } ~ 为止。
具体过程是:
1)取注册名的每一位。假设注册名第一位为1
2)第一次计算:根据“常用字符ASCII值表”顺序,取注册名没一位的后一位字符。例:注册名为1,那么就得到2
3)第二次计算:取与2隔一位的字符,这里为4 与00408B04 那里的+2相对应
4)第三次计算:取与4隔两位的字符,这里为7 与00408B4F 那里的+3相对应
5)第四次计算:取与7隔三位的字符,这里为: 与00408B9A 那里的+4相对应
6)第五次计算:将:转换成相应的16进制数,这里为3B,
7)注册码的每一位都重复上面的计算。将每一位的结果合并就为注册码。
例:注册名: 1 2 3 4 5
第一次计算 2 3 4 5 6
第二次计算 4 5 6 7 8
第三次计算 7 8 9 : ;
第四次计算 ; < = > ?
第五次计算 3B 3C 3D 3E 3F (根据常用字符ASCII值表)
所以。12345对应的注册码就是3B3C3D3E3F
注意:因为从字母v(小写)开始,按照以上的算法找不出相应的常用字符。所以经过处理
v w x y z { | } △ 对应的结果分别是
80 81 82 83 84 85 86 87 88
------------------------------------------------------------------------
有疏漏或错误之处请大家指出。谢谢
CRACKME放在http://free.ys168.com/?tcxb中的CRACKME(2)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)