逆向工程

你玩游戏么?单机游戏,你是否使用过游戏补丁、修改器?

逆向工程,又称逆向技术,是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。

而软件逆向工程,随着计算机技术在各个领域的广泛应用,特别是软件开发技术的迅猛发展,基于某个软件,以反汇编阅读源码的方式去推断其数据结构、体系结构和程序设计信息成为软件逆向工程技术关注的主要对象。软件逆向技术的目的是用来研究和学习先进的技术,特别是当手里没有合适的文档资料,而你又很需要实现某个软件的功能的时候。也正因为这样,很多软件为了垄断技术,在软件安装之前,要求用户同意不去逆向研究。

而,这是重点:逆向工程的实施过程是多领域、多学科的协同过程。

我们拿它来讲解

首先,我声明一点,本文一切仅为技术探讨,并不包含任何攻击性、负面性侵犯。我酷爱俄罗斯方块,而其中火拼俄罗斯更为火爆。记得当年不日不夜的练习俄罗斯方块,试图在 3V3 竞技中一展宏图。却没有料到高手甚多,秒我乃拈花摘叶,随手即来。

此刻,如何是好?

假如,我有一个,传说中的神兵,是不是可以逆转这样狼狈的局面呢?嗯,有趣,甚是有趣。那么,我们就开始造兵器——打造一款,传说中火拼俄罗斯方块辅助如何?

首先,要打造一个辅助,你必须介入程序,怎么介入?

远程注入 DLL!

DLL 的远程注入技术是目前 Win32 病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个 DLL 中,在系统启动的时候,一个 EXE 程序会将这个 DLL 加载至某些系统进程(如 Explorer.exe)中运行。

这样一来,普通的进程管理器就很难发现这种病毒了,而且即使发现了也很难清除,因为只要病毒寄生的进程不终止运行,那么这个 DLL 就不会在内存中卸载。

用户也就无法在资源管理器中删除这个 DLL 文件,真可谓一箭双雕哉。记得 2003年QQ 尾巴病毒肆虐的时候,就已经有些尾巴病毒的变种在使用这种技术了。你需要了解以下几个 API 函数:

  • OpenProcess – 用于打开要寄生的目标进程。
  • VirtualAllocEx/VirtualFreeEx – 用于在目标进程中分配 / 释放内存空间
  • WriteProcessMemory – 用于在目标进程中写入要加载的 DLL 名称。
  • CreateRemoteThread – 远程加载 DLL 的核心内容,用于控制目标进程调用 API 函数。
  • LoadLibrary – 目标进程通过调用此函数来加载病毒 DLL。

在此我只给出了简要的函数说明,关于函数的详细功能和介绍请参阅 MSDN。还有,至于代码,本文不贴代码,只讲技术,有兴趣可以自行谷歌。

如此以来,就可以将自己写的 DLL,注入到火拼俄罗斯方块这个程序里,并且让他运行起来。

DLL 里实现什么?

DLL 里需要实现的就是一套基于人工智能的玩火拼俄罗斯的机器人。我们假设已经有一款超高智能的 LIB 已经被我们引入。那么,DLL 还需要就是实现模拟控制的一些方法。还需要什么?还需要当前方块的样子,下一个方块的样子,当前自己摆放的样子,甚至还可能需要知道对手摆放的样子,自己获得了哪些道具。

这些数据,怎么来?

图像识别,将当前窗口截图,然后开始根据 X Y 的坐标进行分析,通过图像识别的方法,获得当前方块样子,自己摆放的样子,对手的样子。

这样做好么?

这是比较直观的方案,但是每次都要扫描,进行图像比较,然后获得数据,你会直观的觉得,那会快么?效率高么?假定有了这些数据,你还要做什么?当然就是操作了,移动方块,变形方块,下落方块和使用道具了。这又如何做呢?简单,模拟鼠标键盘按键,然后操作就好了。

__01

听起来,这一套,似乎是不错的方案,不是么?NO,这样做出来,顶多算一个兵器,要称之为神兵,估计还是有一点点距离的!那么,神兵的话,我们该如何打造?

分析内存,从内从中找到当前方块,自己摆放的样子,对手的样子。分析程序,获得开发者实现操作函数,并且调用这些函数。于是?听起来很深奥的样子,能办到么?

逆向工具

在这里,我只为大家普及工具,就不一一演示,我只做简单的介绍和说明。

静态分析工具 IDA,交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为 IDA Pro,或简称为 IDA,是总部位于比利时列日市(Liège)的 Hex-Rayd 公司的一款产品。开发 IDA 的是一位编程天才,名叫 Ilfak Guilfanov。十年前诞生时,IDA 还是一个基于控制台的 MS-DOS 应用程序,这一点很重要,因为它有助于我们理解 IDA 用户界面的本质。除其他内容外,IDA 的非 Windows 和非 GUI 版本仍然继续采用源于最初 DOS 版本的控制台形式的界面。

__02

动态调试工具有 OD(OllyDBG)和 windbg。 调试应用层程序两个调试器都可以,OD 因为主要面向逆向,窗口布局更为合理直观且插件众多,所以一般情况下都首选 OD,windbg 没那么方便,大部分操作通过命令来进行,但它也有它的优势,各种命令(内置命令、元命令和扩展命令)提供了强大的控制和分析能力,所以 windbg 有时也会用到。如果要调试内核程序或模块那 OD 就无能为力了,windbg 可以说是唯一的选择,以前还有个 softice,但 softice 已经停止更新和支持,现在已经没什么了用了。

__03

侦壳工具 PEid,但实际结果还是工具加上自己的分析。脱壳,尽量手动。二进制编辑工具 UltraEdit、Hex Workshop 以及 WinHex,比较工具 Beyond Compare。网络包抓包分析工具 Wireshark 和 Iris。文件和注册表监视工具 Process Monitor。最后,虚拟机,VM 不二。

开始逆向

有了工具,我们就可以开始对火拼俄罗斯进行逆向分析了,逆向是一个复杂而繁琐的过程。会经历无数的尝试,代码分析,逻辑分析。如果是分析游戏,如果您是游戏开发者,或许思路更为广泛,可以明白一些开发者的正常思维。
那么,这个游戏,我们入手点在那?

用 OD 附加俄罗斯方块,找到一个关键点,这个关键点就是,游戏初始化。

__05

从正常的开发角度来想,在初始化的时候,一般都会清空数据。无论是从网络还是本地,都会分配方块的样式。然后从这里入手,我就很快的找到了几个内存地址。从这些地址中,可以得到当前方块的样式,并且可以预知下一个方块的样式,并且得到了当前摆放的游戏池中的样式。然后,紧接着,就找寻控制移动的地方。很快,就从按键得到一些信息,找到了。

其中,所有下落后的方块,我们可以在 OD 中看到他的内存样式,其中表示红色的,就是被改变的数据。什么数据被改变呢?就是确定下落后的方块,数字代表了方块的颜色,也可以说是方块的样式。内存中的分布如图可见。

__06

然后,通过注入 DLL 到进程,做出了一个插件。图片中演示了插件工作的样式。

__04

其中,已经预知了下几个方块的样式,并且得到了游戏棋盘的数据,AUTO 就是自动开始游戏。测试了效果还不错。

结束了吗?

其实逆向的还有很多很多高深的奥秘。我也只是一个初级者。现在大多数的程序,都加入了一些反调。并且为自己的程序加入了一些壳。简单说说,世界比较知名的高强度壳就是 VMProtect,Themida ,SE (Safengine) 等等。其中,TW(Themida Winlicense)当时搞得我头大,他的反调很是有趣。而,对于游戏来说,很多游戏都加入了驱动级的保护,比如腾讯的 TP(TenProtect),韩国公司的 HS(HackShield),还有 NEXON 的 NGS (Nexon Game Security) ,完美的 PP 等等等。

现在安全越来越被大家重视,而公司安全逆向组一般都会做一些病毒样本分析,也会做一些公司产品的防护。而这是一个博大精深的世界,里面非常的有趣,也富有挑战。所以,一文的简单介绍,希望能把你吸引进入,这个神奇的界域。

余下全文(1/3)

本文最初发表在36氪,文章内容属作者个人观点,不代表本站立场。

分享这篇文章:

请关注我们:

发表评论

电子邮件地址不会被公开。 必填项已用*标注