超入门级的软件破解实例

  最近得到了一个小玩意,一个游戏外挂(或者叫做辅助)。在Windows 10上运行两分钟左右系统就会蓝屏,基本无法使用。不过,倒是可以用它来写一篇教程。

  这是一个用易语言来开发的游戏外挂,它通过截获和发送网络封包来模拟客户端操作,实现外挂功能。当然,这篇文章要讲的内容和外挂本身的功能无关。这个外挂有一个令人反感的“功能”,每次启动的时候,都会检查收藏夹里是否存在某个网站的快捷方式,如果没有,将会往你的收藏夹里塞入一个URL快捷方式。

  不过我倒是认为,这个快捷方式和作者本人无关。因为名字看起来更像一个大而全的外挂开发交流论坛。为什么会这样呢?因为许多易语言外挂都使用了某些论坛提供的“易语言模块”,里面封装了内存读写、DLL注入、驱动安装卸载、抓包发包等外挂开发常用功能模块。其中有一些“易语言模块”会夹带私货,在背后悄悄地做一些不为人知的事情。受害者包括外挂开发者以外,还包括所有外挂使用者。

  本文将以一个实例来教你怎样从已经编译好的程序中,去除这些不需要的代码。

摸底

  在对一个程序开刀之前,先对它做一个初步的了解。

  首先用PEiD查壳,结果为Visual C++ 6.0。对于外挂程序,这个结果说明十有八九是使用易语言开发的。而且应该没有加壳。

  随意找一个PE文件资源编辑器,打开它,如果找到类似这样的窗口资源,那就是易语言程序了。
0.png
  易语言编译出的程序里夹带的私货实在是太多啦!

  知道上述信息以后,我们就可以直接开始开工了。

调教

  360安全卫士拦截到的程序行为是这个样子的:
1.png

  我们可以从这个信息开始下手。我们可以肯定的是,这个程序做这件事情的时候,一定会创建文件。

  然后我们可以看看Windows API中有哪一个能创建文件。最常用的有两个:

CreateFileA
CreateFileW

  上面的是ASCII版本,下面的是Unicode版本。

  用Ollydbg载入目标,设置断点,然后运行试一试。
2.png

  运行之后程序在这个地方断了下来:
3.png

  我们可以看到右下角的参数列表正好是我们所希望的,不过目前位于内核模块中,我们要改的不是Windows系统DLL,所以我们需要跳到程序模块里去。

  点击OD工具栏上的“K”,查看调用堆栈。
4.png

  一直按Ctrl+F9,这样程序会不停地执行到return语句,直到看到主程序模块为止。
5.png
6.png

  这时候下一步就是主模块了,按F7,即可运行到主模块中。
7.png

  我们可以看到函数返回以后,来到了00471D8C的位置。而上面正好有一个CALL,可以推测刚才那一长串调用堆栈都是从这个CALL开始的。

  C++中的函数调用编译成x86汇编后,它长得像这样:

push 存放最右边的参数的寄存器
push 存放中间的参数的寄存器
push 存放最左边的参数的寄存器
call 函数地址

  将参数列表从右往左压入堆栈,然后CALL一下函数地址,即可完成一次函数调用。这中间可能会穿插mov指令,用来将参数送入寄存器中。

  完整的函数调用是这么一块:
8.png

  全部用空指令填充:
9.png
10.png

  然后就可以保存文件了:
11.png
12.png
13.png

  好了,检验装逼是否成功的时刻到了!

  运行了一下,程序已经不会再写收藏夹了,并且程序可以正常工作。这说明装逼非常成功。

发表评论