双色球霸主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:
好强大!
前排学习! 感谢分享!!! 支持分析的很好。{:soso_e189:} 厉害中,谢谢高人!我什么时候能到的!1{:soso_e113:} 谢谢分享这么精彩的分析! 此軟能算出工作人员定几号球?呵呵(为么上论坛不挂代理上不来?) 赞 不仅搞定了算法 还利用全局变量快速定位到了暗桩 不错。 精彩,感谢楼主提供学习机会