;***************************************************************************
; YAIP
; Yet Another (pseudoIntelligent!!!) Patcher
; Written by Oskar Nurb, 14-4-97
; oskar_nurb@nym.alias.net
;
; GREETZ: +ORC, +Gthorne, Fravia+ and all the readers of RevEngE
;
; Please improve and expread this program. I consider I must learn a lot
; before making good software... I'm on the commercial standards now! :)
;
; Yeah, I can see your faces... You are surely thinking: Another patcher?
; Yes, but this patcher is written in ASM, and it isn't based on the file
; offset method that most pathers out there use. It searches and patches.
; There is a BIG difference between both metods. Using this code you crack
; several versions of a program :)
;
; As it is written in ASM, you can generate a .COM and encrypt it as you
; wish. Or you can just build a C program that uses this code.
;
; Enjoy!
;
;***************************************************************************
.286
.model small
.code
org 100h
bufsize equ 20000
CR equ 0dh
LF equ 0ah
; As usual, some directives.
start:
push cs
pop ds
mov ax,3d02h
mov dx,offset fname
int 21h
; Please chech HelpPc for a refference if you are a newbye.
jc Erroropening
mov word ptr cs:[Fhandle],ax
jmp prinbuc
; I love to write odd modules :)
; Why can't you see any procs? Because I wrote this in order to
; be heavily compiler-encrypted... And I thought it would be a
; mess otherwise.
Erroropening:
mov dx,offset eamsg
mov ah,09
int 21h
; Don't you think I'm a very user-friendly programmer?
mov ah,4ch
int 21h
; Here starts the search engine. You only have to put that
; search string in little bytes. Or even better, you can
; write a function that only needs a string as arg.
;All the jc stuff is there in order to left the read proc
;as free as possible. If you don't like it, just modify it.
;I personally don't care.
searchbuc:
call read
jc finalox
prinbuc:
cmp ah,54h
jne searchbuc
call read
jc finalox
cmp ah,75h
jne prinbuc
call read
jc finalox
cmp ah,72h
jne prinbuc
call read
jc finalox
cmp ah,62h
jne prinbuc
;Bingo. If you are here, you've found the match.
;Let's take our File Pointer
mov ax,4201h
mov bx,word ptr cs:[Fhandle]
mov cx,0
mov dx,0
int 21h
;Let's manage it to point the start of string.
mov bx,word ptr cs:[Fhandle]
mov cx,dx
mov dx,ax
sub dx,word ptr cs:[Inbuf]
add dx,word ptr cs:[readed]
sub dx,3
mov ax,4200h
int 21h
;Let's write the patch
mov bx,word ptr cs:[Fhandle]
mov ah,40h
mov cx,3
push cs
pop ds
mov dx,offset wbuff
int 21h
;Close file
mov bx,word ptr cs:[Fhandle]
mov ah,3eh
int 21h
;Bye dear user!
mov dx,offset hecho
mov ah,09
int 21h
mov ah,4ch
int 21h
wbuff db 90h,90h,90h
hecho db 'OK!!$'
finalox:
mov ah,4ch
int 21h
; This is our read function, with a little buffer, of course.
; It is free of internal weird/end jumps for easy modification
; pourposes. It just returns CF on EOF, and if not CF the next byte of the
; file (stream??) in AH. You can surely write it better, but, hey,
; I'm not a programmer! :)
; May be some day... :)
read:
push si
mov si,word ptr cs:[readed]
cmp si,word ptr cs:[Inbuf]
jne cont
call fullbuf
jnc cont
pop si
stc
ret
cont:
clc
mov ah,byte ptr cs:[Buff+si]
inc word ptr cs:[readed]
pop si
clc
ret
fullbuf:
mov bx,word ptr cs:[Fhandle]
mov ah,3fh
mov cx,bufsize
push cs
pop ds
mov dx,offset Buff
int 21h
jc error
cmp ax,0
je error
mov word ptr cs:[Inbuf],ax
mov word ptr cs:[readed],0
clc
ret
error:
stc
ret
fname db 'test.exe',0
eamsg db 'Error opening file',CR,LF,'$'
readed dw 0
Fhandle dw ?
Inbuf dw ?
Buff dw bufsize dup(?)
end start