• 标 题:用驻留程序拦你要改的代码前一个中断,只要能断下来,想搞什么都行。 (3千字)
  • 作 者:yaoyuan[CCG]
  • 时 间:2002-4-8 22:25:31
  • 链 接:http://bbs.pediy.com

如何编制驻留程序

                       yaoyuan[CCG]

        在破解过程中,我们经常遇到这样的情况,我们要向想要破解的程序传递参数或数据(在磁盘解密中常有此情况),我们想要当程序作中断调用时进入我们自已的服务程序,这就将使用到驻留程序,下面我们以破解Nosa的时间过期限制为例,
    这个程序是一个非常好的统计软件,在2000年8月5日后会到期而无法使用,在跟踪过程中我们发现它使用了INT 21的2A号子功能取系统时间,在程序中取了很多次,改来有些繁琐,做程序如下:当程序取系统时间时就会为我们的驻留程序欺骗。



.model small
.386
.code
org    100h
Start:
        jmp    begin
old21  dw      0
        dw      0
my21:
        pushf
        cmp    ax,0ff00h    ;驻留程式功能一,当子功能号为ff00时送ax为0返回
        jnz    nomy0        ;作为驻留与否的标志 
        mov    ax,0
        popf
        retf    2
nomy0:
        cmp    ax,0ff01h    ;驻留程式功能二,当子功能号为ff01恢复中断向量表
        jnz    nomy1
        push    es
        push    0
        pop    es
        mov    eax,dword ptr cs:old21
        cli
        mov    es:[84h],eax
        pop    es
        mov    bx,cs
        xor    ax,ax
        popf
        retf    2
nomy1:
        cmp    ah,2ah      ;驻留程式功能三,当子功能号为2a时,给出破解程序允许的时间
        jnz    notime
        mov    al,4
        mov    cx,7d0h    ;CX=7d0h 代表2000年
        mov    dx,601h    ;DX=601h 代表6月1日
        popf
        clc
        retf    2
notime:
        popf
        jmp    dword ptr cs:old21
begin:
        mov    ax,0ff00h  ;检测程式是否已经驻留
        int    21h
        or      ax,ax
        jnz    notsr
        cmp    byte ptr ds:[80h],0  ;是否从内存撤出,为1则call remove
        jz      existtsr
        call    remove
existtsr:
        lea    dx,existmsg
        call    disp
exit:
        mov    ah,4ch
        int    21h
notsr:
        push    0       
        pop    es
        mov    eax,es:[84h]
        mov    dword ptr cs:old21,eax  ;取21中断向量保存于变量old21
        mov    ax,cs
        mov    cl,10h                  ;当前CS送EAX高8位
        shl    eax,cl
        mov    ax,offset my21          ;当前IP送EAX低8位,CS:IP为新的INT21送回中断向量表
        cli
        mov    es:[84h],eax
        sti                              ;置新的int 21中断向量
        push    cs
        pop    es
        lea    dx,okmsg
        call    disp
        lea    dx,begin
        shr    dx,4
        add    dx,11h
        mov    ax,3100h
        int    21h                    ;程序驻留
disp:

        push    ds
        push    cs
        pop    ds
        mov    ah,9
        int    21h
        pop    ds
        ret
remove:
        mov    si,81h
repget:
        lodsb
        cmp    al,20h
        jz      repget
        cmp    al,"/"
        jz      getnext
        ret
getnext:
        lodsb
        or      al,20h
        cmp    al,"r"
        jz      sure
        ret
sure:
        mov    ax,0ff01h
        int    21h          ;调用ff01功能恢复旧的int 21中断向量
        push    bx
        pop    es
        lea    ax,exit
        mov    es:[0ah],ax
        mov    ax,cs
        mov    es:[0ch],ax
    mov    es:[16h],ax
        mov    ah,50h
        int    21h
        lea    dx,removemsg
        call    disp
        jmp    exit
okmsg          db "OK !",0dh,0ah,24h
existmsg        db "Program already exist in memory !",0dh,0ah,24h
removemsg      db "Program remove OK from in memory !",0dh,0ah,24h
        end    start