Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #70, СЕНТЯБРЬ 2006 г.

детектор лжи

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #070, стр. 070-060-7


62FFF8 00000666 ; аргумент, переданный потоку

62FFFC 00000000 ; дно пользовательского стека потока

666h – это аргументы, переданные «нечестной» копии потока, а 520000h – его стартовый адрес, принадлежащий (если верить карте памяти) блоку памяти, выделенному функцией VirtualAlloc.

ЛИСТИНГ

карта памяти процесса va_thread

Address Size Owner Section Contains Type Access Initial

400000 1000 va_threa PE header Imag R RWE

401000 4000 va_threa .text code Imag R RWE

405000 1000 va_threa .rdata imports Imag R RWE

406000 2000 va_threa .data data Imag R RWE

410000 2000 Map R R

51E000 1000 Priv RW Guar RW

51F000 1000 stack of thr Priv RW Guar RW

520000 1000 Priv RWE RWE

62E000 1000 Priv RW Guar RW

Последний поток — 578h, представляет собой основной поток программы и хранит свой стартовый адрес не в третьем, а во втором (!) двойном слове.

ЛИСТИНГ

поток 578h хранит свой стартовый адрес во втором двойном слове

12FFE0 FFFFFFFF End of SEH chain

12FFE4 79481F54 SE handler

12FFE8 79432B18 KERNEL32.79432B18

12FFEC 00000000

12FFF0 00000000

12FFF4 00000000

12FFF8 00401405 va_threa.<ModuleEntryPoint> ; стартовый адрес потока 578h

12FFFC 00000000 ; дно пользовательского стека потока

Итак, мы научились быстро и просто определять стартовые адреса потоков, четко отличая «левых» от «правых». Кстати, чтобы каждый раз не сверяться с картой памяти, можно использовать следующий трюк. Если при нажатии стартового адреса в контекстом меню OllyDbg присутствует строчка «Follow in Disassembler» – он принадлежит страничному имиджу (то есть легальному потоку) и, соответственно, наоборот.

На самом деле, праздновать победу еще рано. Умная малварь может нас легко обмануть. Самое простое — подменить истинный стартовый адрес так, чтобы он указывал внутрь страничного имиджа целевого процесса (но в этом случае он должен совпадать с началом какой-нибудь процедуры, иначе мы тут же разоблачим обман). Более умная малварь использует хитрый способ внедрения — находит в целевом процессе функцию по стандартному прологу PUSH EBP/MOV EBP, ESP (55h/8Bh ECh), вставляет в ее начало jump на выделенный из кучи блок, где размещено ее тело, создает новый поток, начинающийся с jump, и тут же восстанавливает оригинальное содержимое хакнутой функции, убирая jump и возвращая стандартный пролог. Еще остается вариант загрузки внутрь процесса динамической библиотеки, принадлежащей малвари, и запуск внутри нее нового потока.

Во всех этих случаях анализ стартового адреса не даст никакого результата, и внедрение зловредного кода останется незамеченным. Чтобы быть уверенным на все 100%, необходимо трассировать каждый из потоков на предмет проверки его лояльности. Потоки, порожденные малварью, либо шпионят за клавиатурой, либо открывают backdoor, либо рассылают спам. Проблема в том, что потоков (легальных) очень много, а современная малварь пишется уже не на ассемблере, а черт знает на чем (DELPHI, Visual BASIC). И полный анализ потребует уйму времени, однако, как говорилось выше, умная малварь — большая редкость, и подделкой стартовых адресов потоков никто не занимается.

Назад на стр. 070-060-6  Содержание  Вперед на стр. 070-060-8