好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 wonderzdh 于 2013-7-16 10:35 编辑
【文章标题】: CC网络验证-分析并爆破CC
【文章作者】: wonderzdh
【作者主页】:http://hi.baidu.com/chicken
【软件名称】: BambooQJ
【下载地址】: 见附件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
本套教程至少得更新到10课,由于没有事先安排,内容可能会比较乱,但是每字每句都是心得。
为什么我要把这些心得发出来,而不自己藏着。因为我发的东西本身就是我对学习逆向的一个梳理和总结。
赠人玫瑰,手有余香。至于你们回不回复,评不评分,我一点所谓也没有。
后续课程不会继续在【逆缘论坛】首发,【吾爱破解】转帖的形式存在,而是两个站同时更新。
也希望我的帖子在吾爱不是归类转帖,而是属于原创,本人可是吾爱未来的“原创精英”+“论坛大牛”呀。
如果想求破,可直接来逆缘免费求破,网址什么的就不发了,自己百度一下。
【第一步】
CC防格盘,因为CC网络验证有格盘暗桩,所以我们要事先做好准备,二进制搜索:
85 DB 74 09 53 E8 ?? ?? ?? ?? 83 C4 04 8B E5 5D C2 04 00
0040651E /$ 55 push ebp
在此处段首retn 4,为什么是retn 4 呢?我们到断尾查看,断尾就是retn 4 所以我们要保持一致。
【第二步】
下易语言按钮事件断点,其实只要是调用易语言的子程序都会被断下来,比如启动窗口创建完毕、自建的子程序等,并不只是按钮事件。
易语言事件代码:
0042A48A |. /EB 09 jmp short 客户端.0042A495
0042A48C |> |8B4D EC /mov ecx,[local.5]
0042A48F |. |83E9 01 |sub ecx,0x1
0042A492 |. |894D EC |mov [local.5],ecx
0042A495 |> \837D EC 00 cmp [local.5],0x0
0042A499 |. 7C 12 |jl short 客户端.0042A4AD
0042A49B |. 8B55 EC |mov edx,[local.5]
0042A49E |. 8B45 08 |mov eax,[arg.1]
0042A4A1 |. 8B4C90 10 |mov ecx,dword ptr ds:[eax+edx*4+0x10]
0042A4A5 |. 894D F0 |mov [local.4],ecx
0042A4A8 |. FF75 F0 |push [local.4]
0042A4AB |.^ EB DF \jmp short 客户端.0042A48C
0042A4AD >|> FF55 FC call [local.1]
0042A4B0 |. 5F pop edi
0042A4B1 |. 5E pop esi
易语言事件死码:
0042A4AD >|> FF55 FC call [local.1]
0042A4B0 |. 5F pop edi
0042A4B1 |. 5E pop esi
Ctel+G 来到00401000处,Ctel+B搜索二进制字符串“FF55FC5F5E”,这个断点非常有用,绝大多数作者不会把此处VM掉,而且VM此处的代价很大,会导致程序不稳定、运行缓慢。
但是一回到CC界面,鼠标一移动到按钮上,还没单击呢,就被断下来了,应该是发生了其他易语言事件,怎么办呢?
此时应该在这句上下条件断点,当条件符合的时候,断点才生效,拦截下来。我们不知道我们要找的地址,但是知道现在被断下将要去的地址。
那我们就排除掉这个地址,具体步骤是,右键-断点-条件-输入“[local.1]!=00406dc6”。
对照代码:0042A4AD >|> FF55 FC call [local.1]
[local.1]处储存的就是要去的地址,也是这个CALL内的段首地址,!=就是不等于返回真,==就是等于返回真,后边就是我们移到按钮后的事件段首地址,这不是我们要的地址,所以我们pass掉。
按B到断点窗口查看:
Breakpoints, 项目 0
地址=0042A4AD
模块=客户端
活动=当 [local.1]!=00406dc6
反汇编=call dword ptr ss:[ebp-0x4]
此时我们鼠标移动到按钮上,OD就不断下了,意味着刚才那个调用被我们排除了。
当我们点击按钮时,程序顺利被断下,F7跟进:
00404D70 /. 55 push ebp
这里就是按钮事件的代码段,从源码上来看,就是“_会员_登录_被单击”这个子程序的所有代码。
按钮事件前边几句代码是固定存在的,不做修改:
00404D70 /. 55 push ebp
00404D71 |. 8BEC mov ebp,esp
00404D73 |. 81EC 3C000000 sub esp,0x3C
00404D79 |. C745 FC 00000>mov [local.1],0x0
00404D80 |. C745 F8 00000>mov [local.2],0x0
00404D87 |. E8 C2CDFFFF call 客户端.00401B4E
后边就是一个VMP的开始标记:
00404D8E |. 56 4D 50 72 6>ascii "VMProtect begin",0
像这种长长的代码段,我们不要轻易运行或者F8跟,更不要F7跟进去。
我们应当从段首看到断尾,看一些可疑的跳转,一些可疑的CALL我们跟进看看。
记住,仅限于看看,不要让程序走起来,这样防止我们跟错又要从新来,也对我们理解代码有帮助。
这段代码我们对照源码来看就更清晰了,一字一句都是一模一样的,大家要尝试多对比理解。
我们一路看到段尾:
00405736 |. 56 4D 50 72 6>ascii "VMProtect end",0
00405767 \. C3 retn
把我们发现的可疑的地址记录一下:
【可疑的跳转】
1.
004056FE |> \68 04000080 push 0x80000004
来自上方一个很长的跳转。
2.
004056BB |> \68 04000080 push 0x80000004
来自上方一个很长的跳转。
3.
004056AC |> \6A 00 push 0x0
来自上方一个很长的跳转。
【可疑的代码】
00405398 |> \837D F0 00 cmp [local.4],0x0
0040539C |. 0F84 0A030000 je 客户端.004056AC
004053A2 |. 68 02000080 push 0x80000002
004053A7 |. 6A 00 push 0x0
004053A9 |. 68 00000000 push 0x0
004053AE |. 6A 00 push 0x0
004053B0 |. 6A 00 push 0x0
004053B2 |. 6A 00 push 0x0
004053B4 |. 68 01000100 push 0x10001
004053B9 |. 68 4B000106 push 0x601004B
004053BE |. 68 4C000152 push 0x5201004C
004053C3 |. 68 03000000 push 0x3
004053C8 |. BB 90B14000 mov ebx,客户端.0040B190
004053CD |. E8 18580000 call 客户端.0040ABEA
004053D2 |. 83C4 28 add esp,0x28
为什么说这段代码可疑呢?第一:push很多,第二:上边就是一个判断跳转。
这段代码往上是处于验证的代码,这点可以从字符串参考和源码对比看出。
那意味着,这就更可疑了,验证代码的下边,一个判断一个跳转一堆push一个CALL,典型的关键。
2.
004056BB |> \68 04000080 push 0x80000004
004056C0 |. 6A 00 push 0x0
004056C2 |. 68 B34F4900 push 客户端.00494FB3
004056C7 |. 68 01030080 push 0x80000301
004056CC |. 6A 00 push 0x0
004056CE |. 68 40000000 push 0x40
004056D3 |. 68 04000080 push 0x80000004
004056D8 |. 6A 00 push 0x0
004056DA |. 8B45 FC mov eax,[local.1]
004056DD |. 85C0 test eax,eax
004056DF |. 75 05 jnz short 客户端.004056E6
004056BB 跳转来自 00405014
3.
004056FE |> \68 04000080 push 0x80000004
00405703 |. 6A 00 push 0x0
00405705 |. 68 B84F4900 push 客户端.00494FB8
0040570A |. 68 01030080 push 0x80000301
0040570F |. 6A 00 push 0x0
00405711 |. 68 40000000 push 0x40
00405716 |. 68 04000080 push 0x80000004
0040571B |. 6A 00 push 0x0
0040571D |. 68 BF4F4900 push 客户端.00494FBF
00405722 |. 68 03000000 push 0x3
00405727 |. BB 80C74000 mov ebx,客户端.0040C780
0040572C |. E8 B9540000 call 客户端.0040ABEA
00405731 |. 83C4 28 add esp,0x28
004056FE 跳转来自 00404E61
处理完会员登录的按钮事件后会来到目标窗口创建完毕的子程序,里边也有要修改的地方。
目标窗口创建完毕的子程序入口:
0040604F /. 55 push ebp
【从源码解读汇编代码】
汇编标志:
0040606B |. 83F8 00 cmp eax,0x0
0040606E |. 0F85 F0000000 jnz 客户端.00406164
00406074 |. 68 3C4F4900 push 客户端.00494F3C ; ersgegy
源码:
.如果真 (二次登录验证参数 = “ersgegy”)
窗口1.可视 = 真
按钮1.可视 = 假
二次免费登录验证 ()
对应的汇编代码:
0040608A |. /0F85 3F000000 jnz 客户端.004060CF ;.如果真 (二次登录验证参数 = “ersgegy”)
00406090 |. |6A 00 push 0x0
00406092 |. |68 01000000 push 0x1
00406097 |. |6A FF push -0x1
00406099 |. |6A 05 push 0x5
0040609B |. |68 4B000106 push 0x601004B
004060A0 |. |68 4C000152 push 0x5201004C
004060A5 |. |E8 3A4B0000 call 客户端.0040ABE4 ;窗口1.可视 = 真
004060AA |. |83C4 18 add esp,0x18
004060AD |. |6A 00 push 0x0
004060AF |. |68 00000000 push 0x0
004060B4 |. |6A FF push -0x1
004060B6 |. |6A 05 push 0x5
004060B8 |. |68 A1020116 push 0x160102A1
004060BD |. |68 4C000152 push 0x5201004C
004060C2 |. |E8 1D4B0000 call 客户端.0040ABE4 ;按钮1.可视 = 假
004060C7 |. |83C4 18 add esp,0x18
004060CA |. |E8 70010000 call 客户端.0040623F ;二次免费登录验证 ()
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
易语言源码:
.版本 2
.如果真 (二次登录验证参数 = “sdgbbeyy”)
二次会员登录验证 ()
窗口1.可视 = 真
按钮1.可视 = 真
网络状态.时钟周期 = 150000
登录时钟.时钟周期 = 300000
对应的汇编代码:
004060E2 |. 83F8 00 cmp eax,0x0
004060E5 |. 0F85 79000000 jnz 客户端.00406164 ;如果真 (二次登录验证参数 = “sdgbbeyy”)
004060EB |. E8 9C080000 call 客户端.0040698C ;二次会员登录验证 ()
004060F0 |. 6A 00 push 0x0
004060F2 |. 68 01000000 push 0x1
004060F7 |. 6A FF push -0x1
004060F9 |. 6A 05 push 0x5
004060FB |. 68 4B000106 push 0x601004B
00406100 |. 68 4C000152 push 0x5201004C
00406105 |. E8 DA4A0000 call 客户端.0040ABE4 ;窗口1.可视 = 真
0040610A |. 83C4 18 add esp,0x18
0040610D |. 6A 00 push 0x0
0040610F |. 68 01000000 push 0x1
00406114 |. 6A FF push -0x1
00406116 |. 6A 05 push 0x5
00406118 |. 68 A1020116 push 0x160102A1
0040611D |. 68 4C000152 push 0x5201004C
00406122 |. E8 BD4A0000 call 客户端.0040ABE4 ;按钮1.可视 = 真
00406127 |. 83C4 18 add esp,0x18
0040612A |. 6A 00 push 0x0
0040612C |. 68 F0490200 push 0x249F0 ;时钟周期-(249F0)16=(150000)10
00406131 |. 6A FF push -0x1
00406133 |. 6A 08 push 0x8
00406135 |. 68 A4040116 push 0x160104A4
0040613A |. 68 4C000152 push 0x5201004C
0040613F |. E8 A04A0000 call 客户端.0040ABE4 ;网络状态.时钟周期 = 150000
00406144 |. 83C4 18 add esp,0x18
00406147 |. 6A 00 push 0x0
00406149 |. 68 E0930400 push 0x493E0 ;时钟周期-(493E0)16=(300000)10
0040614E |. 6A FF push -0x1
00406150 |. 6A 08 push 0x8
00406152 |. 68 8B020116 push 0x1601028B
00406157 |. 68 4C000152 push 0x5201004C
0040615C |. E8 834A0000 call 客户端.0040ABE4 ;登录时钟.时钟周期 = 300000
00406161 |. 83C4 18 add esp,0x18
后边的代码我就不一一对比了,从源码可以看出,后边都不是什么好鸟,我们执行完上边的有用的代码就直接在“0040612A”处retn,把后边的代码pass掉。
【其中一种修改方法爆破CC】
1.
0040651E 55 push ebp
修改为:
0040651E C2 0400 retn 0x4
作用:作废格盘暗装代码
2.
00404D8C |. /EB 10 jmp short 客户端.00404D9E
修改为:
00404D8C /E9 11060000 jmp 客户端.004053A2
作用:直接跳过按下会员登录后的验证部分,来到创建窗口的代码。
3.
004060E5 . /0F85 79000000 jnz 破解后.00406164
用NOP填充
作用:执行我们需要的限制登录模式。
4.
004060EB . E8 9C080000 call 3.0040698C
直接NOP填充,或者跟进直接retn。
作用:作废“二次会员登录验证 ()”这个我们不喜欢的子程序。
5.
0040612A |. 6A 00 push 0x0
修改为:
0040612A C3 retn
0040612B 90 nop
作用:直接返回,跳过后边的验证。
【总结】
1.首先要利用断点找到突破口,来到关键的代码段。
2.然后要仔细分析代码段的内容,找出可疑的代码(跳转和CALL)。
3.巧用“JMP大法”,在不破坏必须执行的代码的前提下,尽可能多的跳过那些验证的代码。
CC就是一个很好的学习例子,两个子程序中的大部分验证都被我们跳过了。而例如目标窗口创建完毕中的代码:窗口显示为真,按钮禁止为假等应该被执行的代码一个都不能跳过。
CC网络验证3.4修复爆破版 破解版.rar
(1.37 MB, 下载次数: 408)
第一篇-【某培训】学前测试-程序多开
第二篇-吾爱扣扣的一个CM
第三篇 - CM大赛作品 - BambooQJ
--------------------------------------------------------------------------------
【版权声明】: 本文原创于【wonderzdh】,转载请注明作者并保持文章的完整,谢谢!
2013-7-10 11:18
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|