Сейчас на форуме: asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Что такое дельта смещение?
Посл.ответ Сообщение


Ранг: 59.5 (постоянный), 326thx
Активность: 0.170.76
Статус: Участник

Создано: 13 июля 2012 10:42 · Поправил: yashechka
· Личное сообщение · #1

b



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 13 июля 2012 10:51
· Личное сообщение · #2

В трех словах с примером --> Link <--




Ранг: 59.5 (постоянный), 326thx
Активность: 0.170.76
Статус: Участник

Создано: 13 июля 2012 11:14
· Личное сообщение · #3

Весёлые картинки. Спс. Сейчас почитаю.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 13 июля 2012 15:01 · Поправил: Coderess
· Личное сообщение · #4

Вот еще :

Code:
  1. delta:  pop     ebp
  2.         mov     eax,ebp
  3.         sub     ebp,offset delta


Code:
  1. Да! Это дельта-смещение! Мы должны получить его по   ;
  2.  ; очень простой причине: мы не знаем где находится исполняющийся код


Отрывок из
--> Путеводитель по написанию вирусов под Win32: 4. Ring-3, программирование на уровне пользователя <--

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 13 июля 2012 18:27
· Личное сообщение · #5

yashechka
Дельта-смещение это разница между двумя адресами.

Когда мы пишем привычными для программера средствами, то адресную арифметику настраивает компиллер, точнее он формирует код и файл таким образом чтобы во время работы исполнимого файла все было ок.

Когда же мы пишем к примеру вирус, или какой-нить код который является чежеродным для исполняемого процесса, то возникает вопрос "Как адресоваться?".

Формулировка проблемы : Как адресоваться внутри чужеродного куска кода к его собственным данным?

Решением этой проблемы является: "Пишите базово-независимо".

Другими словами мы при написании кода, или формировании кода(а мы же можем писать и кодогенераторы) формируем так код, чтобы он адресовался относительно заранее принятого адреса. Во время работы файла мы вычисляем "А где реально находится это место в пространстве процесса?", когда мы знаем этот реальный адрес мы вычитаем его из нами предположенного и тем самым получаем "дельта-смещение", далее прибавив эту разницу там где мы хотим адресоваться в теле базово-независимого кода мы получаем нормально функционирующий код.

Как правило пишется нечто вроде этого:
Code:
  1. call next
  2. next:
  3. pop eax
  4. sub eax,next


Этот кусок кода вычисляет место в процесс, где же реально находится этот next ? Работает примитивно и просто, разжевывать не буду, просто вспомните как работают эти маш.инструкции

| Сообщение посчитали полезным: yashechka


Ранг: 59.5 (постоянный), 326thx
Активность: 0.170.76
Статус: Участник

Создано: 13 июля 2012 19:05
· Личное сообщение · #6

Это. А что мы выталкиваем в eax? Что там в это время на самой верхушке на стеке лежит?
И что мы можем использовать метку как число для вычитания?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июля 2012 22:34
· Личное сообщение · #7

Адрес возврата от call там лежит. Самому прогнать этот код из 3 инструкций в отладчике/почитать доки никак?
Как видишь, можем.


 eXeL@B —› Вопросы новичков —› Что такое дельта смещение?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати