用驻留程序拦你要改的代码前一个中断,驻留程序,其他平台 2008年06月23日 星期一 下午 11:27 如何编制驻留程序 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 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 11:37 , Processed in 0.154164 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.