tree_fly 发表于 2014-10-5 07:21:53

双色球霸主7.0(入门注册码+7Bytes优雅爆破+解方程式算法分析)

本帖最后由 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:
00404E0A   .8D9D B4000000 LEA   EBX, DWORD PTR SS:
00404E10   .8378 F8 04    CMP   DWORD PTR DS:, 4
00404E14   .0F8C C2010000 JL      SSQBZ.00404FDC
00404E1A   .8B8D B8000000 MOV   ECX, DWORD PTR SS:
00404E20   .8DB5 B8000000 LEA   ESI, DWORD PTR SS:
00404E26   .B8 04000000   MOV   EAX, 4
00404E2B   .3941 F8       CMP   DWORD PTR DS:, EAX
00404E2E   .0F8C A8010000 JL      SSQBZ.00404FDC
00404E34   .8B95 BC000000 MOV   EDX, DWORD PTR SS:
00404E3A   .3942 F8       CMP   DWORD PTR DS:, 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:
00404E51   .8887 34494600 MOV   BYTE PTR DS:, 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:
00404E6C   .888F 38494600 MOV   BYTE PTR DS:, 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:
00404E81   .E8 4E330400   CALL    SSQBZ.004481D4
00404E86   .8A1438      MOV   DL, BYTE PTR DS:
00404E89   .8897 3C494600 MOV   BYTE PTR DS:, 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:, 38
00404E9C   .75 5C         JNZ   SHORT SSQBZ.00404EFA

DS:,这里正是注册码的首位,与0x38比较,提示注册码首位必须为8,否则跳转失败。
至此,正确的注册码第一个条件:首位数字为8。


5.我们继续向下看:
00404E9E   .33C0          XOR   EAX, EAX
00404EA0   .B9 02000000   MOV   ECX, 2
00404EA5   >0FBE91 354946>MOVSX   EDX, BYTE PTR DS:    ;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:
00404ED7   .0FBE05 354946>MOVSX   EAX, BYTE PTR DS:      ;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:      ;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:               
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:
0040D87B|.85C0          TEST    EAX, EAX
注意这里读取全局变量,应该对其进一步分析,右键选择该地址,查找参考->查看地址常量。
好家伙!满屏的比较和赋值!


3.不要感到恐惧,仔细把每条语句读完,你会惊喜发现,只有一条语句为该地址赋值为1,似乎看到了成功的丝丝曙光。
双击该语句,来到这里:
00425850/$68 34494600   PUSH    SSQBZ.00464934                   ;830123456789
00425855|.C705 70BE4600>MOV   DWORD PTR DS:, 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:   ;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:
004258A4|.0FBE05 354946>MOVSX   EAX, BYTE PTR DS:      ;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:      ;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:, 1         ;全局变量=1
004258D1\>C3            RETN
看来程序又对注册码进行了验证,验证成功后全局变量即等于1,否则赋0值。
所以我们有理由相信,全局变量是我们要找的主干之一,应该时刻关注他的值,并保持为1。
同时,这里应该也是一个爆破点。我们做个标记提醒一下吧。

4.我们继续回到刚才的跳转组,
0040D84E|> \A1 70BE4600   MOV   EAX, DWORD PTR DS:               
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:
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:       ;   
00415D20|.6A 03         PUSH    3
00415D22|.8D3C08      LEA   EDI, DWORD PTR DS:
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:, 0
00415D3C|.E8 BFFA0000   CALL    SSQBZ.00425800                   ;
00415D41|.C705 70BE4600>MOV   DWORD PTR DS:, 0         ; 失败,清零
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:
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:

条件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:    ;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:       ;1
0041CCF9   .6A 04         PUSH    4
0041CCFB   .8D0C40      LEA   ECX, DWORD PTR DS:    ;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:, 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:, 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:       ;F函数
004258E4|.A1 B0D34600   MOV   EAX, DWORD PTR DS:
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 <-    ,全局变量
F(n)=
switch(n)
1:x/2^10 mod F
2:x/2^Cmod F
3:x/2^8mod F
4:x/2^4mod F
5:x         mod F

10.看来程序在对全局变量的16位进制值进行每一位读取判断,显然这个全局变量的值应该是:
根据我们分析的结果
F(1)   F(2)    F(3)    F(4)    F(5)
1       3       2       5       8
推导全局变量的值=00013258


0x03 优雅爆破篇 **********************************************************************************
1.我们尝试如下方式修改4字节内容:
004258E4      A1 B0D34600   MOV   EAX, DWORD PTR DS:
修改为:
004258E4      B8 58320100   MOV   EAX, 13258

2.继续运行程序,看来解除了很多功能,可是当我们进行多组胆拖过滤时,注册状态再次被重置。似乎还有些问题要处理。
这里决定对全局变量再次分析,查找所有地址参考,我们对每一处下断点并跟进分析,
发现几乎大部分均是访问F函数失败后重新赋0值,唯有1处不是,看这里:
00427237|> \833D 70BE4600>CMP   DWORD PTR DS:, 1
0042723E|.75 42         JNZ   SHORT SSQBZ.00427282
00427240|.8B0D B4D34600 MOV   ECX, DWORD PTR DS:
00427246|.8D41 E8       LEA   EAX, DWORD PTR DS:
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:       ;暗荘
00427265|.74 1B         JE      SHORT SSQBZ.00427282
00427267|.8BCE          MOV   ECX, ESI                         ;SSQBZ.0046B388
00427269|.C705 B0D34600>MOV   DWORD PTR DS:, 0
00427273|.E8 88E5FFFF   CALL    SSQBZ.00425800
00427278|.C705 70BE4600>MOV   DWORD PTR DS:, 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

避开杀软的打过VMP的Loader:










GGLHY 发表于 2014-10-5 08:06:10

好强大!

前排学习!

heizihui 发表于 2014-10-5 08:06:12

感谢分享!!!

wei0227 发表于 2014-10-5 08:11:58

支持分析的很好。{:soso_e189:}

1552759476@ 发表于 2014-10-5 08:55:35

厉害中,谢谢高人!我什么时候能到的!1{:soso_e113:}

点点星 发表于 2014-10-5 09:12:28

谢谢分享这么精彩的分析!

swq0503 发表于 2014-10-5 09:50:02

此軟能算出工作人员定几号球?呵呵(为么上论坛不挂代理上不来?)

Nisy 发表于 2014-10-5 10:58:40

赞 不仅搞定了算法 还利用全局变量快速定位到了暗桩

pendan2001 发表于 2014-10-5 10:59:09

不错。

lyl2012 发表于 2014-10-5 11:57:31

精彩,感谢楼主提供学习机会
页: [1] 2 3 4 5 6
查看完整版本: 双色球霸主7.0(入门注册码+7Bytes优雅爆破+解方程式算法分析)