Консультация № 143592
10.09.2008, 18:25
0.00 руб.
10.09.2008, 18:41
0 4 2
Вопрос по рассылке Калашникова №17(запись вируса в конец файла). Код в приложении.
То что строка 1 заносит в стек число 1203h понятно, но почему offset Get_IP дает 203, а не 1203 неясно...

Приложение:
Теперь представим, что мы находимся в хвосте какого-то файла, размером 1000h байт (смотрите на смещения в скобках). Тот же самый код будет располагаться по такому адресу:

(1) [1234:1200h] call Get_IP
(2) [1234:1203h] Get_IP:
(3) [1234:1203h] pop ax
(4) [1234:1204h] sub ax,offset Get_IP

Что мы получаем? Строка (1) заносит в стек число 1203h. Pop ax достает его со стека. Затем выполняется следующее действие:
sub ax,203h ;sub ax,offset Get_IP ---> AX=1203h-203h=1000h
Теперь в AX размер "файла-жертвы", т.е. 1000h! Получили то, что хотели!

Обсуждение

Неизвестный
11.09.2008, 09:06
общий
11.09.2008, 13:13
это ответ
У меня 0.
в стек число = offset Get_IP
может код всей программы посмотреть.
Неизвестный
11.09.2008, 12:10
общий
Спасибо!
Я разобрался, ноль получается в программе(вирусе) только тогда когда она запущена первый раз, но после того как она копирует себя в конец другой программы то копируется не (4) sub ax,offset Get_IP , а sub ax, 203h
И уже в коде жертвы получается что строки call Get_IP, pop ax дают реально текущее смещение, а строка offset Get_IP заменена на старое значение смещения из файла вируса.
Я это так понял...
ссылка на урок Калашникова №17 http://kalashnikoff.ru/Assembler/issues/017.htm
готовый вирус в 20 уроке
давно
Старший Модератор
31795
6196
11.09.2008, 13:10
общий
это ответ
Здравствуйте, Draft3!

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


Такой прием называется "дельта" смещение. При загрузке в память программа не знает по какому адресу её загрузила система, а знать ей нужно. С помощью этого метода получается текущий адрес, а уже все остальные нужные для работы программы адреса будут расчитаны относительно текущего, к примеру 20-ю байтами ниже находится начало программы, а сотней байт выше находится её хвост.

Чтобы корректно получить нужное число, Вам нужно перед этим кодом поставить к примеру DB 1000h dup(90h);[i] вместо какого-то файла этого размера. [/i] 90h - это код команды NOP ничего не делает, только место занимает, т.к. Вас просили представить.
Теперь представим , что мы находимся в хвосте какого-то файла, размером 1000h байт (смотрите на смещения в скобках).


Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Советник
419
1011
15.09.2008, 18:46
общий
даже я не понял, что тут происходит, хотя создавал резиденты и эти смещения знаю.

считаю, что здесь неоднозначность и непонимание.

нужно подробно расписать про все числа, рядом в скобках при рассмотрении всех случаев расписать, что эти числа получаются такими в какой момент времени.
Форма ответа