巧用反汇编

Author: Date: 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
        通过以上分析,我们编程时就可利用上面实例。