[BRET Team 系列破解教程之中级篇] 超级XXXX专家 v1.10 算法分析
本帖最后由 cxj98 于 2014-2-13 14:41 编辑【破文标题】超级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:往上看,0058833C|.E8 EFCDFEFF CALL ScreenCa.00575130
00588341|.8B83 EC040000 MOV EAX, DWORD PTR DS:
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:
0058836F|.8B10 MOV EDX, DWORD PTR DS:
00588371|.FF92 C4000000 CALL NEAR DWORD PTR DS:
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, EAXF7 进入关键 Call 去看一看:005750D0/[ DISCUZ_CODE_24 ]nbsp; 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:
005750E3|.64:8920 MOV DWORD PTR FS:, 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:
005750F2|.8BC3 MOV EAX, EBX
005750F4|.E8 8FFCFFFF CALL ScreenCa.00574D88 ;// 核心算法,F7 进去瞧瞧
005750F9|.8B55 FC MOV EDX, DWORD PTR SS: ;// 真码,此处可内存注册机
005750FC|.8B43 14 MOV EAX, DWORD PTR DS:
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:, EDX
00575114|.68 29515700 PUSH ScreenCa.00575129
00575119|>8D45 FC LEA EAX, DWORD PTR SS:
0057511C|.E8 77F2E8FF CALL ScreenCa.00404398
00575121\.C3 RETNF7 进核心算法瞧瞧:00574D88/[ DISCUZ_CODE_25 ]nbsp; 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:, 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:
00574DAB|.64:8920 MOV DWORD PTR FS:, ESP
00574DAE|.8B45 FC MOV EAX, DWORD PTR SS:
00574DB1|.E8 E2F5E8FF CALL ScreenCa.00404398
00574DB6|.8D55 F0 LEA EDX, DWORD PTR SS:
00574DB9|.8BC7 MOV EAX, EDI
00574DBB|.E8 60FFFFFF CALL ScreenCa.00574D20
00574DC0|.8B45 F0 MOV EAX, DWORD PTR SS: ;// 用户名
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:
00574DD6|.8BC7 |MOV EAX, EDI
00574DD8|.E8 43FFFFFF |CALL ScreenCa.00574D20
00574DDD|.8B45 E8 |MOV EAX, DWORD PTR SS:
00574DE0|.0FB64418 FF |MOVZX EAX, BYTE PTR DS:;// 取用户名 ASCII 码
00574DE5|.8D4D EC |LEA ECX, DWORD PTR SS:
00574DE8|.33D2 |XOR EDX, EDX
00574DEA|.E8 3145E9FF |CALL ScreenCa.00409320
00574DEF|.8B55 EC |MOV EDX, DWORD PTR SS: ;// 用户名 ASCII 给 EDX
00574DF2|.8D45 F8 |LEA EAX, DWORD PTR SS:
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: ;// 算出来的用户名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: ;// 用户名ASCII码给EAX
00574E14|.E8 3FF8E8FF |CALL ScreenCa.00404658
00574E19|.2BC3 |SUB EAX, EBX ;EAX=EAX-EBX
00574E1B|.8B55 F8 |MOV EDX, DWORD PTR SS: ;// 用户名 ASCII 给 EDX
00574E1E|.8A1402 |MOV DL, BYTE PTR DS: ;// 从右到左依次获取 用户名ASCII最后一个字符的 ASCII
00574E21|.8D45 E4 |LEA EAX, DWORD PTR SS:
00574E24|.E8 57F7E8FF |CALL ScreenCa.00404580
00574E29|.8B55 E4 |MOV EDX, DWORD PTR SS:
00574E2C|.8D45 F4 |LEA EAX, DWORD PTR SS:
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:
00574E3B|.50 PUSH EAX
00574E3C|.B9 04000000 MOV ECX, 0x4
00574E41|.BA 01000000 MOV EDX, 0x1
00574E46|.8B45 F4 MOV EAX, DWORD PTR SS:
00574E49|.E8 6AFAE8FF CALL ScreenCa.004048B8
00574E4E|.8D45 F4 LEA EAX, DWORD PTR SS:
00574E51|.50 PUSH EAX
00574E52|.B9 04000000 MOV ECX, 0x4
00574E57|.BA 05000000 MOV EDX, 0x5
00574E5C|.8B45 F4 MOV EAX, DWORD PTR SS:
00574E5F|.E8 54FAE8FF CALL ScreenCa.004048B8
00574E64|.8B45 F8 MOV EAX, DWORD PTR SS: ;// 用户名 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:
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:
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:
00574E92|.8D45 F8 |LEA EAX, DWORD PTR SS:
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: ;// 用户名 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:
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:
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:
00574ECE|.8D45 F4 |LEA EAX, DWORD PTR SS:
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:
00574EDF|.50 PUSH EAX
00574EE0|.8B47 04 MOV EAX, DWORD PTR DS: ;// 取固定字符串“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: ;// 已经获取到的 Pict 与下面的- 连接,注册码的组合
00574EF5|.68 5C4F5700 PUSH ScreenCa.00574F5C ;UNICODE "-"
00574EFA|.FF75 F8 PUSH DWORD PTR SS: ;// 用户名ascii从右往左从第一位开始获取的4位与上面的注册码连接
00574EFD|.8D45 D4 LEA EAX, DWORD PTR SS:
00574F00|.50 PUSH EAX
00574F01|.8B47 04 MOV EAX, DWORD PTR DS:
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: ;// 取固定字符串“PictureRecording86v2013”中的字符串 ureRe
00574F16|.68 5C4F5700 PUSH ScreenCa.00574F5C ;UNICODE "-"
00574F1B|.FF75 F4 PUSH DWORD PTR SS: ;// 用户名ascii从右往左第5位开始获取的4位与上面的注册码连接
00574F1E|.8B45 FC MOV EAX, DWORD PTR SS:
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:, EDX
00574F33|.68 4D4F5700 PUSH ScreenCa.00574F4D
00574F38|>8D45 D4 LEA EAX, DWORD PTR SS:
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代替了。
沙发,支持一下 支持一下 难道就是昨天只分析了10%的那个? 应该是超级屏幕录像机,看开头的PICT好像是。 谢谢分享,不错的资料 谢谢楼主。
谢谢!用你的方法破解了。 我只是想问下,这个格式是某个记事本的功能吧,似乎看见过。@cxj98 样本名没说全,无法复现啊
页:
[1]
2