目前的软件往往都很庞大,可以说,极简主义不是现代软件的突出特性。但是这并不是说当下的编程者书写的程序代码行多了,而是因为很多的库都普遍与可执行文件静态地链接在一起了。如果所有的外部库都转移至外部动态链接库DLL的话,那么可能情况就会有所不同(对于C++而言,另外的一个理由是静态模板库STL以及其他的模板库文件)。
因此,确定函数的来源很重要,其或者是来自标准库或者通用库(类似Boost和libpng),或者是与我们要找的代码相关。
为了找到我们要的代码而重新编写代码是有些荒唐。
对于一个反编译的工程师来说,一个主要的工作是快速地发现他要找的代码。
反编译工具IDA能让我们在字符串、字节串以及常数中搜索字符串。该工具甚至能将代码输出到lst或则asm文件中,进而可以采用grep和awk等命令处理字符串。
当想要知道某些代码是做什么用的时候,它可能采用一些开源的库(类似上面提到的libpng),因此当你看到一些变量、常数或者字符串很熟悉时,可以用Google搜索一下。如果发现一个开源工程在使用时,就可以拿来做比较。这样的话,也能解决一部分问题。
例如,如果一个程序采用了XML文件,第一步就需要确定采用了XML的哪个库来做处理过程,因为通常都是采用的标准库或者通用库,而不是开发者自己来自行开发。
再举一个例子,在SAP 6.0的软件中,笔者曾经试图了解网络数据包是如何压缩并解压缩的。因为它是一个很大的软件,一个包括调试信息在内的PDB文件使用起来比较方便。通过它能发现一个函数CsDecomprLZC被调用,而这个函数就是对网络数据包进行解压缩的。因此通过查询Google就能发现这个函数是用在了MaxDB中,而这就是一个SAP的开源项目。
查询的命令是:http://www.google.com/search?q=CsDecomprLZC
。
令人吃惊的是,MaxDB和SAP 6.0 软件在网络数据的压缩和解压缩方面采用了相同的代码。