逆向工程
你玩游戏么?单机游戏,你是否使用过游戏补丁、修改器?
逆向工程,又称逆向技术,是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。逆向工程源于商业及军事领域中的硬件分析。其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。
而软件逆向工程,随着计算机技术在各个领域的广泛应用,特别是软件开发技术的迅猛发展,基于某个软件,以反汇编阅读源码的方式去推断其数据结构、体系结构和程序设计信息成为软件逆向工程技术关注的主要对象。软件逆向技术的目的是用来研究和学习先进的技术,特别是当手里没有合适的文档资料,而你又很需要实现某个软件的功能的时候。也正因为这样,很多软件为了垄断技术,在软件安装之前,要求用户同意不去逆向研究。
而,这是重点:逆向工程的实施过程是多领域、多学科的协同过程。
我们拿它来讲解
首先,我声明一点,本文一切仅为技术探讨,并不包含任何攻击性、负面性侵犯。我酷爱俄罗斯方块,而其中火拼俄罗斯更为火爆。记得当年不日不夜的练习俄罗斯方块,试图在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的坐标进行分析,通过图像识别的方法,获得当前方块样子,自己摆放的样子,对手的样子。
这样做好么?
这是比较直观的方案,但是每次都要扫描,进行图像比较,然后获得数据,你会直观的觉得,那会快么?效率高么?假定有了这些数据,你还要做什么?当然就是操作了,移动方块,变形方块,下落方块和使用道具了。这又如何做呢?简单,模拟鼠标键盘按键,然后操作就好了。听起来,这一套,似乎是不错的方案,不是么?
NO,这样做出来,顶多算一个兵器,要称之为神兵,估计还是有一点点距离的!那么,神兵的话,我们该如何打造?
分析内存,从内从中找到当前方块,自己摆放的样子,对手的样子。分析程序,获得开发者实现操作函数,并且调用这些函数。于是?听起来很深奥的样子,能办到么?
逆向工具
在这里,我只为大家普及工具,就不一一演示,我只做简单的介绍和说明。
静态分析工具 IDA,交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA,是总部位于比利时列日市(Liège)的Hex-Rayd公司的一款产品。开发IDA的是一位编程天才,名叫Ilfak Guilfanov。十年前诞生时,IDA还是一个基于控制台的MS-DOS应用程序,这一点很重要,因为它有助于我们理解IDA用户界面的本质。除其他内容外,IDA的非Windows和非GUI版本仍然继续采用源于最初DOS版本的控制台形式的界面。
动态调试工具有OD(OllyDBG)和windbg。 调试应用层程序两个调试器都可以,OD因为主要面向逆向,窗口布局更为合理直观且插件众多,所以一般情况下都首选OD,windbg没那么方便,大部分操作通过命令来进行,但它也有它的优势,各种命令(内置命令、元命令和扩展命令)提供了强大的控制和分析能力,所以windbg有时也会用到。如果要调试内核程序或模块那OD就无能为力了,windbg可以说是唯一的选择,以前还有个 softice,但 softice已经停止更新和支持,现在已经没什么了用了。
侦壳工具 PEid,但实际结果还是工具加上自己的分析。脱壳,尽量手动。二进制编辑工具UltraEdit、Hex Workshop以及WinHex,比较工具 Beyond Compare。网络包抓包分析工具Wireshark和Iris。文件和注册表监视工具Process Monitor。最后,虚拟机,VM不二。
开始逆向
有了工具,我们就可以开始对火拼俄罗斯进行逆向分析了,逆向是一个复杂而繁琐的过程。会经历无数的尝试,代码分析,逻辑分析。如果是分析游戏,如果您是游戏开发者,或许思路更为广泛,可以明白一些开发者的正常思维。
那么,这个游戏,我们入手点在那?
用OD附加俄罗斯方块,找到一个关键点,这个关键点就是,游戏初始化。
从正常的开发角度来想,在初始化的时候,一般都会清空数据。无论是从网络还是本地,都会分配方块的样式。然后从这里入手,我就很快的找到了几个内存地址。从这些地址中,可以得到当前方块的样式,并且可以预知下一个方块的样式,并且得到了当前摆放的游戏池中的样式。然后,紧接着,就找寻控制移动的地方。很快,就从按键得到一些信息,找到了。
其中,所有下落后的方块,我们可以在OD中看到他的内存样式,其中表示红色的,就是被改变的数据。什么数据被改变呢?就是确定下落后的方块,数字代表了方块的颜色,也可以说是方块的样式。内存中的分布如图可见。
然后,通过注入DLL到进程,做出了一个插件。图片中演示了插件工作的样式。
其中,已经预知了下几个方块的样式,并且得到了游戏棋盘的数据,AUTO就是自动开始游戏。测试了效果还不错。
结束了吗?
其实逆向的还有很多很多高深的奥秘。我也只是一个初级者。现在大多数的程序,都加入了一些反调。并且为自己的程序加入了一些壳。简单说说,世界比较知名的高强度壳就是VMProtect,Themida ,SE(Safengine)等等。其中,TW(Themida Winlicense)当时搞得我头大,他的反调很是有趣。而,对于游戏来说,很多游戏都加入了驱动级的保护,比如腾讯的TP(TenProtect),韩国公司的HS(HackShield),还有NEXON的NGS(Nexon Game Security) ,完美的PP等等等。
现在安全越来越被大家重视,而公司安全逆向组一般都会做一些病毒样本分析,也会做一些公司产品的防护。而这是一个博大精深的世界,里面非常的有趣,也富有挑战。所以,一文的简单介绍,希望能把你吸引进入,这个神奇的界域。
本文作者:Garfield(点融黑帮),现任职于点融技术部Social团队,游戏引擎 tyo Engine 及 tyo Engine Revolution作者,对尖端渲染技术拥有浓厚兴趣,曾就职于多家游戏大厂参与游戏引擎研发相关工作。
网友评论