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

детектор лжи

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

Спецвыпуск: Хакер, номер #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 – это «нечестный» поток (а чем он еще может быть), только его стартовый адрес определен неправильно!

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