巧用反汇编 1993-11-26 下面有一个小例子。RⅠ是一个清理内存的小工具。它能把在其后驻留的程序清除掉。笔者对它分析发现一个DOS保留功能调用50H在内存管理二的应用。 对RⅠ反汇编的分析中发现了程序一。 67E6:0777 8C mov ax,cs 67E6:0779 8E C0 mov es,ax 67E6:077B 48 dec ax 67E6:077C 8E D8 mov ds,ax 67E6:077E 33 F6 xor si,si;zeroregister 67E6:0780 BF 0510 mov di, 510h 67E6:0783 FC cld;clear direction 67E6:0784 B9 0010 mov cx, 10h 67E6:0787 F3/A4 rep movsb ;Rep when cx>0 Mov[si]to es:[di] 67E6:0789 33 F6 xor si,si;zero register 该段程序的功能是把程序对应的内存分配块的头部保存到该程序数据区。该分配块是当前内存分配块链中的最后一个。 当RⅠ被键激活后,它通过程序二把程序一中保留的分配块头部恢复使之成为链尾,并通过功能调用50H把RⅠ程序的PSP设为当前PSP,这样当RⅠ退出时,就会根据当前PSP重新分配内存,而这个PSP对应内存分配块根据前面的恢复已是最后一块,故重新分配内存的结果是收回了被驻留程序占用的内存,从而达到了清理内存的目的。见程序二 67E6:05BB 8C C8 mov ax,cs 67E6:05BD 48 dec ax 67E6:05BE 8E C0 mov es,ax 67E6:05C0 5F pop di 67E6:05C1 BE 0510 mov si,510h 67E6:05C4 B9 0005 mov cx,5 67E6:05C7 F3/A4 rep movsb;Rep when cx>0 mov [si]toes:[di] 67E6:05C9 8C CB mov bx,cs 67E6:05CB B4 50 n ah, 50h ;'p' 67E6:05CD CD 21 int 21h;DOS Servicesah=function 50h 通过以上分析,我们编程时就可利用上面实例。