【破文标题】超级XXXX专家 v1.10 算法分析
【破文作者】cxj98
【作者邮箱】
【作者主页】
【破解工具】OD 1.10 飘云修改版
【破解平台】Win 7 x64 Ultimate
【软件名称】超级xxxx专家 v1.10
【软件大小】自己看
【原版下载】自行搜索下载
【保护方式】无
【软件简介】自己查百度
【破解声明】本文仅供研究学习,本人对因这篇文章而导致的一切后果,不承担任何法律责任。本文中的不足之处
------------------------------------------------------------------------
【破解过程】载入OD后,没看到任何的壳提示,目测标准的Delphi程序入口,F9直接跑起来,输入用户名:cxj98,假码:1234567890,点击 "确定"按扭,弹出提示:注册码不正确,请检查注册码是否输错!
对于有消息提示的,可以下 bp MessageboxA 断点,再次点确定,程序果断断下来,堆栈中右键选择反汇编窗口中跟随,来到
00588364 |. E8 8FF3E7FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00588369 |. 8B83 4C040000 MOV EAX, DWORD PTR DS:[EBX+0x44C]
往上看,
0058833C |. E8 EFCDFEFF CALL ScreenCa.00575130
00588341 |. 8B83 EC040000 MOV EAX, DWORD PTR DS:[EBX+0x4EC]
00588347 |. E8 84CDFEFF CALL ScreenCa.005750D0 ; // 关键 call,这里F7进入看看
0058834C |. 84C0 TEST AL, AL ; // 决定 al 是否要跳转
0058834E |. 75 29 JNZ SHORT ScreenCa.00588379
00588350 |. 6A 40 PUSH 0x40 ; // 注册成功提示
00588352 |. 68 DC835800 PUSH ScreenCa.005883DC
00588357 |. 68 1C845800 PUSH ScreenCa.0058841C
0058835C |. 8BC3 MOV EAX, EBX
0058835E |. E8 E1F9EDFF CALL ScreenCa.00467D44
00588363 |. 50 PUSH EAX ; |hOwner
00588364 |. E8 8FF3E7FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00588369 |. 8B83 4C040000 MOV EAX, DWORD PTR DS:[EBX+0x44C]
0058836F |. 8B10 MOV EDX, DWORD PTR DS:[EAX]
00588371 |. FF92 C4000000 CALL NEAR DWORD PTR DS:[EDX+0xC4]
00588377 |. EB 19 JMP SHORT ScreenCa.00588392
00588379 |> 6A 40 PUSH 0x40 ; // 注册失败提示
0058837B |. 68 DC835800 PUSH ScreenCa.005883DC
00588380 |. 68 40845800 PUSH ScreenCa.00588440
00588385 |. 8BC3 MOV EAX, EBX
00588387 |. E8 B8F9EDFF CALL ScreenCa.00467D44
0058838C |. 50 PUSH EAX ; |hOwner
0058838D |. E8 66F3E7FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00588392 |> 33C0 XOR EAX, EAX
F7 进入关键 Call 去看一看:
005750D0 /$ 55 PUSH EBP
005750D1 |. 8BEC MOV EBP, ESP
005750D3 |. 6A 00 PUSH 0x0
005750D5 |. 53 PUSH EBX
005750D6 |. 8BD8 MOV EBX, EAX
005750D8 |. 33C0 XOR EAX, EAX
005750DA |. 55 PUSH EBP
005750DB |. 68 22515700 PUSH ScreenCa.00575122
005750E0 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
005750E3 |. 64:8920 MOV DWORD PTR FS:[EAX], ESP
005750E6 |. 8BC3 MOV EAX, EBX
005750E8 |. E8 73FEFFFF CALL ScreenCa.00574F60
005750ED |. DDD8 FSTP ST(0)
005750EF |. 8D55 FC LEA EDX, DWORD PTR SS:[EBP-0x4]
005750F2 |. 8BC3 MOV EAX, EBX
005750F4 |. E8 8FFCFFFF CALL ScreenCa.00574D88 ; // 核心算法,F7 进去瞧瞧
005750F9 |. 8B55 FC MOV EDX, DWORD PTR SS:[EBP-0x4] ; // 真码,此处可内存注册机
005750FC |. 8B43 14 MOV EAX, DWORD PTR DS:[EBX+0x14]
005750FF |. E8 A0F6E8FF CALL ScreenCa.004047A4
00575104 |. 75 04 JNZ SHORT ScreenCa.0057510A
00575106 |. B3 01 MOV BL, 0x1
00575108 |. EB 02 JMP SHORT ScreenCa.0057510C
0057510A |> 33DB XOR EBX, EBX
0057510C |> 33C0 XOR EAX, EAX
0057510E |. 5A POP EDX
0057510F |. 59 POP ECX
00575110 |. 59 POP ECX
00575111 |. 64:8910 MOV DWORD PTR FS:[EAX], EDX
00575114 |. 68 29515700 PUSH ScreenCa.00575129
00575119 |> 8D45 FC LEA EAX, DWORD PTR SS:[EBP-0x4]
0057511C |. E8 77F2E8FF CALL ScreenCa.00404398
00575121 \. C3 RETN
F7 进核心算法瞧瞧:
00574D88 /$ 55 PUSH EBP
00574D89 |. 8BEC MOV EBP, ESP
00574D8B |. B9 05000000 MOV ECX, 0x5
00574D90 |> 6A 00 /PUSH 0x0
00574D92 |. 6A 00 |PUSH 0x0
00574D94 |. 49 |DEC ECX
00574D95 |.^ 75 F9 \JNZ SHORT ScreenCa.00574D90
00574D97 |. 51 PUSH ECX
00574D98 |. 53 PUSH EBX
00574D99 |. 56 PUSH ESI
00574D9A |. 57 PUSH EDI
00574D9B |. 8955 FC MOV DWORD PTR SS:[EBP-0x4], EDX
00574D9E |. 8BF8 MOV EDI, EAX
00574DA0 |. 33C0 XOR EAX, EAX
00574DA2 |. 55 PUSH EBP
00574DA3 |. 68 464F5700 PUSH ScreenCa.00574F46
00574DA8 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00574DAB |. 64:8920 MOV DWORD PTR FS:[EAX], ESP
00574DAE |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4]
00574DB1 |. E8 E2F5E8FF CALL ScreenCa.00404398
00574DB6 |. 8D55 F0 LEA EDX, DWORD PTR SS:[EBP-0x10]
00574DB9 |. 8BC7 MOV EAX, EDI
00574DBB |. E8 60FFFFFF CALL ScreenCa.00574D20
00574DC0 |. 8B45 F0 MOV EAX, DWORD PTR SS:[EBP-0x10] ; // 用户名
00574DC3 |. E8 90F8E8FF CALL ScreenCa.00404658
00574DC8 |. 8BF0 MOV ESI, EAX ; // 用户名长度给 ESI
00574DCA |. 85F6 TEST ESI, ESI ; // 测试用户名是否为空
00574DCC |. 7E 30 JLE SHORT ScreenCa.00574DFE
00574DCE |. BB 01000000 MOV EBX, 0x1
00574DD3 |> 8D55 E8 /LEA EDX, DWORD PTR SS:[EBP-0x18]
00574DD6 |. 8BC7 |MOV EAX, EDI
00574DD8 |. E8 43FFFFFF |CALL ScreenCa.00574D20
00574DDD |. 8B45 E8 |MOV EAX, DWORD PTR SS:[EBP-0x18]
00574DE0 |. 0FB64418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX-0x1] ; // 取用户名 ASCII 码
00574DE5 |. 8D4D EC |LEA ECX, DWORD PTR SS:[EBP-0x14]
00574DE8 |. 33D2 |XOR EDX, EDX
00574DEA |. E8 3145E9FF |CALL ScreenCa.00409320
00574DEF |. 8B55 EC |MOV EDX, DWORD PTR SS:[EBP-0x14] ; // 用户名 ASCII 给 EDX
00574DF2 |. 8D45 F8 |LEA EAX, DWORD PTR SS:[EBP-0x8]
00574DF5 |. E8 66F8E8FF |CALL ScreenCa.00404660
00574DFA |. 43 |INC EBX
00574DFB |. 4E |DEC ESI
00574DFC |.^ 75 D5 \JNZ SHORT ScreenCa.00574DD3
00574DFE |> 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-0x8] ; // 算出来的用户名ASCII码给EAX
00574E01 |. E8 52F8E8FF CALL ScreenCa.00404658
00574E06 |. 8BF0 MOV ESI, EAX ; // ASCII 长度给 ESI
00574E08 |. 85F6 TEST ESI, ESI ; // ASCII 长度测试
00574E0A |. 7E 2C JLE SHORT ScreenCa.00574E38
00574E0C |. BB 01000000 MOV EBX, 0x1
00574E11 |> 8B45 F8 /MOV EAX, DWORD PTR SS:[EBP-0x8] ; // 用户名ASCII码给EAX
00574E14 |. E8 3FF8E8FF |CALL ScreenCa.00404658
00574E19 |. 2BC3 |SUB EAX, EBX ; EAX=EAX-EBX
00574E1B |. 8B55 F8 |MOV EDX, DWORD PTR SS:[EBP-0x8] ; // 用户名 ASCII 给 EDX
00574E1E |. 8A1402 |MOV DL, BYTE PTR DS:[EDX+EAX] ; // 从右到左依次获取 用户名ASCII最后一个字符的 ASCII
00574E21 |. 8D45 E4 |LEA EAX, DWORD PTR SS:[EBP-0x1C]
00574E24 |. E8 57F7E8FF |CALL ScreenCa.00404580
00574E29 |. 8B55 E4 |MOV EDX, DWORD PTR SS:[EBP-0x1C]
00574E2C |. 8D45 F4 |LEA EAX, DWORD PTR SS:[EBP-0xC]
00574E2F |. E8 2CF8E8FF |CALL ScreenCa.00404660
00574E34 |. 43 |INC EBX
00574E35 |. 4E |DEC ESI
00574E36 |.^ 75 D9 \JNZ SHORT ScreenCa.00574E11
00574E38 |> 8D45 F8 LEA EAX, DWORD PTR SS:[EBP-0x8]
00574E3B |. 50 PUSH EAX
00574E3C |. B9 04000000 MOV ECX, 0x4
00574E41 |. BA 01000000 MOV EDX, 0x1
00574E46 |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-0xC]
00574E49 |. E8 6AFAE8FF CALL ScreenCa.004048B8
00574E4E |. 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-0xC]
00574E51 |. 50 PUSH EAX
00574E52 |. B9 04000000 MOV ECX, 0x4
00574E57 |. BA 05000000 MOV EDX, 0x5
00574E5C |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-0xC]
00574E5F |. E8 54FAE8FF CALL ScreenCa.004048B8
00574E64 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-0x8] ; // 用户名 ascii 依次从右往左从第1位开始取4位,即:abcd 变成 dcba
00574E67 |. E8 ECF7E8FF CALL ScreenCa.00404658
00574E6C |. 83F8 04 CMP EAX, 0x4
00574E6F |. 7D 2F JGE SHORT ScreenCa.00574EA0
00574E71 |. 8B45 F8 MOV EAX, DWORD PTR SS:[EBP-0x8]
00574E74 |. E8 DFF7E8FF CALL ScreenCa.00404658
00574E79 |. 8BD8 MOV EBX, EAX
00574E7B |. 83FB 03 CMP EBX, 0x3
00574E7E |. 7F 20 JG SHORT ScreenCa.00574EA0
00574E80 |> 8D4D E0 /LEA ECX, DWORD PTR SS:[EBP-0x20]
00574E83 |. 8BC3 |MOV EAX, EBX
00574E85 |. C1E0 02 |SHL EAX, 0x2
00574E88 |. 33D2 |XOR EDX, EDX
00574E8A |. E8 9144E9FF |CALL ScreenCa.00409320
00574E8F |. 8B55 E0 |MOV EDX, DWORD PTR SS:[EBP-0x20]
00574E92 |. 8D45 F8 |LEA EAX, DWORD PTR SS:[EBP-0x8]
00574E95 |. E8 C6F7E8FF |CALL ScreenCa.00404660
00574E9A |. 43 |INC EBX
00574E9B |. 83FB 04 |CMP EBX, 0x4
00574E9E |.^ 75 E0 \JNZ SHORT ScreenCa.00574E80
00574EA0 |> 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-0xC] ; // 用户名 ascii 依次从右往左从第5位开始取4位,即:abcd 变成 dcba
00574EA3 |. E8 B0F7E8FF CALL ScreenCa.00404658
00574EA8 |. 83F8 04 CMP EAX, 0x4
00574EAB |. 7D 2F JGE SHORT ScreenCa.00574EDC
00574EAD |. 8B45 F4 MOV EAX, DWORD PTR SS:[EBP-0xC]
00574EB0 |. E8 A3F7E8FF CALL ScreenCa.00404658
00574EB5 |. 8BD8 MOV EBX, EAX
00574EB7 |. 83FB 03 CMP EBX, 0x3
00574EBA |. 7F 20 JG SHORT ScreenCa.00574EDC
00574EBC |> 8D4D DC /LEA ECX, DWORD PTR SS:[EBP-0x24]
00574EBF |. 8BC3 |MOV EAX, EBX
00574EC1 |. C1E0 02 |SHL EAX, 0x2
00574EC4 |. 33D2 |XOR EDX, EDX
00574EC6 |. E8 5544E9FF |CALL ScreenCa.00409320
00574ECB |. 8B55 DC |MOV EDX, DWORD PTR SS:[EBP-0x24]
00574ECE |. 8D45 F4 |LEA EAX, DWORD PTR SS:[EBP-0xC]
00574ED1 |. E8 8AF7E8FF |CALL ScreenCa.00404660
00574ED6 |. 43 |INC EBX
00574ED7 |. 83FB 04 |CMP EBX, 0x4
00574EDA |.^ 75 E0 \JNZ SHORT ScreenCa.00574EBC
00574EDC |> 8D45 D8 LEA EAX, DWORD PTR SS:[EBP-0x28]
00574EDF |. 50 PUSH EAX
00574EE0 |. 8B47 04 MOV EAX, DWORD PTR DS:[EDI+0x4] ; // 取固定字符串“PictureRecording86v2013”中的前4个字符,即:Pict给EAX
00574EE3 |. B9 04000000 MOV ECX, 0x4
00574EE8 |. BA 01000000 MOV EDX, 0x1
00574EED |. E8 C6F9E8FF CALL ScreenCa.004048B8
00574EF2 |. FF75 D8 PUSH DWORD PTR SS:[EBP-0x28] ; // 已经获取到的 Pict 与下面的- 连接,注册码的组合
00574EF5 |. 68 5C4F5700 PUSH ScreenCa.00574F5C ; UNICODE "-"
00574EFA |. FF75 F8 PUSH DWORD PTR SS:[EBP-0x8] ; // 用户名ascii从右往左从第一位开始获取的4位与上面的注册码连接
00574EFD |. 8D45 D4 LEA EAX, DWORD PTR SS:[EBP-0x2C]
00574F00 |. 50 PUSH EAX
00574F01 |. 8B47 04 MOV EAX, DWORD PTR DS:[EDI+0x4]
00574F04 |. B9 05000000 MOV ECX, 0x5
00574F09 |. BA 05000000 MOV EDX, 0x5
00574F0E |. E8 A5F9E8FF CALL ScreenCa.004048B8
00574F13 |. FF75 D4 PUSH DWORD PTR SS:[EBP-0x2C] ; // 固定字符串 ureRe
00574F16 |. 68 5C4F5700 PUSH ScreenCa.00574F5C ; UNICODE "-"
00574F1B |. FF75 F4 PUSH DWORD PTR SS:[EBP-0xC] ; // 用户名ascii从右往左第5位开始获取的4位与上面的注册码连接
00574F1E |. 8B45 FC MOV EAX, DWORD PTR SS:[EBP-0x4]
00574F21 |. BA 06000000 MOV EDX, 0x6
00574F26 |. E8 EDF7E8FF CALL ScreenCa.00404718
00574F2B |. 33C0 XOR EAX, EAX
00574F2D |. 5A POP EDX
00574F2E |. 59 POP ECX
00574F2F |. 59 POP ECX
00574F30 |. 64:8910 MOV DWORD PTR FS:[EAX], EDX
00574F33 |. 68 4D4F5700 PUSH ScreenCa.00574F4D
00574F38 |> 8D45 D4 LEA EAX, DWORD PTR SS:[EBP-0x2C]
00574F3B |. BA 0A000000 MOV EDX, 0xA
00574F40 |. E8 77F4E8FF CALL ScreenCa.004043BC
00574F45 \. C3 RETN
一路 F8 后,走出核心算法。
经过分析,cxj98 的 ascii 码为:63 78 6A 39 38
最终计算出来的注册码为:Pict-8393ureRe-A687
输入最终计算出来的注册码,消息提示:注册成功,程序重新打开后生效。
本人不懂编程,所以这里的算法注册机直接忽略。
本文原创于飘云阁论坛,转载请保留完整的信息,谢谢。同时为了尊重国产软件,固将软件的名称以xxxx代替了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)