最近得到了一个小玩意,一个游戏外挂(或者叫做辅助)。在Windows 10上运行两分钟左右系统就会蓝屏,基本无法使用。不过,倒是可以用它来写一篇教程。
这是一个用易语言来开发的游戏外挂,它通过截获和发送网络封包来模拟客户端操作,实现外挂功能。当然,这篇文章要讲的内容和外挂本身的功能无关。这个外挂有一个令人反感的“功能”,每次启动的时候,都会检查收藏夹里是否存在某个网站的快捷方式,如果没有,将会往你的收藏夹里塞入一个URL快捷方式。
不过我倒是认为,这个快捷方式和作者本人无关。因为名字看起来更像一个大而全的外挂开发交流论坛。为什么会这样呢?因为许多易语言外挂都使用了某些论坛提供的“易语言模块”,里面封装了内存读写、DLL注入、驱动安装卸载、抓包发包等外挂开发常用功能模块。其中有一些“易语言模块”会夹带私货,在背后悄悄地做一些不为人知的事情。受害者包括外挂开发者以外,还包括所有外挂使用者。
本文将以一个实例来教你怎样从已经编译好的程序中,去除这些不需要的代码。
摸底
在对一个程序开刀之前,先对它做一个初步的了解。
首先用PEiD查壳,结果为Visual C++ 6.0。对于外挂程序,这个结果说明十有八九是使用易语言开发的。而且应该没有加壳。
随意找一个PE文件资源编辑器,打开它,如果找到类似这样的窗口资源,那就是易语言程序了。
易语言编译出的程序里夹带的私货实在是太多啦!
知道上述信息以后,我们就可以直接开始开工了。
调教
360安全卫士拦截到的程序行为是这个样子的:
我们可以从这个信息开始下手。我们可以肯定的是,这个程序做这件事情的时候,一定会创建文件。
然后我们可以看看Windows API中有哪一个能创建文件。最常用的有两个:
CreateFileA
CreateFileW
上面的是ASCII版本,下面的是Unicode版本。
用Ollydbg载入目标,设置断点,然后运行试一试。
运行之后程序在这个地方断了下来:
我们可以看到右下角的参数列表正好是我们所希望的,不过目前位于内核模块中,我们要改的不是Windows系统DLL,所以我们需要跳到程序模块里去。
点击OD工具栏上的“K”,查看调用堆栈。
一直按Ctrl+F9,这样程序会不停地执行到return语句,直到看到主程序模块为止。
这时候下一步就是主模块了,按F7,即可运行到主模块中。
我们可以看到函数返回以后,来到了00471D8C的位置。而上面正好有一个CALL,可以推测刚才那一长串调用堆栈都是从这个CALL开始的。
C++中的函数调用编译成x86汇编后,它长得像这样:
push 存放最右边的参数的寄存器
push 存放中间的参数的寄存器
push 存放最左边的参数的寄存器
call 函数地址
将参数列表从右往左压入堆栈,然后CALL一下函数地址,即可完成一次函数调用。这中间可能会穿插mov指令,用来将参数送入寄存器中。
完整的函数调用是这么一块:
全部用空指令填充:
然后就可以保存文件了:
好了,检验装逼是否成功的时刻到了!
运行了一下,程序已经不会再写收藏夹了,并且程序可以正常工作。这说明装逼非常成功。