Автор: SLV. Дата публикации: 24.09.2004
С момента написания моей статьи про скрытие реальных сигнатур в программах, написанных на ассемблере, прошло не много времени. У меня, как и у большинства исследователей стоит две оси (даже три, если считать PalmOS эмуль :): 98 (из линейки 9x) и XP (из NT платформенных). Эти две операционные системы очень разные, если не верите, почитайте хотя бы введение книги Джеффри Рихтера “Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows”. Там многое написано. Но вот, что я не учёл при написании моей первой статьи: в разных операционных системах при загрузке программ значения регистров процессора разные. Теперь объясню это на примере. Нам потребуется: OllyDbg; Windows XP; Windows 98. Чтож, приступим. Для начала будем проводить исследование в 98’ой винде. Загрузим шедевр программерской мысли, calc.exe в Олю. Видим такую картину:
Значит до загрузки программы в eax’е 0. Тогда вот что получается:
Мда. А теперь посмотрим в XP (в ней всё первоначально и делалось). Повторим предыдущее деяние, только в другое системе. И видим это:
Вот такая подстава... Решается это как и всё гениальное (т.е. просто). Надо в начале кода (т.е. после метки start) поставить xor eax,eax или mov eax,0 (кому как нравится). В итоге должен получиться вот такой код:
Теперь посмотрим реакцию PEiD на наши выходки. Компилируем exe и сканируем...
Normal scan: Nothing found *
Deep scan: Nothing found *
Hardcore scan: Nothing found *
PESniffer аналогично в пролёте. Круто! Мы добились чего хотели. Спасибо за интерес к статье. С уважением, SLV/[ROCK]...
Скрытие реальных сигнатур в программах, написанных на ассемблере. Часть вторая.
С момента написания моей статьи про скрытие реальных сигнатур в программах, написанных на ассемблере, прошло не много времени. У меня, как и у большинства исследователей стоит две оси (даже три, если считать PalmOS эмуль :): 98 (из линейки 9x) и XP (из NT платформенных). Эти две операционные системы очень разные, если не верите, почитайте хотя бы введение книги Джеффри Рихтера “Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows”. Там многое написано. Но вот, что я не учёл при написании моей первой статьи: в разных операционных системах при загрузке программ значения регистров процессора разные. Теперь объясню это на примере. Нам потребуется: OllyDbg; Windows XP; Windows 98. Чтож, приступим. Для начала будем проводить исследование в 98’ой винде. Загрузим шедевр программерской мысли, calc.exe в Олю. Видим такую картину:
Значит до загрузки программы в eax’е 0. Тогда вот что получается:
; ((eax == OptionalHeader.AddressOfEntryPoint) and (eax != 0))
.code
pushad
start:
cmp eax,1 ; в eax’е 1? нет! Там намного больше...
je @@OOO ; Не прыгаем...
call @@AAA
ret
@@AAA:
jmp @@BBB
ret
@@BBB:
call @@CCC
ret
@@CCC:
inc eax ; увеличение счётчика на 1. В итоге в eax’е EP+1, потом EP+2 и т.д.
; и прыжок на @@OOO не осуществится никогда...
jmp start
@@OOO:
popad
invoke GetModuleHandle,NULL
mov hInstance,eax
... cut here ...
Мда. А теперь посмотрим в XP (в ней всё первоначально и делалось). Повторим предыдущее деяние, только в другое системе. И видим это:
Вот такая подстава... Решается это как и всё гениальное (т.е. просто). Надо в начале кода (т.е. после метки start) поставить xor eax,eax или mov eax,0 (кому как нравится). В итоге должен получиться вот такой код:
Теперь посмотрим реакцию PEiD на наши выходки. Компилируем exe и сканируем...
Normal scan: Nothing found *
Deep scan: Nothing found *
Hardcore scan: Nothing found *
PESniffer аналогично в пролёте. Круто! Мы добились чего хотели. Спасибо за интерес к статье. С уважением, SLV/[ROCK]...
Комментарии |
отсутствуют |
Добавление комментария |