<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Lhc645&#039;s Blog</title>
	<atom:link href="http://lhc645.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lhc645.wordpress.com</link>
	<description>Into NT</description>
	<lastBuildDate>Mon, 03 Jan 2011 21:20:04 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='lhc645.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/679d6b7a4727d0377322785f0dee3499?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Lhc645&#039;s Blog</title>
		<link>http://lhc645.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://lhc645.wordpress.com/osd.xml" title="Lhc645&#039;s Blog" />
	<atom:link rel='hub' href='http://lhc645.wordpress.com/?pushpress=hub'/>
		<item>
		<title>WinDbg scripting</title>
		<link>http://lhc645.wordpress.com/2010/06/14/windbg-scripting/</link>
		<comments>http://lhc645.wordpress.com/2010/06/14/windbg-scripting/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 12:59:32 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[debugger]]></category>
		<category><![CDATA[WinDbg]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=158</guid>
		<description><![CDATA[Изрядно надоело при старте процесса в WinDbg каждый раз ставить брейк на kernel32!BaseProcessStart (для xp) или kernel32!BaseThreadInitThunk (windows 7) для того, чтобы попасть на точку входа отлаживаемой проги. Для решения задачи был написан такой вот скрипт http://pastebin.com/mBiRewiq В качестве бонуса стоппится и на tls калбеках тоже. Запуск скрипта производится из командной строки windbg при первой [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=158&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Изрядно надоело при старте процесса в WinDbg каждый раз ставить брейк на kernel32!BaseProcessStart (для xp) или kernel32!BaseThreadInitThunk (windows 7) для того, чтобы попасть на точку входа отлаживаемой проги. Для решения задачи был написан такой вот скрипт</p>
<p><a href="http://pastebin.com/mBiRewiq">http://pastebin.com/mBiRewiq</a></p>
<p>В качестве бонуса стоппится и на tls калбеках тоже. Запуск скрипта производится из командной строки windbg при первой остановке на ntdll!DbgBreakPoint (LdrpDoDebuggerBreak):</p>
<p><em><strong>$$&gt;&lt;имя_скрипта</strong></em></p>
<p>Размещать скрипт в каталоге windbg.</p>
<p><em>Примечание1: после расстановки брейков на калбеках и точке входа происходит запуск (g).</em></p>
<p><em>Примечание2: скрипт предназначается только для 64-битных процессов, для 32 битов нужна коррекция </em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=158&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/06/14/windbg-scripting/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>Wow64 debug</title>
		<link>http://lhc645.wordpress.com/2010/05/25/wow64-debug/</link>
		<comments>http://lhc645.wordpress.com/2010/05/25/wow64-debug/#comments</comments>
		<pubDate>Tue, 25 May 2010 07:49:59 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[wow64]]></category>
		<category><![CDATA[wow64log.dll]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=150</guid>
		<description><![CDATA[В продолжение вот этой темы. Как отлаживать 32-х битный код в 64-битной системе Я упомянула логирование wow64. Это удобно для отладки (например видно сервис из какой таблицы возвратил ошибку), если нет нормальных символов. Разреверсила передаваемые аргументы  функциям в wow64log.dll и написала простой логировщик. Прошу потестить обладателей 64-битной винды. wow64log.dll должна быть помещена в директорию \windows\system32. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=150&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>В продолжение вот этой темы.</p>
<p><a href="http://wasm.ru/forum/viewtopic.php?id=37393">Как отлаживать 32-х битный код в 64-битной системе</a></p>
<p>Я упомянула логирование wow64. Это удобно для отладки (например видно сервис из какой таблицы возвратил ошибку), если нет нормальных символов. Разреверсила передаваемые аргументы  функциям в wow64log.dll и написала простой логировщик.</p>
<p>Прошу потестить обладателей 64-битной винды. wow64log.dll должна быть помещена в директорию \windows\system32. Затем запускаете под windbg любое 32-битное приложение и лицезреете лог.  Кстати, небольшое замечание. В wow64log.dll можно импортировать функции только из ntdll, так как иначе приложение будет угроблено.</p>
<p><a href="http://lhc645.files.wordpress.com/2010/05/wowlogger_xp.jpg"><img class="aligncenter size-medium wp-image-151" title="wowlogger_xp" src="http://lhc645.files.wordpress.com/2010/05/wowlogger_xp.jpg?w=300&#038;h=191" alt="" width="300" height="191" /></a></p>
<p>Вот так выглядит вывод под windbg.</p>
<p><a href="http://www.sendspace.com/file/aj9lsf">Download</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=150&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/05/25/wow64-debug/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>

		<media:content url="http://lhc645.files.wordpress.com/2010/05/wowlogger_xp.jpg?w=300" medium="image">
			<media:title type="html">wowlogger_xp</media:title>
		</media:content>
	</item>
		<item>
		<title>Добавление обработчика исключений, x64</title>
		<link>http://lhc645.wordpress.com/2010/05/15/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-x64/</link>
		<comments>http://lhc645.wordpress.com/2010/05/15/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-x64/#comments</comments>
		<pubDate>Sat, 15 May 2010 10:24:16 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=137</guid>
		<description><![CDATA[В предыдущей записи было обсуждение каким образом можно установить свой обработчик.  Собственно код+экзе [в посте он бы выглядел просто отвратительно] для 64-бит http://www.sendspace.com/file/yf28iu Коротко о том, что я делаю. Получаю адреса лока для LdrpInvertedFunctionTable и самой LdrpInvertedFunctionTable. Для поиска переменных применяю дизассемблер distorm (его либу, кстати надо пересобирать под amd64).Затем в блокирую обращения к таблице. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=137&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>В предыдущей записи было обсуждение каким образом можно установить свой обработчик.  Собственно код+экзе [в посте он бы выглядел просто отвратительно] для 64-бит</p>
<p><a href="http://www.sendspace.com/file/yf28iu">http://www.sendspace.com/file/yf28iu</a></p>
<p>Коротко о том, что я делаю. Получаю адреса лока для LdrpInvertedFunctionTable и самой LdrpInvertedFunctionTable. Для поиска переменных применяю дизассемблер distorm (его либу, кстати надо пересобирать под amd64).Затем в блокирую обращения к таблице. Ищу свой модуль, удаляю инфу о нем из кеша, обнуляю в пе-заголовке IMAGE_DIRECTORY_ENTRY_EXCEPTION. Разблокирую кеш. Добавляю свой обработчик, копирую старую ExceptionDirectory. После этого небольшая проверка на сохранность старых хендлеров и вызов нового.<br />
Тест был на vista,7,xp (64).</p>
<p>Distorm<br />
<a href="http://ragestorm.net/distorm/">http://ragestorm.net/distorm/</a></p>
<p>скрины тестов</p>
<p>win7</p>
<p><a href="http://lhc645.files.wordpress.com/2010/05/seven.png"><img class="alignnone size-medium wp-image-143" title="seven" src="http://lhc645.files.wordpress.com/2010/05/seven.png?w=300&#038;h=237" alt="" width="300" height="237" /></a></p>
<p>winxp</p>
<p><a href="http://lhc645.files.wordpress.com/2010/05/w7.jpg"><img class="alignnone size-medium wp-image-144" title="w7" src="http://lhc645.files.wordpress.com/2010/05/w7.jpg?w=300&#038;h=161" alt="" width="300" height="161" /></a></p>
<p>vista</p>
<p><a href="http://lhc645.files.wordpress.com/2010/05/vista.png"><img class="alignnone size-medium wp-image-145" title="vista" src="http://lhc645.files.wordpress.com/2010/05/vista.png?w=300&#038;h=202" alt="" width="300" height="202" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/137/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/137/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=137&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/05/15/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%87%d0%b8%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-x64/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>

		<media:content url="http://lhc645.files.wordpress.com/2010/05/seven.png?w=300" medium="image">
			<media:title type="html">seven</media:title>
		</media:content>

		<media:content url="http://lhc645.files.wordpress.com/2010/05/w7.jpg?w=300" medium="image">
			<media:title type="html">w7</media:title>
		</media:content>

		<media:content url="http://lhc645.files.wordpress.com/2010/05/vista.png?w=300" medium="image">
			<media:title type="html">vista</media:title>
		</media:content>
	</item>
		<item>
		<title>Обработка исключений в x64 [usermode]</title>
		<link>http://lhc645.wordpress.com/2010/04/13/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b2-x64-usermode/</link>
		<comments>http://lhc645.wordpress.com/2010/04/13/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b2-x64-usermode/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 15:34:30 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Research]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=128</guid>
		<description><![CDATA[Обработка исключений в x64 [usermode]. Небольшие наброски по теме. Возможно, позже оформлю это в виде полноценной статьи [после внесения необходимых уточнений], если, конечно, кому-то нужно. Начинается все с функции KiUserExceptionDispatcher. Если у нас 32-битный процесс, то происходит вызов функции wow64.dll!Wow64PrepareForException .text:0000000077EF31C0 KiUserExceptionDispatcher: ; DATA XREF: .text:off_77F03698o .text:0000000077EF31C0 ; .data:RtlpFunctionAddressTableo .text:0000000077EF31C0 mov rax, cs:Wow64PrepareForException .text:0000000077EF31C7 test [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=128&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Обработка исключений в x64 [usermode].<br />
Небольшие наброски по теме. Возможно, позже оформлю это в виде полноценной статьи [после внесения необходимых уточнений], если, конечно, кому-то нужно.</p>
<p>Начинается все с функции KiUserExceptionDispatcher. Если у нас 32-битный процесс, то происходит вызов функции<br />
<span style="color:#808000;">wow64.dll!Wow64PrepareForException</span></p>
<p><span style="color:#808000;"> </span></p>
<p><span style="color:#808000;">.text:0000000077EF31C0 KiUserExceptionDispatcher:              ; DATA XREF: .text:off_77F03698o<br />
.text:0000000077EF31C0                                         ; .data:RtlpFunctionAddressTableo<br />
.text:0000000077EF31C0                 mov     rax, cs:Wow64PrepareForException<br />
.text:0000000077EF31C7                 test    rax, rax<br />
.text:0000000077EF31CA                 jz      short loc_77EF31DB<br />
.text:0000000077EF31CC                 mov     rcx, rsp<br />
.text:0000000077EF31CF                 add     rcx, 4D0h<br />
.text:0000000077EF31D6                 mov     rdx, rsp<br />
.text:0000000077EF31D9                 call    rax ; Wow64PrepareForException<br />
.text:0000000077EF31DB<br />
.text:0000000077EF31DB loc_77EF31DB:                           ; CODE XREF: .text:0000000077EF31CAj<br />
.text:0000000077EF31DB                 mov     rcx, rsp<br />
.text:0000000077EF31DE                 add     rcx, 4D0h<br />
</span><span style="color:#808000;"> </span></p>
<p>Данная функция преобразует структуру CONTEXT для 32-битного процесса.</p>
<p>Затем вызывается RtlDispatchException.</p>
<p><span style="color:#808000;">BOOLEAN<br />
RtlDispatchException (<br />
IN PEXCEPTION_RECORD ExceptionRecord,<br />
IN PCONTEXT ContextRecord<br />
);</span></p>
<p>Внутри RtlDispatchException первым делом вызываются все инсталлированные векторные обработчики исключений<br />
<span style="color:#808000;">text:0000000077EE5F27                 mov     [rax-28h], r14<br />
.text:0000000077EE5F2B                 lea     r8, RtlpCalloutEntryList<br />
.text:0000000077EE5F32                 mov     rbx, rdx<br />
.text:0000000077EE5F35                 mov     [rax-30h], r15<br />
.text:0000000077EE5F39                 mov     rsi, rcx<br />
.text:0000000077EE5F3C                 mov     [rsp+6A8h+var_668], 0<br />
.text:0000000077EE5F41                 call    RtlpCallVectoredHandlers</span></p>
<p>Вызывается функция RtlLookupFunctionEntry, в ней проверяется кэш LdrpInvertedFunctionTable.<br />
Его формат</p>
<p><span style="color:#808000;">typedef struct _RTL_INVERTED_FUNCTION_TABLE<br />
{<br />
ULONG Count; // число структур RTL_INVERTED_FUNCTION_TABLE_ENTRY<br />
ULONG MaxCount; // 0xA0 &#8211; win xp x64<br />
ULONG Pad[ 0x2 ];<br />
RTL_INVERTED_FUNCTION_TABLE_ENTRY Entries[ ANYSIZE_ARRAY ];<br />
} RTL_INVERTED_FUNCTION_TABLE, * PRTL_INVERTED_FUNCTION_TABLE;</p>
<p>typedef struct _RTL_INVERTED_FUNCTION_TABLE_ENTRY<br />
{<br />
PIMAGE_RUNTIME_FUNCTION_ENTRY ExceptionDirectory; // виртуальный адрес .pdata (обычно)<br />
PVOID                         ImageBase; // базовый адрес модуля<br />
ULONG                         ImageSize; // размер образа<br />
ULONG                         ExceptionDirectorySize; // размер .pdata<br />
} RTL_INVERTED_FUNCTION_TABLE_ENTRY, * PRTL_INVERTED_FUNCTION_TABLE_ENTRY;</span><br />
Каждый модуль, подгруженный в АП процесса имеет свою запись в RTL_INVERTED_FUNCTION_TABLE. Если для адреса, по которому прозошло исключение, найден обработчик(и) он вызывается. В секции .pdata, на которую ссылаются элементы LdrpInvertedFunctionTable содержится массив структур типа</p>
<p><span style="color:#808000;">typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {<br />
DWORD BeginAddress; // начальный адрес контролируемой функции [RVA]<br />
DWORD EndAddress; // конечный адрес контролируемой функции [RVA]<br />
DWORD UnwindInfoAddress; // RVA структуры UNWIND_INFO<br />
} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;</span><br />
То есть указывается диапазон контролируемых адресов и привязанный к нему обработчик исключений [UNWIND_INFO].<br />
Теперь чуть подробнее расскажу о LdrpInvertedFunctionTable.</p>
<p>Информация о модуле добавляется в кеш функцией LdrpInsertMemoryTableEntry, которая вызывает RtlInsertInvertedFunctionTable, а та в свою очередь добавляет элемент в таблицу LdrpInvertedFunctionTable.<br />
Первая запись в кеш добавляется при инициализации процесса</p>
<p><span style="color:#808000;">.text:0000000077ED54ED<br />
.text:0000000077ED54ED loc_77ED54ED:                           ; CODE XREF: LdrpInitializeProcess-3C0C1j<br />
.text:0000000077ED54ED                 bts     r8d, 0Eh<br />
.text:0000000077ED54F2                 mov     rcx, rbx<br />
.text:0000000077ED54F5                 mov     [rbx+68h], r8d<br />
.text:0000000077ED54F9                 call    LdrpInsertMemoryTableEntry</span></p>
<p>Поэтому, кстати говоря, если мы просканим LdrpInvertedFunctionTable, то наш исполняемый модуль там будет присутствовать.<br />
Затем, следующие записи добавляются при подгрузке динамических библиотек.</p>
<p><span style="color:#808000;">.text:0000000077F15B9D loc_77F15B9D:                           ; CODE XREF: LdrpMapDll+66Cj<br />
.text:0000000077F15B9D                                         ; LdrpMapDll+677j &#8230;<br />
.text:0000000077F15B9D                 mov     r8d, [rsi+40h]<br />
.text:0000000077F15BA1                 mov     rdx, [rsi+30h]<br />
.text:0000000077F15BA5                 lea     rcx, LdrpInvertedFunctionTable<br />
.text:0000000077F15BAC                 call    RtlInsertInvertedFunctionTable</span></p>
<p>Удаляет элемент функцией RtlRemoveInvertedFunctionTable при выгрузке динамической библиотеки.</p>
<p>Теперь вернемся к RtlLookupFunctionEntry. После проверки кешей вызывается функция RtlpLookupDynamicFunctionEntry.<br />
Она проверяет таблицу RtlpDynamicFunctionTable на предмет обработчиков. В эту таблицу можно добавлять свои таблицы, вызывая функции</p>
<p><span style="color:#808000;">BOOLEAN WINAPI RtlInstallFunctionTableCallback(<br />
__in  DWORD64 TableIdentifier,<br />
__in  DWORD64 BaseAddress,<br />
__in  DWORD Length,<br />
__in  PGET_RUNTIME_FUNCTION_CALLBACK Callback,<br />
__in  PVOID Context,<br />
__in  PCWSTR OutOfProcessCallbackDll<br />
);</p>
<p>BOOLEAN WINAPI RtlAddFunctionTable(<br />
__in  PRUNTIME_FUNCTION FunctionTable,<br />
__in  DWORD EntryCount,<br />
__in  DWORD64 BaseAddress,<br />
__in  ULONGLONG TargetGp<br />
);</span></p>
<p><span style="color:#808000;">.text:0000000077F3A1D3 dyn_look:                               ; CODE XREF: RtlLookupFunctionEntry+B1j<br />
.text:0000000077F3A1D3                 mov     rdx, rsi<br />
.text:0000000077F3A1D6                 mov     rcx, rbx<br />
.text:0000000077F3A1D9                 call    RtlpLookupDynamicFunctionEntry<br />
.text:0000000077F3A1DE                 mov     r8, rax<br />
.text:0000000077F3A1E1                 jmp     loc_77EE5BDA</span></p>
<p>При этом надо учитывать, что динамическая таблица действительна только для кода, который не принадлежит исполняемому модулю<br />
или он не имеет exception directory. Так я лично проводила следующий тест. Вызывала функцию RtlInstallFunctionTableCallback для<br />
своего модуля с необнуленной exception directory. Затем, удостоверившись в успехе выполнения функции, вызывала исключение, калбек не срабатывал.<br />
После обнуления exception directory в pe-файле на диске callback стал работать. Того же эффекта можно добиться если мы выделим память с помощью VirtualAlloc и вызовем<br />
исключение в этом выделенном регионе. Кстати косвенно об этом говорится у ms</p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms680595(v=VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms680595(v=VS.85).aspx</a></p>
<p><em>&laquo;This function is useful for very dynamic code&raquo;</em>. Именно эта фраза и навела меня на мысль, что для кода у которого есть exception directory она может быть неприменима.</p>
<p>Насчет динамического обнуления exception directory. Предположительно нужно сначала удалить запись о модуле из кэша LdrpInvertedFunctionTable, затем обнулить exception directory.<br />
Однако, я пока нормального способа поиска LdrpInvertedFunctionTable не представляю. Учитывая ссылки внутри ntdll на эту переменную:</p>
<p><span style="color:#808000;">Up o LdrpInsertMemoryTableEntry+9E<br />
Up o RtlInsertInvertedFunctionTable+896<br />
Up o LdrUnloadDll-19287<br />
Up o RtlRemoveInvertedFunctionTable+1E<br />
Up r RtlRemoveInvertedFunctionTable+51<br />
Up w RtlRemoveInvertedFunctionTable+5C<br />
Up o LdrUnloadDll-19124<br />
Up o LdrpMapDll+36E05<br />
Up r RtlLookupFunctionTable+4C413<br />
Up r RtlInsertInvertedFunctionTable+36F67<br />
Up w RtlInsertInvertedFunctionTable+37079<br />
Up r RtlRemoveInvertedFunctionTable+33711<br />
Up o LdrUnloadDll+1D80E </span></p>
<p>Из RtlDispatchException вызывается функция  RtlpExecuteHandlerForException, обычно для эксепшнов вызывается<br />
<span style="color:#808000;"><br />
kernel32!__C_specific_handler</span></p>
<p>Все тесты проводились на win xp x64</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/128/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=128&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/04/13/%d0%be%d0%b1%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-%d0%b8%d1%81%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d0%b9-%d0%b2-x64-usermode/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>dgdt livekd plugin [fixed]</title>
		<link>http://lhc645.wordpress.com/2010/03/25/dgdt-livekd-plugin-fixed/</link>
		<comments>http://lhc645.wordpress.com/2010/03/25/dgdt-livekd-plugin-fixed/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 17:53:59 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Research]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[livekd]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=123</guid>
		<description><![CDATA[Руки дошли до плагина (http://lhc645.wordpress.com/2010/02/26/плагин-к-livekd/). Исправила багу при первом обращении к плагину. + добавила команду didt для входов idt. скачать (fixed:26.03.2010 &#8211; теперь на code.google.com =)) http://code.google.com/p/dgdt/downloads/list<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=123&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Руки дошли до плагина (<a title="link" href="http://lhc645.wordpress.com/2010/02/26/плагин-к-livekd/">http://lhc645.wordpress.com/2010/02/26/плагин-к-livekd/</a>).</p>
<p>Исправила багу при первом обращении к плагину. + добавила команду didt для входов idt.</p>
<p>скачать (fixed:26.03.2010 &#8211; теперь на code.google.com =))</p>
<p><a href="http://code.google.com/p/dgdt/downloads/list">http://code.google.com/p/dgdt/downloads/list<br />
</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=123&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/03/25/dgdt-livekd-plugin-fixed/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>ASLR+TLS</title>
		<link>http://lhc645.wordpress.com/2010/03/10/aslrtls/</link>
		<comments>http://lhc645.wordpress.com/2010/03/10/aslrtls/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 14:23:15 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Research]]></category>
		<category><![CDATA[aslr]]></category>
		<category><![CDATA[pe32+]]></category>
		<category><![CDATA[tls]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=121</guid>
		<description><![CDATA[Была задача добавления tls директории в файлы PE32+. В win xp 64 все нормально, а в windows 7 &#8211; софт падал. Виновником оказался флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE  в OptionalHeader.DllCharacteristics. То бишь файл поддерживает ASLR. Соответственно, сброс этого флага решает проблему и файлы с новой tls загружаются нормально.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=121&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Была задача добавления tls директории в файлы PE32+. В win xp 64 все нормально, а в windows 7 &#8211; софт падал. Виновником оказался флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE  в OptionalHeader.DllCharacteristics. То бишь файл поддерживает ASLR. Соответственно, сброс этого флага решает проблему и файлы с новой tls загружаются нормально.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/121/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/121/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/121/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=121&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/03/10/aslrtls/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>Плагин к livekd</title>
		<link>http://lhc645.wordpress.com/2010/02/26/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd-%d0%ba-livekd/</link>
		<comments>http://lhc645.wordpress.com/2010/02/26/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd-%d0%ba-livekd/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 18:17:16 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[livekd]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=119</guid>
		<description><![CDATA[В комментариях к этой записи обсуждалось, что дескать команда !pcr слегка глючит на x64. http://lhc645.wordpress.com/2009/09/04/idt-x64-win-xp-theory/ Я там сначала пропатчила, а вот пару дней назад решила сделать исправление в виде плагина.  Ну и еще хотелось сделать просмотр входов GDT. Т.к. каждый раз вводить dt _KGDTENTRY64 адрес довольно утомительно. скопировать dgdt.dll нужно в каталог \Debugging Tools for [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=119&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>В комментариях к этой записи обсуждалось, что дескать команда !pcr слегка глючит на x64.</p>
<p>http://lhc645.wordpress.com/2009/09/04/idt-x64-win-xp-theory/</p>
<p>Я там сначала пропатчила, а вот пару дней назад решила сделать исправление в виде плагина.  Ну и еще хотелось сделать просмотр входов GDT. Т.к. каждый раз вводить dt _KGDTENTRY64 адрес довольно утомительно.</p>
<p>скопировать dgdt.dll нужно в каталог \Debugging Tools for Windows (x64)\winext</p>
<p>затем подгрузить расширение командой .load dgdt</p>
<p>!dgdt номер &#8211; информация о дескрипторе №(номер) (считая от 0)</p>
<p>!pcr2 номер_процессора &#8211; информация о pcr на процессоре с заданным номером</p>
<p>Выгружается расширение командой .unload</p>
<p>сама dll</p>
<p>http://www.sendspace.com/file/fwynjl</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/119/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/119/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/119/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=119&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2010/02/26/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd-%d0%ba-livekd/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>ASLR</title>
		<link>http://lhc645.wordpress.com/2009/11/07/aslr/</link>
		<comments>http://lhc645.wordpress.com/2009/11/07/aslr/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 08:21:11 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Research]]></category>
		<category><![CDATA[aslr]]></category>
		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=112</guid>
		<description><![CDATA[Краткая справка. Механизм ASLR &#8211; Address Space Layout Randomization (случайное расположение в адресном пространстве) появился впервые в XP и затрагивал PEB и TEB only. Начиная с Vista сабж уже стал применяться к базам загрузки исполняемых файлов и длл (в частности системных  ntdll, kernel32 etc), а также к стеку и куче. Для XP можно было для [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=112&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Краткая справка. Механизм ASLR &#8211; Address Space Layout Randomization (случайное расположение в адресном пространстве) появился впервые в XP и затрагивал PEB и TEB only. Начиная с Vista сабж уже стал применяться к базам загрузки исполняемых файлов и длл (в частности системных  ntdll, kernel32 etc), а также к стеку и куче. Для XP можно было для получения такой возможности юзать какой-нибуть аналог линуксового PaX под винду (BufferShield, например).</p>
<p>ASLR разрабатывался как средство для предотвращения атак типа ret-to-libc (адрес искомой функции при рандомной базе загрузки либы становится трудновычислим).</p>
<p>Довелось столкнуться с сабжем и заинтересовало как оно работает.</p>
<p>Как оказалось, выбор базы загрузки exe происходит следующим образом (ring0)</p>
<p>NtCreateSection -&gt;  MmCreateSection -&gt; MiRelocateImage (MiRelocateImageAgain) -&gt;   MiSelectImageBase</p>
<p>Основная работа по выбору базы загрузки проводится в функции MiSelectImageBase. В зависимости от того с чем имеем дело, с dll или с exe имеем разный алгоритм.  &laquo;Случайность&raquo; для базы во втором случае достигается путем использования rdtsc. Для dll при вычилениях используется переменная MiImageBias (причем при ее инициализации в функции (MiInitSystem-&gt;)MiInitializeRelocations тоже юзается rdtsc)</p>
<p>Чтобы мне не повторяться, псевдокод функции MiSelectImageBase можно посмотреть в статье   (как оказалось, сабж полностью расковыряли до меня) Bypassing Browser Memory Protections</p>
<p>http://taossa.com/archive/bh08sotirovdowd.pdf</p>
<p>В ней кстати не только про ASLR (дока описывает также механизмы GS, SafeSEH и DEP).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=112&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2009/11/07/aslr/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>RIP-relative addressing</title>
		<link>http://lhc645.wordpress.com/2009/09/27/rip-relative-addressing/</link>
		<comments>http://lhc645.wordpress.com/2009/09/27/rip-relative-addressing/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 04:24:04 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[rip-relative addressing]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=102</guid>
		<description><![CDATA[заметка  proc Продолжаю писать про особенности 64-битного режима. На этот раз, речь пойдет об относительной адресации и соответственно, специфики работы с всяческими неэкспортируемыми символами в ядре. Итак, RIP-relative addressing Адрес формируется путем прибавления смещения к адресу следующей инструкции. Пример. Секция .data ntoskrnl, переменная PsInvertedFunctionTable. .data:00000000005748B0 PsInvertedFunctionTable dd 0 Берем какую-нибудь функцию, в которой есть ссылки [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=102&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="color:#888888;">заметка  proc</span></p>
<p>Продолжаю писать про особенности 64-битного режима.<br />
На этот раз, речь пойдет об относительной адресации и соответственно, специфики работы с всяческими неэкспортируемыми символами в ядре. Итак,<br />
<span style="color:#000000;"><br />
</span><span style="color:#000000;"><span style="color:#888888;"><em>RIP-relative addressing</em></span></span><span style="color:#ff6600;"><br />
</span></p>
<p>Адрес формируется путем прибавления смещения к адресу следующей инструкции. Пример.<br />
Секция .data ntoskrnl, переменная  PsInvertedFunctionTable.</p>
<p><span style="color:#ff9900;">.data:00000000005748B0 PsInvertedFunctionTable dd 0</span></p>
<p>Берем какую-нибудь функцию, в которой есть ссылки на искомую переменную. Пусть это будет  RtlInsertInvertedFunctionTable.</p>
<p><span style="color:#ff9900;">.text:0000000000417CB0                 mov     [rsp+arg_0], rcx<br />
.text:0000000000417CB5                 sub     rsp, 48h<br />
.text:0000000000417CB9                 mov     ecx, cs:PsInvertedFunctionTable<br />
.text:0000000000417CBF                 mov     [rsp+48h+var_10], rsi</span></p>
<p>Однако, как раньше мы не можем взять адрес переменной из инструкции mov ecx (как это было на x86). У нас есть только 32-х битное смещение данной переменной относительно следующей за mov ecx инструкции.<br />
Значит, чтобы получить нужный нам адрес</p>
<p><span style="color:#ff9900;">PsInvertedFunctionTableAddress =  0000000000417CBF (адрес следующей инструкции) + 0x15CBF1</span></p>
<p>0x15CBF1 &#8211; есть смещение (опкод mov ecx,смещение &#8211; 8B 0D F1 CB 15 00)</p>
<p>Получаем 00000000005748B0 &#8211; адрес PsInvertedFunctionTable.</p>
<p><span style="color:#993300;"><span style="color:#888888;">заметка endp</span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=102&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2009/09/27/rip-relative-addressing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
		<item>
		<title>Инструкция inc reg  в 64-битном режиме</title>
		<link>http://lhc645.wordpress.com/2009/09/25/%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d1%8f-inc-reg-%d0%b2-64-%d0%b1%d0%b8%d1%82%d0%bd%d0%be%d0%bc-%d1%80%d0%b5%d0%b6%d0%b8%d0%bc%d0%b5/</link>
		<comments>http://lhc645.wordpress.com/2009/09/25/%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d1%8f-inc-reg-%d0%b2-64-%d0%b1%d0%b8%d1%82%d0%bd%d0%be%d0%bc-%d1%80%d0%b5%d0%b6%d0%b8%d0%bc%d0%b5/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 15:03:48 +0000</pubDate>
		<dc:creator>lhc645</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[rex]]></category>
		<category><![CDATA[x64]]></category>

		<guid isPermaLink="false">http://lhc645.wordpress.com/?p=85</guid>
		<description><![CDATA[Доступен only 2-х байтовый вариант, однобайтовая недоступна (в compatibility mode доступна). Example Instruction     &#124; Opcode ______________________ inc cl             &#124; FE C1 inc cx            &#124; 66 FF C1 inc ecx          &#124; FF C1 inc rcx          &#124; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=85&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Доступен only 2-х байтовый вариант, однобайтовая недоступна (в compatibility mode доступна).</p>
<p>Example</p>
<p><span style="color:#ff9900;">Instruction     | Opcode<br />
______________________<br />
inc cl                  | FE C1</span></p>
<p><span style="color:#ff9900;">inc  cx                | 66 FF C1</span></p>
<p><span style="color:#ff9900;">inc  ecx             | FF C1</p>
<p>inc  rcx             | 48 FF C1</p>
<p></span></p>
<p>Подробнее следует сказать о REX &#8211; префиксах (в варианте с rcx юзается)</p>
<p>Но сначала о формате команды, чтобы знать где префикс REX располагается. Значит инструкция может быть от 1 до 15 байт</p>
<p>Состоит из следующих полей (от старшего к младшему)</p>
<ul>
<li><span style="color:#ff9900;">Legacy Prefix</span></li>
<li><span style="color:#ff9900;">REX Prefix</span></li>
<li><span style="color:#ff9900;">Opcode (1-2 байта)</span></li>
<li><span style="color:#ff9900;">ModRM</span></li>
<li><span style="color:#ff9900;">SIB</span></li>
<li><span style="color:#ff9900;">Смещение (1,2,4 или 8 байт)</span></li>
<li><span style="color:#ff9900;">Непосредственный операнд (1,2,4 или 8 байт)</span></li>
</ul>
<p>REX &#8211; префиксы (40h-4fh). Они позволяют</p>
<ol>
<li>использовать дополнительные регистры общего назначения (GPR) r8-r15 и xmm регистры (xmm8-xmm15).</li>
<li> использовать 64-битный размер операнда</li>
<li> позволяют использовать cr8-cr15 регистры и dr8-dr15</li>
</ol>
<p>Формат REX префикса<br />
<span style="color:#ff9900;">Название</span> <span style="color:#ffcc00;">биты</span> <span style="color:#ff6600;">значение/описание </span></p>
<ul>
<li><span style="color:#ff9900;">-</span> <span style="color:#ffcc00;">7-4</span> <span style="color:#ff6600;">0100</span></li>
<li><span style="color:#ff9900;">REX.W</span> <span style="color:#ffcc00;">3</span> <span style="color:#ff6600;"> Размер операнда (0 &#8211; по умолчанию, 1 &#8211; 64 бита)</span></li>
<li><span style="color:#ff9900;">REX.R</span> <span style="color:#ffcc00;">2 </span> <span style="color:#ff6600;">Старший бит поля reg байта режима адресации</span> <span style="color:#ff6600;">(он же ModRM), позволяет  использовать 16 регистров (поле reg &#8211; 3 байта + 1 байт, 4 байта =&gt; 16 регистров) </span></li>
<li><span style="color:#ff9900;">REX.X</span> <span style="color:#ffcc00;"> 1 </span> <span style="color:#ff6600;">расширение поля index байта SIB (если без аббревиатуры и по русски &#8211; байт масштаба, индекса и базы) -старший бит, также для того, чтобы можно было юзать 16 регистров </span></li>
<li><span style="color:#ff9900;">REX.B</span> <span style="color:#ffcc00;">0 </span><span style="color:#ff6600;">старший бит поля r/m байта ModRM, SIB.base или поля reg опкода &#8211; для доступа к 16-ти регистрам </span></li>
</ul>
<p>Хм, ну после того, как становиться известен диапазон rex префиксов &#8211; очевидно почему нельзя использовать однобайтовые inc ;)<br />
Подробнее об этом обо всем в AMD64 Programmer&#8217;s Manual, Volume 3: General-Purpose and System Instructions</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/lhc645.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/lhc645.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/lhc645.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=lhc645.wordpress.com&amp;blog=8933046&amp;post=85&amp;subd=lhc645&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://lhc645.wordpress.com/2009/09/25/%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d1%8f-inc-reg-%d0%b2-64-%d0%b1%d0%b8%d1%82%d0%bd%d0%be%d0%bc-%d1%80%d0%b5%d0%b6%d0%b8%d0%bc%d0%b5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e5468323a3ba813485be22b9c0b0c702?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lhc645</media:title>
		</media:content>
	</item>
	</channel>
</rss>
