📄 cv.asm
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 版本信息
; 程序名:Convert program
; 编写时间:
; Ver 1.0 -- 1992.10 (In ZheJiang University)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 2000.12 公布于 http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 说明:
;
; 由于 Win32Asm 编程论坛 (http://win32asm.netsh.net)上近日对
; .exe 文件上附加代码有不少讨论,所以把这个很老的程序发表出来
; 这个程序是我 1992 年在大学里编写的,对大家有用的是两个模块:
;
; 1. .exe => .com 部分,可以帮助理解 .exe 文件重定位的原理,
; 因为程序去除了 .exe 的文件头,把映象部分存成了一个 .com
; 文件,同时在尾部附加了一段重定位的代码及原来文件的重定
; 位表。
;
; 2. 在 .exe 后加密码的部分
; 可以为在 .exe 文件上加一段代码做参考,注意密码一定要输
; 满 8 位,否则中间的回车等所有键都会被当作密码。
;
; 另外:
;
; 1. 本程序对命令行的处理要求比较严格
; 附加密码程序请用 CV p input.exe output.exe
; 处理.exe到.com程序亚用 CV c input.exe output.com
;
; 2. 那时候的编程习惯不好,不喜欢加注释,大家将就着看吧
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
start:
mov bl,ds:[80h]
or bl,bl
jnz n1
mov dx,offset d_help
mov ah,9
int 21h
int 20h
n1:
mov si,81h
cld
n2:
lodsb
cmp al,' '
jz n2
and al,0dfh
mov command,al
lodsb
cmp al,' '
jz n3
c_er:
mov dx,offset d_command_error
quit:
mov ah,9
int 21h
int 20h
n3:
mov di,offset in_file
call analy
cmp cr,1
jnz n4
jmp short c_er
n4:
mov di,offset out_file
call analy
mov al,command
mov di,offset c_table
mov cx,3*5
cld
repnz scasb
jz n5
mov dx,offset d_no_command
mov ah,9
int 21h
int 20h
n5:
xchg si,di
lodsw
call ax
int 20h
ANALY PROC NEAR
a1:
lodsb
cmp al,' '
jz a1
cmp al,0dh
jz c_er
dec si
a2:
lodsb
cmp al,' '
jz a3
cmp al,0dh
jz a3
stosb
jmp short a2
a3:
cmp al,0dh
jnz a4
mov cr,1
a4:
mov al,0
stosb
ret
ANALY ENDP
DO_IT PROC NEAR
call open
d0:
mov ah,3fh
mov bx,old_handle
mov cx,50000
mov dx,offset buffer
int 21h
cmp ax,cx
jz d1
mov do_end,1
mov cx,ax
d1:
mov si,offset buffer
mov di,si
cld
call in_address
mov ah,40h
mov bx,new_handle
mov dx,offset buffer
int 21h
test do_end,0ffh
jz d0
call close
ret
DO_IT ENDP
LOW_TO_UP PROC NEAR
mov in_address,offset ltu
call do_it
ret
LOW_TO_UP ENDP
LTU PROC NEAR
push cx
l0:
lodsb
cmp al,'a'
jb l1
cmp al,'z'
ja l1
sub al,20h
l1:
stosb
loop l0
pop cx
ret
LTU ENDP
UP_TO_LOW PROC NEAR
mov in_address,offset utl
call do_it
ret
UP_TO_LOW ENDP
UTL PROC NEAR
push cx
u0:
lodsb
cmp al,'A'
jb u1
cmp al,'Z'
ja u1
add al,20h
u1:
stosb
loop u0
pop cx
ret
UTL ENDP
CUT_CR PROC NEAR
mov in_address,offset c_c
call do_it
ret
CUT_CR ENDP
C_C PROC NEAR
cld
cc0:
mov ax,offset buffer
add ax,cx
cmp si,ax
jb cc1
mov cx,di
sub cx,offset buffer
ret
cc1:
lodsb
cmp al,' '
jz find_sp
cmp al,09
jz find_sp
stosb
jmp short cc0
find_sp:
push si
find_sp1:
lodsb
cmp al,' '
jz find_sp1
cmp al,09
jz find_sp1
cmp al,0dh
jz cut_it
cmp al,0ah
jz cut_it
pop ax
dec ax
push cx
mov cx,si
sub cx,ax
mov si,ax
not_cut:
lodsb
stosb
loop not_cut
pop cx
jmp short cc0
cut_it:
add sp,2
stosb
jmp short cc0
C_C ENDP
EXE_TO_COM PROC NEAR
call open
mov ah,3fh
mov bx,old_handle
mov cx,20h
mov dx,offset etc_exehead
int 21h
cmp etc_exehead,5a4dh
jz e1
cmp etc_exehead,4d5ah
jz e1
call close
mov dx,offset etc_not_exe
jmp quit
e1:
mov cx,etc_sss
mov ssss,cx
mov cx,etc_ssp
mov sssp,cx
mov cx,etc_iip
mov iiip,cx
mov cx,etc_ccs
mov cccs,cx
mov cx,etc_num
mov re_number,cx
xor cx,cx
xor dx,dx
mov ax,4202h
int 21h
test dx,0ffffh
jz e3
e2_1:
call close
mov dx,offset not_convert
jmp quit
e3:
cmp ax,0fc00h
jb e4
jmp short e2_1
e4:
mov etc_long,ax
mov ax,etc_headlong
mov cx,4
shl ax,cl
sub etc_long,ax
mov dx,ax
xor cx,cx
mov ax,4200h
int 21h
mov cx,etc_long
mov dx,offset buffer
mov ah,3fh
int 21h
mov di,offset oldf
mov si,offset buffer
cld
movsb
movsw
mov ax,etc_long
mov di,ax
sub ax,3
add di,offset buffer
mov buffer,0e9h
mov word ptr buffer+1,ax
mov si,offset add_file
mov cx,offset oldf-offset add_file+3
add etc_long,cx
cld
rep movsb
mov ah,40h
mov bx,new_handle
mov cx,etc_long
mov dx,offset buffer
int 21h
mov dx,etc_offset
xor cx,cx
mov ax,4200h
mov bx,old_handle
int 21h
mov cx,etc_num
add cx,cx
add cx,cx
push cx
mov dx,offset buffer
push dx
mov ah,3fh
int 21h
mov ah,40h
mov bx,new_handle
pop dx
pop cx
int 21h
call close
ret
add_file:
call etc_off
ETC_OFF PROC NEAR
pop bx
ETC_OFF ENDP
sub bx,offset etc_off
mov di,100h
mov si,offset oldf
add si,bx
cld
movsb
movsw
mov cx,ds:[bx+offset re_number]
jcxz ea1
mov di,offset oldf+3
add di,bx
mov ax,es
add ax,10h
ea2:
lds si,dword ptr es:[di]
add di,4
mov bp,ds
add bp,ax
mov ds,bp
add ds:[si],ax
loop ea2
ea1:
push es
pop ds
add ds:[bx+offset cccs],ax
add ax,ds:[bx+offset ssss]
mov ss,ax
mov sp,ds:[bx+offset sssp]
xor ax,ax
xor bx,bx
xor si,si
xor di,di
xor bp,bp
db 0eah
IIIP DW ?
CCCS DW ?
SSSS DW ?
SSSP DW ?
RE_NUMBER DW ?
OLDF DB 0,0,0
EXE_TO_COM ENDP
PASS PROC NEAR
call open
mov bx,old_handle
mov ah,3fh
mov cx,20h
mov dx,offset etc_exehead
int 21h
cmp etc_exehead,4d5ah
jnz pl1
jmp p_exe
pl1:
cmp etc_exehead,5a4dh
jnz p_com
jmp p_exe
p_com:
mov isexe,0
mov ax,4202h
mov bx,old_handle
xor cx,cx
xor dx,dx
int 21h
or dx,dx
jz pl2
call close
mov dx,offset not_convert
jmp quit
pl2:
mov etc_long,ax
mov ax,4200h
mov bx,old_handle
xor cx,cx
xor dx,dx
int 21h
mov cx,etc_long
mov bx,old_handle
mov ah,3fh
mov dx,offset buffer
int 21h
call get_pass
mov si,offset buffer
push si
mov di,offset old_f3
movsb
movsw
mov ax,etc_long
sub ax,3
mov word ptr buffer+1,ax
mov buffer,0e9h
mov bx,offset buffer
add bx,etc_long
pop di
pl3:
cmp di,bx
jnb pl5
mov si,offset pass_of_file
mov cx,4
pl4:
mov ax,ds:[di]
xor ax,ds:[si]
add si,2
stosw
dec di
loop pl4
jmp short pl3
pl5:
mov si,offset password
mov di,offset buffer
add di,etc_long
mov cx,offset pass_of_file-offset password
push cx
cld
rep movsb
mov ax,etc_long
sub ax,3
mov word ptr buffer+1,ax
mov buffer,0e9h
mov ah,40h
mov bx,new_handle
pop cx
add cx,etc_long
mov dx,offset buffer
int 21h
call close
ret
p_exe:
mov isexe,1
call get_pass
mov si,offset pass_of_file
lodsw
mov bx,etc_sss
xor bx,ax
mov sss,bx
mov bx,etc_ssp
lodsw
xor bx,ax
mov ssp,bx
mov bx,etc_iip
lodsw
xor bx,ax
mov iip,bx
mov bx,etc_ccs
lodsw
xor bx,ax
mov ccs,bx
mov etc_ssp,300h
mov ax,4202h
mov bx,old_handle
xor cx,cx
xor dx,dx
int 21h
mov cx,0010h
div cx
sub ax,etc_headlong
mov etc_sss,ax
mov etc_ccs,ax
mov etc_iip,dx
mov ah,40h
mov dx,offset etc_exehead
mov cx,20h
mov bx,new_handle
int 21h
mov ax,4200h
mov bx,old_handle
xor cx,cx
mov dx,20h
int 21h
pl6:
mov ah,3fh
mov bx,old_handle
mov cx,0d000h
mov dx,offset buffer
int 21h
cmp cx,ax
jz pl7
mov cx,ax
mov do_end,1
pl7:
mov ah,40h
mov bx,new_handle
mov dx,offset buffer
int 21h
cmp do_end,1
jnz pl6
mov ah,40h
mov bx,new_handle
mov cx,offset pass_of_file-offset password
mov dx,offset password
int 21h
call close
ret
password:
push cs
pop ds
push dx
push cx
call know_pass
KNOW_PASS PROC NEAR
pop bx
mov dx,bx
sub dx,7
KNOW_PASS ENDP
sub bx,offset know_pass
push dx
mov dx,bx
add dx,offset mass
mov ah,9
int 21h
mov si,bx
add si,offset pass_of_file
push si
xor dx,dx
mov cx,8
p_1:
mov ah,8
int 21h
mov ds:[si],al
add dl,al
inc si
loop p_1
pop si
cmp dl,byte ptr ds:[bx+offset check_sum]
jz p_11
mov dx,offset dd_quit
add dx,bx
mov ah,9
int 21h
mov ax,4c00h
int 21h
p_11:
pop dx
cmp byte ptr ds:[bx+offset isexe],1
jz pass_exe
mov di,100h
p_2:
cmp di,dx
jnb exec_com
mov cx,4
push si
p_3:
mov ax,ds:[di]
xor ax,ds:[si]
add si,2
stosw
dec di
loop p_3
pop si
jmp short p_2
exec_com:
mov si,offset old_f3
add si,bx
mov di,100h
cld
movsb
movsw
pop cx
pop dx
mov ax,100h
push ax
xor ax,ax
xor bx,bx
xor si,si
xor di,di
sub cx,(offset pass_of_file-offset password)
ret
pass_exe:
lodsw
xor ds:[bx+offset sss],ax
lodsw
xor ds:[bx+offset ssp],ax
lodsw
xor ds:[bx+offset iip],ax
lodsw
xor ds:[bx+offset ccs],ax
mov ax,es
add ax,10h
mov ds,ax
pop cx
pop dx
add ax,cs:[bx+offset sss]
mov ss,ax
mov ax,cs:[bx+offset ssp]
mov sp,ax
mov ax,ds
add cs:[bx+offset ccs],ax
push cs:[bx+offset ccs]
push cs:[bx+offset iip]
push es
pop ds
xor ax,ax
xor bx,bx
xor si,si
sub cx,(offset pass_of_file-offset password)
sbb dx,0
EXEC PROC FAR
ret
EXEC ENDP
MASS DB 0dh,0ah,9,'Please enter password:',0DH,0AH,'$'
DD_QUIT DB 9,'Bad password !',0DH,0AH,'$'
ISEXE DB 0
CCS DW ?
IIP DW ?
SSS DW ?
SSP DW ?
OLD_F3 DB 0,0,0
CHECK_SUM DB 0,'Converted by LYB'
PASS_OF_FILE DB 8 DUP (?)
PASS ENDP
GET_PASS PROC NEAR
mov dx,offset in_pass
mov ah,9
int 21h
mov di,offset pass_of_file
xor dx,dx
mov cx,8
gt1:
mov ah,8
int 21h
add dl,al
stosb
loop gt1
mov check_sum,dl
ret
GET_PASS ENDP
OPEN PROC NEAR
mov ah,3ch
xor cx,cx
mov dx,offset out_file
int 21h
jnb o1
mov dx,offset d_cre_error
jmp quit
o1:
mov new_handle,ax
mov ax,3d00h
mov dx,offset in_file
int 21h
jnb o2
mov dx,offset d_ope_error
jmp quit
o2:
mov old_handle,ax
ret
OPEN ENDP
CLOSE PROC NEAR
mov bx,new_handle
mov ah,3eh
int 21h
mov bx,old_handle
mov ah,3eh
int 21h
ret
CLOSE ENDP
D_HELP DB ' Convert Program by LYB',0DH,0AH,0AH
DB ' Usage:CV command inputfile outputfile',0DH,0AH
DB ' command:',0DH,0AH
DB ' u: Convert UP letters to LOW letters.',0DH,0AH
DB ' l: Convert LOW letters to UP letters.',0DH,0AH
DB ' d: Cut SPACE before <cr/lf> in file.',0DH,0AH
DB ' c: Convert .EXE file to .COM file.',0DH,0AH
DB ' p: Add password on a executable file.',0DH,0AH
DB '$'
D_COMMAND_ERROR:
DB 0DH,0AH,9,'Command line error ,type CV to see help.',0dh,0ah,'$'
D_CRE_ERROR DB 0dh,0ah,9,'Can not create output file.',0DH,0AH,'$'
D_OPE_ERROR DB 0dh,0ah,9,'Can not find input file.',0DH,0AH,'$'
ETC_NOT_EXE DB 0dh,0ah,9,'Miss .EXE file!',0DH,0AH,'$'
NOT_CONVERT DB 0dh,0ah,9,'File can not be converted!',0DH,0AH,'$'
D_NO_COMMAND DB 0dh,0ah,9,'I do not recognize command: '
COMMAND DB 0,0DH,0AH,'$'
IN_PASS DB 0dh,0ah,9,'What password do you want? [ 8 letters ]',0DH,0AH,'$'
NEW_HANDLE DW 0
OLD_HANDLE DW 0
C_TABLE DB 'U'
DW UP_TO_LOW
DB 'L'
DW LOW_TO_UP
DB 'C'
DW EXE_TO_COM
DB 'D'
DW CUT_CR
DB 'P'
DW PASS
IN_ADDRESS DW ?
CR DB 0
DO_END DB 0
IN_FILE DB 43 DUP (0)
OUT_FILE DB 43 DUP (0)
ETC_EXEHEAD DW 0,0,0
ETC_NUM DW 0
ETC_HEADLONG DW 0,0,0
ETC_SSS DW 0
ETC_SSP DW 0,0
ETC_IIP DW 0
ETC_CCS DW 0
ETC_OFFSET DW 0,0,0,0
ETC_LONG DW 0
BUFFER DB ?
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -