协议型外挂制作四

 上一次我们说了外挂中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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值