детектор лжи КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #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 |