协议型外挂制作四

声明:
以下内容是我以前的blog中的,均是早期的内容,只是简单的搬到这里,留个纪念。关于信息安全方面,很早之前已经不再深入,因此,请勿联系。

协议型外挂制作四

By rix

上一次我们说了外挂中APIHOOK和基本平台的搭建,但仅仅只用APIHOOK在大多数的时候并不能达到目的,没有哪个公司会将网络打包加密解密解包的程序放在dll中以函数的形式就可以查看。所以这节来讲解为目标程序打内存补丁来修改程序的执行路径,通过这种办法让目标程序成为我们的奴隶。

前两天由于项目的关系,耽搁了两天教程,对不起大家。今天写教程时才发现,我当时研究程序文件用的是ida 4.17的版本,前段时间刚刚换成了4.7版本。虽然现在的版本比以前更好用,但版本的不兼容却让我头痛,最后没办法又找了个4.17的版本来用。这节中还需要使用的另外一个工具是W32dasm,W32dasm的快捷和为程序打补丁的方便是我最喜欢他的原因,ida 4.7是否支持和W32dasm那样的功能我还不知道,毕竟我刚刚装上,还没怎么用过呢。

废话就不说了,为程序打内存补丁和做游戏修改器差的不太多,只是游戏修改器修改的是数据,而内存补丁修改的是指令,在做之前,请一定要做好祈祷,虽然我会尽可能的将我所知道的注意点说出来,但仍然不敢保证你是否会出现非法指令、内存越界等等,如果出现蓝屏一定要买彩票阿,反正我是没有遇到过。

关于如何做内存补丁,在看雪出的那本《加密与解密》上有详细的讨论,这里简单说一下注意点:

1、 尽可能的调用程序本身的函数,除非没有办法再自己加载函数。

2、 在调用函数之前,一定要将相关函数的寄存器内容保存,在调用结束后,要将其内容恢复。

3、 注意堆栈平衡。

4、 由于我们要给源程序添加代码,因此尽可能的找一块空余的不会被修改内存(内存页4K对齐,这样的内存应该不难找),如果运气差的话,只能自己来申请内存了。

对于xy2.exe的程序来说,程序里面使用了SendMessage函数,这个函数使用方便,居有很大的广泛性就不用说了。因此我们准备使用该函数来将相关内容发送给外挂程序。不过在做这部分之前,我准备先给程序打补丁来防止目标程序升级来练练手。

作外挂最主要的工作是对目标程序的分析程度,分析程序主要用的是汇编的知识,有时候我想将汇编说成是调试程序更确切些,因为我大部分时间都是在用汇编调试,只有很少一部分时间来用汇编写程序。

将xy2.exe的程序用ida反编译,这里用的xy2.exe的版本是9.16之前的版本,从8.12之后到9.16之前xy2.exe的程序都没有做任何改动,因此这段时间的任意一个都是可以的。

移到地址.text:0042BB80处,这里就不给出代码了,代码太长了,足足有8个页面。这里大概就是WinMain函数,我不知道Ida4.7会将这里作为那个函数名,我用的是4.17,给的函数名是:sub_0_42BB80 proc near。通过研究该段代码,我们可以发现这段代码是函数的主程序,功能有下面的几点:

1、 检查更新,启动更新程序。

2、 查看是否播放录像文件,并将程序设置为相应的状态。

3、 设置程序运行的速度。

程序整理后的C代码我就不写了,根据ida给出的程序流程图很容易写出来的。

研究程序可以发现在地址.text:0042BC13处经过判断之后,就会检查大话程序的5个主版本的文件,通过调用下面的函数:

.text:0042BC15 0B8                 call    sub_0_4480E0

.text:0042BC1A 0B8                 call    sub_0_4481C0

.text:0042BC1F 0B8                 call    sub_0_4482A0

.text:0042BC24 0B8                 call    sub_0_448380

.text:0042BC29 0B8                 call    sub_0_448460

.text:0042BC2E 0B8                 push    ebx

.text:0042BC2F 0BC                 call    sub_0_4488E0

.text:0042BC34 0BC                 add     esp, 4

对于之前的这个判断,我想可能是播放录像用的。在接下来的5个call之后,调用sub_0_4488e0来调用升级用的对话框。要修改程序避免升级就简单多了,只用将这个跳转跳过去就行了。这里不用考虑堆栈的平衡,从ida给出的堆栈指针来看,跳转前后的堆栈是一样的。

因此在我们调用CreateProcess之后,就可以通过WriteProcessMemory来进行修改了,将跳转指令的前一个字节改为0xEB,后面的那个字节不用动了,后面的那个字节是用来控制跳转的距离的。这样原来的代码就由:

       .text:0042BBE9 0B8                 jz      short loc_0_42BBF1

变为

.text:0042BBE9 0B8                 jmp      short loc_0_42BBF1

了。

如果你不愿意通过程序来调用,也可以直接修改xy2.exe文件来做到,不过建议将xy2.exe文件备份一个,方便以后升级用。

对于避免弹出主页,也可以通过相同的办法,但修改的不是一个跳转指令了。这里仅仅给出一点点提示,可以自己去尝试:

1、 xy2.exe通过调用ShellExecute函数来弹出主页,可以根据引用段来快速找到调用的办法。

2、 在修改的时候,注意堆栈的平衡点。

上面的都是对于9.16之前的版本,之前的版本没有给程序加壳,可以这么来做。但9.16之后的程序都是被加了壳的,这样做就不可以了。不过可以先将程序脱壳。大话的注程序使用的是PECompact的壳,脱这个壳有个最快速的办法,这也是我在郁闷了几小时之后才发现的。刚开始的时候我用peid版本太低,竟然不认识这个壳,老实的我只好手动脱壳。脱完之后在看雪的站上转转,看有什么新的点子没有,发现peid的V.92版本,比我的新多了,就下载下来看看,发现是PECompact2.X的壳,更重要的发现是这个版本的peid可以脱比较简单的壳了,就在插件里面躺着,随便一试,发现竟然可以直接脱掉,这更过程不用1分钟。脱壳之后就可以按照之前的办法弄了,不过目标程序改为了脱壳后的文件,最新版本的xy2.exe程序(10.30之前)的免升级跳转点在

.text:0042BA7B                 jnz     short loc_42BAA8

。免弹出主页修改地址在:

.text:00444840                 mov     eax, [esp+8+var_8]

今天这节就讲解这些,并没有用到w32dasm,下一节主要讲解用于拦截数据的内存补丁,将会频繁使用w32dasm。

非常感谢热心网友alan将之前的教程整理成为VC的版本,如果对此版本有什么疑问的话,可以给他发E-mail:tyr_alan@hotmal.com。alan整理出来的源文件我会随着教程和我拿到的版本粘贴在www.gameres.com上,源文件的版本可能和教程的内容不符合^_^。

Alan的文件地址:http://blog.gameres.com/upload/sf_20041030104834.rar

本文章只贴于www.csdn.net和www.gameres.com 的Blog上面,请勿将文章用于任何商业场合,如果因为本教程引起其他的后果的话,则与本人无关,本人只讲技术实现。如果要转贴的话,请注明出处,如果有疑问或者商议的话,请发E-Mail到zeze0556@sina.com或者QQ:23033206留言,MSN:zeze0556@msn.com。另外请勿给我信箱发垃圾邮件,在添加好友的时候一定要写好附言,我已经被莫名其妙的广告信件和流言蜚语吓得没有胆了。算是我求各位大虾了

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你