逆向基础--源程序编译-连接-跟踪(09)

一.编译

  当完成一个源程序的编写,保存为1.asm文件。之后就可以进行编译了。编译需要相应的编译器,我们采用的masm汇编编译器。上一章中有介绍使用的方法。

  在之前文章中有介绍进入DOS后,如何设置虚拟c盘,并在配置文件中设置好,方便打开dos时直接进入c盘,输入masm会显示版本信息,如下所示:

image

   默认的扩展名是asm,如果要编译的源程序文件名为p1.asm,上面这里只需要输入p1即可,如果源程序文件名字不是asm的扩展名则需要输入全名。比如文件名为p1.txt。

  输入文件名目的是让系统根据对应的文件名找到对应的文件,如果可执行的文件与masm文件不在同一级目录下,这个文件的所在路径是c:\code\1.txt,那么需要输入带路径的全名,如下图所示:

image

   在编译过程中出现错误的话将不会生成目标文件,程序的出错的标志:  

    1)程序中有Severe Errors

     2) 找不到源程序(.asm)文件

 

二.连接

  对源文件进行编译得到目标文件之后,需要对目标文件进行连接,从而得到可执行文件。我们需要使用连接工具Link.exe.下图所示,输入obj文件,生成exe文件。

image

  为什么需要使用连接?

    1)当源程序很大时,我们可以将它分多个源程序进行编译,每个源程序都将产生一个目标文件,我们需要用连接将多个目标连接成一个可执行文件。

    2)程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接在一起,最终生成一个可执行文件。

    3)一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用于生成可执行文件,需要经过连接程序将这些内容处理为最终的可执行信息。即使只有一个源文件和没有调用某个库的时候也需要进行连接。

  简化编译和连接的方法:

    1)编译:masm 1.asm;   

    2)  连接 :link 1.obj;

    上述的两个指令指定了需要编译和连接的文件,并且用【;】分号表示生成默认的文件。

    编译指令默认生成1.obj。 连接指令默认生成1.exe。

    如下图所示:

image

 三.跟踪

  我们利用Debug来跟踪一个程序的运行过程,也可以叫调试。对于简单的错误,仔细检查源程序即可发现问题。但是对于隐藏较深的错误,就需要对程序的执行过程进行跟踪分析才可以发现。

  例如在上一篇08中,通过跟踪发现AX的取值不对,再通过反编译查看代码知道了ADD AX,BX 是错误的。

  使用debug将程序加载入内存,设置cs:ip指向程序的入口。

  使用-r 命令来查看各个寄存器的设置情况,如下图所示, 可以看到CS:IP指向076A:0000内存单元,也就是说第一条要执行的指令在该地址单元中

    --最后一行看到: 076A:0000 B86B07  MOV AX,076B。这里指示了第一条指令的地址、机器码、对应的汇编指令

image

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

image

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

image

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

image

 

  

posted on 2025-11-07 21:09  花阴偷移  阅读(13)  评论(0)    收藏  举报

导航