第62章 魔数与程序调试

通常来说,逆向工程的主要目标理解程序处理数据的具体方法。这些数据可能来自于某个文件或者来自于网络通信,不过数据的出处无关紧要。手工跟踪一个值往往是一项非常劳神费力的事情。为了完成这个任务,一个最简单的方法是使用自己的特有魔数,虽然这个办法不是百分之百可靠。

在某种意义上讲,魔数的作用和X光的造影剂十分相似:在病人的血液里注入造影剂之后,医生就可以增强X射线的观察效果、清晰地观察病人身体的内部情况。借助造影剂的作用,医生可以在X光机下清晰地观察肾脏里血液的循环过程,从而更为准确地判断脏器是否存在结石或者肿瘤等问题。

魔数要尽量“打眼”。在观测32位数据时,我们可以将魔数设置为0x0BADF00D(BADFOOD)、或者0x11101979(某人的生日,例如“1979年11月10日”)。我们可以将这样的4字节数值写入到我们要调查的程序之中。

接着,我们可以利用tracer的代码覆盖率模式(code coverage/cc模式)跟踪程序,再利用grep或者直接搜索文本文件(跟踪结果的文本文件),我们就能够很容易地发现这些值的调用点及处理方法。

在代码覆盖率模式(cc模式)下,使用tracer跟踪程序并生成与grep兼容的输出(grepable)文件。其结果大致如下所示:

0x150bf66 (_kziaia+0x14), e=         1 [MOV EBX, [EBP+8]] [EBP+8]=0xf59c934
0x150bf69 (_kziaia+0x17), e=         1 [MOV EDX, [69AEB08h]] [69AEB08h]=0
0x150bf6f (_kziaia+0x1d), e=         1 [FS: MOV EAX, [2Ch]]
0x150bf75 (_kziaia+0x23), e=         1 [MOV ECX, [EAX+EDX*4]] [EAX+EDX*4]=0xf1ac360
0x150bf78 (_kziaia+0x26), e=         1 [MOV [EBP-4], ECX] ECX=0xf1ac360

我们同样可以在网络数据包中构造魔数。使用魔数的关键在于:要使用不会重复的且不会在程序里出现的标志性数据。

除了跟踪器tracer之外,MS-DOS模拟器(DosBox)也可以用来观测魔数。在heavydebug(重度调试)模式下,DosBox可以把执行每条指令时的寄存器状态输出到纯文本文件[1]。因此,我们同样可以利用魔数来调试DOS程序。


[1] 关于MS-DOS模拟器(DosBox)的特性可以查询以下博客:https://yurichev.com/blog/ 55/。