- UID
- 73854
注册时间2014-2-6
阅读权限85
最后登录1970-1-1
见习版主
TA的每日心情 | 开心 2019-3-17 22:44 |
---|
签到天数: 132 天 [LV.7]常住居民III
|
本帖最后由 tree_fly 于 2014-11-28 12:03 编辑
【破文标题】双色球霸主7.0(入门注册码+7Bytes优雅爆破+解方程式算法分析)
【破文作者】tree_fly
【作者邮箱】
【作者主页】
【破解工具】PYG_ODBG;Excel
【破解平台】XPSp3 x86
【软件名称】SSQBZ.exe
【软件大小】452K
【原版下载】http://www.cpbz.com/
【保护方式】未加壳;Microsoft Visual C++ 6.0
【软件简介】略
【破解声明】支持国软;请勿商用;本文仅做研究所用。
------------------------------------------------------------------------
这款软件的注册验证很有特点,吸引了我,特开帖与大家分享,如有不足还请指点。
在进一步阅读下面文章之前,希望各位可以先亲自动手尝试破解。
好了,我们进入主题,今天我们来一起分析这款有趣的软件,在这国庆65周年之际,与大家共同进步。
0x01 基础篇 **********************************************************************************
1.软件没有加壳,编程语言是MS VC++。
2.启动软件,点击软件注册按钮,输入假注册码:1234-5678-9012,提示“输入的注册码不正确”。
我们从查询关键词切入。
很容易来到这里:
3.向上分析,我们来到这里:
00404DFB . 6A 01 PUSH 1
00404DFD . 8BCD MOV ECX, EBP
00404DFF . E8 8F1D0400 CALL SSQBZ.00446B93
00404E04 . 8B85 B4000000 MOV EAX, DWORD PTR SS:[EBP+B4]
00404E0A . 8D9D B4000000 LEA EBX, DWORD PTR SS:[EBP+B4]
00404E10 . 8378 F8 04 CMP DWORD PTR DS:[EAX-8], 4
00404E14 . 0F8C C2010000 JL SSQBZ.00404FDC
00404E1A . 8B8D B8000000 MOV ECX, DWORD PTR SS:[EBP+B8]
00404E20 . 8DB5 B8000000 LEA ESI, DWORD PTR SS:[EBP+B8]
00404E26 . B8 04000000 MOV EAX, 4
00404E2B . 3941 F8 CMP DWORD PTR DS:[ECX-8], EAX
00404E2E . 0F8C A8010000 JL SSQBZ.00404FDC
00404E34 . 8B95 BC000000 MOV EDX, DWORD PTR SS:[EBP+BC]
00404E3A . 3942 F8 CMP DWORD PTR DS:[EDX-8], EAX
00404E3D . 0F8C 99010000 JL SSQBZ.00404FDC
00404E43 . 33FF XOR EDI, EDI
00404E45 > 6A 00 PUSH 0
00404E47 . 8BCB MOV ECX, EBX
00404E49 . E8 86330400 CALL SSQBZ.004481D4
00404E4E . 8A0438 MOV AL, BYTE PTR DS:[EAX+EDI]
00404E51 . 8887 34494600 MOV BYTE PTR DS:[EDI+464934], AL ; 111111111111
00404E57 . 47 INC EDI
00404E58 . 83FF 04 CMP EDI, 4
00404E5B .^ 7C E8 JL SHORT SSQBZ.00404E45
00404E5D . 33DB XOR EBX, EBX
00404E5F . 33FF XOR EDI, EDI
00404E61 > 53 PUSH EBX
00404E62 . 8BCE MOV ECX, ESI
00404E64 . E8 6B330400 CALL SSQBZ.004481D4
00404E69 . 8A0C38 MOV CL, BYTE PTR DS:[EAX+EDI]
00404E6C . 888F 38494600 MOV BYTE PTR DS:[EDI+464938], CL ; 11111111
00404E72 . 47 INC EDI
00404E73 . 83FF 04 CMP EDI, 4
00404E76 .^ 7C E9 JL SHORT SSQBZ.00404E61
00404E78 . 33FF XOR EDI, EDI
00404E7A > 53 PUSH EBX
00404E7B . 8D8D BC000000 LEA ECX, DWORD PTR SS:[EBP+BC]
00404E81 . E8 4E330400 CALL SSQBZ.004481D4
00404E86 . 8A1438 MOV DL, BYTE PTR DS:[EAX+EDI]
00404E89 . 8897 3C494600 MOV BYTE PTR DS:[EDI+46493C], DL ; 1111
00404E8F . 47 INC EDI
00404E90 . 83FF 04 CMP EDI, 4
00404E93 .^ 7C E5 JL SHORT SSQBZ.00404E7A
4.软件开始对注册码进行处理了,注意这里:
00404E95 . 803D 34494600>CMP BYTE PTR DS:[464934], 38
00404E9C . 75 5C JNZ SHORT SSQBZ.00404EFA
DS:[464934],这里正是注册码的首位,与0x38比较,提示注册码首位必须为8,否则跳转失败。
至此,正确的注册码第一个条件:首位数字为8。
5.我们继续向下看:
00404E9E . 33C0 XOR EAX, EAX
00404EA0 . B9 02000000 MOV ECX, 2
00404EA5 > 0FBE91 354946>MOVSX EDX, BYTE PTR DS:[ECX+464935] ; 11111111111
00404EAC . 83EA 30 SUB EDX, 30
00404EAF . 0FAFD1 IMUL EDX, ECX
00404EB2 . 03C2 ADD EAX, EDX ;
00404EB4 . 41 INC ECX
00404EB5 . 83F9 0A CMP ECX, 0A
00404EB8 .^ 7E EB JLE SHORT SSQBZ.00404EA5
00404EBA . 99 CDQ
翻译如下:
1.取第4位注册码,乘2,累加
2.取第5位注册码,乘3,累加
......
9.取第12位注册码,乘10,累加
最终获得一个总的累加值EAX
6.下面继续:
00404EBB . B9 64000000 MOV ECX, 64
00404EC0 . F7F9 IDIV ECX
00404EC2 . B8 67666666 MOV EAX, 66666667
00404EC7 . 8BCA MOV ECX, EDX ;
00404EC9 . F7E9 IMUL ECX
00404ECB . C1FA 02 SAR EDX, 2
00404ECE . 8BC2 MOV EAX, EDX ;
00404ED0 . C1E8 1F SHR EAX, 1F
00404ED3 . 8D5402 30 LEA EDX, DWORD PTR DS:[EDX+EAX+30]
00404ED7 . 0FBE05 354946>MOVSX EAX, BYTE PTR DS:[464935] ; 11111111111
00404EDE . 3BC2 CMP EAX, EDX ; ntdll.KiFastSystemCallRet
00404EE0 . 75 18 JNZ SHORT SSQBZ.00404EFA
翻译如下:
1.EAX / 0x64 ,取余数
2.0x66666667 * 余数 = EDX*0x10000 0000 + EAX
3.EDX / 4 ;EAX =0
4.比较第2位注册码 =?EDX
7.继续向下,相信大家应该很容易读懂下面的汇编代码,这里是判断注册码第3位是否正确:
00404EE2 . 8BC1 MOV EAX, ECX
00404EE4 . B9 0A000000 MOV ECX, 0A
00404EE9 . 99 CDQ
00404EEA . F7F9 IDIV ECX
00404EEC . 0FBE05 364946>MOVSX EAX, BYTE PTR DS:[464936] ; 1111111111
00404EF3 . 83C2 30 ADD EDX, 30
00404EF6 . 3BC2 CMP EAX, EDX ;
00404EF8 . 74 2B JE SHORT SSQBZ.00404F25
走到这里,已经提示“注册码初步检测通过,后续还会有进一步的检测”。
8.下面我们为了加快注册码实现速度,我们用Excel来模拟生成注册码,Excel附件已提供。
这样,我们就成功生成了一个入门注册码:8301-2345-6789
之所以我说是入门注册码,因为下面程序还会进一步对注册码反复多次验证,验证失败即复原未注册状态。
0x02 解方程式篇 **********************************************************************************
1.进入缩水过滤功能模块,选择合适的红球、蓝球后,点击“中6保5缩水”,投注结果列表框内即显示了对应的彩票缩水结果,
可是当我们向下翻页时,提示“您尚未注册 可继续使用”。
我们依然从查找关键词文本切入,发现有多个类似提示,很容易定位到中6保5缩水功能块内,如图:
我们发现,在这里至少有5处跳转,用来判断注册状态!
在接下来的分析中,我们会发现无处不在的注册状态判断,几乎大部分重要功能算法后均会跟上一连串的判断,简单点说“暗荘遍野”!
应该有个想法:抓主干,堵源头!
2.所以我们尝试着来分析跳转组里的第一处跳转,看看是否有规律可循。
0040D84E |> \A1 70BE4600 MOV EAX, DWORD PTR DS:[46BE70]
0040D853 |. 85C0 TEST EAX, EAX
0040D855 |. 74 1F JE SHORT SSQBZ.0040D876
0040D857 |. 6A 04 PUSH 4
0040D859 |. 8BCE MOV ECX, ESI
0040D85B |. E8 80800100 CALL SSQBZ.004258E0
0040D860 |. 8BF8 MOV EDI, EAX
0040D862 |. 6A 05 PUSH 5
0040D864 |. 8BCE MOV ECX, ESI
0040D866 |. 83C7 03 ADD EDI, 3
0040D869 |. E8 72800100 CALL SSQBZ.004258E0
0040D86E |. 3BF8 CMP EDI, EAX
0040D870 |. 0F84 F5000000 JE SSQBZ.0040D96B
0040D876 |> A1 B0BF4600 MOV EAX, DWORD PTR DS:[46BFB0]
0040D87B |. 85C0 TEST EAX, EAX
注意这里读取全局变量[46BE70],应该对其进一步分析,右键选择该地址,查找参考->查看地址常量。
好家伙!满屏的比较和赋值!
3.不要感到恐惧,仔细把每条语句读完,你会惊喜发现,只有一条语句为该地址赋值为1,似乎看到了成功的丝丝曙光。
双击该语句,来到这里:
00425850 /$ 68 34494600 PUSH SSQBZ.00464934 ; 830123456789
00425855 |. C705 70BE4600>MOV DWORD PTR DS:[46BE70], 0 ;
0042585F |. E8 BDE80000 CALL SSQBZ.00434121
00425864 |. 83C4 04 ADD ESP, 4
00425867 |. 85C0 TEST EAX, EAX
00425869 |. 74 66 JE SHORT SSQBZ.004258D1
0042586B |. 33C0 XOR EAX, EAX
0042586D |. B9 02000000 MOV ECX, 2
00425872 |> 0FBE91 354946>/MOVSX EDX, BYTE PTR DS:[ECX+464935] ; 30123456789
00425879 |. 83EA 30 |SUB EDX, 30
0042587C |. 0FAFD1 |IMUL EDX, ECX
0042587F |. 03C2 |ADD EAX, EDX ; SSQBZ.0046EF28
00425881 |. 41 |INC ECX
00425882 |. 83F9 0A |CMP ECX, 0A
00425885 |.^ 7E EB \JLE SHORT SSQBZ.00425872
00425887 |. 99 CDQ
00425888 |. B9 64000000 MOV ECX, 64
0042588D |. F7F9 IDIV ECX
0042588F |. B8 67666666 MOV EAX, 66666667
00425894 |. 8BCA MOV ECX, EDX ; SSQBZ.0046EF28
00425896 |. F7E9 IMUL ECX
00425898 |. C1FA 02 SAR EDX, 2
0042589B |. 8BC2 MOV EAX, EDX ; SSQBZ.0046EF28
0042589D |. C1E8 1F SHR EAX, 1F
004258A0 |. 8D5402 30 LEA EDX, DWORD PTR DS:[EDX+EAX+30]
004258A4 |. 0FBE05 354946>MOVSX EAX, BYTE PTR DS:[464935] ; 30123456789
004258AB |. 3BC2 CMP EAX, EDX ; SSQBZ.0046EF28
004258AD |. 75 22 JNZ SHORT SSQBZ.004258D1
004258AF |. 8BC1 MOV EAX, ECX
004258B1 |. B9 0A000000 MOV ECX, 0A
004258B6 |. 99 CDQ
004258B7 |. F7F9 IDIV ECX
004258B9 |. 0FBE05 364946>MOVSX EAX, BYTE PTR DS:[464936] ; 0123456789
004258C0 |. 83C2 30 ADD EDX, 30
004258C3 |. 3BC2 CMP EAX, EDX ; SSQBZ.0046EF28
004258C5 |. 75 0A JNZ SHORT SSQBZ.004258D1
004258C7 |. C705 70BE4600>MOV DWORD PTR DS:[46BE70], 1 ; 全局变量[46be70]=1
004258D1 \> C3 RETN
看来程序又对注册码进行了验证,验证成功后全局变量[46BE70]即等于1,否则赋0值。
所以我们有理由相信,全局变量[46BE70]是我们要找的主干之一,应该时刻关注他的值,并保持为1。
同时,这里应该也是一个爆破点。我们做个标记提醒一下吧。
4.我们继续回到刚才的跳转组,
0040D84E |> \A1 70BE4600 MOV EAX, DWORD PTR DS:[46BE70]
0040D853 |. 85C0 TEST EAX, EAX
0040D855 |. 74 1F JE SHORT SSQBZ.0040D876
0040D857 |. 6A 04 PUSH 4
0040D859 |. 8BCE MOV ECX, ESI
0040D85B |. E8 80800100 CALL SSQBZ.004258E0
0040D860 |. 8BF8 MOV EDI, EAX
0040D862 |. 6A 05 PUSH 5
0040D864 |. 8BCE MOV ECX, ESI
0040D866 |. 83C7 03 ADD EDI, 3
0040D869 |. E8 72800100 CALL SSQBZ.004258E0
0040D86E |. 3BF8 CMP EDI, EAX
0040D870 |. 0F84 F5000000 JE SSQBZ.0040D96B ;
0040D876 |> A1 B0BF4600 MOV EAX, DWORD PTR DS:[46BFB0]
0040D87B |. 85C0 TEST EAX, EAX
注意这里PUSH 4,PUSH 5后分别CALL了一个函数,我们用F来定义这个函数SSQBZ.4258E0。
成功跳转的条件是:
F(4) + 3 = F(5)
5.我们应该对这个F函数进一步了解,右键点击该函数地址,选择查找参考->调用目的地址。
好家伙!又是满屏的调用!
这个函数的调用如下:
本地调用来自 0040D589, 0040D597, 0040D85B, 0040D869, 0040DA8E, 0040DA9C,
0040E3A1, 0040E3B6, 00412228, 004149FE, 00414A10, 00414FBF, 00415D15,
00415D27, 004163C1, 004163CC, 004163D9, 0041CCED, 0041CD02, 0041D386,
0041D394, 0041E7F5, 0041E800……
6.不要放弃,对每一处函数调用下断点,逐条分析。我们惊喜的发现一些规律。
如下代码,分析后应满足:
条件1:F(1) + 1 = F(3)
00415D12 |. 50 PUSH EAX
00415D13 |. 8BCE MOV ECX, ESI
00415D15 |. E8 C6FB0000 CALL SSQBZ.004258E0 ; 调用 4258E0
00415D1A |. 8B0D ACBF4600 MOV ECX, DWORD PTR DS:[46BFAC] ;
00415D20 |. 6A 03 PUSH 3
00415D22 |. 8D3C08 LEA EDI, DWORD PTR DS:[EAX+ECX]
00415D25 |. 8BCE MOV ECX, ESI
00415D27 |. E8 B4FB0000 CALL SSQBZ.004258E0
00415D2C |. 3BF8 CMP EDI, EAX
00415D2E 74 1B JE SHORT SSQBZ.00415D4B
00415D30 |. 8BCE MOV ECX, ESI
00415D32 |. C705 B0D34600>MOV DWORD PTR DS:[46D3B0], 0
00415D3C |. E8 BFFA0000 CALL SSQBZ.00425800 ;
00415D41 |. C705 70BE4600>MOV DWORD PTR DS:[46BE70], 0 ; 失败,[46BE70]清零
00415D4B |> 5F POP EDI
00415D4C |. 5E POP ESI
00415D4D |. 59 POP ECX
00415D4E \. C3 RETN
条件2:F(4) + 3 = F(5)
0040D84E |> \A1 70BE4600 MOV EAX, DWORD PTR DS:[46BE70]
0040D853 |. 85C0 TEST EAX, EAX
0040D855 |. 74 1F JE SHORT SSQBZ.0040D876
0040D857 |. 6A 04 PUSH 4
0040D859 |. 8BCE MOV ECX, ESI
0040D85B |. E8 80800100 CALL SSQBZ.004258E0
0040D860 |. 8BF8 MOV EDI, EAX
0040D862 |. 6A 05 PUSH 5
0040D864 |. 8BCE MOV ECX, ESI
0040D866 |. 83C7 03 ADD EDI, 3
0040D869 |. E8 72800100 CALL SSQBZ.004258E0
0040D86E 3BF8 CMP EDI, EAX
0040D870 0F84 F5000000 JE SSQBZ.0040D96B
0040D876 |> A1 B0BF4600 MOV EAX, DWORD PTR DS:[46BFB0]
条件3:F(2) + F(1) + 1 = F(4)
004163B9 |. 85C0 TEST EAX, EAX
004163BB |. 74 25 JE SHORT SSQBZ.004163E2
004163BD |. 6A 02 PUSH 2
004163BF |. 8BCE MOV ECX, ESI
004163C1 |. E8 1AF50000 CALL SSQBZ.004258E0
004163C6 |. 6A 01 PUSH 1
004163C8 |. 8BCE MOV ECX, ESI
004163CA |. 8BF8 MOV EDI, EAX ; edi=f2
004163CC |. E8 0FF50000 CALL SSQBZ.004258E0
004163D1 |. 6A 04 PUSH 4
004163D3 |. 8BCE MOV ECX, ESI
004163D5 |. 8D7C07 01 LEA EDI, DWORD PTR DS:[EDI+EAX+1] ; f(2)+f(1)+1=f(4)
004163D9 |. E8 02F50000 CALL SSQBZ.004258E0
004163DE |. 3BF8 CMP EDI, EAX
条件4: F(3) + 3 = F(4)
0041CCE9 . 6A 03 PUSH 3
0041CCEB . 8BCD MOV ECX, EBP
0041CCED . E8 EE8B0000 CALL SSQBZ.004258E0
0041CCF2 . 8BF8 MOV EDI, EAX
0041CCF4 . A1 ACBF4600 MOV EAX, DWORD PTR DS:[46BFAC] ; 1
0041CCF9 . 6A 04 PUSH 4
0041CCFB . 8D0C40 LEA ECX, DWORD PTR DS:[EAX+EAX*2] ; 3
0041CCFE . 03F9 ADD EDI, ECX ; f(3)+3
0041CD00 . 8BCD MOV ECX, EBP
0041CD02 . E8 D98B0000 CALL SSQBZ.004258E0 ; f(4)=f(3)+3
0041CD07 . 3BC7 CMP EAX, EDI
0041CD09 . 74 17 JE SHORT SSQBZ.0041CD22
条件5:F(1) + 2 = F(2)
0041D37A > \391D 70BE4600 CMP DWORD PTR DS:[46BE70], EBX
0041D380 . 74 1B JE SHORT SSQBZ.0041D39D
0041D382 . 6A 01 PUSH 1
0041D384 . 8BCD MOV ECX, EBP
0041D386 . E8 55850000 CALL SSQBZ.004258E0 ; f(1)+2=f(2)
0041D38B . 8BF0 MOV ESI, EAX
0041D38D . 6A 02 PUSH 2
0041D38F . 8BCD MOV ECX, EBP
0041D391 . 83C6 02 ADD ESI, 2
0041D394 . E8 47850000 CALL SSQBZ.004258E0
0041D399 . 3BF0 CMP ESI, EAX
0041D39B . 74 3D JE SHORT SSQBZ.0041D3DA
条件6: F(3) + F(4) = 7
0041E7F1 . 6A 04 PUSH 4
0041E7F3 . 8BCD MOV ECX, EBP
0041E7F5 . E8 E6700000 CALL SSQBZ.004258E0 ; f(3)+f(4)=7
0041E7FA . 6A 03 PUSH 3
0041E7FC . 8BCD MOV ECX, EBP
0041E7FE . 8BF0 MOV ESI, EAX
0041E800 . E8 DB700000 CALL SSQBZ.004258E0 ; f(3)+f(4)=7
0041E805 . 03F0 ADD ESI, EAX
0041E807 . 83FE 07 CMP ESI, 7
0041E80A . 74 7F JE SHORT SSQBZ.0041E88B
条件7: F(2) + F(3) = F(4)
0041F67E |. 6A 03 |PUSH 3
0041F680 |. 8BCE |MOV ECX, ESI
0041F682 |. E8 59620000 |CALL SSQBZ.004258E0 ; f(3)+f(2)=f(4)
0041F687 |. 6A 02 |PUSH 2
0041F689 |. 8BCE |MOV ECX, ESI
0041F68B |. 8BF8 |MOV EDI, EAX
0041F68D |. E8 4E620000 |CALL SSQBZ.004258E0 ; f(3)+f(2)=f(4)
0041F692 |. 6A 04 |PUSH 4
0041F694 |. 8BCE |MOV ECX, ESI
0041F696 |. 03F8 |ADD EDI, EAX
0041F698 |. E8 43620000 |CALL SSQBZ.004258E0 ; f(3)+f(2)=f(4)
0041F69D |. 3BF8 |CMP EDI, EAX
0041F69F |. 75 13 |JNZ SHORT SSQBZ.0041F6B4
条件8: F(2) + F(3) = 5
00421D0E |. 6A 03 PUSH 3
00421D10 |. 8BCE MOV ECX, ESI
00421D12 |. E8 C93B0000 CALL SSQBZ.004258E0 ; f3+f2=5
00421D17 |. 6A 02 PUSH 2
00421D19 |. 8BCE MOV ECX, ESI
00421D1B |. 8BD8 MOV EBX, EAX
00421D1D |. E8 BE3B0000 CALL SSQBZ.004258E0 ; f2+f3=5
00421D22 |. 03D8 ADD EBX, EAX
00421D24 |. 83FB 05 CMP EBX, 5
00421D27 |. 74 4C JE SHORT SSQBZ.00421D75
条件9: F(2) + F(3) + 3 = F(5)
004220B4 |> \393D 70BE4600 CMP DWORD PTR DS:[46BE70], EDI
004220BA |. 74 26 JE SHORT SSQBZ.004220E2
004220BC |. 6A 03 PUSH 3
004220BE |. 8BCE MOV ECX, ESI
004220C0 |. E8 1B380000 CALL SSQBZ.004258E0 ; f3+f2+3=f5
004220C5 |. 6A 02 PUSH 2
004220C7 |. 8BCE MOV ECX, ESI
004220C9 |. 8BD8 MOV EBX, EAX
004220CB |. E8 10380000 CALL SSQBZ.004258E0 ; f3+f2+3=f5
004220D0 |. 6A 05 PUSH 5
004220D2 |. 8BCE MOV ECX, ESI
004220D4 |. 03D8 ADD EBX, EAX
004220D6 |. E8 05380000 CALL SSQBZ.004258E0 ; f3+f2+3=f5
004220DB |. 83E8 03 SUB EAX, 3
004220DE |. 3BD8 CMP EBX, EAX
004220E0 |. 74 4C JE SHORT SSQBZ.0042212E
7.为了便于分析,我们汇总一下:
条件1: F(1) + 1 = F(3)
条件2: F(4) + 3 = F(5)
条件3: F(2) + F(1) + 1 = F(4)
条件4: F(3) + 3 = F(4)
条件5: F(1) + 2 = F(2)
条件6: F(3) + F(4) = 7
条件7: F(2) + F(3) = F(4)
条件8: F(2) + F(3) = 5
条件9: F(2) + F(3) + 3 = F(5)
这可是初中时期大家就应该掌握的数学题吧,各位自然不在话下:
F(1) F(2) F(3) F(4) F(5)
1 3 2 5 8
8.至此,我们似乎找到了一些非常关键的内容!
9.是开始分析函数F的时候了。
F函数如下:
004258E0 /$ 8B4C24 04 MOV ECX, DWORD PTR SS:[ESP+4] ; F函数
004258E4 |. A1 B0D34600 MOV EAX, DWORD PTR DS:[46D3B0]
004258E9 |. 83F9 01 CMP ECX, 1 ; Switch (cases 1..5)
004258EC |. 75 09 JNZ SHORT SSQBZ.004258F7
004258EE |. C1E8 10 SHR EAX, 10 ; Case 1 of switch 004258E9
004258F1 |. 83E0 0F AND EAX, 0F
004258F4 |. C2 0400 RETN 4
004258F7 |> 83F9 02 CMP ECX, 2
004258FA |. 75 09 JNZ SHORT SSQBZ.00425905
004258FC |. C1E8 0C SHR EAX, 0C ; Case 2 of switch 004258E9
004258FF |. 83E0 0F AND EAX, 0F
00425902 |. C2 0400 RETN 4
00425905 |> 83F9 03 CMP ECX, 3
00425908 |. 75 09 JNZ SHORT SSQBZ.00425913
0042590A |. C1E8 08 SHR EAX, 8 ; Case 3 of switch 004258E9
0042590D |. 83E0 0F AND EAX, 0F
00425910 |. C2 0400 RETN 4
00425913 |> 83F9 04 CMP ECX, 4
00425916 |. 75 09 JNZ SHORT SSQBZ.00425921
00425918 |. C1E8 04 SHR EAX, 4 ; Case 4 of switch 004258E9
0042591B |. 83E0 0F AND EAX, 0F
0042591E |. C2 0400 RETN 4
00425921 |> 83F9 05 CMP ECX, 5
00425924 |. 75 03 JNZ SHORT SSQBZ.00425929
00425926 |. 83E0 0F AND EAX, 0F ; Case 5 of switch 004258E9
00425929 \> C2 0400 RETN 4 ; Default case of switch 004258E9
翻译如下:
x <- [46D3B0] ,全局变量
F(n)=
switch(n)
1:x/2^10 mod F
2:x/2^C mod F
3:x/2^8 mod F
4:x/2^4 mod F
5:x mod F
10.看来程序在对全局变量[46D3B0]的16位进制值进行每一位读取判断,显然这个全局变量的值应该是:
根据我们分析的结果
F(1) F(2) F(3) F(4) F(5)
1 3 2 5 8
推导全局变量的值[46D3B0]=00013258
0x03 优雅爆破篇 **********************************************************************************
1.我们尝试如下方式修改4字节内容:
004258E4 A1 B0D34600 MOV EAX, DWORD PTR DS:[46D3B0]
修改为:
004258E4 B8 58320100 MOV EAX, 13258
2.继续运行程序,看来解除了很多功能,可是当我们进行多组胆拖过滤时,注册状态再次被重置。似乎还有些问题要处理。
这里决定对全局变量[46BE70]再次分析,查找所有地址参考,我们对每一处下断点并跟进分析,
发现几乎大部分均是访问F函数失败后重新赋0值,唯有1处不是,看这里:
00427237 |> \833D 70BE4600>CMP DWORD PTR DS:[46BE70], 1
0042723E |. 75 42 JNZ SHORT SSQBZ.00427282
00427240 |. 8B0D B4D34600 MOV ECX, DWORD PTR DS:[46D3B4]
00427246 |. 8D41 E8 LEA EAX, DWORD PTR DS:[ECX-18]
00427249 |. B9 38000000 MOV ECX, 38
0042724E |> 2D 78050000 /SUB EAX, 578
00427253 |. 49 |DEC ECX
00427254 |.^ 75 F8 \JNZ SHORT SSQBZ.0042724E
00427256 |. 33D2 XOR EDX, EDX
00427258 |. B9 E8030000 MOV ECX, 3E8
0042725D |. F7F1 DIV ECX
0042725F |. 3B15 A8D34600 CMP EDX, DWORD PTR DS:[46D3A8] ; 暗荘
00427265 |. 74 1B JE SHORT SSQBZ.00427282
00427267 |. 8BCE MOV ECX, ESI ; SSQBZ.0046B388
00427269 |. C705 B0D34600>MOV DWORD PTR DS:[46D3B0], 0
00427273 |. E8 88E5FFFF CALL SSQBZ.00425800
00427278 |. C705 70BE4600>MOV DWORD PTR DS:[46BE70], 0
00427282 |> 5F POP EDI ; USER32.77D191BE
00427283 |. 5E POP ESI ; USER32.77D191BE
00427284 |. 59 POP ECX ; USER32.77D191BE
00427285 \. C3 RETN
我们决定对这里进行1字节爆破:
00427265 74 1B JE SHORT SSQBZ.00427282
修改为:
00427265 EB 1B JMP SHORT SSQBZ.00427282
3.我们再次对入门注册码验证函数进行2字节爆破:
00425850 68 34494600 PUSH SSQBZ.00464934
修改为:
00425850 EB 75 JMP SHORT SSQBZ.004258C7
4.至此,这款程序的爆破思路已完成。
5.爆破实现。 不要Patch主程序,程序会检测完整性并报错。
DLL劫持和Loader是个不错主意。
完美爆破需要修改7字节数据。
0x04 总结篇 **********************************************************************************
1.不得不说,软件作者在反破解方面下了很多功夫。主程序修改检测,注册码分阶段验证,注册功能复杂化,暗荘遍野!
2.但是百密总有一疏,我们必须要不断分析,并找到这里的不足,然后提高自己。
3.文章没有对机器码、真实注册码进一步分析,有兴趣的读者可以尝试。
4.希望国软更加强大。希望论坛更加红火!
国庆快乐
tree_fly
2014-10-04
附件:lpk.dll+Loader+Excel
Crack.zip
(88.87 KB, 下载次数: 304, 售价: 1 枚飘云币)
避开杀软的打过VMP的Loader:
DUP2Loader-双色球霸主.7.0.vmp.zip
(693.66 KB, 下载次数: 176, 售价: 1 枚飘云币)
|
评分
-
查看全部评分
|