четверг, 27 мая 2010 г.

Дружба VirtualKD и WinXP SP3 внутри VMware

Сегодня удалось подружить VirtualKD и WinXP SP3 поставленную в качестве гостевой системы внутри VMware.

Сначала коротко о том, что же такое VirtualKD ?
Если вы перейдете по следующей ссылке, то вы можете прочесть все сами, но приведу слова тут:

In English:
Welcome to the VirtualKD homepage. This project allows speeding up (up to 45x) Windows kernel module debugging using VMWare and VirtualBox virtual machines. If you have ever noticed that the standard debugging over virtual COM port is irritatingly slow, this software is for you!

In Russian(от меня)
Добро пожаловать на домашнюю страничку VirtualKD. Это проект позволяет провысить скорость(до 45x) отладки модулей ядра Windows используя виртуальные машины VMware и VirtualBox . Если Вы когда-либо замечали что стандартная отладка через виртуальный COM порт раздражающе медленная, то это программное обеспечение для Вас!

Думаю теперь вам цель этого проекта понятно и можно приступить к описанию установки, настройки.

1) Установить собственно Windows внутрь VMware
2) Каким-либо способом передать архив дистрибутива внутрь гостевой системы
3) Запустить "target\vminstall.exe" внутри этой гостевой системы
4) Запустить на хостовой, т.е. там где стоит VMware файл "virtualkd\vmmon.exe"
5) Через кнопку "Debugger path" указать путь к отладчику в проге vmmon.exe
6) Перезагрузить гостевую с выбором варианта отладочной загрузки системы
7) После выбора варианта загрузки, система остановится и не будет грузиться. Это нормально!!!
Для этого в загруженном отладчике нужно сказать "ГОУ", для WinDBG это команда "g" в его командной строке и возможно придется два раза, пока не появится "debugging running"
8) Система загрузилась

Теперь, предпочитаю "сохраниться" ;))) Для этого надо перейти в WinDBG и выбрать в верхнем меню Debug->break. После этого гостевая "замрет" и можно нажать кнопку "save snapshot". В комантариях к снэпшоту укажите что хотите не забыть в будущем, чтобы потом не тупить )

среда, 26 мая 2010 г.

Выгрузка драйвера, условия работы DriverUnload

Выгрузка драйвера, не менее важный процесс как и его корректная инициализация.

Инициализация драйвера подобна процессу создания объекта класса в С++. Когда вы создаете объект класса, то в случае, если тело конструктора корректно не отработало и некорректно завершен, тогда не следует ждать работы деструктора объекта. Он отработает только, когда корректно создан объект, читай корректно отработал конструктор. Другими словами, если вам, к примеру, нужно сделать 5 действий, а из них корректно выполнены только 4, то вы должны внутри конструктора "откатить" изменения сделанные этими 4 действиями и только тогда вы можете завершать работу конструктора бросанием исключения. Не стоит надеяться на то что в деструкторе все почистится и завершится!

В модели драйверов WDM точно также, есле не отработана функция DriverEntry, т.е. не завершена кодом возврата STATUS_SUCCESS, то зарегистрированная функция DriverUnload не отработает!

Еще раз подчеркну важность освобождения ресурсов на случай, если что-то пошло не так в конструкторе объекта, если это С++ или в функции инициализации драйвера!

Кстати вот слова взятые тут:
"Note that a driver's Unload routine is not called if a driver's DriverEntry routine returns a failure status."

воскресенье, 16 мая 2010 г.

Развивая Hiew

Сбылась, мечта идиота! :))) Это я о том, что и у меня есть проект, в который можно вкладывать душу! ;) Ну а теперь все по порядку.

Давным-давно, у меня была мечта учавствовать в проекте развития программного средства или системы, которое используют очень множество людей. Очень долго зрела идея помогать множеству людей, быть действительно полезным и нужным, чтобы мой труд приносил пользу как можно большему количеству народу. Шло время, а возможности реализации этой идеи все не представлялось. Буквально недавно до меня дошло как же осуществить мою затею :)

До устройства на постоянную работу в ЗАО "Лабораторию Касперского"(далее ЛК) вирусным аналитиком, мне приходилось сталкиваться с анализом исполнимых файлов формата PE исключительно в личных целях, мне было интересно как устроены защиты ПО, как работают вирусы. В то время анализировал файлы только в основном с помощью небольшого множества инструментов, туда входили Hiew, OllyDebugger, PE-Tools, WinHex. Думаю, вы заметили что я не упомянул IDA Pro, потому что в то время ее не использовал, в силу сложности ее освоения, также не использовал и WinDbg. С течением времени, будучу сотрудником ЛК освоил множество других инструментов, поменялось почти полностью точка зрения на техники исследования. Страшно представить, какое количество файлов пересмотрел, проанализировал, сколько всего узнал работая вирусным аналитиком. Среди большого количества нового, интересного и полезного выделяется одна маленькая утиллита, весом не больше 200 КБ и называется она "Hiew". Именно о ней говорит множество системных программистов и реверсеров, потому что она имеет довольно простой интерфейс и множество весьма полезных возможностей.

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

Приведу, пиар-инфу ;)

Ссылка на домашнюю страницу на русском
Ссылка на интернет-магазин

На данный, момент разработал плагин "mbytes2csrc", цель которого выделенные байты в режимах Hex, Code скопировать в буфер обмена оформленых в виде исходников на Си.

суббота, 8 мая 2010 г.

Выдираем из Hiew-листинга байты инструкций

Получил тут листинг, который ребята получили в результате копирования в режиме Code из Hiew. Чтобы удобней было анализить, т.е. юзать IDA pro и ставить коменты в ходе анализа, то написал небольшой скрипт на Perl:

extract_code.pl:


#!/usr/bin/perl
use strict;
use warnings;

sub ParseFile
{
open (SRCFILE, $_[0]) or die "Can't open source file";
open (DESTFILE, ">$_[1]") or die "Can't create destination file";

while()
{
chomp;
if(/(\.[A-F0-9]{8}: )([A-F0-9]+)(.*)/)
{
my $bin = pack('H*', $2);
syswrite DESTFILE, $bin;
}
}

close(DESTFILE);
close(SRCFILE);
}

ParseFile($ARGV[0],$ARGV[1]);


extract_code.pl usage:
extract_code.pl

Хавает листинг вида:
.0043F3A5: 74F4 jz 00043F39B -- 1
.0043F3A7: 8D441812 lea eax,[eax][ebx][012]
.0043F3AB: EB12 jmps 00043F3BF -- 2
.0043F3AD: 8D742600 lea esi,[esi][0]

вторник, 4 мая 2010 г.

Проверочный ли выпуск у вашей системы ?

В виду того нет тулзы, которая бы ответила бы вам на вопрос в сабже, то предлагаю применить vbs-скрипт для этой цели:

1) сохраните следующее в osversion.vbs:
<начало вырезания>
strComputer = "."

' WMI Connection to the object in the CIM namespace
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

' WMI Query to the Win32_OperatingSystem
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

' For Each... In Loop (Next at the very end)
For Each objItem in colItems
Wscript.Echo "Caption: " & objItem.Caption
Wscript.Echo "Debug: " & objItem.Debug
Wscript.Echo "Version: " & objItem.Version
Next
WSCript.Quit
<конец вырезания>

2) выполните в командной строке:
cscript osversion.vbs

3) Результат будет примерено таким:
Caption: Microsoft Windows 7 Ultimate
Debug: False
Version: 6.1.7600

4) Где "False" говорит о том, что выпуск не проверочный.

Изначально о таком способе прочитал в книге Марка Руссиновича, но почему-то его скрипт не сработал на моей системе. ;( Пришлось немного видоизменить ;)

воскресенье, 2 мая 2010 г.

WDK(7600.16385.1) в одной упряжке с MS Visual Studio 2008 Team Suite

Ринг нуль!

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

Какой же вопрос встал передо мной в первую очередь? Правильно: "Как разрабатывать и  в чем?". Почитав в этой области и увидел множество разнообразных слов в виде "ddkbuild.cmd" или более старый "ddkbuild.bat" , позже натолкнулся на "ddkwizard", но только "VisualDDK" преподнесло мне те возможности какие я искал:

  1. Создание проекта на основе шаблонов;
  2. В проекте уже вставлены и добавлены нужные инклуды и либы;
  3. При создании проекта создаются привычные debug , release папки;

Поэтому я рекомендую всем начинающим посетить VisualDDK . Думаю, после установки этого продукта вам не захочется ставить что-либо другое! ;)

При установке меня всего-лишь спросили папку, где установлен WDK("c:\WinDDK\7600.16385.1\") и ВСЕ! Ну да и во время создания проекта указал, что нужен драйвер под Win XP ;)