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

детектор лжи

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

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


Призываем на помощь OllyDbg и пытаемся разобраться в ситуации самостоятельно, без всех этих прелестей автоматизации и прочих чудес технического прогресса. Подключившись к процессу va_thread.exe, в меню «view» выбираешь пункт «thread» и... обнаруживаешь не три (как ожидалось), а целых четыре потока!

ЛИСТИНГ

информация о четырех потоках, выданная OllyDbg

Ident Entry Data block Last error Status Priority

050C 7943B700 7FFDB000 ERROR_SUCCESS Active 32 + 0

0558 00000000 7FFDC000 ERROR_SUCCESS Suspended 32 + 0

055C 00000000 7FFDE000 ERROR_SUCCESS Suspended 32 + 0

0578 00000000 7FFDD000 ERROR_SUCCESS Suspended 32 + 0

Стартовый адрес (entry) определен только для одного из потоков — 50Ch, да и тот, вероятно, служит для связки отлаживаемого процесса с OllyDbg. Стартовые адреса остальных потоков выставлены в ноль, но ведь это же не так... Щелкаешь мышью по потоку c идентификатором 558h (естественно, при следующем запуске программы идентификаторы потоков будут другими) и получаешь код, который (судя по карте памяти) принадлежит страничному имиджу, следовательно, это — легальный поток.

ЛИСТИНГ

код потока 558h, находящегося в пределах страничного имиджа

401000 55 PUSH EBP

401001 8B EC MOV EBP,ESP

401003 B8 01000000 MOV EAX,1

401008 85C0 TEST EAX,EAX

40100A 74 02 JE SHORT va_threa.0040100E

40100C EB F5 JMP SHORT va_threa.00401003

Переходи к окну стека, перемещая ползунок в самый низ. На дне стека увидишь аргумент, переданный потоку (второе двойное слово, в данном случае равное 999h), и стартовый адрес потока (лежащий в третьем двойном слове и в данном случае равный 401000h), что верно (на самом деле, в зависимости от способа создания потока, стартовый адрес может лежать как в третьем, так и во втором слове, поэтому автоматические утилиты и путаются).

ЛИСТИНГ

на дне пользовательского стека потока 558h лежит стартовый адрес вместе с переданным ему аргументом

51FFDC FFFFFFFF End of SEH chain

51FFE0 79481F54 SE handler

51FFE4 79432B08 KERNEL32.79432B08

51FFE8 00000000

51FFEC 00000000

51FFF0 00000000

51FFF4 00401000 va_threa.00401000 ; стартовый адрес потока 558h

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

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

Переходи к следующему потоку — 55Ch. Код выглядит так же, как раньше (ведь запустили два экземпляра одной и той же функции), а вот содержимое дна стека слегка изменилось.

ЛИСТИНГ

на дне пользовательского стека потока 55Ch лежит стартовый адрес вместе с переданным ему аргументом

62FFDC FFFFFFFF End of SEH chain

62FFE0 79481F54 SE handler

62FFE4 79432B08 KERNEL32.79432B08

62FFE8 00000000

62FFEC 00000000

62FFF0 00000000

62FFF4 00520000 ; стартовый адрес потока 55Сh

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