<?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>Icewall&#039;s blog &#187; vbox</title>
	<atom:link href="http://www.icewall.pl/tag/vbox/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.icewall.pl</link>
	<description>IT Security</description>
	<lastBuildDate>Thu, 29 Jul 2010 23:19:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>VBox,Virtual PC,VMware i IDT Hooking</title>
		<link>http://www.icewall.pl/2009/10/27/vboxvirtual-pcvmware-i-idt-hooking/</link>
		<comments>http://www.icewall.pl/2009/10/27/vboxvirtual-pcvmware-i-idt-hooking/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 00:19:56 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[idt]]></category>
		<category><![CDATA[idt hooking]]></category>
		<category><![CDATA[int 2e]]></category>
		<category><![CDATA[syscall]]></category>
		<category><![CDATA[sysenter]]></category>
		<category><![CDATA[vbox]]></category>
		<category><![CDATA[virtual pc crash]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=285</guid>
		<description><![CDATA[Będzie to dość stosunkowo lightowy post o “anomaliach”, które wystąpiły podczas moich testów z hookowaniem tablicy IDT pod wymienionymi w tytule post’a wirtualnymi maszynami. Dlaczego lightowy? Ponieważ żeby ustalić detale związane z sytuacjami, które później zaprezentuje, wymagało by to spooorego research’u odnośnie sposobu działania wewnętrznego mechanizmu poszczególnych wirtualnych maszyn (tak sądzę   ).
Także proponuje [...]]]></description>
			<content:encoded><![CDATA[<p>Będzie to dość stosunkowo lightowy post o <strong>“anomaliach”</strong>, które wystąpiły podczas moich testów z <strong>hookowaniem tablicy IDT</strong> pod wymienionymi w tytule post’a wirtualnymi maszynami. Dlaczego lightowy? Ponieważ żeby ustalić detale związane z sytuacjami, które później zaprezentuje, wymagało by to spooorego research’u odnośnie sposobu działania wewnętrznego mechanizmu poszczególnych wirtualnych maszyn (tak sądzę <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ).<br />
Także proponuje traktować niniejszy post jako ciekawostkę/(wektor do badań) niż jako rezultat głębszego researchu.</p>
<p>Cała historia zaczyna się od momentu kiedy chciałem przetestować najprostszy w życiu hook na procedure <strong>KiSystemService</strong> poprzez modyfikacje jej adresu w tablicy IDT. Oto fragment kodu zakładający hook:</p>
<pre class="brush: cpp">
void IDTHook()
{
IDTINFO idtInfo;
IDTENTRY *idt_entries;
IDTENTRY *int2e_entry;
DbgPrint(&quot;[+] IDTHook&quot;);
//pobranie IDTINFO
idtInfo = getIDTInfo();
//pobranie *tablicy IDT
idt_entries = getIDTEntries(&amp;amp;idtInfo);

//zapisanie oryginalnego IDTENTRY_2E
orgIDTEntry_2e = idt_entries[KiSystemService_INDEX];
//zapisanie DWORD&#039;a na potrzeby funkcji hookujacej
orgKiSystemService = MAKELONG(orgIDTEntry_2e.LowOffset,orgIDTEntry_2e.HiOffset);
__asm cli;//wylacz obsluge maskowalnych przerwan
idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&amp;amp;MySystemService);
idt_entries[KiSystemService_INDEX].HiOffset  = (unsigned short)(((unsigned long)(&amp;amp;MySystemService))&lt;&lt;16);
__asm lidt idtInfo;
__asm sti;//wlacz obsluge maskowalnych przerwan

}
</pre>
<p>‘kod MySystemService przepisany w calosci z „Subverting Windows Kernel”‘</p>
<pre class="brush: cpp">
__declspec(naked) MySystemService()
{

__asm{
pushad
pushfd
push fs
mov bx,0x30
mov fs,bx
push ds
push es
//do something

//Finish:
pop es
pop ds
pop fs
popfd
popad

jmp	orgKiSystemService;
}
}
</pre>
<pre class="brush: cpp">
/* __asm { sysenter VPC } */
</pre>
<p>Bez większego wachania i namysłow postanowiłem przetestować wynikowy driver pod <strong>Virtual PC(ver. 6.0.192.0 + additions)[OS: Windows XP SP3 Eng]</strong>, z którego zwykłem korzystać. Ku mojemu zaskoczeniu (bo liczyłem co najwyżej na <strong>BSOD’a</strong> <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) przy próbie założenia hook’a wystąpił wewnętrzny błąd vpc:<br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/vpc_crash_error1.JPG" alt="vpc_crash_error" title="vpc_crash_error" width="827" height="452" class="alignnone size-full wp-image-297" /><br />
Hym&#8230;dziwna kwestia pomyślałem. Między czasie przypomniałem sobie, że przecież system może w ogóle nie korzystać z <strong>IDT</strong> jeżeli posiadany przez nas procesor dysponuje obsługą instrukcji <strong>sysenter/syscall</strong>. Rzut okiem pod vpc na wywolanie jednego z najbardziej popularnych <strong>native api:<br />
ZwOpenFile</strong>, rozwiało moje wątpliwości:<br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/vpc_syscalls_handler.JPG" alt="vpc_syscalls_handler" title="vpc_syscalls_handler" width="779" height="144" class="alignnone size-full wp-image-287" /></p>
<p>Sam error „wywalony” przez vpc wskazywał na to, że to nic stricte związanego z samym systemem, a raczej z vm, a teraz dodatkowo wiemy, że sens zakładania hook’a na IDT pod vpc jest raczej nie wielki <strong>(przez co POWINIEN być nie szkodliwy)</strong> <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Postanowiłem wykonać test jeszcze raz po odinstalowaniu z systemu additions. Tu ponownie zaskoczenie, bo system zachował się tak jak powinien, czyli:<br />
udało się zainstalować hook’a<br />
oraz  żaden z breakpoint’ów(po dłuższej chwili), które założyłem na MySystemService nie został wywołany.<br />
Zobaczmy teraz jak się sprawy maja pod VirtualBoxem.</p>
<pre class="brush: cpp">
/* __asm { INT VirtualBox } */
</pre>
<p><strong>Ver. 3.0.8 r53138 + additions<br />
OS pozostaje bez zmian pod każdą maszynką.</strong><br />
Pierwszą kwestią, którą tutaj sprawdziłem jest sposób przejścia procesu z <strong>r3 do r0.</strong><br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/vbox_syscalls_handler.JPG" alt="vbox_syscalls_handler" title="vbox_syscalls_handler" width="807" height="159" class="alignnone size-full wp-image-289" /></p>
<p>Wyśmienicie! Jak widać na załączonym obrazku pod VBoxem możemy śmiało testować hooki na IDT. Tak mi się bynajmniej wydawało…<br />
Ładuje driver,przekazuje odpowiedni <strong>IOCL_code</strong> do moje driver’a, który wywoła instalacje hook’a i … :<br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/vbox_crash.JPG" alt="vbox_crash" title="vbox_crash" width="942" height="605" class="alignnone size-full wp-image-290" /><br />
cała akcja kończy się nie oczekiwanem crash’em VBox’a.<br />
Długo nie myśląc odinstalowalem dodatki z systemu i ponowiłem próbę.<br />
Udało się!Instalacja hook’a przebiegła bez problemowo, ale podczas paru kolejnych prób zdarzał mi się <strong>BSOD’nąć</strong> system z komunikatem, który jedno znacznie wskazywał, że nastąpiła próba dostępu do stronnicowanego obszaru pamięci.Windbg wskazywał następującą linijke kodu jako przyczyne zła:</p>
<pre class="brush: cpp">
idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&amp;amp;amp;MySystemService);
</pre>
<p>Eeee delikatnie dziwne,,,IDT w obszarze stronnicowanej pamięci o_0?<br />
Delikatnie zmodyfikowałem więc kod instalujący hook, po przez zmapowanie tablicy IDT pod NIEstronnicowany obszar pamieci. Kod prezentuje się teraz następująco:</p>
<pre class="brush: cpp">
void IDTHook()
{
IDTINFO idtInfo;
IDTENTRY *idt_entries;
IDTENTRY *int2e_entry;
DbgPrint(&quot;[+] IDTHook&quot;);
//pobranie IDTINFO
idtInfo = getIDTInfo();
//pobranie *tablicy IDT
idt_entries = getIDTEntries(&amp;amp;idtInfo);

//try to map it
idt_entries = mapMemory(idt_entries,idtInfo.IDTLimit);// NOWA LINIA
//update idtinfo struct
idtInfo.HiIDTbase  = HIWORD(idt_entries);
idtInfo.LowIDTbase = LOWORD(idt_entries);

//zapisanie oryginalnego IDTENTRY_2E
orgIDTEntry_2e = idt_entries[KiSystemService_INDEX];
//zapisanie DWORD&#039;a na potrzeby funkcji hookujacej
orgKiSystemService = MAKELONG(orgIDTEntry_2e.LowOffset,orgIDTEntry_2e.HiOffset);
__asm cli;//wylacz obsluge maskowalnych przerwan
idt_entries[KiSystemService_INDEX].LowOffset = (unsigned short)(&amp;amp;amp;MySystemService);
idt_entries[KiSystemService_INDEX].HiOffset  = (unsigned short)(((unsigned long)(&amp;amp;MySystemService))&amp;gt;&amp;gt;16);
__asm lidt idtInfo;
__asm sti;//wlacz obsluge maskowalnych przerwan

}
</pre>
<p>Ten prosty zabieg wyeliminował pojawianie się BSOD’ów.</p>
<pre class="brush: cpp">
/* __asm { VMware sysenter } */
</pre>
<p><strong><br />
VMware Workstation<br />
6.5.3 build-185404<br />
</strong><br />
Rzut oka na przejście <strong>r3 &#8211; > r0:</strong><br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/vmware_syscalls_handler-1024x332.jpg" alt="vmware_syscalls_handler" title="vmware_syscalls_handler" width="1024" height="332" class="alignnone size-large wp-image-291" /><br />
Jak widać użyty jest tu sysenter. Nie będę się rozpisywał przy vmware i od razu powiem, że instalacja hooka przebiega tutaj bez problemowo czy to z zainstalowanymi dodatkami czy bez.</p>
<p>Na podsumowanie sporządziłem następującą tabelkę:<br />
<img src="http://www.icewall.pl/wp-content/uploads/2009/10/table.JPG" alt="table" title="table" width="827" height="180" class="alignnone size-full wp-image-292" /></p>
<p>Jak zwykle komentarze i wszelkiego rodzaju sugestie mile widziane <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/10/27/vboxvirtual-pcvmware-i-idt-hooking/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
