所以我知道x86机器语言和C ++ / C语言。在过去的几周里,我一直致力于学习Windows内部知识,尤其是PE格式。我的目标是检索《古墓丽影:黑暗天使》源代码文件。这是10年前(2003年)发布的3d电子游戏,使用C和C ++语言编写。该代码都是使用VC ++ 6.0和Intel C ++ 7.1编译的。我试图从中猜测初始源代码的文件是PE格式的可执行文件,其中包括带有公共符号的ProgramDataBase文件(v2.0)。它们的名称为TRAOD,TRAOD_P3和TRAOD_P4(不包括文件扩展名(.exe.PDB),因为第一个是使用vc ++编译的,另一个是使用ic ++的,分别是奔腾3和奔腾4目标处理器的。 >我正在使用IDA Pro打开可执行文件并映射PDB符号。然后,我将机器指令转换为它们的C ++等效项,然后将它们丢弃到一个大的缓存文件中。然后,我使用dbh.exe将功能映射到它们匹配的源文件中(因为PDB文件具有公共功能的源行信息)。但是在转到下一个功能之前,我先使用包含该功能的vc ++或ic ++在测试可执行文件中进行编译,然后将结果与原始功能进行比较(我的意思是将与目标功能等效的机器代码与测试exe和游戏进行比较一)。但是后来我认为这样做效率不高,因为没有考虑许多其他过程。我的意思是,PDB文件比dbh程序转储的文件包含更多的信息,PE文件也可能包含更多的信息。在有关PE文件格式的文章中,据说它与.OBJ非常相似,链接器使用这些文件来生成exe。因此,浏览.OBJ文件然后猜测源代码还是只使用exe更好?我还读到,要从PE生成.OBJ文件,您需要有一些符号,而我也从PDB文件中获得了这些符号,因此我认为这种转换是可能的。另外,如果您还有其他想法如何对这个游戏进行反编译,请与我分享-我真的想实现这一目标。

编辑:我也在搜索文档,但.PDB格式(v2.0)和有关VC ++ 6.0生成的.OBJ和.LIB文件。

评论

关于机器代码可执行文件的反编译以及为什么这不是一件容易的事,请参阅此问题。

#1 楼

鉴于您还没有.obj文件,因此尝试从.exe和.pdb文件生成.obj文件,然后对生成的.obj文件进行反向工程是没有意义的。如果要执行此操作,则.obj文件中将没有.exe或.pdb文件中没有的任何信息。因此,最好只使用.exe和.pdb文件。

对于代码的反向工程,当尝试将x86代码反向工程回C时,Hex-Rays非常有用。 / C ++源代码。

评论


感谢您的回答,但是反编译每个.obj文件不是更容易和更有条理。我的意思是可执行文件不仅由.obj文件创建,而且也由.lib文件创建。应用程序使用的API中也包含一些.obj。因此,如果我直接使用可执行文件,则应该区分什么是用户编写的代码以及什么已经编码的API函数。编辑:我已经使用了Hex-Rays-顺便说一句,它对我有很大帮助。

–sasho648
13年7月14日在8:34



所以您已经有了.obj文件?

–詹森·格夫纳(Jason Geffner)
13年7月14日在17:20

否,但是我想我可以提取它们(它们的文件名存储在PDB文件中,我怀疑它们在PE文件中的组成部分也已描述,但不幸的是,我找不到它的格式的很好解释- PDB之一)。我的观点是,反编译和测试可执行文件的一小部分可能比编译整个测试可执行文件容易得多。

–sasho648
13年7月14日在17:45

因此,听起来您正在询问如何从PDB文件中提取信息。您最好开始一个新问题,因为您的原始问题已经得到回答。但是,对于FWIW,请参见此处以获取可以从PDB中提取的值:msdn.microsoft.com/en-us/library/4sy4ebfw.aspx

–詹森·格夫纳(Jason Geffner)
13年7月14日在19:07

#2 楼

如果您打算对游戏进行反向工程,是为了学习游戏的制作方式,那么您很可能最终会重新创建C / C ++文件(至少是主要组件)。恐怕没有固定的组装方法,您无法扭转某些事情并充分了解内部工作原理。有几种工具可以帮助您的工作。您可以使用几个出色的调试器:OllyDBG和Immunity Debugger。显然有Hex-Rays,它提供几种产品。有IDA,它是出色的多处理器分解器。 IDA有2个版本:免费版和商业版。还有Hex-Rays反编译器

评论


抱歉,这里没有新信息。无论如何,谢谢你的回答。

–sasho648
13年7月14日在8:38

#3 楼

如果您对真正消化PE格式感兴趣,则绝对希望在此处查看参考:http://blog.dkbza.org/2012/08/pe-file-format-graphs.html

这些图非常完美,即使分析标题以阻止RE,也可以绝对帮助您分析PE格式的未知文件。

评论


嗯,一个奇怪的解释。顺便说一句,我想拥有一些有关.PDB文件格式(v2.0)的文档,但本书《 Windows 2000 Undocumented secrets》已经读过它的描述,但不幸的是它并不完整(无处提及)流实际上代表。)。我也想了解更多有关VC ++ 6.0生成的.OBJ和.LIB文件的信息。谢谢。

–sasho648
13年7月14日在8:40