GEMINIGHT 警告:您的浏览器不支持JavaScript将无法正常浏览!
Warning: Your browser does not support JavaScript!
📋注册(Register) | 📛登录(Login)
🎲

主站(Home) »  论坛(Forum)  » 程序编写(Program)
GEMINIGHT

自称:发贴器2号
等级:发贴器
帖子数:5173
积分:9588
阅读权限:99
[转贴] 揭开游戏程序的核心秘密-游戏程序逆向工程 1楼
Tags引力关联贴

来源:3DMGAME  作者:DogKarl

\N

看到3DH工作室的杰出的作品,相信许多的新人们对于程序制作相当感兴趣,但是从来没有一个系统的教程来指导大家如何做到这些东西。近来逆向Battle Raper 2过程中,发现了一些新的东西(对我而言),因此把经验写下来,希望对新人有所帮助。

\N


整个教程分为若干课,我将从基础的逆向工程常识讲起,介绍逆向的基本方法,以及对于D3D程序的特殊的处理技巧,最后给出BR2 XX文件的详细格式。整个教程将以Battle Raper 2作为实例。
\N

注意:此教程适用于有一定C语言基础和汇编基础的人。我假设此教程读者对于D3D和COM,以及逆向工程并不熟悉,因此仅仅要求大家可以看懂汇编以及C
因为我自身也有很多的学习任务,更新不会很快,如果大家喜欢的话,我会尽快写完。

\N

第一课:什么是逆向工程?

\N

首先DogKarl向大家问好。

\N
\N

相信对于程序制作相当感兴趣新人们有很大的热情,但是作为比较特殊的一种程序制作---我是指游戏汉化,模型截取,格式破解来说,并不是像各位手中的标准编程书籍里面的程序设计那么简单:一个游戏公司会给你他的文件格式资料吗?你编写程序时会像写普通的程序那么简单吗?游戏公司会给你成熟的SDK用吗?进一步说,游戏的源代码会给你吗?非常遗憾的是,以上问题的答案在大多数情况下都是No! You will never get it from us!

\N

\N

那么我们是否就此放弃?答案也是No. 的确有一种方法可以获得游戏程序中的秘密:文件格式,数据存贮方法,渲染的设置。。。等等,只要是有关的秘密都可以获得。这种方法就是逆向工程。

\N

\N

之所以逆向工程不为大家所熟悉,原因其实很简单。逆向工程,作为相当强大一个工具,相但多的人用它来盗版。也就是大家所知的Crack,破解。正因为如此,你在书店你是找不到像是《软件逆向工程指南》一类的书。这个话题比较敏感,但是对于软件商封锁源代码的做法,是一种信息垄断,应对的方法就是逆向工程。

\N

\N

看了这么多,因该给逆向工程下个定义了。其实它就是指单纯从可执行文件获取源代码(一般都是等价代码,不可能原样还原的,但是等价代码也就足够了)的过程和方法。

\N

大家可能有点吃惊:”可以从机器代码还原源代码吗?这个我可没听说过。”

\N

\N

\N


答案是 是的:有一点关于编译的知识的同学知道,源代码编译,连接为机器代码后,其中的信息并没有丢失多少.从机器代码还原源代码是可能的.但是(又是但是!)这需要一个和人一样聪明的程序,现在这类程序还在开发,但对于C的反编译总的来说不太成功。

\N

\N

\N

\N


然而,反编译为汇编代码的程序则是早就写好的,而且功能强大。下面将介绍我们的主要武器IDA Pro。首先一睹她的芳容

\N

\N

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-7/2005742334374.jpg[/upload]

🗓2006-5-26 07:25(约18年前)  👁1758
GEMINIGHT

自称:发贴器2号
等级:发贴器
帖子数:5173
积分:9588
阅读权限:99
2楼
许多的同学可能看到这个界面就头晕。。但是,逆向工程是与汇编打交道,我介绍之后大家就会觉得IDA Pro对于逆向工程最适合不过了。 \N
\N

首先,它可以自动分析和注释已知API函数,并以其参数表为基础,推断出相关的变量功能。 \N

\N

第二,它可以自动注释编译库函数。 \N

\N

第三,它会自动分析C语言函数及其堆栈变量结构。 \N

\N

第四,它可以按照你的要求变更几乎所有的东西,包括函数名,变量名,注释等等,甚至自己定义结构体。 \N

\N

。。。。。。。。。。。。。。。。 \N

\N

主要用的就是这些了(这正是W32asm没有的功能),如果没有这些辅助功能,逆向大的程序是不可能的。 \N

\N

\N

详细的使用手册和软件相信大家都有办法获得。这里介绍几个基本操作。

\N

打开文件:和大多数的Windows程序一样,从File中Open,或是直接拖一个文件到IDA上面,出现对话框,那里有很多选项,不要动它,仅仅点击OK。

\N

IDA开始自动分析,等到分析完成(大程序可能会比较久),就可以浏览汇编的源文件了。

\N

1。导航器介绍:如图:

\N

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-7/200575011971.jpg[/upload]
导航器就是如此了,图例说明了各个色块的含义:

\N

深蓝色:被分析过的函数(可能是该程序程序员编写的函数,或是未识别的库函数)

\N

浅青色:已被识别的库函数(功能已知,不用看了)

\N

深红色:确定为指令,但是不知功能(可能是从来不被调用的指令)

\N

灰色:数据,确定在程序中已使用。

\N

棕色:未知其为何数据。

\N

粉红:API符号。注意:以上颜色在源代码中含义也是一致的。

\N

箭头:当前浏览的位置。

\N

这个导航器主要的功能是让你对于文件组成有个大概的了解。你可以缩放它的比例尺

\N

顺便说一下,以上的图示为br2可执行文件的比例,可以看到程序中只有大约25%的数据是蓝色的。。其他的75%中有25%是库函数,还有50%是D3D的数据。

\N

在导航器上点击,可以直接跳到代码位置,这是一种很大略的定位方法。实际上定位一般使用jump菜单,如下所示

\N

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-7/2005721105614927.jpg[/upload]

\N

最为常用的是“Jump to Address”,在代码窗口中按下G键也可以。出现以下的窗口。

\N

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-7/200572111016149.jpg[/upload]

\N

这个就不用我说明了。主要的作用是定位感兴趣的代码,以后会和动态调试一起讲。

\N

此外常用的代码定位方式是"交叉引用定位":X Cross Reference,这个的意思是你看到一段代码或数据,想知道哪个地方调用了这段代码或是使用了这些数据,这时候使用"交叉引用定位"就极为合适。如下图:

\N

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-7/200572111819162.jpg[/upload]

\N

sub_4C0910是一个函数。是谁调用了他呢?右边绿色的; CODE XREF: Vertex+16p说明了他被Vertex函数调用。在右边的绿色字上双击,你可以直接跳到调用他的代码处。对于数据也是一个道理。这里还介绍一个小的诀窍:有的时候代码被很多的地方调用,右边最多只显示3条,此时可以在绿色字上按下Ctrl+X,出现以下窗口。

\N

完了,图片到限制了,明天再讲。。

🗓2006-5-26 07:27(约18年前)
GEMINIGHT

自称:发贴器2号
等级:发贴器
帖子数:5173
积分:9588
阅读权限:99
3楼

[upload=jpg]http://bbs.chnren.com/UploadFile/2005-9/20059271861826.jpg[/upload]

\N

从这里我们可以看到,在反编译文本里面没有显示完全的函数调用,在窗口中全部显示出来了。当然,从其中任何的一个显示条目都可以跳到相应的代码。

\N

代码的解读

\N

一旦定位了感兴趣的代码,下一步就是阅读它,弄清楚其意图。这个不是可以几天学会的东西。最起码来说,你要有汇编语言的基础,大体上知道在win32 下面的汇编语言程序是怎么回事;你必须知道一个win32程序的基本组成,也就是消息循环,窗口句柄等等相关的内容;最为重要的是,你必须对D3D有一定的理解(这个要求直接与你破解的程序有关,如果程序本身不是太变态,你不用知道很多东西)。

\N

下面所说的,是IDA中最为常见的辅助代码的分析功能。

\N

1.重命名功能:逆向工程最为重要的功能就是这个。为什么呢?答案很简单,你觉得.text:0045C590 sub_45C590 proc near好理解,还是.text:0045C590 SetUpScence proc near好理解?逆向工程最重要的工作,就是从汇编代码里还原编码者的意图。重命名不仅可以清楚的标出你读过的代码的功能,而且保存了你的工作,免得重新再去读一遍。

\N

具体的操作就不用说了。在你想命名的变量名,函数名等等上点击右键,出现下面对话框[upload=jpg]http://bbs.chnren.com/UploadFile/2005-9/2005927184711333.jpg[/upload]

\N

把它改成你想要的名字吧。IDA会自动把和这个名字相关的地址全部重命名。

\N

2.注释 这个的重要性也不用我多说。操作也是一样的,空白处点击右键,输入你的注释

\N

有了这一点基本的知识,你可以在IDA的世界中自由的遨游了。你自己会在IDA的世界中发现更多的东西!

\N

当然,相对于破解来说,这样的一点知识是远远不够的。对于任何想要进入这一领域的有志者而言,下面的资料几乎是必读的。

\N

《加密与解密》(第二版)段钢 :这是关于逆向工程的最起码,而且又全面的教科书。对应的电子概览版是http://www.pediy.com/tutorial.htm,技术支持网站是http://www.pediy.com。大家需要的工具可以在上面找到。同时,里面有很好的东西。

\N

任何一本中文的全面介绍D3D的入门教科书。我就在使用Wolfgan F.Engel的《Direct3D游戏编程入门教程〉。当然,在网上你可以找到非常多的教程,例如www.andypike.com上的教程,就相当好。

\N

[em06]SoftIce,IDA,D3D SDK帮助文件。对于你来说任何必要的东西。

\N

祝你愉快!

🗓2006-5-26 07:29(约18年前)

标题(Title):
关键字标签(Tags):
路人:回贴可以不必登录