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