逆向基础--源程序编译-连接-跟踪(09)
一.编译
当完成一个源程序的编写,保存为1.asm文件。之后就可以进行编译了。编译需要相应的编译器,我们采用的masm汇编编译器。上一章中有介绍使用的方法。
在之前文章中有介绍进入DOS后,如何设置虚拟c盘,并在配置文件中设置好,方便打开dos时直接进入c盘,输入masm会显示版本信息,如下所示:

默认的扩展名是asm,如果要编译的源程序文件名为p1.asm,上面这里只需要输入p1即可,如果源程序文件名字不是asm的扩展名则需要输入全名。比如文件名为p1.txt。
输入文件名目的是让系统根据对应的文件名找到对应的文件,如果可执行的文件与masm文件不在同一级目录下,这个文件的所在路径是c:\code\1.txt,那么需要输入带路径的全名,如下图所示:

在编译过程中出现错误的话将不会生成目标文件,程序的出错的标志:
1)程序中有Severe Errors
2) 找不到源程序(.asm)文件
二.连接
对源文件进行编译得到目标文件之后,需要对目标文件进行连接,从而得到可执行文件。我们需要使用连接工具Link.exe.下图所示,输入obj文件,生成exe文件。

为什么需要使用连接?
1)当源程序很大时,我们可以将它分多个源程序进行编译,每个源程序都将产生一个目标文件,我们需要用连接将多个目标连接成一个可执行文件。
2)程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接在一起,最终生成一个可执行文件。
3)一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用于生成可执行文件,需要经过连接程序将这些内容处理为最终的可执行信息。即使只有一个源文件和没有调用某个库的时候也需要进行连接。
简化编译和连接的方法:
1)编译:masm 1.asm;
2) 连接 :link 1.obj;
上述的两个指令指定了需要编译和连接的文件,并且用【;】分号表示生成默认的文件。
编译指令默认生成1.obj。 连接指令默认生成1.exe。
如下图所示:

三.跟踪
我们利用Debug来跟踪一个程序的运行过程,也可以叫调试。对于简单的错误,仔细检查源程序即可发现问题。但是对于隐藏较深的错误,就需要对程序的执行过程进行跟踪分析才可以发现。
例如在上一篇08中,通过跟踪发现AX的取值不对,再通过反编译查看代码知道了ADD AX,BX 是错误的。
使用debug将程序加载入内存,设置cs:ip指向程序的入口。
使用-r 命令来查看各个寄存器的设置情况,如下图所示, 可以看到CS:IP指向076A:0000内存单元,也就是说第一条要执行的指令在该地址单元中。
--最后一行看到: 076A:0000 B86B07 MOV AX,076B。这里指示了第一条指令的地址、机器码、对应的汇编指令

使用-u命令反编译查看:第1列是指令的地址; 第2列是机器码; 第3列是汇编指令。如下图所示:

使用 -t 命令进行单步调试执行 ,并观察每条指令执行后对寄存器的影响。最后一行代表是待执行的指令。

一直使用 -t 命令进行单步调试,直到最后看到INT 21这条指令(返回指令相当于return)时我们需要用p命令(显示执行后的结果),如下图所示

浙公网安备 33010602011771号