<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Волчьи IT-мысли &#187; Отладка</title>
	<atom:link href="http://sww-it.ru/category/debugging/feed" rel="self" type="application/rss+xml" />
	<link>http://sww-it.ru</link>
	<description>Компьютерная безопасность, IT, антивирусная индустрия.</description>
	<lastBuildDate>Wed, 18 Jan 2012 11:20:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Свежий взгляд на антиотладку</title>
		<link>http://sww-it.ru/2011-06-02/543?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2581%25d0%25b2%25d0%25b5%25d0%25b6%25d0%25b8%25d0%25b9-%25d0%25b2%25d0%25b7%25d0%25b3%25d0%25bb%25d1%258f%25d0%25b4-%25d0%25bd%25d0%25b0-%25d0%25b0%25d0%25bd%25d1%2582%25d0%25b8%25d0%25be%25d1%2582%25d0%25bb%25d0%25b0%25d0%25b4%25d0%25ba%25d1%2583</link>
		<comments>http://sww-it.ru/2011-06-02/543#comments</comments>
		<pubDate>Thu, 02 Jun 2011 13:19:59 +0000</pubDate>
		<dc:creator>priv8v</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[anti-debug]]></category>
		<category><![CDATA[IsDebuggerPresent]]></category>
		<category><![CDATA[анти-отладка]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=543</guid>
		<description><![CDATA[<p align="justify">Ниже пойдет речь исключительно об OllyDbg и плагинах к ней, но описанный подход и сами идеи при определенных навыках вы сможете использовать применительно и к другим утилитам такого класса.</p> <p align="justify">Если эти строки вы читаете, борясь с желанием закрыть окно браузера оттого, что далеко не уверены, будет ли сказано далее что-то для вас новое [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Ниже пойдет речь исключительно об OllyDbg и плагинах к ней, но описанный подход и сами идеи при определенных навыках вы сможете использовать применительно и к другим утилитам такого класса.</p>
<p align="justify">Если эти строки вы читаете, борясь с желанием закрыть окно браузера оттого, что далеко не уверены, будет ли сказано далее что-то для вас новое и оригинальное, то ответьте для себя на следующие вопросы:</p>
<p align="justify">Как работает функция IsDebuggerPresent? Если ее не вызывать из kernel32, а реализовать ее функционал в своем коде, то получится ли обмануть анти-антиотладку? Как плагин скрывает процесс отладчика (чтобы его подопытная программа не завершила по имени или не прекратила свою работу)?</p>
<p align="justify">Если на эти вопросы вы с легкостью отвечаете и еще можете рассуждать на эту тему и рассказать в каком плагине что да как, то статья вряд ли откроет вам на что-то глаза или сможет показать хоть что-то новое, но если прочитать все же хочется или вопросы несколько озадачили, то рекомендую к прочтению.</p>
<p><span id="more-543"></span></p>
<p align="justify">Сам процесс антиотладки и противодействия оной, достаточно автоматизирован &#8212; существует приличное количество навесных защит на файлы и специальных анти-антиотладочных плагинов к дебаггерам.</p>
<p align="justify">На этот раз пойдет речь о способах обнаружения факта отладки путем выявления и анализа изменений, вносимых плагинами отладчика в исследуемый процесс и систему. Плагины скрывают присутствие отладчика в системе, но скрывают ли они себя самих? Не вызывают ли они каких-то аномалий? При поиске ответов на эти вопросы из под пера (точнее клавиатуры) вышла  данная рукопись.</p>
<p align="justify">На тему противодействия отладке написано немало статей, как хороших, так и &#171;ни о чем&#187;. У меня нет ни малейшего желания изобретать колесо и разжевывать то, что было с успехом сделано и до меня, поэтому если что-то в статье вам покажется непонятным, то запрос &#171;антиотладка&#187; в яндекс/гугл, думаю, все расставит по своим местам.</p>
<p align="justify">Все антиотладочные приемы условно можно разделить на две группы:</p>
<ul>
<li>Усложнение возможной отладки. Сюда можно отнести обфускацию кода, паковку/криптовку, использование исключений, разделение кода на потоки/библиотеки, мусорные функции и т.д.</li>
<li>Обнаружение отладки. Название говорит само за себя &#8212; так или иначе происходит обнаружение самого факта исследования: через созданные для этого функции или через нахождения окна/процесса отладчика, нахождение брекпоинтов (CC, проверка атрибутов доступа и др.), замеры времени и т.д.</li>
</ul>
<p align="justify">Как, наверное, уже понял читатель, наш метод относится ко второй группе. Использовать полученное знание можно по-разному. Про это писалось много, но вкратце сказать об этом все же необходимо: обнаружив отладчик, конечно, можно сразу радостно выкинуть алерт типа &#171;debugger detected&#187; и завершить работу, а можно затаиться и потихонечку портить жизнь взломщику &#8212; сбить значения пары переменных, изменить логику работы программы, использовать флаги обнаружения отладчика как слагаемые при вычислении относительного адреса и т.д. Совершенно очевидно, что второй способ способен очень сильно затруднить жизнь исследователю, но все эти возможности оставляю вашей фантазии с базированием на других статья на эту тему, я же только постараюсь показать новые методы обнаружения отладки, а как вы это будете применять далее уже не мое дело.
</p>
<p align="justify">Ниже будут рассмотрены способы защиты от некоторых антиотладочных приемов следующими популярными плагинами для OllyDbg:</p>
<ul>
<li>Olly Advanced 1.26 Beta 12</li>
<li>Hide Debugger v1.2.4 (by Asterix)</li>
<li>HideOD v0.12 (pеdiy.соm)</li>
</ul>
<h5>ZwQueryInformationProcess (InfoClass = 7)</h5>
<p align="justify">Olly Advanced модифицирует данную функцию так, что после ее отработки она сама же зануляет четырехбайтовый буфер и вместо законных FFFFFFFF там будет абсолютный ноль.
</p>
<p align="justify">HideOD работает более жестко. Функцию он модифицирует так, что она, по сути, и не работает (вызова в ядро не происходит). При этом значение регистра есх остается преждним, хотя нормальная функция его бы изменила, значение edx также остается постоянным или меняется на 00320000 (в зависимости от выбора метода в настройках).
</p>
<p align="justify">А в Hide Debugger такой функционал не заложен.</p>
<h5>GetTickCount</h5>
<p align="justify">Защиту от этого метода предлагает только Olly Advanced, причем двумя методами. При выборе первого варианта защиты, происходит просто обнуление возвращаемого значения (при любых обстоятельствах данная функция вернет 0), а второй возвращает небольшое значени и при повторных вызовах функции прибавляет к счетчику единицу. Реализованы они по принципу &#171;перехвати себя сам&#187; &#8212; код функции изменяется так, что как надо она не работает. В любом случае значения счетчиков выходят до безобразия маленькие, чем можно воспользоваться. Вот самый простой пример:
</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">call</span> GetTickCount
<span style="color: #00007f; font-weight: bold;">push</span> <span style="color: #00007f;">eax</span>
<span style="color: #000000; font-weight: bold;">invoke</span> Sleep<span style="color: #339933;">,</span> 1000d <span style="color: #666666; font-style: italic;">; 3e8h</span>
<span style="color: #00007f; font-weight: bold;">call</span> GetTickCount
<span style="color: #00007f; font-weight: bold;">pop</span> <span style="color: #00007f;">ecx</span>
<span style="color: #00007f; font-weight: bold;">sub</span> <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #00007f;">ecx</span></pre></div></div>

<p align="justify">В итоге если в eax ноль или единица, а не законный минимум 3E8, то значит, поработал плагин&#8230;<br />
Данная функция состоит из четырех строк и не делает каких-либо глубинных вызовов по относительным адресам, поэтому никаких сложностей собственной ее реализации быть не должно:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;"><span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #00007f;">EDX</span><span style="color: #339933;">,</span>7FFE0000
<span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #00007f;">DS</span><span style="color: #339933;">:</span><span style="color: #00007f;">EDX</span><span style="color: #009900; font-weight: bold;">&#93;</span>
<span style="color: #00007f; font-weight: bold;">MUL</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #00007f;">DS</span><span style="color: #339933;">:</span><span style="color: #00007f;">EDX</span><span style="color: #339933;">+</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#93;</span>
<span style="color: #00007f; font-weight: bold;">SHRD</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span><span style="color: #00007f;">EDX</span><span style="color: #339933;">,</span><span style="color: #0000ff;">18</span>
<span style="color: #00007f; font-weight: bold;">PUSH</span> <span style="color: #00007f;">EAX</span>
<span style="color: #00007f; font-weight: bold;">PUSH</span> <span style="color: #0000ff;">3E8</span>                    <span style="color: #666666; font-style: italic;">; Timeout = 1000. ms</span>
<span style="color: #00007f; font-weight: bold;">CALL</span>   <span style="color: #666666; font-style: italic;">; Sleep</span>
<span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #00007f;">EDX</span><span style="color: #339933;">,</span>7FFE0000
<span style="color: #00007f; font-weight: bold;">MOV</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #00007f;">DS</span><span style="color: #339933;">:</span><span style="color: #00007f;">EDX</span><span style="color: #009900; font-weight: bold;">&#93;</span>
<span style="color: #00007f; font-weight: bold;">MUL</span> <span style="color: #009900; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">DWORD</span> <span style="color: #00007f;">DS</span><span style="color: #339933;">:</span><span style="color: #00007f;">EDX</span><span style="color: #339933;">+</span><span style="color: #0000ff;">4</span><span style="color: #009900; font-weight: bold;">&#93;</span>
<span style="color: #00007f; font-weight: bold;">SHRD</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span><span style="color: #00007f;">EDX</span><span style="color: #339933;">,</span><span style="color: #0000ff;">18</span>
<span style="color: #00007f; font-weight: bold;">POP</span> <span style="color: #00007f;">ECX</span>
<span style="color: #00007f; font-weight: bold;">SUB</span> <span style="color: #00007f;">EAX</span><span style="color: #339933;">,</span><span style="color: #00007f;">ECX</span></pre></div></div>

<p align="justify">Чтобы не бросаться в глаза можно обойтись и без Sleep&#8217;a, просто проверить один раз использовать код GetTickCount и проверить еах на близость к нулю, и если на данном участке программы такое небольшое значение невозможно, то значит плагин детектед&#8230; </p>
<h5>Process32Next</h5>
<p align="justify">Теперь рассмотрим что за жуткую зиродей руткит-технологию используют плагины для сокрытия процесса ollydbg от подопытной программы.<br />
Olly Advanced в этом плане решил не заморачиваться и просто обнуляет еах в функции Process32NextW, на чем, собственно, все листание процессов и заканчивается: Process32First отрабатывает как положено, а процессов next оказывается в системе не существует, ну, на нет и суда нет, видимо юзер так оптимизировал систему убрав ненужные процессы ;)
</p>
<p align="justify">Кстати, помимо того, что в реальной системе процессов чуть побольше чем один, так и при завершении листания всех процессов, Process32Next помимо выдачи нуля в eax еще и LastError, установленный в ERROR_NO_MORE_FILES, обеспечит&#8230;
</p>
<p align="justify">HideOD работает точно также и обсуждать его посему незачем. </p>
<p align="justify">В Hide Debugger такой функционал не замечен, конечно, может там названо это иначе, например защитой от убийства процесса (галочка напротив TerminateProcess), но какого-либо результата от установки этой защиты добиться не удалось, подопытной утилите ничто не помешало пролистать процессы, найти процесс олли и благополучно его прибить, после этого у меня пропало всякое желание исследовать, почему так происходит в этом плагине. К слову сказать, защита от TerminateProcess в Olly Advanced работает как топор &#8212; просто и надежно: в самое начало функции поставлен ret. </p>
<p><br /><br /></p>
<p align="justify">Теперь, после знакомства с некоторыми принципами работы анти-антиотладочных плагинов можно перейти к выводам. Некоторые из них уже были вкратце озвучены выше, а до каких-то нужно еще дойти посредством мыслительной деятельности &#8212; размышляя какие слабости у таких методов реализации защиты отладчика от агрессивно настроенных программ:
</p>
<p align="justify">
<ul>
<li>Поиск аномалий
<ul>
<li>Различия в изменениях регистров. Исследовав работу чистой функции и с плагином можно выявить различия.</li>
<li>Используя функцию GetLastError (или самостоятельно находя значение в блоке окружения) после антиотладочных функций (выше есть пример) проверить правильность ее работы. Если функция в случае неудачи возвращает 0 и msdn советует вызывать GetLastError, которая клянется, что все ОК, то это повод задуматься&#8230;</li>
<li>Можно обнаружить сплайсинг путем поиска опкода jmp в первых байтах функции. Вызвав GetProcAddress, можно не только использовать его для вызова, но и незаметно сохранить первые его байты, а потом в спокойной остановке исследовать.</li>
<li>Правдоподобность. Один процесс в системе это похоже на истину? Нет. Вот и ответ.</li>
</ul>
</li>
<li>Рыба ищет, где глубже&#8230;
<ul>
<li>Использовать NativeAPI. Конечно, в некоторых случаях перехвачены и они, но ведь это общая рекомендация и из примеров выше видно на каком уровне что изменяется.</li>
<li>sysenter. В этом случае за собой придется таскать массив номеров системных вызовов, т.к от системы к системе они меняются.</li>
<li>Серединный вызов api-функций. На самом деле это не так сложно как кажется и таскать за собой километры кода функций не требуется, достаточно вызывать с $+5, т.к зачастую именно в первых пяти байтах содержится jmp, тем более не стоит забывать о распространенном пятибайтовом прологе.</li>
</ul>
</li>
<li>Ищем плагин. Если сам отладчик может быть замаскирован как бревно в собственном глазу (т. е найти почти нереально), то плагин может и не скрываться совсем. Например, CommandBar светится классом окна ComboLBox.</li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2011-06-02%2F543&amp;title=%D0%A1%D0%B2%D0%B5%D0%B6%D0%B8%D0%B9%20%D0%B2%D0%B7%D0%B3%D0%BB%D1%8F%D0%B4%20%D0%BD%D0%B0%20%D0%B0%D0%BD%D1%82%D0%B8%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D1%83" id="wpa2a_2"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2011-06-02/543/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Использование мэппинга драйверов</title>
		<link>http://sww-it.ru/2010-07-08/485?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b8%25d1%2581%25d0%25bf%25d0%25be%25d0%25bb%25d1%258c%25d0%25b7%25d0%25be%25d0%25b2%25d0%25b0%25d0%25bd%25d0%25b8%25d0%25b5-%25d0%25bc%25d1%258d%25d0%25bf%25d0%25bf%25d0%25b8%25d0%25bd%25d0%25b3%25d0%25b0-%25d0%25b4%25d1%2580%25d0%25b0%25d0%25b9%25d0%25b2%25d0%25b5%25d1%2580%25d0%25be%25d0%25b2</link>
		<comments>http://sww-it.ru/2010-07-08/485#comments</comments>
		<pubDate>Thu, 08 Jul 2010 11:50:08 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[windbg]]></category>
		<category><![CDATA[драйвер]]></category>
		<category><![CDATA[мэппинг]]></category>
		<category><![CDATA[трюки]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=485</guid>
		<description><![CDATA[<p align="justify">В отладчике WinDbg существует специальная возможность – мэппинг драйвера. Отладчик может перехватить момент загрузки драйвера на тестовой машине и загрузить в память копию драйвера с машины разработчика. Эта способность избавляет разработчика от проблемы копирования файла драйвера на тестовую машину и, конечно, от забывчивости.</p> <p></p> <p align="justify">Прежде всего, необходимо внести в переменные окружения компьютера разработчика [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">В отладчике WinDbg существует специальная возможность – мэппинг драйвера. Отладчик может перехватить момент загрузки драйвера на тестовой машине и загрузить в память копию драйвера с машины разработчика. Эта способность избавляет разработчика от проблемы копирования файла драйвера на тестовую машину и, конечно, от забывчивости.</p>
<p><span id="more-485"></span></p>
<p align="justify">Прежде всего, необходимо внести в переменные окружения компьютера разработчика параметр <strong>_NT_KD_FILES</strong>, где значением этого параметра должен быть полный путь до специального map-файла, например, <strong>c:\driver.map</strong>.</p>
<p align="justify">Далее, необходимо создать сам map-файл по выбранному пути с указанным содержимым:</p>
<blockquote><p>map<br />
\??\C:\1\driver32.sys<br />
C:\project_path\out\debug\driver32.sys
</p></blockquote>
<p align="justify">Во второй строке файла необходимо указать путь до драйвера на тестовой машине (например, на VmWare) так, как он указан в реестре данного сервиса. В третьей строке необходимо указать путь до файла на машине разработчика. Удобнее всего использовать путь до директории, в которой собирается chk-билд драйвера. Тогда каждый раз при загрузке драйвера будет загружена его новая версия.
</p>
<p align="justify">В отладчике процесс загрузки драйвера с машины разработчика на тестовую машину выглядит примерно так:</p>
<blockquote><p>kd> g<br />
KD: Accessing &#8216;C:\project_path\out \debug\driver32.sys&#8217; (\??\C:\1\driver32.sys)<br />
  File size 91K&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
MmLoadSystemImage: Pulled \??\C:\1\driver32.sys from kd</p></blockquote>
<p align="justify">Удачной отладки!</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-07-08%2F485&amp;title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BC%D1%8D%D0%BF%D0%BF%D0%B8%D0%BD%D0%B3%D0%B0%20%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%BE%D0%B2" id="wpa2a_4"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-07-08/485/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Утилита DumpConfigurator</title>
		<link>http://sww-it.ru/2010-03-10/447?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2583%25d1%2582%25d0%25b8%25d0%25bb%25d0%25b8%25d1%2582%25d0%25b0-dumpconfigurator</link>
		<comments>http://sww-it.ru/2010-03-10/447#comments</comments>
		<pubDate>Wed, 10 Mar 2010 20:18:14 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[memory dump]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=447</guid>
		<description><![CDATA[<p>Рекомендую всем простенькую тулзу для конфигурации memory дампов. Она выполнена в виде .hta-файла.</p> <p class="wp-caption-text">Утилита DumpConfigurator</p> <p>Ссылка на скачивание: </p> <p>http://www.codeplex.com/WinPlatTools/SourceControl/changeset/view/14600#256939</p> ]]></description>
			<content:encoded><![CDATA[<p>Рекомендую всем простенькую тулзу для конфигурации memory дампов. Она выполнена в виде .hta-файла.</p>
<div id="attachment_448" class="wp-caption aligncenter" style="width: 820px"><a href="http://sww-it.ru/wp-content/uploads/2010/03/dumpcfg.png"><img src="http://sww-it.ru/wp-content/uploads/2010/03/dumpcfg.png" alt="" title="dumpcfg" width="810" height="410" class="size-full wp-image-448" /></a><p class="wp-caption-text">Утилита DumpConfigurator</p></div>
<p>Ссылка на скачивание:
</p>
<p><a href="http://www.codeplex.com/WinPlatTools/SourceControl/changeset/view/14600#256939">http://www.codeplex.com/WinPlatTools/SourceControl/changeset/view/14600#256939</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2010-03-10%2F447&amp;title=%D0%A3%D1%82%D0%B8%D0%BB%D0%B8%D1%82%D0%B0%20DumpConfigurator" id="wpa2a_6"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2010-03-10/447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Адрес модуля в WinDbg</title>
		<link>http://sww-it.ru/2009-11-20/339?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d0%25b0%25d0%25b4%25d1%2580%25d0%25b5%25d1%2581-%25d0%25bc%25d0%25be%25d0%25b4%25d1%2583%25d0%25bb%25d1%258f-%25d0%25b2-windbg</link>
		<comments>http://sww-it.ru/2009-11-20/339#comments</comments>
		<pubDate>Fri, 20 Nov 2009 13:32:07 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=339</guid>
		<description><![CDATA[<p style="text-align: justify;">Довольно часто я сталкиваюсь с тем, что необходимо получить имя модуля по какому-либо адресу внутри него. Например, для того, чтобы загрузить символы этого модуля. Отладчик использует отложенную загрузку символов (deferred symbol loading или lazy symbol loading) и выражается она в том, что символы подгружаются только тогда, когда они нужны. Делается это специально, иначе [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Довольно часто я сталкиваюсь с тем, что необходимо получить имя модуля по какому-либо адресу внутри него. Например, для того, чтобы загрузить символы этого модуля. Отладчик использует отложенную загрузку символов (<em>deferred symbol loading</em> или <em>lazy symbol loading</em>) и выражается она в том, что символы подгружаются только тогда, когда они нужны. Делается это специально, иначе программист устанет ждать, когда же загрузятся все символы. Я, кстати, не знаю в чем смысл «когда они нужны». Эта тайна доступна лишь программистам WinDbg.</p>
<p style="text-align: justify;"><span id="more-339"></span></p>
<p>И так часто бывает, что по команде <span style="color: #0000ff;">lm</span> видны лишь несколько модулей ядра:</p>
<blockquote><p>kd&gt; <span style="color: #0000ff;">lm</span></p>
<p>start    end        module name<br />
8181c000 81bd5000   nt         (pdb symbols)          c:\symserver\ntkrpamp.pdb\37D328E3BAE5460F8E662756ED80951D2\ntkrpamp.pdb</p>
<p>Unloaded modules:<br />
85b4a000 85b57000   crashdmp.sys<br />
85b57000 85b61000   dump_storport.sys<br />
85b61000 85b7b000   dump_LSI_SCSI.sys<br />
85b7b000 85b8c000   dump_dumpfve.sys</p></blockquote>
<p style="text-align: justify;">Рассмотрим типичную ситуацию, в которой необходимо получить имя модуля по адресу в его образе:</p>
<blockquote><p>kd&gt; <span style="color: #0000ff;">!devstack \Device\Harddisk0\DR0</span></p>
<p>!DevObj   !DrvObj            !DevExt   ObjectName<br />
84680d20  \Driver\partmgr    84680dd8<br />
&gt; 8457d1e0  \Driver\disk       8457d298  DR0<br />
<strong>83d03708  \Driver\LSI_SCSI   83d037c0  0000004b</strong></p>
<p>!DevNode 83d031d0 :</p>
<p>DeviceInst is &#171;SCSI\Disk&amp;Ven_VMware_&amp;Prod_VMware_Virtual_S\4&amp;2b9256da&amp;0&amp;000000&#8243;</p>
<p>ServiceName is &#171;disk&#187;</p>
<p>kd&gt; <span style="color: #0000ff;">!devobj 83d03708</span><br />
Device object (83d03708) is for:<br />
0000004b \Driver\LSI_SCSI <strong>DriverObject 833bbb98</strong><br />
Current Irp 00000000 RefCount 0 Type 00000007 Flags 00001050<br />
Dacl 87c8f334 DevExt 83d037c0 DevObjExt 83d03a38 DevNode 83d031d0<br />
ExtensionFlags (0&#215;00000800)<br />
Unknown flags 0&#215;00000800<br />
AttachedDevice (Upper) 8457d1e0 \Driver\disk<br />
Device queue is not busy.</p>
<p>kd&gt; <span style="color: #0000ff;">!drvobj 833bbb98 2</span><br />
Driver object (833bbb98) is for:<br />
\Driver\LSI_SCSI<br />
DriverEntry:   81fec005<br />
DriverStartIo: 00000000<br />
DriverUnload:  807b9a50<br />
AddDevice:     807b379c</p>
<p>Dispatch routines:</p>
<p>[00] IRP_MJ_CREATE                      807e460a	+0x807e460a<br />
[01] IRP_MJ_CREATE_NAMED_PIPE           81841fef	nt!IopInvalidDeviceRequest<br />
[02] IRP_MJ_CLOSE                       807e4565	+0x807e4565<br />
[03] IRP_MJ_READ                        81841fef	nt!IopInvalidDeviceRequest<br />
[04] IRP_MJ_WRITE                       81841fef	nt!IopInvalidDeviceRequest<br />
[05] IRP_MJ_QUERY_INFORMATION           81841fef	nt!IopInvalidDeviceRequest<br />
[06] IRP_MJ_SET_INFORMATION             81841fef	nt!IopInvalidDeviceRequest<br />
[07] IRP_MJ_QUERY_EA                    81841fef	nt!IopInvalidDeviceRequest<br />
[08] IRP_MJ_SET_EA                      81841fef	nt!IopInvalidDeviceRequest<br />
[09] IRP_MJ_FLUSH_BUFFERS               81841fef	nt!IopInvalidDeviceRequest<br />
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    81841fef	nt!IopInvalidDeviceRequest<br />
[0b] IRP_MJ_SET_VOLUME_INFORMATION      81841fef	nt!IopInvalidDeviceRequest<br />
[0c] IRP_MJ_DIRECTORY_CONTROL           81841fef	nt!IopInvalidDeviceRequest<br />
[0d] IRP_MJ_FILE_SYSTEM_CONTROL         81841fef	nt!IopInvalidDeviceRequest<br />
<strong>[0e] IRP_MJ_DEVICE_CONTROL              807e46cb	+0x807e46cb</strong><br />
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     807b3ee3	+0x807b3ee3<br />
[10] IRP_MJ_SHUTDOWN                    81841fef	nt!IopInvalidDeviceRequest<br />
[11] IRP_MJ_LOCK_CONTROL                81841fef	nt!IopInvalidDeviceRequest<br />
[12] IRP_MJ_CLEANUP                     81841fef	nt!IopInvalidDeviceRequest<br />
[13] IRP_MJ_CREATE_MAILSLOT             81841fef	nt!IopInvalidDeviceRequest<br />
[14] IRP_MJ_QUERY_SECURITY              81841fef	nt!IopInvalidDeviceRequest<br />
[15] IRP_MJ_SET_SECURITY                81841fef	nt!IopInvalidDeviceRequest<br />
[16] IRP_MJ_POWER                       807b998f	+0x807b998f<br />
[17] IRP_MJ_SYSTEM_CONTROL              807e48fe	+0x807e48fe<br />
[18] IRP_MJ_DEVICE_CHANGE               81841fef	nt!IopInvalidDeviceRequest<br />
[19] IRP_MJ_QUERY_QUOTA                 81841fef	nt!IopInvalidDeviceRequest<br />
[1a] IRP_MJ_SET_QUOTA                   81841fef	nt!IopInvalidDeviceRequest<br />
[1b] IRP_MJ_PNP                         807e629c	+0x807e629c</p>
<p>kd&gt; <span style="color: #0000ff;">lma 0x807e46cb</span></p>
<p>start    end        module name</p></blockquote>
<p style="text-align: justify;">Команда <span style="color: #0000ff;">lm</span> с параметром <span style="color: #0000ff;"><strong>a</strong> <em>Address</em></span> должна вывести имя модуля, в котором содержится данный адрес, но символы не загружены и список модулей практически пуст. Как вариант – это загрузить все символы для всех модулей ядра, но, не загружая их.</p>
<p style="text-align: justify;">
<blockquote>
<p style="text-align: justify;">kd&gt; <span style="color: #0000ff;">.reload /n /s</span><br />
Connected to Windows Server 2008/Windows Vista 6001 x86 compatible target at (Fri Nov 20 15:54:17.231 2009 (GMT+3)), ptr64 FALSE<br />
Loading Kernel Symbols<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br />
&#8230;..<br />
Loading unloaded module list<br />
&#8230;.<br />
kd&gt;<span style="color: #0000ff;"> lm</span><br />
start    end        module name<br />
8060e000 80616000   kdcom      (deferred)<br />
80616000 80676000   mcupdate_GenuineIntel   (deferred)<br />
80676000 80687000   PSHED      (deferred)<br />
80687000 8068f000   BOOTVID    (deferred)<br />
8068f000 806d0000   CLFS       (deferred)<br />
806d0000 807b0000   CI         (deferred)<br />
807b0000 807f1000   storport   (deferred)<br />
8181c000 81bd5000   nt         (pdb symbols)          c:\symserver\ntkrpamp.pdb\37D328E3BAE5460F8E662756ED80951D2\ntkrpamp.pdb<br />
81bd5000 81c08000   hal        (deferred)<br />
81e0e000 81e8a000   Wdf01000   (deferred)<br />
81e8a000 81e97000   WDFLDR     (deferred)<br />
&#8230;</p>
<p>Unloaded modules:<br />
85b4a000 85b57000   crashdmp.sys<br />
85b57000 85b61000   dump_storport.sys<br />
85b61000 85b7b000   dump_LSI_SCSI.sys<br />
85b7b000 85b8c000   dump_dumpfve.sys</p></blockquote>
<p style="text-align: justify;">
<p style="text-align: justify;">Как мы видим, информация о модулях обновилась, а загрузка символов все еще отложена. Теперь попробуем еще раз воспользоваться командой <span style="color: #0000ff;">lm</span>:</p>
<p style="text-align: justify;">
<blockquote>
<p style="text-align: justify;">kd&gt; <span style="color: #0000ff;">lma 0x807e46cb</span><br />
start    end        module name<br />
807b0000 807f1000   storport   (deferred)</p></blockquote>
<p style="text-align: justify;">
<p style="text-align: justify;">Вот мы и получили имя модуля и можем подгрузить только его символы.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">Альтернативный вариант – воспользоваться скриптовым языком отладчика и перечислить все модули ядра:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$$ pointer to modules list
r $t0 <span style="color: #339933;">=</span> nt<span style="color: #339933;">!</span>PsLoadedModuleList
&nbsp;
	.<span style="color: #202020;">echo</span> <span style="color: #ff0000;">&quot;Section             Start               End                 Name&quot;</span>
&nbsp;
.<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> r $t1 <span style="color: #339933;">=</span> poi<span style="color: #009900;">&#40;</span>@$t0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#40;</span>@$t1 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span>@$t1 <span style="color: #339933;">!=</span> @$t0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       r $t1 <span style="color: #339933;">=</span> poi<span style="color: #009900;">&#40;</span>@$t1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    r<span style="color: #339933;">?</span> $t2 <span style="color: #339933;">=</span> <span style="color: #339933;">#CONTAINING_RECORD( @$t1, nt!_LDR_DATA_TABLE_ENTRY, InLoadOrderLinks );</span>
    as <span style="color: #339933;">/</span>x $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$Section<span style="color: #009900;">&#125;</span> @$t2
&nbsp;
    $$  Get image name into $DriverName
    as <span style="color: #339933;">/</span>msu $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$DriverName<span style="color: #009900;">&#125;</span> @@c<span style="color: #339933;">++</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>@$t2<span style="color: #339933;">-&gt;</span>BaseDllName<span style="color: #009900;">&#41;</span>
    $$  Get image base into $Start
    as <span style="color: #339933;">/</span>x $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$Start<span style="color: #009900;">&#125;</span> @@c<span style="color: #339933;">++</span><span style="color: #009900;">&#40;</span>@$t2<span style="color: #339933;">-&gt;</span>DllBase<span style="color: #009900;">&#41;</span>
    $$  Get image base <span style="color: #339933;">+</span> image size into $End
    as <span style="color: #339933;">/</span>x $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$End<span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#40;</span> @@c<span style="color: #339933;">++</span><span style="color: #009900;">&#40;</span>@$t2<span style="color: #339933;">-&gt;</span>DllBase<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> @@c<span style="color: #339933;">++</span><span style="color: #009900;">&#40;</span>@$t2<span style="color: #339933;">-&gt;</span>SizeOfImage<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
&nbsp;
    .<span style="color: #202020;">block</span>
    <span style="color: #009900;">&#123;</span>
        .<span style="color: #202020;">echo</span> $<span style="color: #009900;">&#123;</span>$Section<span style="color: #009900;">&#125;</span><span style="color: #339933;">:</span> $<span style="color: #009900;">&#123;</span>$Start<span style="color: #009900;">&#125;</span><span style="color: #339933;">:</span> $<span style="color: #009900;">&#123;</span>$End<span style="color: #009900;">&#125;</span><span style="color: #339933;">:</span> $<span style="color: #009900;">&#123;</span>$DriverName<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    ad $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$End<span style="color: #009900;">&#125;</span>
    ad $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$Start<span style="color: #009900;">&#125;</span>
    ad $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$DriverName<span style="color: #009900;">&#125;</span>
    ad $<span style="color: #009900;">&#123;</span><span style="color: #339933;">/</span>v<span style="color: #339933;">:</span>$Section<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<blockquote><p>kd&gt; <span style="color: #0000ff;">$$&gt;a&lt; c:\dbg_get_kernel_modules.txt</span><br />
Section             Start               End                 Name<br />
0xffffffff82f69ba0: 0xffffffff8181c000: 0xffffffff81bd5000: ntoskrnl.exe<br />
0xffffffff82f69b30: 0xffffffff81bd5000: 0xffffffff81c08000: hal.dll<br />
0xffffffff82f69ab8: 0xffffffff8060e000: 0xffffffff80616000: kdcom.dll<br />
0xffffffff82f69a40: 0xffffffff80616000: 0xffffffff80676000: mcupdate.dll<br />
0xffffffff82f699c8: 0xffffffff80676000: 0xffffffff80687000: PSHED.dll<br />
0xffffffff82f69950: 0xffffffff80687000: 0xffffffff8068f000: BOOTVID.dll<br />
0xffffffff82f698e0: 0xffffffff8068f000: 0xffffffff806d0000: CLFS.SYS<br />
0xffffffff82f69870: 0xffffffff806d0000: 0xffffffff807b0000: CI.dll<br />
0xffffffff82f697f8: 0xffffffff81e0e000: 0xffffffff81e8a000: Wdf01000.sys<br />
0xffffffff82f69780: 0xffffffff81e8a000: 0xffffffff81e97000: WDFLDR.SYS<br />
0xffffffff82f69710: 0xffffffff81e97000: 0xffffffff81edd000: acpi.sys<br />
0xffffffff82f69698: 0xffffffff81edd000: 0xffffffff81ee6000: WMILIB.SYS<br />
0xffffffff82f69620: 0xffffffff81ee6000: 0xffffffff81eee000: msisadrv.sys<br />
0xffffffff82f695b0: 0xffffffff81eee000: 0xffffffff81f15000: pci.sys<br />
0xffffffff82f69538: 0xffffffff81f15000: 0xffffffff81f24000: partmgr.sys<br />
0xffffffff82f694c0: 0xffffffff81f24000: 0xffffffff81f27000: compbatt.sys<br />
0xffffffff82f69448: 0xffffffff81f27000: 0xffffffff81f31000: BATTC.SYS<br />
0xffffffff82f693d0: 0xffffffff81f31000: 0xffffffff81f40000: volmgr.sys<br />
0xffffffff82f69358: 0xffffffff81f40000: 0xffffffff81f8a000: volmgrx.sys<br />
0xffffffff82f692e0: 0xffffffff81f8a000: 0xffffffff81f91000: intelide.sys<br />
0xffffffff82f69268: 0xffffffff81f91000: 0xffffffff81f9f000: PCIIDEX.SYS<br />
0xffffffff82f691f0: 0xffffffff81f9f000: 0xffffffff81faf000: mountmgr.sys<br />
0xffffffff82f69178: 0xffffffff81faf000: 0xffffffff81fb7000: atapi.sys<br />
0xffffffff82f69100: 0xffffffff81fb7000: 0xffffffff81fd5000: ataport.SYS<br />
0xffffffff82f69088: 0xffffffff81fd5000: 0xffffffff81fef000: lsi_scsi.sys<br />
0xffffffff82f6ff90: 0xffffffff807b0000: 0xffffffff807f1000: storport.sys<br />
&#8230;</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-11-20%2F339&amp;title=%D0%90%D0%B4%D1%80%D0%B5%D1%81%20%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%20%D0%B2%20WinDbg" id="wpa2a_8"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-11-20/339/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Темы WinDbg</title>
		<link>http://sww-it.ru/2009-11-19/327?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2582%25d0%25b5%25d0%25bc%25d1%258b-windbg</link>
		<comments>http://sww-it.ru/2009-11-19/327#comments</comments>
		<pubDate>Thu, 19 Nov 2009 18:07:48 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=327</guid>
		<description><![CDATA[<p style="text-align: justify;">Рабочее место разработчика должно быть удобным для него. Ничего не должно отвлекать от процесса разработки или анализа и все должно быть под рукой. Отладчик WinDbg не блещет красивым и удобным интерфейсом, но старается покорять громадными техническими возможностями.</p> <p style="text-align: justify;">Данная заметка – это вольное изложение документации, которая поставляется с отладчиком.</p> <p style="text-align: justify;"> [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Рабочее место разработчика должно быть удобным для него. Ничего не должно отвлекать от процесса разработки или анализа и все должно быть под рукой. Отладчик WinDbg не блещет красивым и удобным интерфейсом, но старается покорять громадными техническими возможностями.</p>
<p style="text-align: justify;">Данная заметка – это вольное изложение документации, которая поставляется с отладчиком.</p>
<p style="text-align: justify;">
<p style="text-align: justify;"><span id="more-327"></span>Тема отладчика WinDbg – это специальным образом сконфигурированное рабочее место с окнами, закрепленными на своем месте. Выше уже было сказано то, что данный отладчик не отличается дружественным интерфейсом, поэтому темы в нем представлены в виде .reg файлов, которые можно импортировать (и экспортировать из реестра) в определенную ветку реестра (HKEY_CURRENT_USER\Software\Microsoft\Windbg).</p>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Загрузка темы</h3>
<p style="text-align: justify;">
<ol style="text-align: justify;">
<li>Рекомендуется очистить все данные рабочего места. Из GUI WinDbg – File-&gt;Clear Workspace или удалив ключ HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces.</li>
<li>Загрузить тему из директории <strong>themes </strong>(C:\Program Files\Debugging Tools for Windows\themes\) отладчика по вашему выбору. Импортирование информации из .reg файла затрет текущее рабочее место.</li>
</ol>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Перед использованием темы</h3>
<p style="text-align: justify;">
<ol style="text-align: justify;">
<li>После загрузки темы запустите WinDbg без параметров. Откроется рабочее место по умолчанию.</li>
<li>Настройте готовую тему так, как вам это нужно. Не забудьте про пути к символам, исходным кодам и так далее. Также можно подвигать окна так, как вам будет удобно с ними работать.</li>
<li>Закройте отладчик и сохраните ваше рабочее место.</li>
<li>После всех настроек можно экспортировать ветку реестра HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces в .reg файл.</li>
</ol>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Предустановленные темы отладчика WinDbg</h3>

<a href='http://sww-it.ru/2009-11-19/327/theme_standard' title='theme_standard'><img width="150" height="150" src="http://sww-it.ru/wp-content/uploads/2009/11/theme_standard-150x150.jpg" class="attachment-thumbnail" alt="theme_standard" title="theme_standard" /></a>
<a href='http://sww-it.ru/2009-11-19/327/theme_standardvs' title='theme_standardvs'><img width="150" height="150" src="http://sww-it.ru/wp-content/uploads/2009/11/theme_standardvs-150x150.jpg" class="attachment-thumbnail" alt="theme_standardvs" title="theme_standardvs" /></a>
<a href='http://sww-it.ru/2009-11-19/327/theme_srcdisassembly' title='theme_srcdisassembly'><img width="150" height="150" src="http://sww-it.ru/wp-content/uploads/2009/11/theme_srcdisassembly-150x150.jpg" class="attachment-thumbnail" alt="theme_srcdisassembly" title="theme_srcdisassembly" /></a>
<a href='http://sww-it.ru/2009-11-19/327/theme_multimon' title='theme_multimon'><img width="150" height="150" src="http://sww-it.ru/wp-content/uploads/2009/11/theme_multimon-150x150.jpg" class="attachment-thumbnail" alt="theme_multimon" title="theme_multimon" /></a>

<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-11-19%2F327&amp;title=%D0%A2%D0%B5%D0%BC%D1%8B%20WinDbg" id="wpa2a_10"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-11-19/327/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Трюки WinDbg</title>
		<link>http://sww-it.ru/2009-04-15/187?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25d1%2582%25d1%2580%25d1%258e%25d0%25ba%25d0%25b8-windbg</link>
		<comments>http://sww-it.ru/2009-04-15/187#comments</comments>
		<pubDate>Tue, 14 Apr 2009 21:27:55 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[windbg]]></category>
		<category><![CDATA[трюки]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=187</guid>
		<description><![CDATA[<p>Представляю вашему вниманию страницу &#171;Трюки WinDbg&#187;, которую буду пополнять по мере возможности. Об изменениях в ней я сообщу дополнительно. Вопросы можно оставлять в любой теме, которая относится к данной странице.</p> ]]></description>
			<content:encoded><![CDATA[<p>Представляю вашему вниманию страницу <a href="http://sww-it.ru/windbg-tricks">&#171;Трюки WinDbg&#187;</a>, которую буду пополнять по мере возможности. Об изменениях в ней я сообщу дополнительно. Вопросы можно оставлять в любой теме, которая относится к данной странице.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-04-15%2F187&amp;title=%D0%A2%D1%80%D1%8E%D0%BA%D0%B8%20WinDbg" id="wpa2a_12"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-04-15/187/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>IDA vs Windbg</title>
		<link>http://sww-it.ru/2009-03-08/50?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ida-vs-windbg</link>
		<comments>http://sww-it.ru/2009-03-08/50#comments</comments>
		<pubDate>Sun, 08 Mar 2009 10:41:13 +0000</pubDate>
		<dc:creator>SWW</dc:creator>
				<category><![CDATA[Отладка]]></category>
		<category><![CDATA[ida]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://sww-it.ru/?p=50</guid>
		<description><![CDATA[<p style="text-align: justify;">Относительно недавно вышла новая IDA v5.4. В ней были заявлены возможности удаленной отладки, используя Windbg. Конечно, в IDA появились и другие интересные вещи. Среди них я бы выделил те самые три отладчика: Bosch, GDB, Windbg; возможность писать на Python (видимо для гиков и «аверов», которые строят на этом системы анализа); и, задерживаем дыхание, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Относительно недавно вышла новая <strong>IDA v5.4</strong>. В ней были заявлены возможности удаленной отладки, используя <strong>Windbg</strong>. Конечно, в <strong>IDA</strong> <a href="http://www.hex-rays.com/idapro/54/index.htm" target="_blank">появились</a> и другие интересные вещи. Среди них я бы выделил те самые три отладчика: <strong>Bosch</strong>, <strong>GDB</strong>,<strong> Windbg</strong>; возможность писать на <strong>Python</strong> (видимо для гиков и «аверов», которые строят на этом системы анализа); и, задерживаем дыхание, возможность получить  имена локальных переменных и типы из формата .PDB. Последнее означает то, что теперь можно загрузить наконец-то <span style="color: #0000ff;">ntoskrnl.exe</span> в <strong>IDA</strong> и все недокументированные структуры будут как на ладони (это ж надо дойти до этого только к версии 5.4).</p>
<p style="text-align: justify;"><span id="more-50"></span>Картинка ниже показывает недокументированную структуру <span style="color: #0000ff;">_KTHREAD</span> файла ядра.</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-51" title="Недокументрированные структуры" src="http://sww-it.ru/wp-content/uploads/2009/03/structures.png" alt="Недокументрированные структуры" width="714" height="573" /></p>
<p style="text-align: justify;">Возможности загрузить структуры в другой анализируемый файл &#8212; нет. Пользуемся старым способом: добавляем нужные нам структуры и экспортируем их в виде .IDC файла, который потом подгружаем в анализируемый сэмпл. Неудобно добавлять каждую структуру по отдельности, также неудобно то, что нет возможности сразу подгрузить все структуры из .PDB в анализируемый файл.</p>
<p style="text-align: justify;">Первым делом, я взялся смотреть отладчик, так как он мне интереснее всего. Скачиваем по <a href="http://www.hex-rays.com/idapro/debugger/windbg_tut.pdf" target="_blank">ссылке</a> статью, в которой описываются настройки <strong>IDA</strong> для удаленной отладки с помощью <strong>Windbg</strong>. Прежде всего, я советую обратить внимание на следующие моменты:</p>
<ul class="unIndentedList" style="text-align: justify;">
<li> Конфигурация источника символов. Не забываем прописать путь в переменные окружения или перед запуском <strong>IDA</strong> выполняем команду <span style="color: #0000ff;">set</span>.</li>
<li> Выбираем <span style="color: #0000ff;">Debugger-&gt;Attach</span>, а не <span style="color: #0000ff;">Debugger-&gt;Run</span>.</li>
<li> Не забываем поставить галочку <span style="color: #0000ff;">Kernel mode debugging</span>.</li>
</ul>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-52" title="Подключение к ядру" src="http://sww-it.ru/wp-content/uploads/2009/03/attach_options.png" alt="Подключение к ядру" width="404" height="353" /></p>
<p style="text-align: justify;">Сразу после подключения мы получаем полноценный отладчик, который умеет выполнять команды <strong>Windbg</strong> в отдельном окошке. Нам доступны все расширения (смотри <span style="color: #0000ff;">.chain</span> и <span style="color: #0000ff;">.load</span>). Не забывайте нажимать <strong>C</strong> для преобразования в код. В отладчике также работает <strong>Hex-Rays</strong> (для этого надо создать функцию, нажмите <strong>P</strong>, а потом <strong>F5</strong>).</p>
<p style="text-align: justify;"><img class="aligncenter size-full wp-image-53" title="Главное окно отладчика" src="http://sww-it.ru/wp-content/uploads/2009/03/debugger.png" alt="Главное окно отладчика" width="800" height="466" /></p>
<p style="text-align: justify;">Пожалуй, я задумаюсь о полноценном переходе на отладчик <strong>IDA</strong>, использующий <strong>Windbg</strong>. Графический интерфейс однозначно удобнее, а если меня застигнет ностальгия, то всегда под рукой строка для ввода команд <strong>Windbg</strong>.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fsww-it.ru%2F2009-03-08%2F50&amp;title=IDA%20vs%20Windbg" id="wpa2a_14"><img src="http://sww-it.ru/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://sww-it.ru/2009-03-08/50/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

