Сейчас на форуме: Slinger, Rio (+7 невидимых)

 eXeL@B —› Основной форум —› IDA PRO и самомодификация кода
Посл.ответ Сообщение

Ранг: 4.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 августа 2006 23:54
· Личное сообщение · #1

Очень интересует тема - обнаружение самомодифицирующегося кода (в дальнейшем просто СК).
Все статьи на тему СК в основном связаны с обходом дизассемблеров и с методами такого обхода, но хочется решить обратную задачу.
Толкового материала по обнаружению СК мне найти не удалось.
Знаком с IDA, думаю, он может решить поставленную задачу с помощью SDK'ашного инструментария.
Возможно, кто-нибудь уже сталкивался с подобной задачей и может "наставить на путь истинный".
С какого бока подходить к обнаружению СК, всё ли там завязано на копировании в стек/кучу?

Спасибо!



Ранг: 39.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 августа 2006 06:20
· Личное сообщение · #2

Для СК вовсе необязательно копирование в стек, тем более что в системах с DEP его просто так не исполнишь ;) Есть вариант просто править собственный код, юзая WriteProcessMemory, а еще проще - задать атрибуты секции с кодом так, чтобы можно было ее править, и трактовать код как данные, перезаписывая его..



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 10 августа 2006 09:42
· Личное сообщение · #3

northdemon пишет:
думаю, он может решить поставленную задачу с помощью SDK'ашного инструментария.

Поставь бряк на чтение/запись в любом месте большой программы, и ты убедишься как долго будет работать IDA только из-за того, что проверяет изменился код или нет, а подобное решение через SDK, вероятно, замедлит процесс до беспредела. А вообще, если ты видишь в IDA в секции текста какую-ту абракадабру не похожую на инструкции (например, есть переходы типа jmp 00000007) и на данные (которых там в большинстве компиляторов быть не должно; если есть, то где-то должно быть обращение к ним), то можешь на 50% быть уверен что это СК. Но это только мой опыт. Кроме того, в принципе абсолютно правильной тактики не существует



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 10 августа 2006 14:27
· Личное сообщение · #4

Mordred, на кой хрен юзать WriteProcessMemory для своего кода?



Ранг: 39.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 августа 2006 17:48
· Личное сообщение · #5

MoonShiner пишет:
Mordred, на кой хрен юзать WriteProcessMemory для своего кода?

А я разве рекомендовал это делать? Просто говорю, что можно править его таким образом. Если секция кода не разрешена на запись, просто даешь разрешение через VirtualProtect и правишь - вполне допустимо. Другое дело, я хз, юзает ли это кто-то



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

Создано: 10 августа 2006 20:10
· Личное сообщение · #6

я могу юзать и для своего кода. А также такие извраты, как например, WriteProcessMemory на адрес возврата из самой же WriteProcessMemory. Сбивает трассировку через int3. Правда, OllyDbg всё равно параметры показывает...
самое сложное здесь в том, что код неотличим от данных, а хранить и то, и другое можно вперемешку, даже если назначение за каждым куском оставлять единственное.
и это фатальная проблема.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 10 августа 2006 20:52
· Личное сообщение · #7

northdemon пишет:
С какого бока подходить к обнаружению СК

ИМХО, качественное решение получить не просто
1. Определить атрибуты секций кода
если есть write, то поиск всех команд, которые меняют память в области этой секции.
2. Определить атрибуты секций данных
если есть exec, то поиск всех переходов на выполнение области данных
3. Определить все API, которые способны модифицировать память процесса и доступ на выполнение/запись
если есть, то найти параметры, указывающие на код определённый выше.
...потом стек и т.д.
Осложняется картина тем, что статически анализировать команды вроде call EAX не всегда просто. Но можно.

-----
Всем привет, я вернулся




Ранг: 4.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 августа 2006 22:30
· Личное сообщение · #8

Спасибо всем за наставления.
Прояснилось, в каком направлении надо двигаться. И делов в этом направлении предстоит наворотить много Сплошная эвристика и теория вероятностей

Тему закрывать пока что не буду, возможно, ещё откликнутся люди, столкунувшиеся с обнаружением СК на практике.



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

Создано: 11 августа 2006 20:15
· Личное сообщение · #9

ну допустим возьмём 2. переходы на выполнение области данных могут быть разными:
1. jmp/ret/call/iret и т.д.
2. использование Api: CreateThread, CreateRemoteThread, WriteProcessMemory (последнее делается с затиранием адреса возврата, хотя можно и просто заменить следующий за этим код), QueueUserApc
3. осложнённое использование API: два процесса с разделяемыми секциями, созданными при помощи ntdll!ZwCreateSection и использованием объектов LPC (аналог RPC, работающий тоже на разделяемых секциях). Данные пишутся в другой процесс через LPC-канал, тот при поступлении замораживает поток, и меняет eip на тот адрес, где находятся те же данные, но с адресом в другом процессе. Дело в том, что при создании разделяемой секции можно узнать адрес её в другом процессе! И создавать можно даже в системном, другое дело что ему эти данные читать не хочется.
4. seh-фреймы, тут главное заметить заполнение будущего eip

некоторые программы производят какой-то анализ, например, OllyDbg. можно глянуть в него, хотя можно сделать и лучше. API-методы он ловить с полной смелостью не будет наверно. Итак, надо помнить:
1. мы находимся в защищённом режиме
2. мы имеем доступ к системным функциям, которые способны изменять ход выполнения программы
3. мы располагаем многозадачностью и многопоточностью
4. неплохо иметь качественный эмулятор
__это нужно, чтобы поставить это на поток, обычно же настолько извращённым всё это дело не оказывается (мне не попадалось, но я бы попробовал это замутить).



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 12 августа 2006 14:53
· Личное сообщение · #10

NullSession пишет:
мне не попадалось, но я бы попробовал это замутить

А не попадалось, потому что чем больше извратов, тем больше шансов для эвристики и стенки выловить такую подлянку.
Про SEH ты верно вспомнил, это очень часто используется.

-----
Всем привет, я вернулся




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

Создано: 13 августа 2006 16:32
· Личное сообщение · #11

Bitfry что такое "стенка"? насчёт эвристики-то понятно.



Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 15 августа 2006 17:51
· Личное сообщение · #12

имхо ре4ь о фаере

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 15 августа 2006 19:14
· Личное сообщение · #13

Bitfry пишет:
что такое "стенка"?

Firewall'ы не любят когда процессы "влезают" друг в друга.

-----
Всем привет, я вернулся



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


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