继续翻看Functions界面的函数,可以看到一堆标上蓝底且有特殊命名的函数,说明IDAPro确实识别了其中的一些函数并且解释了其中的作用,但是,这些函数其实跟英杰传的作用并不大,因为这些函数算库函数,相当于是一些已经写好的并且程序可以直接调用的函数,而这些函数也算是替我们把大部分程序启动和结束的事情做了,而中间的事情由程序的作者来设计,也就是用户代码中的函数才是我们研究的重点,但由于没有原始代码对照,用户代码一般不会被IDAPro识别出具体的函数和功能。
所以我们先从简单的函数来观察,代码是怎么改变AX寄存器的值。Functions界面的右上角有个放大的按钮(鼠标移动上去是Fullscreen),或者向右拉伸Functions界面的宽度,移动下面的滚动条,就能看到Function name右边还有Segment, Start, Length, Local, Argument等区分这些函数的参数。说实话,这个Functions界面的用法就和Windows系统下的文件资源管理器差不多的用法,总之我们要注意到Length这个参数,点击一下Length,就能让Functions界面的函数从小到大排序,或者从大到小排序。我们注意那些nullsub函数大部分长度都是1,不用看就知道里面的代码都是retf,看下面几个长度不超过5的简单函数都在做什么事。
seg001:D6C6 sub_2A626 proc far ; CODE XREF: sub_2A63A+10B↓P
seg001:D6C6 ; sub_2A768+FC↓P
seg001:D6C6 ; DATA XREF: ...
seg001:D6C6 B0 FF mov al, 0FFh
seg001:D6C8 CB retf
seg001:D6C8 sub_2A626 endp
seg001:D6CA sub_2A62A proc far ; CODE XREF: sub_2A63A+10B↓P
seg001:D6CA ; sub_2A768+FC↓P
seg001:D6CA ; DATA XREF: ...
seg001:D6CA B0 FF mov al, 0FFh
seg001:D6CC CB retf
seg001:D6CC sub_2A62A endp
seg003:18E2 sub_3E7E2 proc far ; CODE XREF: sub_3E990+60↓P
seg003:18E2 ; DATA XREF: dseg:432C↓o
seg003:18E2 33 C0 xor ax, ax
seg003:18E4 CB retf
seg003:18E4 sub_3E7E2 endp
seg001:E114 sub_2B074 proc far ; CODE XREF: sub_2B078+7↓P
seg001:E114 ; DATA XREF: dseg:off_42B8E↓o
seg001:E114 32 C0 xor al, al
seg001:E116 CB retf
seg001:E116 sub_2B074 endp
seg003:164C sub_3E54C proc far ; CODE XREF: sub_3E990+60↓P
seg003:164C ; DATA XREF: dseg:41F8↓o ...
seg003:164C B8 02 00 mov ax, 2
seg003:164F CB retf
seg003:164F sub_3E54C endp
我们发现了AL这个寄存器,这个寄存器和AX寄存器有什么关系?请看下一节的介绍。