欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

对一游戏外挂浅浅的分析

程序员文章站 2022-04-07 09:49:21
前言:夜阑静,已是凌晨2:11分,明天还要实习,但这几天在研究一个网页游戏的辅助,也分享下自己的一些笔记和心得,虽然我是个大菜鸟。   真的是很遗憾,今天花了6,7个小时分析,基...
前言:夜阑静,已是凌晨2:11分,明天还要实习,但这几天在研究一个网页游戏的辅助,也分享下自己的一些笔记和心得,虽然我是个大菜鸟。

 

真的是很遗憾,今天花了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