对一游戏外挂浅浅的分析
真的是很遗憾,今天花了6,7个小时分析,基本上每一行都写了注释,后来分析了另外一个程序,注释和断点都清除了。下次一定要保存好!大家凑合着看吧T T
1.查壳
PEID---->ASPack 2.12 -> Alexey Solodovnikov
手脱
脚本脱
脱壳机脱
都行
记得用LordPE 和ImportREC 修复一下就好了。
2.来到代码入口点:
004F568D > 55 push ebp
004F568E 8BEC mov ebp,esp
004F5690 6A FF push -0x1
004F5692 68 084B5500 push Dumped_.00554B08
004F5697 68 44804F00 push Dumped_.004F8044
004F569C 64:A1 00000000 mov eax,dword ptr fs:[0]
004F56A2 50 push eax
004F56A3 64:8925 0000000>mov dword ptr fs:[0],esp
004F56AA 83EC 58 sub esp,0x58
004F56AD 53 push ebx
004F56AE 56 push esi
004F56AF 57 push edi
----------------------------------------------------
明显的C++头。
我在MessageBoxA 下断点:
注册按钮之后
断下来了来到
----------------------------------------------------
77D507EA > 8BFF mov edi,edi
77D507EC 55 push ebp
77D507ED 8BEC mov ebp,esp
77D507EF 833D BC14D777 0>cmp dword ptr ds:[0x77D714BC],0x0
77D507F6 74 24 je short user32.77D5081C
77D507F8 64:A1 18000000 mov eax,dword ptr fs:[0x18]
77D507FE 6A 00 push 0x0
77D50800 FF70 24 push dword ptr ds:[eax+0x24]
77D50803 68 241BD777 push user32.77D71B24
77D50808 FF15 C412D177 call dword ptr ds:[<&KERNEL32.Interlocke>; kernel32.InterlockedCompareExchange
77D5080E 85C0 test eax,eax
77D50810 75 0A jnz short user32.77D5081C
77D50812 C705 201BD777 0>mov dword ptr ds:[0x77D71B20],0x1
77D5081C 6A 00 push 0x0
77D5081E FF75 14 push dword ptr ss:[ebp+0x14]
77D50821 FF75 10 push dword ptr ss:[ebp+0x10]
77D50824 FF75 0C push dword ptr ss:[ebp+0xC]
77D50827 FF75 08 push dword ptr ss:[ebp+0x8]
77D5082A E8 2D000000 call user32.MessageBoxExA
77D5082F 5D pop ebp
77D50830 C2 1000 retn 0x10
----------------------------------------------------
因为没发现关键跳,因此我Ctrl+F9 F8 几层之后,来到:
----------------------------------------------------
0048ED10 . 83EC 64 sub esp,64
0048ED13 . 56 push esi ; Dumped_.004613AC
0048ED14 . 8B7424 74 mov esi,dword ptr ss:[esp+74] ; Dumped_.00580070
0048ED18 . 57 push edi
0048ED19 . 8B7E 08 mov edi,dword ptr ds:[esi+8]
0048ED1C . 57 push edi
0048ED1D . E8 0E410100 call Dumped_.004A2E30
0048ED22 . 83C4 04 add esp,4
0048ED25 . 85C0 test eax,eax
0048ED27 . 74 10 je short Dumped_.0048ED39
0048ED29 . 8D4424 08 lea eax,dword ptr ss:[esp+8]
0048ED2D . 50 push eax
0048ED2E . 56 push esi ; Dumped_.004613AC
0048ED2F . E8 FCE2FFFF call Dumped_.0048D030
0048ED34 . 83C4 08 add esp,8
0048ED37 . EB 42 jmp short Dumped_.0048ED7B
0048ED39 > 81FF 04000080 cmp edi,80000004 ; Switch (cases 80000002..80000004)
0048ED3F 75 04 jnz short Dumped_.0048ED45
0048ED41 . 8B0E mov ecx,dword ptr ds:[esi] ; Case 80000004 (SINGLE STEP) of switch 0048ED39
0048ED43 . EB 3A jmp short Dumped_.0048ED7F
0048ED45 > 81FF 02000080 cmp edi,80000002
0048ED4B 75 12 jnz short Dumped_.0048ED5F
0048ED4D . 8B16 mov edx,dword ptr ds:[esi] ; Case 80000002 (DATATYPE MISALIGNMENT) of switch 0048ED39
0048ED4F . 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0048ED53 . 51 push ecx
0048ED54 . 52 push edx
----------------------------------------------------
这里有一个跳是可以跳过messagebox的,可是我试了之后,发现程序跑飞,因此不得不再次找上一级的CALL。。。。
根据远CALLF7 近CALL F8的原则 时时刻刻观察OD的几个窗口,真的叫一个目不转睛!
跟踪+跟踪+再跟踪!坚持+坚持+再坚持!
看到一行疑似注册码的字母,相当兴奋,仔细一分析,原来是磁盘序列号,,接着是各种序列号,MAC,机器注册码,总之走了很久。
name和serial终于出现!本来要放弃的我又兴奋起来了,可惜仔细分析之后,并没有明码比较,而是和http://www.etigou.com/jqm/index.php/index/zhuce/cardid/有关,于是我想 可能是网络验证。
fosom师傅之前虽然指点过 要修改几个跳转
但是接下来还是让我发现了一个关键跳,只要修改一个 可以实现注册界面上的爆破:
0040B9F2 33C9 xor ecx,ecx 此时;ecx=0
0040B9F4 41 inc ecx
0040B9F5 51 push ecx
0040B9F6 50 push eax
0040B9F7 3BC8 cmp ecx,eax ;此时ecx=1 eax=0
0040B9F9 0F8F 8F020000 jg Dumped_.0040BC8E ; 关键跳,跳则死,不跳成功 (但是这个程序跳了之后再次运行到这里的时候必须不跳)
----------------------------------------------------
ecx 此处是计注册次数用的
爆破1.
我先将jg 改成je 发现可以注册成功,但是注册成功的窗口i一直弹出,关了继续弹出。
面对这样,我写了个内存注册机,点击注册之前先将jg改成je,弹出框后再将je改成jg,于是就成功提示“注册成功”了。
爆破2.
我在想,如果可以将eax改成1的话,那么也能实现第一次不跳,之后跳转恢复,实现爆破,可惜字节不够,fosom师傅说用SMC技术,可是我找了一下,CC也很少。。
最后我往上找,
把0040B9F2 33C9 xor ecx,ecx
改成not ecx 让ecx=FFFFFFFF
成功实现了爆破
爆破3.
我继续往上找:
想办法让一个寄存器的值=1,我是让EDX=1了
然后在0040B9F7 3BC8 cmp ecx,eax
这一句上,将eax改成edx 也能实现爆破。
其实我觉得 还有很多方法的,比如说,既然关键跳是0040B9F9 0F8F 8F020000 jg Dumped_.0040BC8E
而JG的测试条件是SF=OF且ZF=0,我们是否能找到影响标志位的语句来影响这个跳转呢?
最后附一下fosom师傅教我的另一种方法:
如图所示:
1,在需要改的jne,修改成jmp。
2,在所在模块,找9个空字节(连续的CC很多,容易找)。
这样就实现了,运行一次就自动恢复原有代码。
我觉得很不错,今天虽然累了 明天还要实习。但是收获颇多,我会继续努力的!
当然还有点问题,虽然只改了和少部分代码,但是还是有功能失效了,我觉得可以用对比分析来找出失效的原因,再加以改正就能成功。
努力早就实力!态度决定高度!
加油~!
2013.6.26.凌晨3点5分
附件下载:http://up.2cto.com/2013/0626/20130626113300781.zip
推荐阅读
-
SEO实例分析:百度对新老域名的第一印象
-
Vista对游戏的良好支持特性一览
-
逆向一个老的双升扑克游戏,并完成外挂
-
Hibernate框架ORM基础(一对多关系的save分析)
-
腾讯校招的题:牛牛和妞妞玩一个游戏,轮流对某一数列里相同且相邻的两个数字进行删除,无法删除的玩家将输掉这个游戏
-
对一游戏外挂浅浅的分析
-
《孩子,为你自己读书》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+多多图书馆+志存当高远+读万卷书如行万里路+术业有专攻+读书是对思想的一种升华+立钻哥哥++==)
-
微星MPG321UR-QD显示器评测 满足你对游戏的一切幻想
-
对一个vbs脚本病毒的病毒原理分析
-
对Android 8.0以上版本通知点击无效的一次分析