| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552 |
- jumps
- .286
- cseg segment byte public 'CODE'
- assume cs:cseg, ds:cseg, es:cseg
- start:
- mov ax, seg cseg
- mov es, ax
- push ax
- mov si, 80h
- cmp byte ptr ds:[si], 0
- je errusg
- xor ax, ax
- mov al, ds:[si]
- dec ax
- mov cx, ax
- inc si
- inc si
- mov di, offset _hname
- lp: cmp byte ptr ds:[si], 0dh
- je wrk
- movsb
- loop lp
- wrk: pop ds
- ;------------- Interceptor -------------
- mov ax, 3d00h
- mov dx, offset _iname
- int 21h
- jc IOErr
- mov bx, ax
- mov ah, 3fh
- mov dx, offset buffer
- mov cx, 07B00h
- int 21h
- mov _isize, ax
- mov ah, 3eh
- int 21h
- ;------------- Interceptor -------------
- ;------------- Host --------------------
- mov ax, 3d02h
- mov dx, offset _hname
- int 21h
- jc IOErr
- mov bx, ax
- mov handle, ax
- mov ah, 3fh
- mov dx, offset header
- mov cx, 28
- int 21h
- ;------------- Host --------------------
- ;------- Password ----------------------
- mov ah, 09h
- mov dx, offset enter_pass
- int 21h
- ; Read password from stdin
- ;-------------------------------
- lea di, [pass]
- mov cx, 20
- chrloop:mov ah, 08h
- int 21h
- cmp al, 0Dh
- jz pass_end
- stosb
- mov ah, 02h
- mov dl, '*'
- int 21h
- dec cx
- jnz chrloop
- pass_end:
- mov ah, 09h
- mov dx, offset newline
- int 21h
- sub cx, 20
- neg cx
- mov [pass_len], cx
- test cx, cx
- jz pass_error
- ;-----------------------------------
- ; Done
- lea di, [buffer+21Eh]
- mov cx, 9
- call encode
- ;------------- Header ------------------
- mov ax, word ptr header + 22 ; Old rCS1
- mov word ptr buffer + 11, ax ; Save
- mov ax, word ptr header + 20 ; Old rIP1
- mov word ptr buffer + 9, ax ; Save
- ;My new entry-point calculation method
- ; mov bx, [header+8]
- ; mov cx, bx
- ; shr bx, 5
- ; mov ax, [header+4]
- ; dec ax
- ; sub ax, bx ; AX - 512b page count
- ; and cx, 11111b
- ; shl cx, 4
- ; mov bx, [header+2]
- ; sub bx, cx ; BX - partial page size
- ; sbb ax, 0
- ; mov [cntH], ax
- ; mov [cntL], bx
- ; add bx, 10 ; Ten bytes for test_pass
- ; adc ax, 0
-
- ; and bx, 111111111b
- ; and ax, 11111111111b
- ; mov cx, ax
- ; shl cx, 5
- ; mov dx, bx
- ; shr bx, 4
- ; add cx, bx ; CX - new rCS2
- ; and dx, 0Fh ; DX - new rIP2
-
- ; My second method
- ; mov bx, handle
- mov ax, 4202h
- xor cx, cx
- xor dx, dx
- int 21h ; In dx-ax we got size
- xor bx, bx
- mov cx, [header+8]
- clc
- rcl cx, 1
- rcl bx, 1
- rcl cx, 1
- rcl bx, 1
- rcl cx, 1
- rcl bx, 1
- rcl cx, 1
- rcl bx, 1
- sub ax, cx
- sbb dx, bx
- mov [cntH], dx
- mov [cntL], ax
- and dx, 1111b
- shl dx, 12
- mov cx, ax
- shr cx, 4
- or dx, cx
- and ax, 1111b
- mov [buffer+15], dx ; Code segment
- mov [header+22], dx
- mov [header+14], dx
- mov [buffer+13], ax ; Code offset
- mov [header+20], ax
- xor ax, ax
- not ax
- mov [header+16], ax
- mov dx, [header+6] ; Relocation table item count
- mov [buffer+17], dx
- mov cx, dx
- shr cx, 7
- and dx, 1111111b
- shl dx, 2
- mov ax, [header+2]
- add ax, _isize
- add ax, dx
- mov bx, ax
- shr bx, 9
- add bx, cx
- add [header+4], bx
- and ax, 1FFh
- mov [header+2], ax
- ;------------- Header ------------------
- ;------------- Host --------------------
- mov bx, handle
- mov ax, 4202h
- xor cx, cx
- xor dx, dx
- int 21h
- mov ah, 40h
- mov cx, _isize
- mov dx, offset buffer
- int 21h
- mov ah, 3eh
- int 21h
- mov ax, 3d02h
- mov dx, offset _hname
- int 21h
- mov bx, ax
- mov handle, ax
- ;------------- Host --------------------
- ;--- Add to host additional relocation table ---
- mov word ptr [lastOffsH], 0
- mov ax, [header+18h]
- mov [lastOffsL], ax
- big_loop:
- cmp [header+6], 100
- jl small_loop
- sub [header+6], 100
- mov ax, 4200h
- mov cx, [lastOffsH]
- mov dx, [lastOffsL]
- int 21h
- mov ah, 3fh
- mov dx, offset reloBuf
- mov cx, 400
- int 21h
- mov cx, 399
- mov di, offset reloBuf
- call addmagic
- mov di, offset reloBuf
- call encode
- mov ax, 4202h
- xor cx, cx
- xor dx, dx
- int 21h
- mov ah, 40h
- mov cx, 400
- mov dx, offset reloBuf
- int 21h
- mov ax, 4200h
- mov cx, [lastOffsH]
- mov dx, [lastOffsL]
- int 21h
- mov ah, 40h
- mov cx, 400
- mov dx, offset zeroBuf
- int 21h
- add [lastOffsL], 400
- adc [lastOffsH], 0
- jmp big_loop
- small_loop:
- mov ax, 4200h
- mov cx, [lastOffsH]
- mov dx, [lastOffsL]
- int 21h
- mov ah, 3fh
- mov dx, offset reloBuf
- mov cx, [header+6]
- sub [header+6], cx
- shl cx, 2
- push cx
- int 21h
- dec cx
- mov di, offset reloBuf
- call addmagic
- mov di, offset reloBuf
- call encode
- mov ax, 4202h
- xor cx, cx
- xor dx, dx
- int 21h
- mov ah, 40h
- pop cx
- push cx
- mov dx, offset reloBuf
- int 21h
- mov ax, 4200h
- mov cx, [lastOffsH]
- mov dx, [lastOffsL]
- int 21h
- mov ah, 40h
- pop cx
- mov dx, offset zeroBuf
- int 21h
- ; Write EXE header
- mov ax, 4200h
- mov bx, handle
- xor cx, cx
- xor dx, dx
- int 21h
- mov ah, 40h
- mov cx, 28
- mov dx, offset header
- int 21h
- ; Calculate count of encode bytes
- mov dx, [cntL]
- ; mov cx, ax
- ; shr cx, 7
- ; and ax, 1111111b
- ; shl ax, 9
- mov cx, [cntH]
- ; add dx, ax
- ; adc cx, 0
- assume cs:cseg, ds:dseg, es:dseg
- mov ax, seg dseg
- mov es, ax
- mov ds, ax
-
- mov bx, cs:[header+8]
- mov ax, bx
- shr ax, 12
- mov cs:[lastOffsH], ax
- shl bx, 4
- mov cs:[lastOffsL], bx
- mov bx, [handle]
- push dx
- seg_loop:
- test cx, cx
- jz no_seg
- ; jnz begins
- ; cmp dx, 20000
- ; jb no_seg
- begins: push cx
- ; push dx
- mov ax, 4200h
- mov cx, cs:[lastOffsH]
- mov dx, cs:[lastOffsL]
- int 21h
- mov ah, 3Fh ; Read segment of
- mov cx, 0ffffh ; input file
- mov dx, 0 ;
- int 21h ;
- mov ah, 3Fh ; Read segment of
- mov cx, 1h ; input file
- mov dx, 0ffffh ;
- int 21h ;
- xor di, di
- xor cx, cx
- not cx
- call addmagic
- call encode
- mov ax, 4200h
- mov cx, cs:[lastOffsH]
- mov dx, cs:[lastOffsL]
- int 21h
- mov ah, 40h ; Write segment to
- mov cx, 0FFFFh ; the input file
- mov dx, 0 ;
- int 21h ;
- mov ah, 40h ; Write segment to
- mov dx, 0FFFFh ; the input file
- mov cx, 1 ;
- int 21h ;
- ; add cs:[lastOffsL], 20000
- ; adc cs:[lastOffsH], 0
- inc cs:[lastOffsH]
- ; pop dx
- pop cx
- ; sub dx, 20000
- ; sbb cx, 0
- dec cx
- jmp seg_loop
- no_seg:
- mov ax, 4200h
- mov cx, cs:[lastOffsH]
- mov dx, cs:[lastOffsL]
- int 21h
- mov ah, 3Fh ; Read data of
- pop cx ; input file
- push cx
- mov dx, 0 ;
- int 21h ;
- xor di, di
- pop cx
- push cx
- dec cx
- call addmagic
- xor di, di
- call encode
- mov ax, 4200h
- mov cx, cs:[lastOffsH]
- mov dx, cs:[lastOffsL]
- int 21h
- mov ah, 40h ; Write segment to
- pop cx
- mov dx, 0 ;
- int 21h ;
- pop dx
- ; Close host file
- mov ah, 3eh
- int 21h
- ;- Done
- ;--------------------------------------------------
- mov ah, 4ch
- int 21h
- ;--------------------------------------------------
- ;==================================================
- ;--------------------------------------------------
- pass_error:
- mov dx, offset bad_pass
- mov ah, 09h
- int 21h
- mov ax, 4cFFh
- int 21h
- errusg: pop ds
- mov ah, 09h
- mov dx, offset errstr
- int 21h
- mov ax, 4cFEh
- int 21h
- IOErr: mov ah, 09h
- mov dx, offset errstr
- int 21h
- mov ax, 4cFDh
- int 21h
- ;-----------------------------------------------
- encode proc near
- push si
- push ax
- push cx
- loops2: mov si, offset pass
- cmp cx, cs:[pass_len]
- jb lasts2
- push cx
- mov cx, cs:[pass_len]
- addmag2: mov al, cs:[si]
- xor es:[di], al
- inc si
- inc di
- loop addmag2
- pop cx
- sub cx, cs:[pass_len]
- jmp loops2
- lasts2: inc cx
- lasts3: mov al, cs:[si]
- xor es:[di], al
- inc si
- inc di
- loop lasts3
- pop cx
- pop ax
- pop si
- ret
- endp
- addmagic proc near
- push si
- push ax
- push cx
- loops: mov si, offset test_pass
- cmp cx, 10
- jb lasts
- push cx
- mov cx, 10
- addmag: mov al, cs:[si]
- add es:[di], al
- inc si
- inc di
- loop addmag
- pop cx
- sub cx, 10
- jmp loops
- lasts: inc cx
- lasts0: mov al, cs:[si]
- add es:[di], al
- inc si
- inc di
- loop lasts0
- pop cx
- pop ax
- pop si
- ret
- endp
- test_pass db 10, 12, 15, 17, -20, -13, 05, -30, 55, -51
- cntH dw 0
- cntL dw 0
- io_err_str db 'Error in file io', 0dh, 0ah, '$'
- enter_pass db 'Please enter pass: $'
- errstr db 'usage: "crypt.exe source"', 0dh, 0ah,'$'
- _hname db 13 dup (0)
- _iname db 'interc.com',0
- bad_pass db 'Bad password',0dh,0ah,'$'
- newline db 0dh,0ah,'$'
- zeroBuf db 400 dup (0)
- pass db 20 dup (0)
- pass_len dw ?
- handle dw ?
- header dw 14 dup (?)
- _isize dw ?
- lastOffsH dw ?
- lastOffsL dw ?
- rCS2 dw ?
- rIP2 dw ?
- reloBuf dw 200 dup (?)
- buffer dw 07B00h dup (?)
- ends
- dseg segment para public 'DATA'
- file_buf db 0FFFFh dup (?)
- ends
- sseg segment stack
- db 200 dup (?)
- ends
- end start
|