2、 新版本采用的加密办法(双精度浮点数加密)在讲解上非常的麻烦,不是一般人容易入门的,但解决的办法和9.16之前的版本一样,只是繁琐而以。
3、 脱壳后的程序有更多的需要人工识别的部分,这会造成不必要的麻烦,免得误导大家。
协议型网络游戏外挂制作之DLL中改代码
第一节到第三节我们说了基本工具的准备,第四节使用免升级和免弹出主页来做了一下基本的练习。第四节中和普通的游戏修改器没有太大的区别,只是一个修改的是数据,一个修改的是代码。这一节中我们将通过在dll中修改大话的代码来进行外挂的制作。其实在dll中动态修改代码和上一节用的方法一样,只是要改写的东西更多了而已。
原理和上一节中的函数一样,都是调用WriteProcessMemory。
这一节的任务是拦截接收到的数据,关于发送的数据可以进行相类似的处理。一般在分析网络游戏的时候,都是先分析接收到的数据。对于大话的程序,中间如何去分析的过程就不说了,这要看自己的调适能力了。不过对于9.16之前的大话客户端程序,里面含有大量的调试信息(也可能是脚本信息),大致分析程序可以发现,程序总是在打印调试信息之后,然后做实际的工作。其中对于"rx_decode”这个字段很感兴趣,看看调用的地方:
.text:00449D4F 154 push offset aRx_decode ; "rx_decode"
在前方不久的地方就是网络函数recv,因此可以这样来理解,程序接收到数据之后,打印出调试信息,然后跳转到:
.text:00449D95 154 push ebp
的地方继续执行,通过不断的跟踪发现,大部分时候程序都执行到地址:
.text:00449DED 154 mov [eax], edi
而且,[edi]中的内容在相同的时刻几乎是相似的,通过在游戏中随机的打开中断,将[edi]中的内容dump出来,然后组成ASCII码便可以发现,里面的内容相对来说是不变的,如果你运气好刚好可以拦截到聊天数据的话,就会发现里面的内容就是聊天的内容。这有点像碰运气。不过,如果采用下面的方法的话,就可以不用碰运气了。首先,我们发现edi是一个数据的地址,ebp中是我们接收到的数据的长度。当对其中的内容感到怀疑的时候,我们就想将该语句执行的时候[edi]中的内容dump出来,dump的长度就是ebp中的值。因此我们通过w32dasm来制作内存补丁,使用W32dasm反编译程序之后,使用快捷键Ctrl L可以将程序加载到内存中,不让程序执行,快捷键Ctrl F12跳转代码窗口的地址到00449DED 一行,方便恢复代码的时候用。在调试窗口中按Ctrl F12将当前代码位置跳转到00449DED。
我们将在这里进行内存补丁的编写。点击Patch Code按钮就可以直接写内存代码了。在00449DED的位置的补丁如下:
:00449DED E90ECA0400 jmp 00496800
00496800地址的内容是一段空闲得内存。在ida中可以看到程序中没有任何地方使用这块内存,我们将在这里进行程序的修改。当程序执行到00449DED的时候,就会跳转到00496800接着执行,因此,我们还必须修改00496800处的代码,使用Ctrl F12跳转到00496800处,开始打补丁:
:00496800 50 push eax;保存各寄存器的值
:00496801 53 push ebx
:00496802 51 push ecx
:00496803 52 push edx
:00496804 55 push ebp;ebp为这次接收到的数据长度
:00496805 57 push edi;edi为数据地址
:00496806 6804040000 push 00000404;向外挂程序发送拦截消息ID
:0049680B A1D0664900 mov eax, dword ptr [004966D0];[004966d0]中包含的是外挂窗口的窗口句柄
:00496810 50 push eax
:00496811 3EFF1574924700 call dword ptr ds:[00