детектор лжи КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #070, стр. 070-060-5 В OllyDbg в меню «file» выбираешь «attach» и указываешь процесс, чьи потоки будешь исследовать. После успешного присоединения к процессу говоришь «view» —> «memory» или давишь <ALT-M>. Получаешь карту. Регионы, помеченные как «Priv» (сокращение от «private»), принадлежат блокам динамической памяти, «map» (сокращение от «mapping») – проекциям файлов, созданных функциями CreateFileMapping/MapViewOfFile, «Imag» (сокращение от «imaging») – страничным имиджам исполняемых файлов или динамических библиотек. В PE-TOOLS для той же цели необходимо выделить процесс и в контекстном меню выбрать «dump region», при этом на экране появится диалоговое окно с картой памяти — не так подробно как у OllyDbg, но для нашей задачи вполне удовлетворительно. Для дальнейших экспериментов понадобится программа, создающая пару потоков — «честным» и «нечестным» путем. ЛИСТИНГ исходный код демонстрационной программы (с опущенной обработкой ошибок и других исключительных ситуаций), полная версия — на диске #include <stdio.h> #include <windows.h> // код потока, который ничего не делает, а только мотает цикл thread(){while(1);} main() { void *p; // переменная многоцелевого назначения // создаем «честный» поток CreateThread(0,0,(void*)&thread,0x999,0,&p); // создаем «нечестный» поток так, как это делает malware: // выделяем блок памяти из кучи, копируем туда код потока // и вызываем CreateThread p = VirtualAlloc(0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); memcpy(p,thread,0x1000);CreateThread(0,0,p,0x666,0,&p); // ждем нажатия на ENTER gets(&p); } Компилируешь с настройками по умолчанию, запускаешь, заходишь в soft-ice, даешь команду «THREAD -x» (вывод детальной информации о потоках) и смотришь полученный результат. ЛИСТИНГ информация о потоках в soft-ice (в сокращенном виде) :THREAD -x Extended Thread Info for thread 374 KTEB 873CFDA0 TID: 374 Process: va_thread(11C) Start EIP: KERNEL32!SetUnhandledExceptionFilter+001A (77E878C1) User Stack: 00030000 — 00130000 Stack Ptr: 0012FD24 Extended Thread Info for thread 238 KTEB: 82007020 TID: 238 Process: va_thread(11C) Start EIP: KERNEL32!CreateFileA+00C3 (77E92C50) User Stack: 00420000 — 00520000 Stack Ptr: FFFFFFFF Extended Thread Info for thread 30C KTEB: 82007AC0 TID: 30C Process: va_thread(11C) Start EIP: KERNEL32!CreateFileA+00C3 (77E92C50) User Stack: 00530000 — 00630000 Stack Ptr: FFFFFFFF Soft-ice не смог определить истинные стартовые адреса потоков, заблудившись в недрах KERNEL32.DLL. Что ж, попробуем другой инструмент — Process Explorer от Марка Руссиновича, весьма неплохо разбирающегося во внутренностях операционных систем от Microsoft (и даже участвующего в написании книги «Windows NT Internals»). Скачиваешь (совершенно бесплатно) Process Explorer, запускаешь, наводишь курсор на «va_thread.exe» (или как назвал демонстрационную программу), далее в контекстом меню выбираешь пункт «Properties» и в открывшемся диалоговом окне переходишь к вкладке «Threads». Что видим? Адреса двух потоков определены верно. Первый: va_thread.exe+0x1405, судя по адресу, представляет основной поток (адрес совпадает с точкой входа, что легко проверить в hiew'е). Второй: va_thread.exe+0x1000 — это «честно» созданный поток (что, опять-таки, проверяется по адресу в hiew'е), а вот третий – KERNEL32.DLL+0xB700 – это «нечестный» поток (а чем он еще может быть), только его стартовый адрес определен неправильно! |