<?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</title>
	<atom:link href="http://www.icewall.pl/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>LapSec &#8211; Hispasec</title>
		<link>http://www.icewall.pl/2010/07/29/lapsec-hispasec/</link>
		<comments>http://www.icewall.pl/2010/07/29/lapsec-hispasec/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 23:19:16 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Aplikacja]]></category>
		<category><![CDATA[autorun]]></category>
		<category><![CDATA[hasła Internet Explorer]]></category>
		<category><![CDATA[konsola odzyskiwania]]></category>
		<category><![CDATA[lapsec]]></category>
		<category><![CDATA[LM hash]]></category>
		<category><![CDATA[pagefile]]></category>
		<category><![CDATA[secdel]]></category>
		<category><![CDATA[wyłącz hibernacje]]></category>
		<category><![CDATA[zablokuj konto administratora]]></category>
		<category><![CDATA[zablokuj konto gościa]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=422</guid>
		<description><![CDATA[Około roku temu jeden z moich hiszpańskich kolegów, a dokładnie Sergio de los Santos wpadł na pomysł niewielkiej aplikacji. Jej architektura miała być oparta o regułę KISS, a główne zadanie polegać na zmianie domyślnych ustawień windows&#8217;a, które w wielu przypadkach ujemnie wpływały na bezpieczeństwo systemu. Pomysł był gotowy, teraz tylko wystarczało znaleźć osobę chętną do [...]]]></description>
			<content:encoded><![CDATA[<p>Około roku temu jeden z moich hiszpańskich kolegów, a dokładnie <strong>Sergio de los Santos</strong> wpadł na pomysł niewielkiej aplikacji. Jej architektura miała być oparta o regułę KISS, a główne zadanie polegać na zmianie domyślnych ustawień windows&#8217;a, które w wielu przypadkach ujemnie wpływały na bezpieczeństwo systemu. Pomysł był gotowy, teraz tylko wystarczało znaleźć osobę chętną do jego implementacji. Jak się domyślacie Sergio zwrócił się z tym pomysłem do mnie i tak zostałem głównym i jedynym dev&#8217;em tego projektu <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Po ukończeniu, projekt przeleżał w szufladzie około roku, ponieważ nie było dokładnie znane jego przeznaczenie (komercyjne, freeware,?etc). Jednak w tym tygodniu Sergio poinformował mnie, że mamy zielone światło na publikacje tego tool&#8217;a w wersji freeware <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
I tak oto światło dzienne ujrzał <strong>LapSec</strong>!<br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/07/lapsec12-1023x716.jpg" alt="lapsec1" title="lapsec1" width="1023" height="716" class="aligncenter size-large wp-image-423" /></p>
<p><font color="green">[+]Jaką funkcjonalność posiada LapSec?</font><br />
Myślę, że sporo można wyczytać z powyższego screen&#8217;a <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Jeśli jednak, ktoś życzy sobie czytelniejszą listę dostępnych opcji,<br />
zapraszam na stronę poświęconą LapSec&#8217;owi -> <a href="http://www.icewall.pl/lapsec-laptop-securer/">LapSec Laptop Securer</a>.</p>
<p><font color="green">[+]Czy LapSec posiada więcej opcji niż te widoczne na screen&#8217;e?</font><br />
Binarka LapSec.exe nie, ale wraz z LapSec&#8217;emi instalowany jest SecDel, który z menu kontekstowego<br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/07/secdel.JPG" alt="secdel" title="secdel" width="181" height="274" class="aligncenter size-full wp-image-408" /></p>
<p>pozwala na bezpieczne usunięcie pliku. Co to znaczy ? Tzn, że założeniem tej aplikacji jest jak najskuteczniejsze nadpisanie danych powiązanych z konkretnym pliki w celu uniemożliwienie ich przywrócenia przez aplikacje do odzyskiwania danych.</p>
<p><font color="green">[+]Dla kogo jest ten tool?</font><br />
Naprawdę trudno jest mi to powiedzieć <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . I z chęcią usłyszę jakie są wasze odczucia w tej kwestii.</p>
<p>Hymm to chyba na tyle <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Czekamy na wasze opinie, propozycje, uwagi i słowa krytyki <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>LapSec <a href="http://blog.hispasec.com/laboratorio/recursos/lapsec_beta.exe">setup.exe</a><br />
<strong>md5: 042b3dde2f0674d0dc57b1ea1ac082f3<br />
sha1: 0b376e42e77698e6294b772601ff85e5061730af</strong><br />
<strong>Więcej info:</strong> <a href="http://www.icewall.pl/lapsec-laptop-securer">Laptop Securer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2010/07/29/lapsec-hispasec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Błąd logiczny w </title>
		<link>http://www.icewall.pl/2010/07/22/blad-logiczny-w/</link>
		<comments>http://www.icewall.pl/2010/07/22/blad-logiczny-w/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 20:27:39 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[bug in gmer]]></category>
		<category><![CDATA[błąd gmer]]></category>
		<category><![CDATA[dobre praktyki]]></category>
		<category><![CDATA[gmer]]></category>
		<category><![CDATA[IoQueryFileDosDeviceName]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=388</guid>
		<description><![CDATA[Przy okazji badań opisanych w ostatnim poście, odkryłem błąd logiczny w sterowniku gmer’a mogący powodować nieprawidłowe działanie losowych aplikacji.
Żeby przybliżyć sobie kwestię, o której będę pisał polecam zajrzeć do punktu drugiego poprzedniego postu, a dokładnie do implementacji rozwiązanie w ring0.
Do rzeczy, naszym obiektem zainteresowań jest  najnowszy sterownik gmer’a na dzień 22.07.2010:
    [...]]]></description>
			<content:encoded><![CDATA[<p>Przy okazji badań opisanych w ostatnim poście, odkryłem błąd logiczny w sterowniku gmer’a mogący powodować nieprawidłowe działanie losowych aplikacji.<br />
Żeby przybliżyć sobie kwestię, o której będę pisał polecam zajrzeć do punktu drugiego poprzedniego postu, a dokładnie do implementacji rozwiązanie w ring0.<br />
Do rzeczy, naszym obiektem zainteresowań jest  najnowszy sterownik gmer’a na dzień <strong>22.07.2010</strong>:<br />
     <strong> FileVersion	: 1, 0, 15, 4809 built by: WinDDK</strong></p>
<p><font color="green">[+]Lokalizacja problemu</font><br />
Jeśli jakiś plik nie może zostać usunięty w standardowy sposób, gmer stara się zamknąć wszystkie otwarte handlery odwołujące się do tego pliku, a następnie go usunąć. Moim zdaniem, niestety implementacja tej procedury przez twórcę gmer’a nie została do końca dobrze przemyślana.<br />
Rzućmy okiem na tą prockę:</p>
<pre class="brush: cpp">
.text:0001B488 ; int __stdcall sub_1B488(wchar_t *filePath, int a2)
.text:0001B488 sub_1B488       proc near               ; CODE XREF: sub_1CB32+299 p
.text:0001B488
.text:0001B488 PFILE_OBJECT    = dword ptr -30h
.text:0001B488 var_2C          = dword ptr -2Ch
.text:0001B488 var_28          = dword ptr -28h
.text:0001B488 PSYSTEM_HANDLE_INFORMATION= dword ptr -24h
.text:0001B488 pEPROCESS       = dword ptr -20h
.text:0001B488 index           = dword ptr -1Ch
.text:0001B488 ms_exc          = CPPEH_RECORD ptr -18h
.text:0001B488 filePath        = dword ptr  8
.text:0001B488 a2              = dword ptr  0Ch
.text:0001B488
.text:0001B488                 push    20h
.text:0001B48A                 push    offset stru_1EED0
.text:0001B48F                 call    __SEH_prolog
.text:0001B494                 xor     esi, esi
.text:0001B496                 mov     [ebp+pEPROCESS], esi
.text:0001B499                 lea     eax, [ebp+var_28]
.text:0001B49C                 push    eax             ; int
.text:0001B49D                 push    10h             ; SystemHandleInformation
.text:0001B49F                 call    wrap_NtQuerySystemInformation
.text:0001B4A4                 mov     [ebp+PSYSTEM_HANDLE_INFORMATION], eax
.text:0001B4A7                 cmp     eax, esi
.text:0001B4A9                 jz      error
.text:0001B4AF                 mov     [ebp+ms_exc.disabled], esi
.text:0001B4B2                 mov     [ebp+index], esi
.text:0001B4B5                 mov     ebx, ds:NtClose
.text:0001B4BB
.text:0001B4BB loc_1B4BB:                              ; CODE XREF: sub_1B488+119 j
.text:0001B4BB                 mov     ecx, [ebp+index]
.text:0001B4BE                 cmp     ecx, [eax]      ; eax = NumberOfHandles
.text:0001B4C0                 jnb     end_of_SYSTEM_HANDLE_INFORMATION
.text:0001B4C6                 shl     ecx, 4
.text:0001B4C9                 lea     edi, [ecx+eax+4]
.text:0001B4CD                 mov     [ebp+var_2C], edi
.text:0001B4D0                 mov     esi, [edi+8]
.text:0001B4D3                 mov     [ebp+PFILE_OBJECT], esi
.text:0001B4D6                 test    esi, esi
.text:0001B4D8                 jz      next_struct
.text:0001B4DE                 push    esi             ; VirtualAddress
.text:0001B4DF                 call    ds:MmIsAddressValid
.text:0001B4E5                 test    al, al
.text:0001B4E7                 jz      next_struct
.text:0001B4ED                 cmp     word ptr [esi], 5
.text:0001B4F1                 jnz     next_struct
.text:0001B4F7                 mov     eax, [esi+34h]
.text:0001B4FA                 test    eax, eax
.text:0001B4FC                 jz      next_struct
.text:0001B502                 push    eax             ; VirtualAddress
.text:0001B503                 call    ds:MmIsAddressValid
.text:0001B509                 test    al, al
.text:0001B50B                 jz      next_struct
.text:0001B511                 push    [ebp+filePath]  ; VirtualAddress
.text:0001B514                 call    ds:MmIsAddressValid
.text:0001B51A                 test    al, al
.text:0001B51C                 jz      short next_struct
.text:0001B51E                 push    [ebp+filePath]  ; wchar_t *
.text:0001B521                 call    ds:wcslen
.text:0001B527                 pop     ecx
.text:0001B528                 sub     eax, 6
.text:0001B52B                 mov     [ebp+a2], eax
.text:0001B52E                 movzx   ecx, word ptr [esi+30h] ; fileObject-&gt;FileName.Length
.text:0001B532                 shr     ecx, 1
.text:0001B534                 cmp     ecx, eax
.text:0001B536                 jnz     short next_struct
.text:0001B538                 push    eax             ; size_t
.text:0001B539                 mov     eax, [ebp+filePath]
.text:0001B53C                 add     eax, 0Ch
.text:0001B53F                 push    eax             ; wchar_t *
.text:0001B540                 push    dword ptr [esi+34h] ; fileObject-&gt;FileName.Buffer
.text:0001B543                 call    ds:_wcsnicmp
.text:0001B549                 add     esp, 0Ch
.text:0001B54C                 test    eax, eax
.text:0001B54E                 jnz     short next_struct
.text:0001B550                 lea     eax, [ebp+pEPROCESS]
.text:0001B553                 push    eax
.text:0001B554                 push    dword ptr [edi]
.text:0001B556                 call    ds:PsLookupProcessByProcessId
.text:0001B55C                 mov     status, eax
.text:0001B561                 test    eax, eax
.text:0001B563                 jnz     short next_struct
.text:0001B565                 mov     eax, [ebp+pEPROCESS]
.text:0001B568                 cmp     eax, current_process_EPROCESS
.text:0001B56E                 jz      short handleBelongsToCurrentProcess
.text:0001B570                 push    eax
.text:0001B571                 call    ds:KeAttachProcess
.text:0001B577                 movzx   eax, word ptr [edi+6]
.text:0001B57B                 push    eax             ; Handle
.text:0001B57C                 call    ebx ; NtClose
.text:0001B57E                 mov     status, eax
.text:0001B583                 call    ds:KeDetachProcess
.text:0001B589                 jmp     short loc_1B592
.text:0001B58B ; ---------------------------------------------------------------------------
.text:0001B58B
.text:0001B58B handleBelongsToCurrentProcess:          ; CODE XREF: sub_1B488+E6 j
.text:0001B58B                 movzx   eax, word ptr [edi+6]
.text:0001B58F                 push    eax             ; Handle
.text:0001B590                 call    ebx ; NtClose
.text:0001B592
.text:0001B592 loc_1B592:                              ; CODE XREF: sub_1B488+101 j
.text:0001B592                 mov     ecx, [ebp+pEPROCESS] ; Object
.text:0001B595                 call    ds:ObfDereferenceObject
.text:0001B59B
.text:0001B59B next_struct:                            ; CODE XREF: sub_1B488+50 j
.text:0001B59B                                         ; sub_1B488+5F j ...
.text:0001B59B                 inc     [ebp+index]
.text:0001B59E                 mov     eax, [ebp+PSYSTEM_HANDLE_INFORMATION]
.text:0001B5A1                 jmp     loc_1B4BB
.text:0001B5A6 ; ---------------------------------------------------------------------------
.text:0001B5A6
.text:0001B5A6 _end:                                   ; DATA XREF: .rdata:stru_1EED0 o
.text:0001B5A6                 xor     eax, eax
.text:0001B5A8                 inc     eax
.text:0001B5A9                 retn
</pre>
<p><strong>Gdzie tu jest problem?</strong><br />
Przyjrzyjmy się samej kwesti odnalezienia przez gmer’a uchwytu, który jest powiązany z plikiem do którego handlery chcemy pozamykać. Autor gmer’a postanowił tutaj skorzystać z dostarczonego w strukturze <strong>SYSTEM_HANDLE_INFORMATION</strong> FILE_OBJECT’u i slusznie,no ale&#8230;</p>
<p>Sprawdzenie rozpoczyna się od zbadania długości scieżki podanej jako argument i tej zawartej w file object’e.</p>
<pre class="brush: cpp">
.text:0001B51E                 push    [ebp+filePath]  ; wchar_t *
.text:0001B521                 call    ds:wcslen
.text:0001B527                 pop     ecx
.text:0001B528                 sub     eax, 6
.text:0001B52B                 mov     [ebp+a2], eax
.text:0001B52E                 movzx   ecx, word ptr [esi+30h] ; fileObject-&gt;FileName.Length
.text:0001B532                 shr     ecx, 1
.text:0001B534                 cmp     ecx, eax
.text:0001B536                 jnz     short next_struct
</pre>
<p>Jeśli długości są identyczne przechodzimy do następnego testu. Zanim jednak przejde dalej odczuwam wielką potrzebe czepienia się jednej kwestii związaną z dobrymi praktykami jak i optymalizacją kodu.<br />
Chodzi dokładnie o ten fragment:</p>
<pre class="brush: cpp">
.text:0001B51E                 push    [ebp+filePath]  ; wchar_t *
.text:0001B521                 call    ds:wcslen
</pre>
<p>Ten fragment znajduję się wewnątrz pętli i przy każdej iteracji, kiedy obiektem okazuje się plik, wywoływana jest zupełnie bez sensownie funkcja <strong>wcslen</strong> na zmiennej <strong>filePath</strong>, która została podana jako parametr do <strong>sub_1B488</strong>!!! Takie wielokrotne wyliczanie tej samej wartości wewnątrz pętli prowadzi do niczego innego niż zmniejszenia wydajności kodu, a w tym przypadku wydajność będzie mala wręcz wprost proporcjonalnie do długości stringu. Także, nie polecam takich konstrukcji <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> (btw: jak zobaczyłem ten twór to przypomniał mi się post <strong>Malcom</strong>’a <a href="http://blog.malcom.pl/2009/09/09/programowanie-wymaga-myslenia/">„Programowanie wymaga myślenia!”</a> , polecam).</p>
<p>Kontynuujmy:</p>
<pre class="brush: cpp">
.text:0001B538                 push    eax             ; length
.text:0001B539                 mov     eax, [ebp+filePath]
.text:0001B53C                 add     eax, 0Ch
.text:0001B53F                 push    eax             ; wchar_t *
.text:0001B540                 push    dword ptr [esi+34h] ; fileObject-&gt;FileName.Buffer
.text:0001B543                 call    ds:_wcsnicmp
</pre>
<p>Tutaj dokonywane jest już porównanie stringów reprezentujących ścieżki do plików.<br />
<strong>Ale, ale !!! Nie jest to porównanie zawierające litery partycji, na której dany plik się znajduje!!!</strong><br />
Ścieżki mają tu postać:<br />
<strong>„\folder\file.ext”</strong></p>
<p>Tylko i wyłącznie takie porównanie doprowadza do sytuacji, w której handler powiązany z plikiem o takiej samej ścieżce jak ścieżka podana jako parametr funkcji, lecz znajdujący się na innej partycji zostanie zamknięty!!!</p>
<p><font color="gree">[+]Przykład</font><br />
Na potrzeby testów stworzyłem niewielką aplikację, która otwiera handler do pliku bez praw do usunięcia( bez <strong>FILE_SHARE_DELETE,</strong> w celu zmuszenia gmer’a do wywołania powyżej omawianej procki). Kod tej aplikacji jest następujący:</p>
<pre class="brush: cpp">
int main(int argc, char* argv[])
{

	HANDLE h = CreateFileA(argv[1],
				GENERIC_READ,
				FILE_SHARE_READ | FILE_SHARE_WRITE,
				0,
				OPEN_EXISTING,
				FILE_ATTRIBUTE_NORMAL,
				0);
	if(h == INVALID_HANDLE_VALUE)
	{
		cout&lt;&lt;[+]INVALID_HANDLE_VALUE;
		return 0;
	}
	cout&lt;&lt;[+]File opened!&lt;&lt;endl;
	getchar();
}
</pre>
<p>oraz narzędzia <strong>Handle v3.42</strong>, do wylistowania wszystkich otwartych handlerów przez dany proces. Na dwóch konsolach odpaliłem swój kod skompilowany do pliku zlo.exe z następującymi parametrami:</p>
<pre class="brush: php">
Console_1:
zlo.exe C:\install.exe
</pre>
<p>oraz </p>
<pre class="brush: php">
Console_2:
zlo.exe E:\install.exe
</pre>
<p>Po odpaleniu aplikacji wylistowałem otwarte przez nie handler:</p>
<pre class="brush: php">
// Przed proba usuniecia C:\install.exe [+]
c:\Documents and Settings\virtual&gt;handle.exe -p zlo.exe

Handle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
zlo.exe pid: 1928 SLAVE\virtual
    C: File  (RW-)   C:\Documents and Settings\virtual
  7E8: File  (RW-)
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375
  7F4: File  (RW-)   C:\install.exe
------------------------------------------------------------------------------
zlo.exe pid: 932 SLAVE\virtual
    C: File  (RW-)   C:\Documents and Settings\virtual
  7E8: File  (RW-)
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375
  7F4: File  (RW-)   E:\install.exe
</pre>
<p>Następnie przy pomocy gmer’a usunąłem plik <strong>C:\install.exe</strong> i ponownie wylistowałem handlery:</p>
<pre class="brush: php">
//Po usunieciu przez gmer&#039;a C:\install.exe
c:\Documents and Settings\virtual&gt;handle.exe -p zlo.exe

Handle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
zlo.exe pid: 1928 SLAVE\virtual
    C: File  (RW-)   C:\Documents and Settings\virtual
  7E8: File  (RW-)
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375
------------------------------------------------------------------------------
zlo.exe pid: 932 SLAVE\virtual
    C: File  (RW-)   C:\Documents and Settings\virtual
  7E8: File  (RW-)
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375
</pre>
<p>Efekt potwierdził moją teorie, tak jak widać uchwyt do <strong>E:\install.exe</strong> również został zamknięty.</p>
<p><font color="green">[+]Rada</font><br />
Dodanie pełnego badania ścieżek do plików m.in z wykorzystaniem np. <strong>IoQueryFileDosDeviceName</strong>.</p>
<p>No i chyba tyle;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2010/07/22/blad-logiczny-w/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tochę o usuwaniu plików</title>
		<link>http://www.icewall.pl/2010/07/21/toche-o-usuwaniu-plikow/</link>
		<comments>http://www.icewall.pl/2010/07/21/toche-o-usuwaniu-plikow/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 13:26:00 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[Aplikacja]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[bagle]]></category>
		<category><![CDATA[ddk]]></category>
		<category><![CDATA[DuplicateHandle]]></category>
		<category><![CDATA[gmer]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[ntfs hooking]]></category>
		<category><![CDATA[NtfsFsdCreate]]></category>
		<category><![CDATA[odmowa dostępu]]></category>
		<category><![CDATA[usunięcie pliku]]></category>
		<category><![CDATA[windows driver]]></category>
		<category><![CDATA[ZwQuerySystemInformation]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=349</guid>
		<description><![CDATA[Jakiś czas temu zainteresowałem się kwestią sposobów usuwania plików, a raczej możliwościami wywołania takiego procesu w „trudnych przypadkach”. Co mam na myśli mówiąc „trudne przypadki”  :
1. Zabicie procesu malware’u i próba usunięcia jego pliku wykonywalnego jest utrudniona z tego względu, że innym proces wciąż odnawia proces naszych zainteresowań.
2. Aplikacja/malware posiada otwarty handler do pliku [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu zainteresowałem się kwestią sposobów usuwania plików, a raczej możliwościami wywołania takiego procesu w „trudnych przypadkach”. Co mam na myśli mówiąc „trudne przypadki”  :</p>
<p><strong>1. Zabicie procesu malware’u i próba usunięcia jego pliku wykonywalnego jest utrudniona z tego względu, że innym proces wciąż odnawia proces naszych zainteresowań.</p>
<p>2. Aplikacja/malware posiada otwarty handler do pliku z takimi uprawnieniami (brak FILE_SHARE_DELETE) , które uniemożliwiają jego usunięcie.</p>
<p>3.Usuniecie pliku nie jest możliwe ze względów na hooki , czy to na poziomie r3 czy r0, które chronią wybrane pliki malware’u.</strong></p>
<p>Poniżej przedstawię parę sposobów na radzenie sobie w takich „trudnych sytuacjach” spowodowanych przez nie do końca poprawnie działającą aplikacje lub malware.</p>
<h3>1.</h3>
<p><strong> Zabicie procesu malware’u i próba usunięcia jego pliku wykonywalnego jest utrudniona z tego względu, że innym proces wciąż odnawia proces naszych zainteresowań.</strong></p>
<p>          Porzućmy  kwestie jaką przedstawiam w tytule tego punktu i wyobraźmy sobie prostszy scenariusz o identycznym charakterze.<br />
Załóżmy teoretyczną sytuację, że istnieje malware, który składa się dwóch modułów na potrzeby przykładu nazwane następująco:<br />
<strong>matka.exe</strong> – „dobrze ukryty” plik w systemie, który uruchamia się przy każdym uruchomieniu komputer’a następnie tworzy zdalny wątek w jednym z procesów systemowych i stamtąd wykonuje swoje zadania.  Jego jedynym zadaniem jest uruchamianie modułu <strong>zle_dziecko.exe</strong> oraz monitorowanie jego stanu. W przypadku kiedy, proces <strong>zle_dziecko.exe </strong>zostanie zabity ukryty gdzieś w czeluściach systemu wątek matki tworzy jego nowy proces.</p>
<p><strong>zle_dziecko.exe </strong>– moduł posiadający najważniejsza funkcjonalność keyloggingu,itp uruchamiany i utrzymywany przy życiu przez moduł <strong>matka.exe</strong>.</p>
<p>Dodatkowo scenariusz postępowania zakłada, że naszym priorytetem jest w pierwszej kolejności pozbycie się złośliwego procesu <strong>zle_dziecko.exe</strong> ponieważ co każdą minutę wysyła on cenne skradzione dane z naszego systemu na  drop host.<br />
Niestety pojawiają się drobne problemy, ponieważ po zabiciu procesu <strong>zle_dziecko.exe</strong> jest on wciąż odnawiany, przez co „nie możliwe” staje się usunięcie jego pliku wykonywalnego ze względu na „blokady” ze strony systemu.</p>
<p><font color="green">[+]Sposób na obejście tego przypadku:</font><br />
Analizując driver filesystemu (w moim przypadku źródłem zainteresowań był <strong>NTFS[ntfs.sys</strong>]) dochodzimy do wniosków, że tak naprawdę dwa pola w <strong>FILE_OBJECT’e</strong> pliku wykonywalnego, który posiada aktywny proces mogą uniemożliwiać usunięcie powiązanego z nim pliku.</p>
<pre class="brush: php">
kd&gt;dt _FILE_OBJECT [ecx]
ntdll!_FILE_OBJECT
   +0x000 Type             : 5
   +0x002 Size             : 112
   +0x004 DeviceObject     : 0x88fd1900 _DEVICE_OBJECT
   +0x008 Vpb              : 0x88fa5780 _VPB
   +0x00c FsContext        : 0xe12f33d0
   +0x010 FsContext2       : 0xe189f870
   +0x014 SectionObjectPointer : 0x88c4d964 _SECTION_OBJECT_POINTERS
   +0x018 PrivateCacheMap  : (null)
   +0x01c FinalStatus      : 0
   +0x020 RelatedFileObject : (null)
   +0x024 LockOperation    : 0 &#039;&#039;
   +0x025 DeletePending    : 0 &#039;&#039;
   +0x026 ReadAccess       : 0x1 &#039;&#039;
   +0x027 WriteAccess      : 0 &#039;&#039;
   +0x028 DeleteAccess     : 0 &#039;&#039;
   +0x029 SharedRead       : 0x1 &#039;&#039;
   +0x02a SharedWrite      : 0x1 &#039;&#039;
   +0x02b SharedDelete     : 0x1 &#039;&#039;
   +0x02c Flags            : 0x840042
   +0x030 FileName         : _UNICODE_STRING &quot;\zle_dziecko.exe&quot;
   +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x040 Waiters          : 0
   +0x044 Busy             : 0
   +0x048 LastLock         : (null)
   +0x04c Lock             : _KEVENT
   +0x05c Event            : _KEVENT
   +0x06c CompletionContext : (null) </pre>
<p><em>„File object dla pliku zle_dziecko.exe posiadający aktywny proces”</em></p>
<p>Czytając specyfikacje <strong>FILE_OBJECT na msdn’e:</strong><br />
<u><strong>DeleteAccess</strong></u><br />
<em>A read-only member (nie był bym tego taki pewny <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ). If TRUE, the file associated with the file object has been opened for delete access. If FALSE, the file has been opened without delete access. This information is used when checking and/or setting the share access of the file.</em><br />
<em>Źródło:</em>  <a href="http://msdn.microsoft.com/en-us/library/ff545834(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ff545834(VS.85).aspx</a></p>
<p>I bardzo ważna informacja znajdująca się na dole strony:</p>
<p><em>During the processing of an <strong>IRP_MJ_CREATE</strong> request, a file system driver calls the IoSetShareAccess routine (if the client is the first to open the file) or the <strong>IoCheckShareAccess</strong> routine (for subsequent clients that want to share the file). IoSetShareAccess and IoCheckShareAccess update the ReadAccess, WriteAccess, and <strong>DeleteAccess</strong> members to indicate the access rights that are granted to the client if the client has exclusive access to the file.</em><br />
<em>Źródło:</em> <a href="http://msdn.microsoft.com/en-us/library/ff545834(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ff545834(VS.85).aspx</a></p>
<p>Ważną wskazówką tutaj dla nas jest to, iż sprawdzenie flagi <strong>DeleteAccess</strong> odbywa się podczas przetwarzania zapytania <strong>IRP_MJ_CREATE</strong> przez driver( już teraz dopowiem, że zapytanie to jest wysyłane również podczas usuwania pliku, a procedura obsługująca je w NTFS’e nazywa sie <strong>NtfsFsdCreate</strong>) w funkcji <strong>IoCheckShareAccess</strong> i tam należy badać jej wpływ na dalszy przebieg operacji usuwania.<br />
Oczywiści z badań wynikło, że ustawienie tej flagi na <strong>TRUE</strong> pozwala przejść check w <strong>IoCheckShareAccess</strong> pozytywnie.</p>
<p><strong><u>SectionObjectPointer  :_SECTION_OBJECT_POINTERS</u></strong><br />
w tej strukturze interesuje nas tak naprawdę jeden wskaźnik </p>
<p><strong><u>ImageSectionObject  : PVOID</u></strong><br />
<em>Opaque pointer to an image section object (that is, a CONTROL_AREA structure) that is used to track state information for an executable file stream. Memory manager sets this member whenever an executable image section is created for the stream. <strong>A NULL value indicates that the executable image is currently not in memory;</strong> this value, however, can change at any time.</em><br />
<em>Źródło:</em> <a href="http://msdn.microsoft.com/en-us/library/ff563687(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ff563687(VS.85).aspx</a></p>
<p>W skrócie, pointer ten ma wartość <strong>NULL </strong>wtedy, gdy plik wykonywalny nie jest załadowany do pamięci(nie posiada aktywnego procesu).  W innym przypadku pointer ten jest ustawiony, a próba skasowania pliku wykonywalnego kończy się kodem błędu <strong>STATUS_SHARING_VIOLATION</strong>.</p>
<p><font color="green">[+]Implementacja:  [źródło inspiracji gmer.sys]</font><br />
Żeby móc manipulować na file object’e musimy zejść w czeluści piekielne naszego <strong>OS’u , czyli ring0.</strong><br />
Oczywiście dokonamy tego pisząc driver, w którym przykładowa funkcja realizująca nasze zadanie będzie wyglądała tak :</p>
<pre class="brush: cpp">
NTSTATUS ForceDelete(wchar_t *path)
{

	HANDLE fileHandle;
	NTSTATUS result;
	IO_STATUS_BLOCK ioBlock;
	DEVICE_OBJECT *device_object;
	void* object = NULL;
	OBJECT_ATTRIBUTES fileObjectAttr;
	wchar_t deviceName[14];
	UNICODE_STRING uDeviceName;
	UNICODE_STRING uPath;

	//switch context to UserMode
	EPROCESS *eproc = IoGetCurrentProcess();
	KeAttachProcess(eproc);

	//e.g &quot;\??\C:\&quot;
	memset(deviceName,0,sizeof(deviceName));
	wcsncpy(deviceName,path,7);

	RtlInitUnicodeString(&amp;uDeviceName,deviceName); //initialize volume name
	RtlInitUnicodeString(&amp;uPath,path); //initialize path

	/* get volume handle */
	InitializeObjectAttributes(&amp;fileObjectAttr,
								uDeviceName,
								OBJ_CASE_INSENSITIVE,
								NULL,
								NULL);

	result = ZwOpenFile(&amp;fileHandle,
						SYNCHRONIZE,
						&amp;fileObjectAttr,
						&amp;ioBlock,
						FILE_SHARE_READ,
						FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE);

	if(result != STATUS_SUCCESS)
	{
		DbgPrint(&quot;Some problems with open file ;[&quot;);
		goto _end;
	}

    if ( !ObReferenceObjectByHandle(fileHandle, 0, 0, 0, &amp;object, 0) )
    {

      device_object = IoGetBaseFileSystemDeviceObject(object); //get the lowest-level file system volume device object associated with a file
      ObfDereferenceObject(object);
    }

    ZwClose(fileHandle);	

	InitializeObjectAttributes(&amp;fileObjectAttr,
							   &amp;uPath,
							   OBJ_CASE_INSENSITIVE,
							   NULL,
							   NULL);

	result = IoCreateFileSpecifyDeviceObjectHint(
			   &amp;ileHandle,
			   SYNCHRONIZE | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | FILE_READ_DATA,
			   &amp;fileObjectAttr,
			   &amp;ioBlock,
			   0,
			   0,
			   FILE_SHARE_READ | FILE_SHARE_WRITE |FILE_SHARE_DELETE,
			   FILE_OPEN,
			   FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
			   0,
			   0,
			   CreateFileTypeNone,
			   0,
			   IO_IGNORE_SHARE_ACCESS_CHECK,
			   device_object);
	if(result != STATUS_SUCCESS)
	{
		DbgPrint(&quot;error in IoCreateFileSpecifyDeviceObjectHint&quot;);
		goto _end;
	}

	result = ObReferenceObjectByHandle(fileHandle, 0, 0, 0, &amp;object, 0);

	if(result != STATUS_SUCCESS)
	{
		DbgPrint(&quot;error in ObReferenceObjectByHandle&quot;);
		ZwClose(fileHandle);
		goto _end;
	}
	/* set up proper FILE_OBJECT members  to allow file delete */
	((FILE_OBJECT*)object)-&gt;SectionObjectPointer-&gt;ImageSectionObject = 0; //.exe file is not in memory
	((FILE_OBJECT*)object)-&gt;DeleteAccess = 1; //we have access to delete file (.exe file doesn&#039;t have active process)

	 /*Try of file deletion*/
	 result = ZwDeleteFile(&amp;fileObjectAttr);

	if(result != STATUS_SUCCESS)
	{
		DbgPrint(&quot;\nerror in ZwDeleteFile&quot;);
	}
	ObDereferenceObject(object);
	ZwClose(fileHandle);

_end:
	//return to r0
	KeDetachProcess();
	return result;
}
</pre>
<p>Myślę, że małe wyjaśnienia przydadzą się w następujących linijkach:</p>
<pre class="brush: cpp">
device_object = IoGetBaseFileSystemDeviceObject(object); //get the lowest-level file system volume device object associated with a file
</pre>
<p>pobieramy najniżej położony na stosie <strong>device_object</strong> związany z naszym plikiem, po to by później w:</p>
<pre class="brush: cpp">
IoCreateFileSpecifyDeviceObjectHint(
(...)
device_object);
</pre>
<p><strong><u>DeviceObject [in, optional] </u></strong></p>
<p><em>A pointer to the device object to which the create request is to be sent. The device object must be a filter or file system device object in the file system driver stack for the volume on which the file or directory resides. This parameter is optional and can be NULL. If this parameter is NULL, the request will be sent to the device object at the top of the driver stack.</em><br />
<em>Żródło:</em> <a href="http://msdn.microsoft.com/en-us/library/ff548289(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ff548289(VS.85).aspx</a><br />
gdzie nasz <strong>device object</strong> przedstawia się następująco:</p>
<pre class="brush: php">
//88f8b020 == device_object
kd&gt;; !devobj 88f8b020
Device object (88f8b020) is for:
  \FileSystem\Ntfs DriverObject 88f733d0
Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000
DevExt 88f8b0d8 DevObjExt 88f8b880
ExtensionFlags (0000000000)
AttachedDevice (Upper) 88fc4b30 \FileSystem\sr
Device queue is not busy.

kd&lt; !devstack 88f8b020
  !DevObj   !DrvObj            !DevExt   ObjectName
  88fc4b30  \FileSystem\sr     88fc4be8
&gt;88f8b020  \FileSystem\Ntfs   88f8b0d8
</pre>
<p>Myślę, że cały sens użycia tego api wyjaśnia jego opis:</p>
<p><em>The <strong>IoCreateFileSpecifyDeviceObjectHint</strong> routine is used by file system filter drivers to send a create request only to the filters below a specified device object and to the file system.</em></p>
<p>Co dzięki temu zyskujemy? Większą pewność, że nasze zapytanie nie zostanie po drodze zmodyfikowane przez sterownik <strong>rootkit’a </strong>podpiętego pod stos urządzeń powiązanych z file systemem.</p>
<h3>2.</h3>
<p> <strong>Wiele aplikacji/malware posiada otwarte handler’y do pliku z takimi uprawnieniami (brak FILE_SHARE_DELETE) , które uniemożliwiają jego usunięcie.</strong></p>
<p>W tym przypadku nasz trick z ustawieniem odpowiednich flag dla <strong>FILE_OBJECT’u </strong>niestety nie zda egzaminu, ze względu na to, że file system w swoich wewnętrznych strukturach utrzymuje np.<strong>ReferenceCount</strong> dla takiego pliku i nie pozwoli na jego usunięcie, jeśli nie jest ono równe 0. Modyfikacja wewnętrznych struktur NTFS’a nie jest kwestią trywialną imo ze względu na sama kontrukcje tych struktu:<br />
<strong>Root FCB jest tworzone dla kazdego plik tylko w jednej instacji -> FCB zawiera pointer na LCB , który łączy FCB z SCB, gdzie może występować wiele SCB posiadających wiele dzieci  typu FCB,a do tego wszystkiego dochodzi jeszcze CCB tworzone w zależności od wymaganych praw na otwieramy pliku <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Dorzućmy jeszcze do tego wszystkiego to, że struktury te nie są udokumentowane i myślę, że już wystarczająco zachęciłem was do ich ręcznej modyfikacji <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</strong></p>
<p>My podejdziemy do tego tematu w prostszy sposób, i do tego jakże logiczny, bo przecież jak pewna aplikacja ma jakiś otwarty handler do pliku i przez to tego pliku usunąć się nie da ,to co należało by zrobic? <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Oczywiście zamknąć jej ten uchwyt! <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . I tak też uczynimy.</p>
<p><font color="green">[+]Sposób na obejście tego przypadku:</font><br />
Dla tego przypadku zaproponuje dwa rozwiązania, jedno na poziomie <strong>ring 3</strong> oraz kolejne na poziomie <strong>ring0.</strong><br />
Zajmijmy się w pierwszej kolejności r3.</p>
<p><font color="green">[+]Implementacja</font><br />
W potrzebie tworzenia aplikacji, która zrealizuje dla nas założone zadanie przychodzi nam api:</p>
<pre class="brush: cpp">
__kernel_entry NTSTATUS
NTAPI
NtQuerySystemInformation (
    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    OUT PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );
</pre>
<p>oraz jego nieudokumentowana klasą informacji wraz z strukturami:</p>
<pre class="brush: cpp">
#define SystemHandleInformation 0x10

typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO {
    USHORT UniqueProcessId;
    USHORT CreatorBackTraceIndex;
    UCHAR ObjectTypeIndex;
    UCHAR HandleAttributes;
    USHORT HandleValue;
    PVOID Object;
    ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;

typedef struct _SYSTEM_HANDLE_INFORMATION {
    ULONG NumberOfHandles;
    SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[ 1 ];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
</pre>
<p>Korzystając z jej dobrodziejstwa otrzymamy tablice zawierającą wszystkie procesy oraz uchwyty należące do tych procesów wraz z typami obiektów, z jakimi te handler’y są powiązane.<br />
Te wszystkie informacje pozwolą nam na zlokalizowanie otwartych uchwytów do naszego pliku w każdym procesie istniejącym w systemie, dzięki czemu po przez drobne sztuczki uzyskamy możliwość ich zamknięcia, a następnie usunięcia pliku.</p>
<pre class="brush: cpp">
//funkcja główna
void fileToDelete(char *filePath)
{
	closeAllHandles(filePath);

	//after closing all handler to the file ,try to delete it
	DeleteFileA(filePath);

}
</pre>
<p>Rzućmy okien na funkcje <strong>closeAllHandles</strong>:</p>
<pre class="brush: cpp">
void closeAllHandles(char* filePath)
{
	SYSTEM_HANDLE_INFORMATION *shiTable;
	char foundPath[MAX_PATH];

	shiTable = enumerateHandles();
	for(int i = 0; i &lt; shiTable-&gt;NumberOfHandles;i++)
	{
		if( isFile( shiTable-&gt;Handles[i].ObjectTypeIndex) )
		{
			HANDLE fileHandle = getDuplicatedHandle(shiTable-&gt;Handles[i].UniqueProcessId,
															    shiTable-&gt;Handles[i].HandleValue,
																false);
				if(!fileHandle)
					continue;//probably a bad handle

			if(!GetFileNameFromHandle(fileHandle,foundPath))//check whether we have been able to receive filePath
					continue;
			if( !strcmp(filePath,foundPath) )
			{
				//handle to interesting file has been found,,,let&#039;s close it
				getDuplicatedHandle(shiTable-&gt;Handles[i].UniqueProcessId,
									shiTable-&gt;Handles[i].HandleValue,
									true);
			}
		}
	}

	VirtualFree(shiTable,0,MEM_RELEASE);
}
</pre>
<p>postępując w kolejności:</p>
<pre class="brush: cpp">
SYSTEM_HANDLE_INFORMATION * enumerateHandles()
{
	SYSTEM_HANDLE_INFORMATION shi = {0};
	SYSTEM_HANDLE_INFORMATION *shiTable;
	unsigned long shiTableSize;

	int status  = NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemHandleInformation,
						     &amp;shi,
							 sizeof(SYSTEM_HANDLE_INFORMATION),
							 &amp;shiTableSize);
	//TODO: check status
	shiTable = (SYSTEM_HANDLE_INFORMATION*)VirtualAlloc(0,shiTableSize,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
	status = NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemHandleInformation,
									  shiTable,
									  shiTableSize,
									  0);

	return shiTable;
}
</pre>
<p>Myślę, że tutaj wszystko jest jasne, a funkcja <strong>getDuplicatedHandle </strong> będzie bardziej interesująca. Ahh<br />
jeszcze mała funkcja <strong>isFile</strong>:</p>
<pre class="brush: cpp">
bool isFile(unsigned char type)
{
	return type == 0x1c; //for XP
}
</pre>
<p>Sprawdzamy tutaj czy element opisany przez <strong>SYSTEM_HANDLE_TABLE_ENTRY_INFO</strong> jest plikiem. Jeśli tak, to przechodzimy dalej:</p>
<pre class="brush: cpp">
HANDLE getDuplicatedHandle(unsigned long procID,unsigned long handleValue,bool closeSourceHandle)
{
	HANDLE rFile = (HANDLE)handleValue;
	HANDLE rProc;
	HANDLE duplicatedHandle;
	rProc = OpenProcess(PROCESS_DUP_HANDLE,0,procID);
	unsigned long option = closeSourceHandle?(DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS):DUPLICATE_SAME_ACCESS;

	DuplicateHandle(rProc,rFile,GetCurrentProcess(),&amp;duplicatedHandle,0,0,option);
	CloseHandle(rProc);
	if(closeSourceHandle)
	{
		CloseHandle(duplicatedHandle);
		return 0;
	}

	return duplicatedHandle;
}
</pre>
<p>Do funkcji trafiają trzy parametry: </p>
<pre class="brush: php">
unsigned long procID      // ID procesu do którego należy handler
unsigned long handleValue // wartość handler’a
bool closeSourceHandle    // flaga, na podstawie której będzie wybierana opcja dla api DuplicateHandle
</pre>
<p>W pierwszej kolejności uzyskujemy handler do procesu, który być może, trzyma otwarty handler do interesującego nas pliku. Istotną kwestią tutaj jest flag <strong>DesiredAccess</strong> ustawiona na <strong>PROCESS_DUP_HANDLE</strong>, ponieważ zawiązana ona jest z mechanizmem, który wykorzystamy za chwilę.<br />
<strong>Api DuplicateHandle</strong> pozwala nam na stworzenie kopi uchwytu pochodzącego z naszego procesu lub też (co jest najciekawsze) z procesu zdalnego. Bez tej możliwości wartość handler’a uzyskanego przez <strong>NtQuerySystemInformation</strong> była by dla nas bezużyteczna, ponieważ nie moglibyśmy skorzystać z niej w obrębie naszego procesu. Myślę, że co niektórym z was nasuwa się kolejna idea, a mianowicie możliwość wykorzystania zdalnych wątków. Fakt, w ten sposób również można podejść do tego tematu, jednak mi bardziej do gustu przypadło to rozwiązanie.</p>
<p>Opcja <strong>DuplicateHandle</strong>, która najbardziej nas tutaj interesuje to:</p>
<pre class="brush: php">
DUPLICATE_CLOSE_SOURCE
</pre>
<p>dzięki, której jak się domyślacie <strong>stworzymy kopie uchwytu przy jednoczesnym zamknięciu uchwyty źródłowego</strong>!;]. Oczywiście nie chcemy zamykać wszystkich uchwytów każdego procesu, dlatego też, przed sprawdzeniem, z jakim plikiem powiązany jest dany handler ustawiamy tylko opcje: </p>
<pre class="brush: php">
DUPLICATE_SAME_ACCESS
</pre>
<p>Po uzyskaniu klonu uchwytu wypadałoby, w jakiś sposób teraz ustalić, z jakim plikiem powiązany jest ten handler. Z pomocą przychodzi tutaj funkcja<br />
<strong>GetFileNameFromHandle</strong><br />
źródło: <a href="http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx</a><br />
, a tak naprawdę api związane z mapowaniem pliku, dokładnie mówiąc:</p>
<pre class="brush: php">
GetMappedFileName
</pre>
<p>Ja delikatnie zmodyfikowałem tą funkcje na swoje potrzeby i teraz prezentuje się ona następująco</p>
<pre class="brush: cpp">
BOOL GetFileNameFromHandle(HANDLE hFile,char* filePath)
{
  BOOL bSuccess = FALSE;
  char pszFilename[MAX_PATH+1];
  HANDLE hFileMap;

  // Create a file mapping object.
  hFileMap = CreateFileMapping(hFile,
                    NULL,
                    PAGE_READONLY,
                    0,
                    1,
                    NULL);

  if (hFileMap)
  {
    // Create a file mapping to get the file name.
    void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

    if (pMem)
    {
      if (GetMappedFileNameA (GetCurrentProcess(),
                             pMem,
                             pszFilename,
                             MAX_PATH))
      {

        // Translate path with device name to drive letters.
        char szTemp[1024];
        szTemp[0] = &#039;\0&#039;;

        if (GetLogicalDriveStringsA(BUFSIZE-1, szTemp))
        {
          char szName[MAX_PATH];
          char szDrive[3] = &quot; :&quot;;
          BOOL bFound = FALSE;
          char* p = szTemp;

          do
          {
            // Copy the drive letter to the template string
            *szDrive = *p;

            // Look up each device name
            if (QueryDosDeviceA(szDrive, szName, MAX_PATH))
            {
              UINT uNameLen = strlen(szName);

              if (uNameLen &lt; MAX_PATH)
              {
                bFound = strnicmp(pszFilename, szName, uNameLen) == 0;

                if (bFound &amp;&amp; *(pszFilename + uNameLen) == &#039;\\&#039;)
                {
					strcpy(filePath,szDrive);
					strcpy(filePath+strlen(szDrive),pszFilename + strlen(szName));
                }
              }
            }

            // Go to the next NULL character.
            while (*p++);
          } while (!bFound &amp;&amp; *p); // end of string
        }
      }
      bSuccess = TRUE;
      UnmapViewOfFile(pMem);
    } 

    CloseHandle(hFileMap);
  }
  CloseHandle(hFile);

  return(bSuccess);
}
</pre>
<p>Istotną zmianą jest tutaj usunięcie check’u polegającego na sprawdzaniu wielkości pliku po przez <strong>GetFileSize</strong>. Niestety ale dla pewnych handler’ow wskazujących na takie twory jak:<br />
<strong>78: File  (---)   \Device\NamedPipe\net\NtControlPipe15</strong><br />
<strong>GetFileSize zawisa.</strong><br />
Kiedy uda nam się zdobyć ścieżkę do pliku kwestia jest już prosta. Wykonujemy check czy dana ścieżka jest identyczna do tej podanej przez nas </p>
<pre class="brush: php">
if( !strcmp(filePath,foundPath) )
</pre>
<p>Jeśli tak, to wywołujemy wcześniej omawianą funkcję <strong>duplicateHandle</strong>, lecz tym razem z parametrem <strong>closeSourceHandle ustawionym na true</strong></p>
<pre class="brush: php">
				//handle to interesting file has been found,,,let&#039;s close it
				getDuplicatedHandle(shiTable-&gt;Handles[i].UniqueProcessId,
									shiTable-&gt;Handles[i].HandleValue,
									true);
</pre>
<p><font color="green">[+]Analogiczne rozwiązanie lecz w świecie ring0[inspiracja gmer.sys].</font><br />
Początek prezentuje sie identycznie jak wersja dla r3.</p>
<pre class="brush: cpp">
void r0_fileToDelete(wchar_t *filePath)
{
	r0_closeAllHandles(filePath);
	/*
		after closing all handles to the file ,try to delete it
		ofc,,,before it convert DosPath to NtPath (just add \??\ before filePath)
	*/
	//ZwDeleteFile();
}
</pre>
<p>Przyjrzyjmy się obecnej wersji <strong>closeAllHandles</strong>:</p>
<pre class="brush: cpp">
void r0_closeAllHandles(wchar_t* filePath)
{
	MY_SYSTEM_HANDLE_INFORMATION *shiTable;
	EPROCESS *eprocess;
	unsigned long i;
	FILE_OBJECT *file;
	OBJECT_NAME_INFORMATION *objectNameInformation = 0;
	unsigned long filePathLength = wcslen(filePath);

	shiTable = enumerateHandles();
	for(i = 0; i &lt; shiTable-&gt;NumberOfHandles;i++)
	{
		if( isFile( shiTable-&gt;Handles[i].ObjectTypeIndex) )
		{
			file = (FILE_OBJECT*)shiTable-&gt;Handles[i].Object;
			if(!file || file-&gt;FileName.Length == 0)
				continue;

			getFullPathName(file,&amp;objectNameInformation);

			if((objectNameInformation-&gt;Name.Length/2 ) != filePathLength)
				continue;

			if( !_wcsnicmp(filePath,(wchar_t*)objectNameInformation-&gt;Name.Buffer,filePathLength) )
			{
				PsLookupProcessByProcessId((HANDLE)shiTable-&gt;Handles[i].UniqueProcessId,&amp;eprocess);
				KeAttachProcess(eprocess);//switch context to process one
				ZwClose((HANDLE)shiTable-&gt;Handles[i].HandleValue);
				KeDetachProcess();
			}
		}
	}

	ExFreePoolWithTag(shiTable,0xdeadbeef);
}
</pre>
<p>Tak jak poprzednio używamy <strong>enumerateHandles</strong> do zdobycia informacji o handler’ach, jedyna zmianą tutaj jest sposób alokacji:</p>
<pre class="brush: cpp">
MY_SYSTEM_HANDLE_INFORMATION * enumerateHandles()
{
	MY_SYSTEM_HANDLE_INFORMATION shi = {0};
	MY_SYSTEM_HANDLE_INFORMATION *shiTable;
	unsigned long shiTableSize;

	int status  = ZwQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemHandleInformation,
						     &amp;shi,
							 sizeof(MY_SYSTEM_HANDLE_INFORMATION),
							 &amp;shiTableSize);
	//TODO: check status
	shiTable = (MY_SYSTEM_HANDLE_INFORMATION*)ExAllocatePoolWithTag(NonPagedPool,shiTableSize,0xdeadbeef);
	status = ZwQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemHandleInformation,
									  shiTable,
									  shiTableSize,
									  0);

	return shiTable;
}
</pre>
<p>Poruszając się w głab funkcji <strong>r0_closeAllHandles</strong> napotykamy linijkę gdzie:</p>
<pre class="brush: php">
file = (FILE_OBJECT*)shiTable-&gt;Handles[i].Object;
</pre>
<p>Możemy skorzystać z tej dogodności, jaką daje nam obecność w <strong>r0</strong>, a mianowicie do wyciagnięcia interesujących nas informacji o ścieżce do pliku przy pomocy <strong>FILE_OBJECT’u</strong> dostarczonego w <strong>_SYSTEM_HANDLE_INFORMATION</strong> przez <strong>ZwQuerySystemInformation.</strong> Niestety sytuacja na wstępie nie jest taka kolorowa jak mogła by się wydawać, chodzi tutaj o nie dogodność związana z formatem sciężki do pliku z jaki powiązany jest <strong>FILE_OBJECT:</strong></p>
<pre class="brush: php">
kd&gt; dt _FILE_OBJECT 88e280d0
ntdll!_FILE_OBJECT
   +0x000 Type             : 5
   +0x002 Size             : 112
   +0x004 DeviceObject     : 0x88f76900 _DEVICE_OBJECT
   +0x008 Vpb              : 0x88fa5780 _VPB
   +0x00c FsContext        : 0xe154c0d0
   +0x010 FsContext2       : 0xe154c228
   +0x014 SectionObjectPointer : 0x88ee87ac _SECTION_OBJECT_POINTERS
   +0x018 PrivateCacheMap  : (null)
   +0x01c FinalStatus      : 0
   +0x020 RelatedFileObject : (null)
   +0x024 LockOperation    : 0 &#039;&#039;
   +0x025 DeletePending    : 0 &#039;&#039;
   +0x026 ReadAccess       : 0x1 &#039;&#039;
   +0x027 WriteAccess      : 0x1 &#039;&#039;
   +0x028 DeleteAccess     : 0 &#039;&#039;
   +0x029 SharedRead       : 0 &#039;&#039;
   +0x02a SharedWrite      : 0 &#039;&#039;
   +0x02b SharedDelete     : 0 &#039;&#039;
   +0x02c Flags            : 0x40008
   +0x030 FileName         : _UNICODE_STRING &quot;\WINDOWS\system32\config\default.LOG&quot;
   +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0
   +0x040 Waiters          : 0
   +0x044 Busy             : 0
   +0x048 LastLock         : (null)
   +0x04c Lock             : _KEVENT
   +0x05c Event            : _KEVENT
   +0x06c CompletionContext : (null)
</pre>
<p>Tak jak widać ścieżka do pliku nie zawiera informacji o partycji, na której plik się znajduje. Jak uzyskać literę partycji? Jest na to parę sposobów.<br />
Najwygodniejszym wydaje się użycie <strong>IoQueryFileDosDeviceName</strong>. <strong>getFullPathName</strong> w wersji dla r0 prezentuje się następująco: </p>
<pre class="brush: cpp">
NTSTATUS getFullPathName(FILE_OBJECT* fileObject,OBJECT_NAME_INFORMATION **objectNameInformation)
{

	 return IoQueryFileDosDeviceName(fileObject,
							  objectNameInformation
							  );
	//remeber about _OBJECT_NAME_INFORMATION deallocation!!!
}
</pre>
<p>Funkcja ta zwróci nam wypełniona strukturę, która tak naprawdę zawiera jedno pole UNICODE_STRING, zawierające pełną ścieżkę do pliku. Po porównaniu ścieżek do plików i znalezieniu tej interesującej nas przystępujemy tak jak poprzednio do zamknięcia uchwytu. I tu kolejna zmiana:</p>
<pre class="brush: cpp">
				PsLookupProcessByProcessId((HANDLE)shiTable-&gt;Handles[i].UniqueProcessId,&amp;eprocess);
				KeAttachProcess(eprocess);//switch context
				ZwClose((HANDLE)shiTable-&gt;Handles[i].HandleValue);
				KeDetachProcess();
</pre>
<p>Tak jak odrazu widać nie posługujemy się <strong>DuplicateHandle</strong> jak poprzednio, lecz korzystamy z możliwości zmiany kontekstu(<strong>KeAttachProcess</strong>) na kontekst procesu, w którym dany handler istnieje i zamykamy go w trywialny sposób korzystając z <strong>ZwCloseHandle</strong>. Po zamknięciu wszystkich otwartych handler’ów do naszego pliku jesteśmy gotowi na jego usunięcie przy pomocy <strong>ZwDeleteFile</strong>.</p>
<h3>3.</h3>
<p><strong>Usuniecie pliku nie jest możliwe ze względów na hooki , czy to na poziomie r3 czy r0, które chronią wybrane pliki malware’u.</strong></p>
<p>Niestety czasami bywa tak, że chcemy usunąć jakiś plik, lecz nie jest to możliwe, a przeglądając listę otwartych handlerów wszystkich procesów nie odnajdujemy tam interesującego nas pliku o_0. So WTF?!.<br />
Problemem mogą tu być hooki zakładane przez malware na różne api, których zdaniem jest zwracania kodu błędu w przypadku kiedy użytkownik zapragnie usunąć plik znajdujący się na liście plików chronionych przez malware.</p>
<p>Zanim przejdziemy do konkretnego przypadku i moim zdaniem jednego z lepszych rozwiązań w tym przypadku, prześledźmy z grubsza drogę, jaką musi przebyć żądanie usunięcia pliku z pod r3.</p>
<pre class="brush: php">
Ring3
------------
DeleteFile
|
V
NtOpenFile
|
V
KiFastSystemCall
|
V
Ring0
---------
NtDeleteFile
|
V
ObOpenObjectByName
|
V
ObpCaptureObjectCreateInformation
|
V
ObpLookupObjectName
|
V
ObpLookupDirectoryEntry
|
V
IopParseDevice
|
V
IofCallDriver
|
V
IRP_MJ_CREATE in filter drivers
|
V
File system driver (e.g NtfsFsdCreate)
</pre>
<p>Tak jak widać ścieżka od <strong>DeleteFile</strong> do <strong>NtfsFsdCreate</strong> jest dość długa i na każdej z jej etapów mogą pojawić się hooki uniemożliwiające usunięcie wybranego przez malware pliku. Sprawdzanie wszystkich tych api w <strong>r3 i r0</strong> pod kątem istnienia hooku na nich jest dość czasochłonne i czasem nie trywialne. Było by wspaniale gdybyśmy mogli w pewien sposób oszukać hooki malware’u sprawdzające ścieżkę do pliku.<br />
Czy jest to możliwe? Okazuje się, że <strong>od samego DeleteFile do NtfsFsdCreate</strong> ścieżka wskazująca na plik do usunięcia nie musi wskazywać na plik dokładnie ten, który chcemy usunąć!!!<br />
Dopiero, w NtfsFsdCreate(a dokładnie w <strong>NtfsCommonCreate</strong>) ścieżka ta ma znaczenie i jest rozwiązywana na konkretne wewnętrzne struktury NTFS’owe.<br />
Co nam to daje?<br />
<strong>Wspaniałą możliwość ominięcia masy istniejących hook’ow na api zaprezentowanych powyżej!!!.</strong></p>
<p><font color="green">[+]Sposób na obejście tego przypadku:</font><br />
Wystarczy uzyskać bezpośredni dostęp do urządzenia file systemu, a następnie, podmienić w obiekcie sterownika handler(założyć hook...jak kto woli) obsługujący <strong>IRP_MJ_CREATE</strong> (w naszym przypadku jest to NtfsFsdCreate) na własny. Nasz handler będzie tylko i wyłącznie odpowiedzialny za podmianę ścieżki do pliku, którą wcześniej ustalimy, jako coś ala <strong>„turn on trigger”</strong>(<strong>np. \ice_psuje.exe</strong>). Ścieżkę tą, podmienimy na taką by wskazywała ona na plik malware’u, który rzeczywiście jest naszym celem.</p>
<p><font color="green">[+]Implementacja  (inspiracja gmer.sys)</font></p>
<pre class="brush: cpp">
void hook_NtfsFsdCreate(wchar_t* filePath)
{
	HANDLE fileHandle;
	NTSTATUS result;
	IO_STATUS_BLOCK ioBlock;
	DEVICE_OBJECT *device_object;
	void* object = NULL;
	OBJECT_ATTRIBUTES objectAttr;
	UNICODE_STRING uDeviceName;
	wchar_t deviceName[14];

	//switch context to UserMode
	EPROCESS *eproc = IoGetCurrentProcess();
	KeAttachProcess(eproc);

	//initialize file to delete variable
	g_fileToDelete = filePath;
	g_fileToDelete += 6; //take from \??\C:\zlo only \zlo

	//e.g &quot;\??\C:\&quot;
	memset(deviceName,0,sizeof(deviceName));
	wcsncpy(deviceName,filePath,7);
	wcsncpy(g_tmpFile,filePath,7);

	RtlInitUnicodeString(&amp;uDeviceName,deviceName);
	InitializeObjectAttributes(&amp;objectAttr,
								&amp;uDeviceName,
								OBJ_CASE_INSENSITIVE,
								NULL,
								NULL);

	result = ZwOpenFile(&amp;fileHandle,
						SYNCHRONIZE,
						&amp;objectAttr,
						&amp;ioBlock,
						FILE_SHARE_READ,
						FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE);

	if(result != STATUS_SUCCESS)
	{
		DbgPrint(&quot;Some problem with open file ;[&quot;);
		goto _end;
	}

    if ( !ObReferenceObjectByHandle(fileHandle, 0, 0, 0, &amp;object, 0) )
    {
      device_object = IoGetBaseFileSystemDeviceObject(object);
      ObfDereferenceObject(object);
    }

	hook_it(device_object);

_end:
	KeDetachProcess();}
</pre>
<p>Myślę, że ta część kodu jest już wam dobrze znana. Nowością może tu być linia gdzie pojawia się zmienna globalna:</p>
<pre class="brush: cpp">
	g_fileToDelete = filePath;
	g_fileToDelete += 6; //take from \??\C:\zlo only \zlo
</pre>
<p>Ustawiamy zmienna globalną <strong>g_fileToDelete</strong>, którą później będziemy wykorzystywać w hooku, na ścieżkę do pliku, który rzeczywiście chcemy skasować. W lini:</p>
<pre class="brush: php">
	wcsncpy(g_tmpFile,filePath,7);
</pre>
<p>gdzie, zmienna <strong>g_tmpFile</strong> prezentuje się domyślnie tak:</p>
<pre class="brush: php">
wchar_t *g_tmpFile = L&quot;\\??\\C:\\ice_psuje.exe&quot;;
</pre>
<p>dokonujemy podmiany domyślnej wartości woluminu na tą, na której znajduje się plik naszych zainteresowań.</p>
<pre class="brush: cpp">
void hook_it(DEVICE_OBJECT *device_object)
{
	NTSTATUS result;
	OBJECT_ATTRIBUTES fileObj;
	UNICODE_STRING uTmpFile;
	HANDLE fileHandle;
	IO_STATUS_BLOCK ioStatus;
	FILE_BASIC_INFORMATION fileBasicInfo;

	//initialize variables related with fake file
	RtlInitUnicodeString(&amp;uTmpFile,g_tmpFile);

	InitializeObjectAttributes(&amp;fileObj,
								&amp;uTmpFile,
								OBJ_CASE_INSENSITIVE,
								NULL,
								NULL);

	//save original MJ functions
	create  = device_object-&gt;DriverObject-&gt;MajorFunction[0];

	result = ZwCreateFile(&amp;fileHandle,
						  4,
						  &amp;fileObj,
						  &amp;ioStatus,
						  0,
						  0x80,
						  2,
						  3,
						  0x20,
						  0,
						  0);
	if(result != STATUS_SUCCESS)
		return;

	ZwClose(fileHandle);

	//install hooks
	device_object-&gt;DriverObject-&gt;MajorFunction[0]    = HookedNtfsFsdCreate;  

	ZwDeleteFile(&amp;fileObj);//launche our hooks

	//restore original MJ functions
	device_object-&gt;DriverObject-&gt;MajorFunction[0]    = create;

}
</pre>
<p>W kolejności:</p>
<pre class="brush: php">
//save original MJ functions
	create  = device_object-&gt;DriverObject-&gt;MajorFunction[0];
</pre>
<p>Zachowujemy oryginalny handler <strong>IRP_MJ_CREATE</strong>, następnie tworzymy plik, który będzie trigerem. Instalujemy nasz hook:</p>
<pre class="brush: php">
	//install hooks
	device_object-&gt;DriverObject-&gt;MajorFunction[0]    = HookedNtfsFsdCreate;  
</pre>
<p>Chcąc skorzystać z dobroci naszego hook’a, wywołujemy <strong>ZwDeleteFile</strong> na <strong>\??\X:\ice_psuje.exe.</strong></p>
<pre class="brush: cpp">
//global
wchar_t *g_tmpFileName = L&quot;\\ice_psuje.exe&quot;;

//--------
//(...)
NTSTATUS NTAPI
HookedNtfsFsdCreate(PDEVICE_OBJECT DeviceObject,
	   PIRP Irp)
{
	unsigned long proper_file = 0; //whether we get Irp with interesting for us file_object ?
	UNICODE_STRING bfile; //backup file
	UNICODE_STRING uMalwareFile;
	NTSTATUS rez;
	PFILE_OBJECT pFileObject;

	RtlInitUnicodeString(&amp;uMalwareFile,g_fileToDelete);
	pFileObject = Irp-&gt;Tail.Overlay.CurrentStackLocation-&gt;FileObject;
	if(!pFileObject)
		goto _end;

	if((pFileObject-&gt;FileName.Length / 2) != wcslen(g_tmpFileName))
		goto _end;

	if(!_wcsnicmp(g_tmpFileName,
				  (wchar_t*)pFileObject-&gt;FileName.Buffer,
				  (pFileObject-&gt;FileName.Length / 2)))
	{

		    bfile = pFileObject-&gt;FileName;//backup current string
			pFileObject-&gt;FileName = uMalwareFile; //hook string value
			proper_file = 1;
	}

_end:

	rez = Call_NtfsFsdCreate(DeviceObject,Irp);
	if(pFileObject)
	{
		if(proper_file)
		{
			pFileObject-&gt;FileName = bfile;
		}
	}
	return rez;
}
</pre>
<p>Wydaje mi się, że po wcześniejszych opisach sprawa jest jasna. Jeżeli do <strong>NtfsFsdCreate</strong> trafia FILE_OBJECT, którego FileName to <strong>„\ice_psuje.exe”</strong> następuje podmiana tej ścieżki na ścieżkę podana jako parametr <strong>hook_NtfsFsdCreat</strong>e i zachowaną w:</p>
<pre class="brush: php">
	//initialize file to delete variable
	g_fileToDelete = filePath;
	g_fileToDelete += 6; //take from \??\C:\zlo only \zlo
</pre>
<p>Uff w końcu dobrnęliśmy do końca tego skromnego postu <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Ma nadzieje, że ktoś dotarł do tego miejsca, znalazł coś ciekawego dla siebie i zostawi jakiś feedback <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Enjoy</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2010/07/21/toche-o-usuwaniu-plikow/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Opera – Null Pointer Dereference</title>
		<link>http://www.icewall.pl/2010/05/14/opera-%e2%80%93-null-pointer-dereference/</link>
		<comments>http://www.icewall.pl/2010/05/14/opera-%e2%80%93-null-pointer-dereference/#comments</comments>
		<pubDate>Fri, 14 May 2010 21:35:36 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[fuzzing]]></category>
		<category><![CDATA[null pointer dereference]]></category>
		<category><![CDATA[opera]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=305</guid>
		<description><![CDATA[Ahh… sporo czasu upłynęło od ostatniego wpisu, lecz bez wdawania się w szczegóły chciałem uspokoić, że prac nad tworzeniem tego blogu nie porzuciłem i w miarę możliwości będą się tu pojawiały nowe wpisy  .
A teraz do rzeczy…Tak jak w tytule post będzie traktował o bug’u typu Null Pointer Dereference znajdującym się dokładnie w opera.dll [...]]]></description>
			<content:encoded><![CDATA[<p>Ahh… sporo czasu upłynęło od ostatniego wpisu, lecz bez wdawania się w szczegóły chciałem uspokoić, że prac nad tworzeniem tego blogu nie porzuciłem i w miarę możliwości będą się tu pojawiały nowe wpisy <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
A teraz do rzeczy…Tak jak w tytule post będzie traktował o bug’u typu Null Pointer Dereference znajdującym się dokładnie w opera.dll do wersji Opera 10.53 włącznie, jedynie od wersji 10.10 blad nie bedzie wystepowal w sposob &#8220;automatyczny&#8221;, a będzie wymagal od nas jeszcze wiekszej ingerencji niz w wersjach poprzednich. Jednak tak jak wspomniałem kod odpowiedzialny za ten bug nie zostal poprawiony do dzisiaj ;/.<br />
Wspominam o tej „niedociągłości” bardziej w ramach ciekawosteki niż prezentacji konkretnego bug’u do wyexploitowania, chociazby z tego powodu ze wywolanie go wymaga NIE MALEJ ingerencji  od user’a.</p>
<p><font color="blue">[+]Dlaczego warto o nim wspomnieć?</font><br />
1.	Dla zdobycia odpowiedzie na pytania, które tygrysy lubią najbardziej : czyli po co, na co ,dlaczego ,dlaczego tak a nie inaczej <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
2.	Dla zaprezentowania wektora ataku np. na przekladarke.</p>
<p><font color="blue">[+]Jak wywołać bug?</font><br />
Wystarczy stworzyc pusty plik i nadac mu rozszerzenie .eml (trudno okreslic dla jakich jeszcze rozszerzenie opera tak zareaguje, ze wzgledu na pokazny kod do rewersowania, w celu ustalenia tych danych oraz mala uzytecznosc tego bug’a jak dla mnie <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ),wrzucic ten plik do katalogu np. apacha’a ( to istotne zeby odwolywac sie do pliku zdalnie) odwolac sie do niego i nastepnie wywolac opcje ‘Zapisz jako’.<br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/05/opera_crash.JPG" alt="opera_crash" title="opera_crash" width="554" height="376" class="alignnone size-full wp-image-307" /></p>
<p><font color="blue">[+]Gdzie znajduje sie bug?</font><br />
Rzućmy okiem na wartosci rejestrow,elementow na stos podczas wystapienia tego bledu.<br />
<strong>Opera 10.10b PL</strong><br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/05/ok_10.10_first_instruction-1024x584.jpg" alt="ok_10.10_first_instruction" title="ok_10.10_first_instruction" width="1024" height="584" class="alignnone size-large wp-image-309" /><br />
Pointer na unikodowy string leżący na stosie może sugerować nam, że błąd może być związany z wypelnianiem kontrolki trzymajacej opisy typow plikow do jakich opera moze zapisac bierzacy kontent. Zdziwiłem się delikatnie, kiedy na tej samej wersji przegladarki, jedynie z zaladowanym angielskim tlumaczeniem wywolanie bug’a nie udalo sie powtorzyc. Co tu moze byc problemem?!&#8230;.</p>
<p><font color="blue">[+]Wektor ataku</font><br />
Wektorem ataku okazują sie tutaj pliki z tlumaczeniami,<br />
<strong>($INSTALDIR\locale\[jezyk]\[jezyk])</strong><br />
 ktorych nie do końca poprawne zdefiniowanie może spowodować DoS’a ze względu na nie sprawdzanie w kodzie poprawności zawartych tam danych. Taka sytuacja bez naszej ingerencji ma miejsce do Opery 10.10b ze wzgledu na nie poprawnie zdefiniowany plik z tlumaczeniem dla jezyka polskiego.<br />
Odnajdzmy wczesniej prezentowany interesujacy string na screen’e w pliku z tlumaczeniem PL oraz sprobujmy znaleść rożnice w formacie dla pliku z tlumaczeniem ANG.<br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/05/compare_pl_eng-1024x135.jpg" alt="compare_pl_eng" title="compare_pl_eng" width="1024" height="135" class="alignnone size-large wp-image-318" /><br />
Baah!!!Jak widać string zawierający tekst, który jest umieszczany pozniej w kontrolce, zawierajacej liste typow plikow  mozliwych do zapisu przez opera oraz rozszerzenie pod jakim plik zostanie zapisany w wersji PL nie zawiera znaku ‘|’ co jak okazuje sie jest zrodlem problemu.</p>
<p><font color="blue">[+]Malo bezpiecznie zdefiniowana funkcja</font><br />
Powróćmy teraz do Olka i przyjrzymy sie miejscu gdzie nastepuje dereferencja pointer’a zerowego:<br />
Analiza kodu dla poprawnie zdefiniowanego parametru:<br />
<strong>-1371929526=&#8221;Archiwum strony WWW (jeden plik)|*.mht|&#8221;</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">registers<span style="color: #008080;">:</span>
EAX <span style="color: #000080;">=</span> <span style="color: #208080;">0x1732F8C</span>
ECX <span style="color: #000080;">=</span> <span style="color: #208080;">0x1732FA0</span>
&nbsp;
entire code<span style="color: #008080;">:</span>
67ADDA16    8B4424 <span style="color: #208080;">04</span>       MOV EAX,DWORD PTR SS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ESP<span style="color: #000040;">+</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span> <span style="color: #666666;">//eax == save_as_struct</span>
67ADDA1A    8D48 <span style="color: #0000dd;">14</span>         LEA ECX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>EAX<span style="color: #000040;">+</span><span style="color: #0000dd;">14</span><span style="color: #008000;">&#93;</span>
67ADDA1D    8B40 2C         MOV EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>EAX<span style="color: #000040;">+</span>2C<span style="color: #008000;">&#93;</span>
67ADDA20    <span style="color: #0000dd;">57</span>              PUSH EDI
67ADDA21    E8 F842D8FF     CALL Opera_1.67861D1E
67ADDA26    8BC8            MOV ECX,EAX
67ADDA28    83C1 <span style="color:#800080;">08</span>         ADD ECX,<span style="color: #0000dd;">8</span>
67ADDA2B    33C0            XOR EAX,EAX
67ADDA2D    E8 EC42D8FF     CALL Opera_1.67861D1E
<span style="color: #000080;">&gt;&gt;&gt;</span> 67ADDA32    8B00            MOV EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>EAX<span style="color: #008000;">&#93;</span> <span style="color: #666666;">//eax = pointer on string contains file extension (e.g *.mht) or NULL</span>
67ADDA34    8B7C24 0C       MOV EDI,DWORD PTR SS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ESP<span style="color: #000040;">+</span>C<span style="color: #008000;">&#93;</span> <span style="color: #666666;">//esp+c == buffer_for_copyOf_file_extension</span>
67ADDA38    6A FF           PUSH <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>
67ADDA3A    <span style="color: #0000dd;">50</span>              PUSH EAX
67ADDA3B    E8 60B3CBFF     CALL Opera_1.67798DA0
67ADDA40    <span style="color:#800080;">5F</span>              POP EDI
67ADDA41    C3              RETN
&nbsp;
<span style="color: #0000ff;">struct</span> save_as_struct
<span style="color: #008000;">&#123;</span>
<span style="color: #208080;">0x1732F8C</span>  <span style="color: #ff0000; font-style: italic;">/* +0 */</span>  <span style="color: #208080;">0x00000000</span>
<span style="color: #208080;">0x1732F90</span>  <span style="color: #ff0000; font-style: italic;">/* +4 */</span>  <span style="color: #208080;">0x00000000</span>
<span style="color: #208080;">0x1732F94</span>  <span style="color: #ff0000; font-style: italic;">/* +8 */</span>  <span style="color: #208080;">0x00000000</span>
<span style="color: #208080;">0x1732F98</span>  <span style="color: #ff0000; font-style: italic;">/* +C */</span>  <span style="color: #208080;">0x60D76F01</span>
<span style="color: #208080;">0x1732F9C</span>  <span style="color: #ff0000; font-style: italic;">/* +10 */</span> <span style="color: #208080;">0x38000000</span>
<span style="color: #208080;">0x1732FA0</span>  <span style="color: #ff0000; font-style: italic;">/* +14 */</span> <span style="color: #208080;">0x4805E967</span>     <span style="color: #666666;">//ecx pointer</span>
<span style="color: #208080;">0x1732FA4</span>  <span style="color: #ff0000; font-style: italic;">/* +18 */</span> <span style="color: #208080;">0x0A000000</span>
<span style="color: #208080;">0x1732FA8</span>  <span style="color: #ff0000; font-style: italic;">/* +1C */</span> <span style="color: #208080;">0xC0E59301</span>     <span style="color: #666666;">//ecx + 0x8  //pointer on array-&gt;pointer-&gt;string('Archiwum strony WWW (jeden plik)')</span>
<span style="color: #208080;">0x1732FAC</span> <span style="color: #ff0000; font-style: italic;">/* +20 */</span> <span style="color: #208080;">0x01000000</span>     <span style="color: #666666;">//ecx + 0xc // count of elements</span>
<span style="color: #208080;">0x1732FB0</span> <span style="color: #ff0000; font-style: italic;">/* +24 */</span> <span style="color: #208080;">0x0A000000</span> 
<span style="color: #208080;">0x1732FB4</span> <span style="color: #ff0000; font-style: italic;">/* +28 */</span> <span style="color: #208080;">0x00000000</span> 
<span style="color: #208080;">0x1732FB8</span> <span style="color: #ff0000; font-style: italic;">/* +2C */</span> <span style="color: #208080;">0x00000000</span> 
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
first call of 67861D1E<span style="color: #008080;">:</span>
ECX <span style="color: #000080;">=</span> <span style="color: #208080;">0x1732FA0</span> <span style="color: #ff0000; font-style: italic;">/* +0x14 */</span>
EAX <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>
67861D1E    3B41 0C         CMP EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ECX<span style="color: #000040;">+</span>C<span style="color: #008000;">&#93;</span> <span style="color: #ff0000; font-style: italic;">/* eax = 0; ecx + C == count of elements*/</span>
67861D21    <span style="color: #0000dd;">73</span> <span style="color: #208080;">07</span>           JNB SHORT Opera_1.67861D2A   
67861D23    8B49 <span style="color:#800080;">08</span>         MOV ECX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ECX<span style="color: #000040;">+</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span> <span style="color: #ff0000; font-style: italic;">/* ecx = [ecx + 8]; [ecx+8]==pointer on array-&gt;pointer-&gt;string */</span>
67861D26    8B0481          MOV EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ECX<span style="color: #000040;">+</span>EAX<span style="color: #000040;">*</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span> <span style="color: #ff0000; font-style: italic;">/* eax = pointer-&gt;string */</span>
67861D29    C3              RETN
67861D2A    33C0            XOR EAX,EAX
67861D2C    C3              RETN
&nbsp;
second call of 67861D1E<span style="color: #008080;">:</span>
ECX <span style="color: #000080;">=</span> <span style="color: #208080;">0x0166C270</span>
EAX <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>
stack view<span style="color: #008080;">:</span>
<span style="color: #208080;">0x0166C270</span> <span style="color: #ff0000; font-style: italic;">/* +0 */</span> <span style="color: #208080;">0xB832DC67</span> 
<span style="color: #208080;">0x0166C274</span> <span style="color: #ff0000; font-style: italic;">/* +4 */</span> <span style="color: #208080;">0x0A000000</span> 
<span style="color: #208080;">0x0166C278</span> <span style="color: #ff0000; font-style: italic;">/* +8 */</span> <span style="color: #208080;">0xC0DF9301</span>  <span style="color: #666666;">//pointer on array-&gt;pointer-&gt;string('*.mht')  </span>
<span style="color: #208080;">0x0166C27C</span> <span style="color: #ff0000; font-style: italic;">/* +C */</span> <span style="color: #208080;">0x01000000</span>  <span style="color: #666666;">// count of elements</span></pre></div></div>

<p>Dereferencja null pointer’a dla blednie zdefiniowanego parametru:<br />
<strong>-1371929526=&#8221;Archiwum strony WWW (jeden plik)|*.mht&#8221;</strong><br />
<img src="http://www.icewall.pl/wp-content/uploads/2010/05/null_pointer_dereference.JPG" alt="null_pointer_dereference" title="null_pointer_dereference" width="726" height="600" class="alignnone size-full wp-image-340" /><br />
Tak jak pisalem wczesniej nie analizowałem dogłebnie calego procesu parsowania pliku z tlumaczeniem &#8230;<br />
Bez doglebnej analizy wczesniej wykonanego kodu przed kodem prezentowanym powyzej, mozemy stwierdzic ze <strong>brak znaku ‘|’ na koncu ‘parametru’ -1371929526 </strong>powoduje bledny split lancucha znakow i tym samym nie wypelnienie pola struktury gdzie powinien sie znalesc pointer na rozszerzenie pliku pod jakim miala by byc zapisana zawartosc strony.<br />
Całe zło zaczyna sie dziać przy drugi wywołaniu funkcji <strong>67861D1E</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">second call of 67861D1E<span style="color: #008080;">:</span> <span style="color: #666666;">// for bad parameter</span>
ECX <span style="color: #000080;">=</span> <span style="color: #208080;">0x0166C270</span>
EAX <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>
Stack view<span style="color: #008080;">:</span>
<span style="color: #208080;">0x0166C270</span> <span style="color: #ff0000; font-style: italic;">/* +0 */</span><span style="color: #208080;">0xB832DC67</span>
<span style="color: #208080;">0x0166C274</span>  <span style="color: #ff0000; font-style: italic;">/* +4 */</span><span style="color: #208080;">0x00000000</span>
<span style="color: #208080;">0x0166C278</span>  <span style="color: #ff0000; font-style: italic;">/* +8 */</span><span style="color: #208080;">0x00000000</span>  
<span style="color: #208080;">0x0166C27C</span> <span style="color: #ff0000; font-style: italic;">/* +C */</span><span style="color: #208080;">0x00000000</span>  
67861D1E    3B41 0C         CMP EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>ECX<span style="color: #000040;">+</span>C<span style="color: #008000;">&#93;</span> <span style="color: #ff0000; font-style: italic;">/* eax = 0; ecx + C == count of elements*/</span>
67861D21    <span style="color: #0000dd;">73</span> <span style="color: #208080;">07</span>           JNB SHORT Opera_1.67861D2A</pre></div></div>

<p>Warunek skoku zostaje spelniony i mamy skok do instrukcji:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">67861D2A    33C0            XOR EAX,EAX
67861D2C    C3               RETN</pre></div></div>

<p>zerujacej nam eax i wychodzacej z funkcji. Nastepnie bez sprawdzania czy wartosc w eax jest poprawnym wskaznikiem mamy dereferencje:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #000080;">&gt;&gt;&gt;</span> 67ADDA32    8B00            MOV EAX,DWORD PTR DS<span style="color: #008080;">:</span><span style="color: #008000;">&#91;</span>EAX<span style="color: #008000;">&#93;</span> <span style="color: #666666;">//eax = pointer on string contains file extension (e.g *.mht) or NULL</span></pre></div></div>

<p><font color="blue">[+]Konkluzja</font><br />
Tak jak pisałem na początku wspominam o tym bug’u raczej z formie ciekawostki niz jakiegos żalu do twórców opery ze wzgledu na sposob jaki „pozbyli” sie problemu(od wersji 10.10 plik z tlumaczeniem we wspomnianej linijce zawiera na koncu &#8216;|&#8217; <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). Co niektorzy mogą się przyczepic ze mozna przeciez wykonac tutaj sprawdzanie formatu i ewentualnie wyswietlic komunikat ze plik z tlumaczeniem zostal zmodyfikowany lub jest uszkodzony i nalezy go zastapic poprawna wersja,itd&#8230;.Takie rozwazania i ocene podejscia dev’ow z opery pozostawia wam Drodzy Czytelnicy <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/2010/05/14/opera-%e2%80%93-null-pointer-dereference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>SecDay 2009 – Video</title>
		<link>http://www.icewall.pl/2009/10/14/secday-2009-%e2%80%93-video/</link>
		<comments>http://www.icewall.pl/2009/10/14/secday-2009-%e2%80%93-video/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 21:07:56 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Konferencje]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[bugbear]]></category>
		<category><![CDATA[bugs in malware]]></category>
		<category><![CDATA[błedy w malwarze]]></category>
		<category><![CDATA[delephant]]></category>
		<category><![CDATA[GetCodec]]></category>
		<category><![CDATA[icewall]]></category>
		<category><![CDATA[secday]]></category>
		<category><![CDATA[secday 2009]]></category>
		<category><![CDATA[zbot]]></category>
		<category><![CDATA[zeus panel]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/?p=276</guid>
		<description><![CDATA[Po paru tygodniach oczekiwań i kilku złożonych obietnicach, w końcu mogę przedstawić wam nagranie video z mojej prelekcji, która miała miejsce na konferencji SecDay 2009.
Wszelkiego rodzaju feedback związany ze sposobem prowadzenia prezentacji jest mile widziany;).
Miłego oglądania i ………… czekam na wasze komentarze;).

Bugs in Malware
]]></description>
			<content:encoded><![CDATA[<p>Po paru tygodniach oczekiwań i kilku złożonych obietnicach, w końcu mogę przedstawić wam nagranie video z mojej prelekcji, która miała miejsce na konferencji <a href="http://www.icewall.pl/2009/09/24/secday-2009/">SecDay 2009.</a><br />
Wszelkiego rodzaju feedback związany ze sposobem prowadzenia prezentacji jest mile widziany;).<br />
Miłego oglądania i ………… czekam na wasze komentarze;).</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7055140&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=7055140&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/7055140">Bugs in Malware</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/10/14/secday-2009-%e2%80%93-video/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nowa odsłona</title>
		<link>http://www.icewall.pl/2009/10/01/nowa-odslona/</link>
		<comments>http://www.icewall.pl/2009/10/01/nowa-odslona/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 17:46:28 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[icewall]]></category>

		<guid isPermaLink="false">http://www.icewall.pl/2009/10/01/nowa-odslona/</guid>
		<description><![CDATA[Witam wszystkich w nowej odsłonie mojego bloga!
Z jakich powodów przeniosłem blog na nowy server? Powodów jest kilka, a główny jest to, że posiadanie pełnego dostępu do plików na serwerze daje mi większe możliwości:
- darmowa instalacja dodatkowych pluginów do wordpress&#8217;u
napewno tutaj  odczuwalnym dyskomfortem był brak pluginu do wyświetlania fragmentów kodu.

#include &#60;iostream&#62;
int main()
{
  std::cout&#60;&#60;&#34;Hello world!&#34;;
  [...]]]></description>
			<content:encoded><![CDATA[<p>Witam wszystkich w nowej odsłonie mojego bloga!</p>
<p>Z jakich powodów przeniosłem blog na nowy server? Powodów jest kilka, a główny jest to, że posiadanie pełnego dostępu do plików na serwerze daje mi większe możliwości:<br />
- darmowa instalacja dodatkowych pluginów do wordpress&#8217;u<br />
napewno tutaj  odczuwalnym dyskomfortem był brak pluginu do wyświetlania fragmentów kodu.</p>
<pre class="brush: cpp">
#include &lt;iostream&gt;
int main()
{
  std::cout&lt;&lt;&quot;Hello world!&quot;;
  return 0;
}
</pre>
<p><em>Nie mogłem się powstrzymać:P</em></p>
<p>Jeżeli chodzi o jakieś gruntowne zmiany to takowych raczej nie przewiduje,  jedyną kwestią która być może niektórym osobą (a pewnej grupie ludzie zdecydowanie) przypadnie do gustu jest publikowanie postów, które uznam za ciekawe lub tych które będą cieszyły się dużą popularnością , w dwóch wersjach językowych: <strong>Polskiej jak i Angielskiej.</strong><br />
Chyba tyle jężeli chodzi o zmiany i &#8220;innowacje&#8221; <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
     <strong>BTW</strong>:Rozpoczyna się delikatnie burzliwy okres: &#8220;Rozpoczęcie roku akademickiego&#8221; , także będe musiał poświęcić trochę czasu na dogranie pracy z uczelnią i paroma dodatkowymi zajęciami, ale oczywiście jestem przekonany o tym, że znajdzie się również czas na wrzucenie nowego posta <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
W najbliższym czasie myślę, że można się spodziewać nagrań <strong>video z SecDay2009</strong> jaki i kolejnego postu z cyklu<br />
<strong>&#8220;Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych&#8221;.</strong><br />
Stay tuned <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/10/01/nowa-odslona/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SecDay 2009</title>
		<link>http://www.icewall.pl/2009/09/24/secday-2009/</link>
		<comments>http://www.icewall.pl/2009/09/24/secday-2009/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 14:23:18 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[Konferencje]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[bugbear]]></category>
		<category><![CDATA[bugs in malware]]></category>
		<category><![CDATA[błędy w złośliwym oprogramowaniu]]></category>
		<category><![CDATA[GetCodec]]></category>
		<category><![CDATA[lfi zeus]]></category>
		<category><![CDATA[rfi zeus]]></category>
		<category><![CDATA[secday]]></category>
		<category><![CDATA[secday 2009]]></category>

		<guid isPermaLink="false">http://icewall.wordpress.com/?p=262</guid>
		<description><![CDATA[Wczoraj, to jest 22.09.2009r zakończyła się dwu dniowa konferencja SecDay 2009 organizowana przez Lukasz Błażys’a, która odbyła się we Wrocławiu, a jak nie trudno się domyślić była ona związana z ogólno pojętym bezpieczeństwem w IT. Z wielką przyjemnością muszę przyznać, że pierwszy raz  ….UWAGA…….UWAGA  miałem okazję:
brać czynny udział == być prelegentem!
na tego typu [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj, to jest <strong>22.09.2009r</strong> zakończyła się dwu dniowa konferencja <a href="http://secday.pl/">SecDay 2009</a> organizowana przez <a href="http://sekme.pl/">Lukasz Błażys’a</a>, która odbyła się we Wrocławiu, a jak nie trudno się domyślić była ona związana z ogólno pojętym bezpieczeństwem w IT. Z wielką przyjemnością muszę przyznać, że pierwszy raz  <strong>….UWAGA…….UWAGA</strong>  miałem okazję:<br />
<font color="green">brać czynny udział == być prelegentem!</font><br />
na tego typu event’e.<br />
<a href="http://icewall.files.wordpress.com/2009/09/lgim0042.jpg"><img src="http://icewall.files.wordpress.com/2009/09/lgim0042.jpg" alt="LGIM0042" title="LGIM0042" width="497" height="372" class="aligncenter size-full wp-image-265" /></a></p>
<p>Emocje były wielkie …… ale jak dokładnie było możecie przeczytać poniżej:<br />
Na wstępie powiem, że nie będę w żaden sposób komentował prezentacji <strong>Team’u HSPL</strong> w składzie (chronologicznie względem kolejności wystąpień):<br />
<font color="blue"><br />
Mateusz &#8220;j00ru&#8221; Jurczyk<br />
Adam &#8220;pi3&#8243; Zabrocki<br />
Gynvael Coldwind<br />
</font><br />
Żeby nikt nie zarzucał mi, że cukruje kolegą z pracy to tylko powiem, że każda prezentacja była petardą i warto na nie rzucić okiem <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ..Heheh.<br />
More details below…</p>
<p><font color="green">/* SecDay 2009 dzień pierwszy */</font><br />
Jako, że obecnie mieszkam we Wrocławiu to kwestie dotarcia na konferencje pominę ponieważ nie było w niej nic nadzwyczajnego(15min taxi)….taaa to nie to samo co 5h spędzonych w pociągu w drodze na confidence <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p>Konferencje  rozpoczął :<br />
<font color="orange">Dariusz Puchalak</font><br />
prezentując temat:<br />
<font color="red">„Bezpieczeństwo czy wydajność pracy?”</font><br />
Niestety muszę się przyznać, że delikatnie się spóźniłem na ten wykład(sorry Darek <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).<br />
Już parę razy miałem okazje słuchać prezentacji Darka i także tym razem była ona prowadzona na wysokim poziomie. Ze względu na porę dnia długo nie zastanawiałem się<br />
nad propozycją jaką Dariusz umieścił w swoim temacie i wybrałem …..NIEBEZPIECZEŃSTWO.:D.</p>
<p><font color="orange">Przemysław Świercz</font><br />
<font color="red">Bezpieczeństwo Bluetooth</font><br />
Na wstępie trzeba wspomnieć, że był to debiut Przemka co moim zdaniem po wysłuchaniu jego prelekcji jest jak najbardziej na plus. Temat myślę, że jak najbardziej na czasie, bo przecież bluetooth można spotkać teraz praktycznie w każdym telefonie komórkowym, większości nowych TV,itd. Prezentacja była mocno techniczna (a takie właśnie uwielbiam)  + zabawne anegdoty prowadzącego działające silnie na wyobraźnie <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Jeżeli ktoś jest zainteresowany bezpieczeństwo Bluetooth to myślę, że warto prześledzić tą prezentacje.</p>
<p><font color="green">/* Przerwa na kafkę i po niej …*/</font></p>
<p><font color="orange">Mateusz Jurczyk</font><br />
<font color="red">Bootkit vs Windows</font><br />
Jako, że j00ru prowadzi własny blog to zachęcam do przeczytania jego relacji z konferencji jak i pobrania materiałów -&gt; <a href="http://j00ru.vexillium.org/?lang=pl">j00ru’s blog</a></p>
<p><font color="green">/* Przerwa obiadowa */</font><br />
Mówiąc krótko i kolokwialnie „obiad był bez szału”, także nie mogę tutaj przyznać ani plusa ani minusa, ale na pewno wypadł o wiele lepiej niż tegoroczny podawany na confidence’e.<br />
Małego minusa dam za to, że dwa dni była ta sama potrawa:P,,,,gdzie kucharz „zostawił” fantazję!?</p>
<p>wracamy do prelekcji:</p>
<p><font color="orange">Krzysztof Maćkowiak</font><br />
<font color="red">„Zarządzanie ryzykiem podstawą profesjonalnego podejścia do bezpieczeństwa informacji i ciągłości działania.”</font><br />
Prezentacja jak najbardziej wykonana jak i poprowadzona w sposób profesjonalny, chociaż nie interesująca mnie zbytnio ze względu na obszar działań jakie poruszała. Dlatego też 3/4 jej czasu przegadałem z <a href="http://pentester.jogger.pl/">carstein</a>’em o niuansach związanych z pentestingiem <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p><font color="orange">Grzegorz Błoński</font><br />
<font color="red">Problem ulotu elektromagnetycznego.</font><br />
Bardzo interesująca prezentacja, mocno techniczna podczas, której mogliśmy zobaczyć parę narzędzi do monitorowania ulotu elektromagnetycznego stworzonych przez autora przy wykorzystaniu popularnych kart telewizyjnych <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Jeżeli byłeś/jesteś fanem serialu MacGyver masz zbędną kartę TV to nie czekaj tylko przeanalizuj powyższą prezentacje i rozpocznij własne badania!</p>
<p><font color="orange">Michał Melewski</font><br />
<a href="http://pentester.jogger.pl/2009/09/23/secday-2009-prezentacja/">Metodyka testów penetracjnych</a>.<br />
Moim zdaniem elegancko wykonana prezentacja, przejrzysta, przedstawiona na luzie, dająca do myślenia jeżeli chodzi o podejście do pentestów. Dzięki za źródło do refleksji <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><font color="orange">Leszek Miś</font><br />
<font color="red">Rootkity w systemie Linux.</font><br />
Niestety prelegent nie dotarł na konferencje, a szkoda bo z chęcią posłuchałbym jak wygląda kwestia związana z rootkit’ami na linuxach.</p>
<p><font color="orange">Janusz Żmudziński</font><br />
<font color="red">Monitorowanie bezpieczeństwa jako istotny element skutecznego zarządzania bezpieczeństwem informacji</font><br />
?</p>
<p><font color="green">/* SecDay 2009 dzień drugi */</font><br />
Jako, że miałem przyjemność rozpocząć dzień drugi to przejdę od razu do drugiej prezentacji, a o własnej wspomnę na końcu relacji.</p>
<p><font color="orange">Konrad Zuwała</font><br />
<font color="red">Solaris jako bezpieczna platforma serwerowa.</font><br />
Od strony technicznej prezentacja jak najbardziej poprowadzona bardzo dobrze. Przeznaczona raczej dla administratorów i w tym kręgu znalazła ona grono słuchaczy jak i wywołała burzliwą dyskusję.</p>
<p><font color="orange">Błażej Miga</font><br />
<font color="red">Zagrożenia w Internecie – DNS</font><br />
Muszę powiedzieć, że na opublikowanie tej prezentacji czekam ponieważ pojawiło się w niej parę smaczków, które z chęcią bym przetestował. Hehe no i pojawił się w niej kod python’owy z wykorzystaniem modułu scapy.. jak widać prelegent wie co dobre;).</p>
<p><font color="green">/* Dinner */</font></p>
<p><font color="orange">Jakub Bryl</font><br />
<font color="red">Testowanie planów ciągłości działania</font><br />
?</p>
<p><font color="orange">Adam Zabrocki</font><br />
<font color="red">Unusual bugs</font><br />
Adam obiecał wystartować z nową stroną/blogiem, a wtedy na pewno będziecie mieli okazje przejrzeć jego materiały <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><font color="orange">Gynvael Coldwind</font><br />
<font color="red">PHP Internals (not another RFI/SQLI)</font><br />
Relacja Gyn’a + jego materiały. -&gt; <a href="http://gynvael.coldwind.pl/?id=231">LINK</a></p>
<p><font color="orange">Robert Dąbrowski</font><br />
<font color="red">Monitoring bezpiecznej sieci &#8211; praktyczne wykorzystanie logów.</font><br />
Przepraszam, ale prezentacje komercyjnych produktów mnie nie interesują. Tu chodzi o research w dobrym klimacie tzw „piwnicznym klimacie”:D!</p>
<p>I tak kończy się lista prelegentów wraz ich tematami, których miałem przyjemność w większości wysłuchać.</p>
<p>Jeżeli chodzi o mój temat to brzmi on następująco:<br />
<font color="orange">Bugs in malware</font><br />
Moim główny zamiarem było uświadomienie słuchaczy o tym, że w wieluuuuu przypadkach tworzony malware NIE jest doskonały, bardzo często tworzą go ludzie, którzy nie mają nawet średnich umiejętności programistycznych, a  gruntowne testowanie swojego tworu jest dla nich abstrakcją. Często zdarza mi się spoglądając w kod malware’u pomyśleć o wyrażeniu : <strong>tragizm połączony z idiotyzmem</strong>.  Czy taki obraz złośliwego oprogramowania przedstawiany jest w prasie i mediach? NIE. Oczywiście głównymi hasłami jakie pojawiają się są następujące:<br />
<strong>„nowy błyskawicznie rozprzestrzeniający się worm”<br />
„bardzo trudny do usunięcia trojan”<br />
„trudno wykrywalny wirus”<br />
„maszynka do wykradania poufnych danych”<br />
itp.</strong></p>
<p>Taki obraz, będący totalną generalizacją na temat malware’u, który rzekomo jest absolutnie genialny, trudny do usunięcia, napisany przez pr0 cod3r0w miałem na zamiarze usunąć z mapy rzeczywistości słuchaczy, a przynajmniej wzbogacić ją o informacje, które pokazują „troszeczke” inny obraz tych „złośliwych” aplikacji <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Czy mi się udało ?;]. Mam taką nadzieję;).</p>
<p>Jeżeli chodzi o moje materiały to możecie je pobrać stąd:</p>
<p>Pełna paczka(prezentacja + filmiki) => <a href="http://www.icewall.pl/download/Icewall_SecDay_2009.zip">Icewall_SecDay_2009.zip</a></p>
<p><font color="yellow">W kwestii wyjaśnienia: Jeden z filmików zbudził delikatne kontrowersje dlatego też został odpowiednio ocenzurowany.</font></p>
<p>Hiperlinki w <strong>ODP</strong> jak i w <strong>PDF’e </strong>są ustawione w sposób relatywny, także można na nie klikać dowoli jeżeli zachowacie następująco strukturę katalogów:</p>
<p><strong>Delephant<br />
GetCodec<br />
Zeus<br />
prezentacja.odp<br />
prezentacja.pdf</strong></p>
<p><font color="red"><br />
PS: Możliwe, że nawet do końca tygodnia pojawi się photo jaki i video relacja z konferencji dla której myśle stworze osobny post. Na video relacji będziecie mogli obejrzeć wszystkie prelekcje ludzi zarówno z HSPL jak i Vexillium. Także bądźcie czujni;),będzie co oglądać.</font></p>
<p>Pozdrawiam i zapraszam na kolejną edycje SecDay już we wrzesniu, bo warto;).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/09/24/secday-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych – PART II</title>
		<link>http://www.icewall.pl/2009/08/29/algorytmy-deszyfrowania-wykorzystywane-przez-tworcow-trojanow-bankowych-%e2%80%93-part-ii/</link>
		<comments>http://www.icewall.pl/2009/08/29/algorytmy-deszyfrowania-wykorzystywane-przez-tworcow-trojanow-bankowych-%e2%80%93-part-ii/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 13:17:02 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[decryption]]></category>
		<category><![CDATA[deszyfrowanie]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[szyfrowanie]]></category>
		<category><![CDATA[trojan]]></category>
		<category><![CDATA[trojan bankowy]]></category>
		<category><![CDATA[trojan delphi]]></category>

		<guid isPermaLink="false">http://icewall.wordpress.com/?p=250</guid>
		<description><![CDATA[Tak jak wspominałem w poprzednim poście niniejszy będzie o sposobach (de)szyfrowania stosowanych w pewnej rodzinie trojanów bankowych pisanych w delphi.
Oczywiście tradycyjnie zaczniemy od przedstawienia naszego bohatera:
[=]Dane[=]

Antivirus	Version	Last Update	Result
a-squared	4.5.0.24	2009.08.28	Trojan-Spy.Win32.Bancos!IK
AhnLab-V3	5.0.0.2	2009.08.28	-
AntiVir	7.9.1.7	2009.08.28	TR/Spy.Banker.DS.5102592
Antiy-AVL	2.0.3.7	2009.08.24	-
Authentium	5.1.2.4	2009.08.28	-
Avast	4.8.1335.0	2009.08.28	Win32:Spyware-gen
AVG	8.5.0.406	2009.08.28	PSW.Banker5.IQR
BitDefender	7.2	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
CAT-QuickHeal	10.00	2009.08.28	-
ClamAV	0.94.1	2009.08.28	Trojan.Agent-119128
Comodo	2125	2009.08.28	-
DrWeb	5.0.0.12182	2009.08.28	Trojan.PWS.Banker.based
eSafe	7.0.17.0	2009.08.27	-
eTrust-Vet	31.6.6706	2009.08.28	-
F-Prot	4.5.1.85	2009.08.27	-
F-Secure	8.0.14470.0	2009.08.28	-
Fortinet	3.120.0.0	2009.08.28	W32/Banker.B!tr.pws
GData	19	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
Ikarus	T3.1.1.68.0	2009.08.28	Trojan-Spy.Win32.Bancos
Jiangmin	11.0.800	2009.08.28	-
K7AntiVirus	7.10.830	2009.08.28	-
Kaspersky	7.0.0.125	2009.08.28	-
McAfee	5723	2009.08.28	PWS-Banker.gen.b
McAfee+Artemis	5723	2009.08.28	Artemis!504F1C591479
McAfee-GW-Edition	6.8.5	2009.08.28	Trojan.Spy.Banker.DS.5102592
Microsoft	1.5005	2009.08.28	TrojanSpy:Win32/Bancos.gen!C
NOD32	4378	2009.08.28	probably a variant of Win32/Spy.Banker.QEO
Norman		2009.08.28	W32/Banker.EKFF
nProtect	2009.1.8.0	2009.08.28	-
Panda	10.0.2.2	2009.08.28	Trj/CI.A
PCTools	4.4.2.0	2009.08.28	-
Prevx	3.0	2009.08.28	-
Rising	21.44.40.00	2009.08.28	Trojan.PSW.Win32.Banker.dnl
Sophos	4.45.0	2009.08.28	Mal/Generic-A
Sunbelt	3.2.1858.2	2009.08.28	-
Symantec	1.4.4.12	2009.08.28	Infostealer.Bancos
TheHacker	6.3.4.3.389	2009.08.27	-
TrendMicro	8.950.0.1094	2009.08.28	-
VBA32	3.12.10.10	2009.08.28	-
ViRobot	2009.8.28.1907	2009.08.28	-
VirusBuster	4.6.5.0	2009.08.28	TrojanSpy.Banker.CDVF
Additional information
File size: 5102592 bytes
MD5   : 504f1c5914799e5122c69620c0b892e2
SHA1  : 32980745998151bda4a9e3bab767201ebc52fc0a
SHA256: 54d974192dd53aba186d56803087224ff8f8b0aba9687604332891842bb5ef58

[=]Prolog[=]
Tak jak pewnie udało wam się zauważyć w poprzednim poście malware ten posiada [...]]]></description>
			<content:encoded><![CDATA[<p>Tak jak wspominałem w poprzednim poście niniejszy będzie o sposobach (de)szyfrowania stosowanych w pewnej rodzinie trojanów bankowych pisanych w delphi.</p>
<p>Oczywiście tradycyjnie zaczniemy od przedstawienia naszego bohatera:<br />
<font color="blue"><b>[=]Dane[=]</b></font></p>
<pre>
Antivirus	Version	Last Update	Result
a-squared	4.5.0.24	2009.08.28	Trojan-Spy.Win32.Bancos!IK
AhnLab-V3	5.0.0.2	2009.08.28	-
AntiVir	7.9.1.7	2009.08.28	TR/Spy.Banker.DS.5102592
Antiy-AVL	2.0.3.7	2009.08.24	-
Authentium	5.1.2.4	2009.08.28	-
Avast	4.8.1335.0	2009.08.28	Win32:Spyware-gen
AVG	8.5.0.406	2009.08.28	PSW.Banker5.IQR
BitDefender	7.2	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
CAT-QuickHeal	10.00	2009.08.28	-
ClamAV	0.94.1	2009.08.28	Trojan.Agent-119128
Comodo	2125	2009.08.28	-
DrWeb	5.0.0.12182	2009.08.28	Trojan.PWS.Banker.based
eSafe	7.0.17.0	2009.08.27	-
eTrust-Vet	31.6.6706	2009.08.28	-
F-Prot	4.5.1.85	2009.08.27	-
F-Secure	8.0.14470.0	2009.08.28	-
Fortinet	3.120.0.0	2009.08.28	W32/Banker.B!tr.pws
GData	19	2009.08.28	DeepScan:Generic.Banker.OT.4CC5D1C8
Ikarus	T3.1.1.68.0	2009.08.28	Trojan-Spy.Win32.Bancos
Jiangmin	11.0.800	2009.08.28	-
K7AntiVirus	7.10.830	2009.08.28	-
Kaspersky	7.0.0.125	2009.08.28	-
McAfee	5723	2009.08.28	PWS-Banker.gen.b
McAfee+Artemis	5723	2009.08.28	Artemis!504F1C591479
McAfee-GW-Edition	6.8.5	2009.08.28	Trojan.Spy.Banker.DS.5102592
Microsoft	1.5005	2009.08.28	TrojanSpy:Win32/Bancos.gen!C
NOD32	4378	2009.08.28	probably a variant of Win32/Spy.Banker.QEO
Norman		2009.08.28	W32/Banker.EKFF
nProtect	2009.1.8.0	2009.08.28	-
Panda	10.0.2.2	2009.08.28	Trj/CI.A
PCTools	4.4.2.0	2009.08.28	-
Prevx	3.0	2009.08.28	-
Rising	21.44.40.00	2009.08.28	Trojan.PSW.Win32.Banker.dnl
Sophos	4.45.0	2009.08.28	Mal/Generic-A
Sunbelt	3.2.1858.2	2009.08.28	-
Symantec	1.4.4.12	2009.08.28	Infostealer.Bancos
TheHacker	6.3.4.3.389	2009.08.27	-
TrendMicro	8.950.0.1094	2009.08.28	-
VBA32	3.12.10.10	2009.08.28	-
ViRobot	2009.8.28.1907	2009.08.28	-
VirusBuster	4.6.5.0	2009.08.28	TrojanSpy.Banker.CDVF
Additional information
File size: 5102592 bytes
MD5   : 504f1c5914799e5122c69620c0b892e2
SHA1  : 32980745998151bda4a9e3bab767201ebc52fc0a
SHA256: 54d974192dd53aba186d56803087224ff8f8b0aba9687604332891842bb5ef58
</pre>
<p><font color="blue"><b>[=]Prolog[=]</b></font><br />
Tak jak pewnie udało wam się zauważyć w poprzednim poście malware ten posiada np. zaszyfrowane ścieżki, do których zostaną wykonana jego kopie. Przykładowy zaszyfrowany ciąg wygląda tak:<br />
<strong>GpfSH6zZTMrbRdHp865kP21JPNHqQMvdSrn1R6mWLNDbSdDSJMLkTI19RcbZQM5oN51oRsToOMrXSrn9RcbZQM5iQNfXSbnNQMvaRtTpCp8kPNXb</strong></p>
<p>gdzie po deszyfrowaniu otrzymujemy łańcuch:<br />
<strong>C:\Documents and Settings\All Users\Menu Iniciar\Programas\Inicializar\Windows32.exe</strong></p>
<p>W jaki  sposób funkcjonuje ten algorytm ? Tego dowiemy się już za chwilę.<br />
Wcześniej jednak sprecyzuje  „elementy”, które w tym malware’e wymagają deszyfrowania:</p>
<p><strong>- ścieżki, do który kopiowany jest malware<br />
- tytuły okien IE(malware używa tytułów okien do rozpoznania czy user znajduje się obecnie na stronie,  dla której trojan ma przygotowany np. fałszywy panel logowania)<br />
- treść fałszywych komunikatów mówiących o tym, że np. Internet Explorer wykonał<br />
nieprawidłową operacje i zostanie zamknięty.</strong></p>
<p>w niektórych wersjach także:<br />
<strong>- login&amp;hasło do serwera ftp/mysql używanego jako drop host<br />
- adresy email na które mają zostać przesłane skradzione dane</strong></p>
<p>Warto tutaj wspomnieć o różnicy, która występuje w podejściu autorów trojana obecnego i tego z poprzedniego postu. Jak pamiętamy tam autor nie dość, że stosował różnego rodzaju klucze xor’ujące to jeszcze zmieniały się w nieznacznym stopniu same procedury szyfrowania. Tutaj spoglądając na wygląd ciągów reprezentujących zaszyfrowane dane:<br />
<a href="http://icewall.files.wordpress.com/2009/08/encrypted_strings.jpg"><img src="http://icewall.files.wordpress.com/2009/08/encrypted_strings.jpg" alt="encrypted_strings" title="encrypted_strings" width="497" height="266" class="aligncenter size-full wp-image-251" /></a></p>
<p>Można zakładać, że procedura deszyfrująca jest jedna, globalna. Po dokładnej analizie okazuje się, że faktycznie tak jest i nadszedł czas żeby przyjrzeć się jej bliżej.<br />
Oczywiście jej lokalizację można w prosty sposób ustalić po przez przejście do kawałka kodu, który odwołuje się do jednego z zaszyfrowanych ciągów:<br />
<a href="http://icewall.files.wordpress.com/2009/08/decryption_routine_call.jpg"><img src="http://icewall.files.wordpress.com/2009/08/decryption_routine_call.jpg" alt="decryption_routine_call" title="decryption_routine_call" width="497" height="182" class="aligncenter size-full wp-image-253" /></a><br />
<em>Wywołanie funkcji deszyfrującej. Oczywiście argumenty, są przekazywane zgodnie z konwencja __fastcall typową dla Borlanda.</em></p>
<p><font color="blue"><b>[=]Analiza[=]</b></font><br />
Procka deszyfrująca przedstawia się następująco:<br />
<a href="http://icewall.files.wordpress.com/2009/08/decryption_routine.jpg"><img src="http://icewall.files.wordpress.com/2009/08/decryption_routine.jpg" alt="decryption_routine" title="decryption_routine" width="497" height="236" class="aligncenter size-full wp-image-252" /></a><br />
gdzie:<br />
<strong>ESI  &#8211; długość zaszyfrowanego ciągu<br />
Local.1 – pointer na zaszyfrowany ciąg</strong><br />
Jak widać procka jest o wiele pokaźniejsza od tych, które mogliśmy obserwować w poprzednim malware’e.<br />
<font color="blue"><b>[=]Deszyfrowanie[=]</b></font><br />
Bez większe zastanawiania się tworzymy decryptor, który w pythonie przedstawia się następująco:</p>
<pre class="brush: python">
import sys
#Delephant decryption script 

ascii_table = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/&quot;

def decrypt(encrypted):
    decrypted = []
    local_4 = 0
    edi     = 0
    for index in range(0,len(encrypted)):
        pos = ascii_table.find(encrypted[index])
        if pos &lt; 0:
            return &quot;Encrypted string is in unproper format&quot;
        pos = pos + (local_4 &lt;&lt; 6)
        local_4 = pos
        edi = edi + 6
        if edi &lt; 8:
            continue
        edi = edi - 8
        local_4 = local_4 % ( 1 &lt;&lt; (edi &amp; 0xff ) )
        pos = ( pos &gt;&gt; (edi &amp; 0xff) ) &amp; 0x800000ff
        if pos &lt; 0:
            pos = ( (pos - 1) &amp; 0xffffff00 ) + 1
        decrypted.append( chr(pos) )
    return &quot;&quot;.join(decrypted)

if __name__ == &quot;__main__&quot;:
    if len(sys.argv) &lt; 2:
        print &quot;Usage: %s encrypted_string&quot; % sys.argv[0]
        sys.exit(0)
    print decrypt(sys.argv[1])
</pre>
<p>Rezultat deszyfrowania losowo wybranych stringów:<br />
<a href="http://icewall.files.wordpress.com/2009/08/result_of_decryption.jpg"><img src="http://icewall.files.wordpress.com/2009/08/result_of_decryption.jpg" alt="result_of_decryption" title="result_of_decryption" width="496" height="244" class="aligncenter size-full wp-image-254" /></a></p>
<p>Warto tutaj zauważyć jedną znacząco różnice:<br />
<font color="gree"><b><br />
MOV EAX,[Local.5] ; kolejny znak z zaszyfrowanego ciagu<br />
MOV EDX,zloavgtr.00480BAC ;     ASCI „0123456789ABCD….”<br />
CALL StrPos<br />
MOV EBX,EAX<br />
DEC EBX<br />
</b></font><br />
i odpowiednik tego kodu w Python’e:<br />
<font color="gree"><b><br />
pos = ascii_table.find(encrypted[index])<br />
</b></font><br />
Trzeba być tutaj świadomym jednej rzeczy, a mianowicie tego ze <strong>StrPos Borlandowy</strong> indexuje pozycje znaków w stringu od 1 a <strong>find Pythonowy od 0</strong>. Dlatego też w kodzie pythona nie pojawia się dekrementacja wartości pozycji znaku do odszyfrowania.</p>
<p><font color="blue"><b>[=]Epilog[=]</b></font><br />
Jak można zauważyć, procedura deszyfrująca tego trojana jest objętościowa ok.3 razy większa od tych, z którymi mieliśmy do czynienie w poprzednim sampel’u co jednak nie przeszkodziło nam w stworzeniu python’ego decryptor’a.<br />
Jeżeli chodzi o algorytmy wykorzystywanego przez ten malware’u do „szyfrowania„ skradzionych danych to są to przeważnie:<br />
<strong>- URL Encode<br />
- Base64</strong><br />
ze względu na powszechność nie zostały one tutaj opisane.</p>
<p>Na sam koniec dla ciekawych, chcących przeanalizować krok po kroku działanie decryptor’a pare stringów do deszyfracji:<br />
<strong><br />
&#8220;IKLuS6nlScK&#8221;<br />
&#8220;IMvcRt9jOUVZRo1fRcDlSd9bT64X851oPMLkOsXX86DlSd9bT65jPMvqPI1l86DXRN1l84HfPsbqRou&#8221;<br />
&#8220;H65aRtCWIMvZRt9oPNHlSomWK6zo86PXTczo86HfPsbqPI1kRtPXRMLkT6Kk&#8221;<br />
&#8220;K6zo86PXTczoB21fRcPlScrb86baPMvqQMPfOs7dusyi865dPMvZQM4i86DlRdHX&#8221;<br />
&#8220;Kt8eOIak84PXTczo86HfPsbqON8WOI1pTM4WSsLkQ64WP64WT65YPMnX86DlSd9bT65jPMvqPIu&#8221;<br />
&#8220;LNDruN9fRoukBYukBYukBYukBZe&#8221;<br />
&#8220;K6zo86rlT6bsRo1aPI1JPMTrSc5kvs4WSsLr84D1KbJ3Jo14HI1JHKTLKa5Enq4WP6LsPI1pPN8WKcLZOMHXStHoOMHlB21JRsnfOsbqOMrlSo1nTMKWLczZwY18OM9fR6bqPI1pPNKWGs5oTEDl86Hb85DbPtLoOMxdOI1ERtPXRMLkT6Kk&#8221;<br />
&#8220;Gc5kOsyWINHX+Y0j84PbQNHl851XSc4WLczZwY0WBI1DQMDoRtDlPdGWIMvqPN9kPNGWHNXmR6zoPN8&#8243;<br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/08/29/algorytmy-deszyfrowania-wykorzystywane-przez-tworcow-trojanow-bankowych-%e2%80%93-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reversowanie trojanów pisanych w Delphi/BCB.</title>
		<link>http://www.icewall.pl/2009/08/07/reversowanie-trojanow-pisanych-w-delphibcb/</link>
		<comments>http://www.icewall.pl/2009/08/07/reversowanie-trojanow-pisanych-w-delphibcb/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 01:10:07 +0000</pubDate>
		<dc:creator>Icewall</dc:creator>
				<category><![CDATA[Analiza]]></category>
		<category><![CDATA[Malware]]></category>
		<category><![CDATA[RE]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[DeDe]]></category>
		<category><![CDATA[delphi banker]]></category>
		<category><![CDATA[delphi trojan]]></category>
		<category><![CDATA[DFM Editor]]></category>
		<category><![CDATA[Fast IDB2Sig]]></category>
		<category><![CDATA[GoDup]]></category>
		<category><![CDATA[map file]]></category>
		<category><![CDATA[resource editor]]></category>
		<category><![CDATA[reversing bcb]]></category>
		<category><![CDATA[reversing delphi]]></category>
		<category><![CDATA[trojan bankowy]]></category>

		<guid isPermaLink="false">http://icewall.wordpress.com/?p=220</guid>
		<description><![CDATA[Jako, że kolejny post  z cyklu „Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych” , który mam w planach napisać, będzie o algorytmach szyfrowania wykorzystanych w trojanach napisanych w Delphi   (tak tak, poczekajcie jeszcze pare lat i będzie wysyp trojanów pisanych w .NET… using System.malwares.bankers; i go go go !!!  ) , [...]]]></description>
			<content:encoded><![CDATA[<p>Jako, że kolejny post  z cyklu <a href="http://icewall.wordpress.com/2009/07/23/algorytmy-deszyfrowania-wykorzystywane-przez-tworcow-trojanow-bankowych/">„Algorytmy (de)szyfrowania wykorzystywane przez twórców trojanów bankowych”</a> , który mam w planach napisać, będzie o algorytmach szyfrowania wykorzystanych w trojanach napisanych w <strong>Delphi <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (tak tak, poczekajcie jeszcze pare lat i będzie wysyp trojanów pisanych w .NET… using System.malwares.bankers; i go go go !!! <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</strong> , to postanowiłem wcześniej napisać co nie co o moim ogólnym podejściu do trojanów pisanych w tym właśnie języku oraz narzędzi ułatwiających ich analizę.</p>
<p>Nasz dzisiejszy „bohater” przedstawia się następująco:<br />
<font color="blue"><b>[=]Dane[=]</b></font></p>
<pre>
Antywirus	Wersja	Ostatnia aktualizacja	Wynik
a-squared	4.5.0.24	2009.08.02	Trojan-Banker.Win32.Banker!IK
AhnLab-V3	5.0.0.2	2009.08.01	Win-Trojan/Banker.7315456.D
AntiVir	7.9.0.238	2009.08.02	TR/Agent.GGO.1
Antiy-AVL	2.0.3.7	2009.07.31	-
Authentium	5.1.2.4	2009.08.02	W32/Trojan.BZCX
Avast	4.8.1335.0	2009.08.01	Win32:Banker-CXH
AVG	8.5.0.406	2009.08.02	PSW.Banker4.AJJ
BitDefender	7.2	2009.08.02	Generic.Spy.Bank.ZWQ.720719B9
CAT-QuickHeal	10.00	2009.07.30	-
ClamAV	0.94.1	2009.08.02	-
Comodo	1840	2009.08.02	TrojWare.Win32.Spy.Banker.OHT
DrWeb	5.0.0.12182	2009.08.02	Trojan.PWS.Banker.12795
eSafe	7.0.17.0	2009.07.30	Win32.Banker.cwo
eTrust-Vet	31.6.6650	2009.08.01	-
F-Prot	4.4.4.56	2009.08.02	W32/Trojan.BZCX
F-Secure	8.0.14470.0	2009.08.01	Trojan-Banker.Win32.Banker.fgw
Fortinet	3.120.0.0	2009.08.02	Spy/Banker
GData	19	2009.08.02	Generic.Spy.Bank.ZWQ.720719B9
Ikarus	T3.1.1.64.0	2009.08.02	Trojan-Banker.Win32.Banker
Jiangmin	11.0.800	2009.08.02	-
K7AntiVirus	7.10.808	2009.08.01	-
Kaspersky	7.0.0.125	2009.08.02	Trojan-Banker.Win32.Banker.fgw
McAfee	5695	2009.08.01	PWS-Banker.gen.cb
McAfee+Artemis	5695	2009.08.01	PWS-Banker.gen.cb
McAfee-GW-Edition	6.8.5	2009.08.02	Heuristic.BehavesLike.Win32.Spyware.K
Microsoft	1.4903	2009.08.02	TrojanSpy:Win32/Banker.USW
NOD32	4299	2009.08.02	Win32/Spy.Banker.OHJ
Norman	6.01.09	2009.07.31	W32/Banker.BQZT
nProtect	2009.1.8.0	2009.08.02	-
Panda	10.0.0.14	2009.08.02	Trj/Banker.gen
PCTools	4.4.2.0	2009.08.02	TrojanSpy.Banker.ARXE
Rising	21.40.62.00	2009.08.02	Trojan.Spy.Win32.Banker.c
Sophos	4.44.0	2009.08.02	Mal/DelpBanc-A
Sunbelt	3.2.1858.2	2009.08.02	Bulk Trojan
Symantec	1.4.4.12	2009.08.02	Infostealer.Bancos
TheHacker	6.3.4.3.375	2009.08.01	Trojan/Spy.Banker.cwo
TrendMicro	8.950.0.1094	2009.07.31	-
VBA32	3.12.10.9	2009.08.02	Trojan-Spy.Win32.Banker.cwo
ViRobot	2009.7.31.1863	2009.07.31	-
VirusBuster	4.6.5.0	2009.08.02	TrojanSpy.Banker.ARXE

Dodatkowe informacje
File size: 7319552 bytes
MD5   : d9e6a8e34c8c6f33919c33889c23811c
SHA1  : 38bb2fbb82e419d044a2a9e9199eb948eb891679
SHA256: 9fe271dbe89dd60d072789f49197d217edf75d9ed5a46fc5e94e28c7522341d8
TrID  : File type identification65.9% (.EXE) InstallShield setup (43065/22/16)13.0% (.EXE) Win32 Executable Generic (8527/13/3)11.6% (.DLL) Win32 Dynamic Link Library (generic) (7583/30/2)3.1% (.EXE) Win16/32 Executable Delphi generic (2072/23)
3.0% (.EXE) Generic Win/DOS Executable (2002/3)
ssdeep: 98304:aVwdUDdAVtUSlUTE2PIEH4B4Yo1qIZtDxHw7SbrKD:anAUkQPIYA49m
PEiD  : -
RDS   : NSRL Reference Data Set
</pre>
<p>Ja kto przeważnie bywa sygnaturki, są bardzo ooooooogggggólne. Jeżeli nawet, któraś z nich wskazuje na jakiś bardziej konkretny typ trojana to analiza techniczna bardzoooooo mija się z rzeczywistością, weźmy chociażby :<br />
<a href="http://www.symantec.com/security_response/writeup.jsp?docid=2003-071710-2826-99&amp;tabid=2">Symantec &#8211;  Infostealer.Bancos</a><br />
Morał jest taki, że ludki pracujące nad tego typu malware’em, a m.in. są to osoby z brazylijskich slumsów oraz innych biednych krajów A.Pd, (polecam tutaj wystąpienie<br />
<a href="http://video.hackinthebox.org/HITBSecConf2007-Malaysia-Day-1.torrent">Mikko Hypponen : Online Crime and Crime Online</a><br />
) nie robią sobie urlopów <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p><font color="blue"><b>[=]Prolog[=]</b></font><br />
Jeżeli kiedykolwiek zdarzyło Ci  się pisać w <strong>BCB/Delphi aplikację z GUI</strong> (bo na takich będziemy się skupiać) to możesz podejrzewać, a jeżeli już je reversowałeś to jesteś świadom, że narzut kodu wygenerowanego przez kompilator, który nie specjalnie nas interesuje jest dość spory. Dodatkowo mamy tu do czynienia z budową silnie obiektową <strong>(masa metod wirtualnych, delegaty [tak tak, borland dostarcza do tego celu specyfikatora „__closure”],wielodziedziczenie,itp.)</strong> przez co nasza analiza jest nieco <strong>„utrudniona”(interpretuj. utrudniać: wydłużać czas zabawy <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</strong>. Dlatego też, pokarze parę narzędzi oraz plugin’ów do nich, które przyspieszą samą analizę kodu jak i pomogą nam na znalezienie tych fragmentów, które zastały napisane przez autora trojana.</p>
<p><font color="blue"><b>[=]Analiza[=]</b></font><br />
Na początku naszej analizy zastanówmy się jakie akcje są przeważnie wykonywane podczas początkowego uruchomienia trojana. Z mojego doświadczenia wynika, że są to przeważnie następujące działania :<br />
<strong>- kopiowanie własnej instancji do katalogu systemowego<br />
- dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu<br />
- rejestracja zainfekowanej maszyny</strong></p>
<p>Ok, na początek tyle ustaleń nam wystarczy teraz pojawia się kwestia jak zlokalizować ten kod?<br />
Oczywiście niektórzy z was mogli pomyśle, od razu o rozwiązaniu w stylu ustawianiu BP na api, które w jakiś sposób są powiązane z wyżej wymienionymi akcjami. Jest to na pewno jakiś sposób, ale w przypadku aplikacji Borlandowskich warto użyć paru dodatkowych narzędzi poza disassambler’em i debugger’em żeby osiągnąć naprawdę interesujące rezultaty, ale o tym za chwilę. Obejrzyjmy wstępnie kod trojana:<br />
<a href="http://icewall.files.wordpress.com/2009/08/ida_wstepny_kod.jpg"><img src="http://icewall.files.wordpress.com/2009/08/ida_wstepny_kod.jpg" alt="ida_wstepny_kod" title="ida_wstepny_kod" width="497" height="310" class="aligncenter size-full wp-image-225" /></a><br />
Na chwilę obecną powyższy kod nie daje nam zbyt wiele informacji, widać <strong>„rzetelne sprawdzanie błędów” <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </strong>, tworzenie mutex’a i wywołanie paru metod na globalnym obiekcie <strong>off_500864</strong>.Pierwszą rzeczą, która z pewnością ułatwi nam dalsze analizowanie kodu są <strong>FLIRT</strong>’y(więcej informacji <a href="http://www.hex-rays.com/idapro/flirt.htm">TU</a>), które dostarcza nam IDA Pro w wersji komercyjnej. Trudno mi powiedzieć jak wygląda kwestia z wersją Free, niestety nie testowałem, także jeżeli ktoś z was będzie testował lub już to zrobił to dajcie znać <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Załadujmy odpowiednie FLIRT’y i rzućmy okiem na kod po tym zabiegu:<br />
<a href="http://icewall.files.wordpress.com/2009/08/flirts.jpg"><img src="http://icewall.files.wordpress.com/2009/08/flirts.jpg" alt="flirts" title="flirts" width="497" height="331" class="aligncenter size-full wp-image-226" /></a><br />
<a href="http://icewall.files.wordpress.com/2009/08/code_after_flirts_load.jpg"><img src="http://icewall.files.wordpress.com/2009/08/code_after_flirts_load.jpg" alt="code_after_flirts_load" title="code_after_flirts_load" width="497" height="206" class="aligncenter size-full wp-image-227" /></a><br />
Ahhh….na mój gust kod wygląda już znacznie lepiej <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
<strong>Jak widać IDA zastąpiła większość wywołań VCL’owych metod sygnaturami</strong> przez co kod jest znacznie czytelniejszy. Warto jeszcze tutaj zastosować tryb:<br />
<strong>Options-&gt;Demangled names<br />
I przy wyborze „Show demangled C++ names  as” zaznaczyć radio box „Names” czego rezultatem będzie poniższy wynik:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/code_after_flirts_load_comments_as_funname.jpg"><img src="http://icewall.files.wordpress.com/2009/08/code_after_flirts_load_comments_as_funname.jpg" alt="code_after_flirts_load_comments_as_FunName" title="code_after_flirts_load_comments_as_FunName" width="497" height="261" class="aligncenter size-full wp-image-228" /></a><br />
Wracając do kodu, osoby, które miały styczność czy to z <strong>BCB czy Delphi</strong> już na pewno rozpoznają ten fragment.Tak tak jest to standardowy kod, którego główny cel możemy określić na:<br />
<strong>- automatyczne tworzenie form używanych w projekcie<br />
oraz  obsługę komunikatów do nich napływających. </strong></p>
<p>Porównamy teraz kod z pod IDA’y z kodem jednej z moich aplikacji pisanych w <strong>RAD Studio 2007( dawne wersje nazywane były Borland C++ Builder):</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/code_from_rad.jpg"><img src="http://icewall.files.wordpress.com/2009/08/code_from_rad.jpg" alt="code_from_RAD" title="code_from_RAD" width="497" height="427" class="aligncenter size-full wp-image-229" /></a><br />
Tak jak widać kod jest uderzająco podobny, z czego morał taki, że dzięki IDA’e i sygnaturką zaoszczędziliśmy czas na analizowaniu standardowych VCL’owych metod.</p>
<p>Ok, wszystko fajnie, ale dalej nie mamy żadnych szczegółów związanych z naszymi wcześniejszymi ustaleniami. Po listingu z IDA’y możemy stwierdzić, że przy uruchomieniu trojana tworzone są automatycznie 3 formy, co wiąże się z wywołaniem pewnych zdarzeń. Zanim jednak omówimy sobie te zdarzenia przyjrzyjmy się wszystkim formą. Do tego celu oczywiście posłużymy się resource editor’em. Wyróżnie tutaj dwa:</p>
<p><strong>Komercyjny:</strong><br />
<strong>PE Explorer:</strong> genialny edytor zasobów i nie tylko. Umożliwia podgląd form znajdujących się w zasobach, komponentów znajdujących się na nich (Timerów,Buttonów,Obrazów,&#8230;) oraz ich właściwości.</p>
<p><strong>Darmowy:</strong><br />
<strong>DFM Editor:</strong> autorstwa MiTeC’ka jest darmowym prawie że odpowiednikiem PE Explorer’a, jeżeli chodzi o samo edytowanie zasobów. Jedynym mankamentem tego narzędzia jest brak możliwości podglądu obrazków znajdujących się na formach co w  przypadku identyfikacji przeznaczenia formy(np. dzięki umieszczonym bannerą czy imitacją form przeznaczonych do logowania, możemy określić jakich banków klienci są narażeni na atak przez danego trojana już po samym analizowaniu zasobów) jest bardzo użyteczne.<br />
W naszych badaniach identyfikacja przeznaczania danej formy pod kątem konkretnego banku jest zbyteczna ( a nawet z paru względów zabroniona <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ). Rzućmy okiem do zasobów:<br />
<a href="http://icewall.files.wordpress.com/2009/08/resource_preview.jpg"><img src="http://icewall.files.wordpress.com/2009/08/resource_preview.jpg" alt="resource_preview" title="resource_preview" width="467" height="696" class="aligncenter size-full wp-image-230" /></a><br />
<em>(Niektóre nazwy form były zbyt oczywistymi skrótami nazw banków przez co musiałem je troszeczkę ocenzurować.)</em></p>
<p>Jak widzimy trojan ten posiada sporą dawkę fałszywych form imitujących panel’e do logowania, wirtualne klawiatury, a skończywszy na oknach prezentujących imitacje <strong>crash’u IE czy nawet BSOD’a</strong> <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />
Jest jednak parę form. :<br />
<strong>TAup &#8211; Application update?<br />
TCMD – Commands ?<br />
TFUNC – Functions ?</strong></p>
<p>które nie posiadają charakterystycznych Bitmap, lecz np. komponenty takie jak :<br />
<strong>TTimer<br />
TIdSMTP<br />
TIdMessage</strong></p>
<p>i  tym formą się przyjrzymy.<br />
Przeglądając komponenty znajdujące się na wyżej wymienionych formach szybko dochodzimy do wniosku, że tak naprawdę tylko <strong>TCMD</strong> jest formą, która może nas zainteresować, ponieważ:<br />
<strong>TAup – co prawda posiada komponent TTimer lecz nie ma on podczepionego event handler’a.  </strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/aup.jpg"><img src="http://icewall.files.wordpress.com/2009/08/aup.jpg" alt="aup" title="aup" width="497" height="327" class="aligncenter size-full wp-image-231" /></a><br />
Czyżby autor trojana doznał chwilowego przebłysku oraz chęci dodania kolejnej funkcjonalności po czym, po krótkie chwili porzucił tą idee, oraz wszelkie elementy z nią związane? Tego się nigdy nie dowiemy.</p>
<p><strong>TFUNC &#8211;  ta forma jest kompletnie pusta.<br />
Nie mogę tego inaczej skomentować niż jako wyjątkowego przejawu nonszalancji <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/func.jpg"><img src="http://icewall.files.wordpress.com/2009/08/func.jpg" alt="func" title="func" width="497" height="337" class="aligncenter size-full wp-image-232" /></a><br />
<strong>TCMD</strong><br />
Rzućmy okiem na najbardziej interesujące nas komponenty oraz ich własności:</p>
<pre>
object CMD: TCMD
  OnActivate = FormActivate
  OnCreate = FormCreate
  object TPrincipal: TTimer
    OnTimer = TPrincipalTimer
    Left = 8
  end
  object Tcook: TTimer
    Interval = 100
    OnTimer = TcookTimer
    Left = 40
  end
  object Tsite: TTimer
    Enabled = False
    Interval = 50
    OnTimer = TsiteTimer
    Left = 72
  end
  object Tjanela: TTimer ;
            nie wierzcie, że event handler jest ustawiany dynamicznie:P
	To raczej kolejny przejaw wrodzonej rozrzutności autora malware’u.
    Left = 104
  end
  object Taup: TTimer
    Enabled = False
    Interval = 720000
    OnTimer = TaupTimer
    Left = 136
  end
end
</pre>
<p><a href="http://icewall.files.wordpress.com/2009/08/resource_preview_tcmd.jpg"><img src="http://icewall.files.wordpress.com/2009/08/resource_preview_tcmd.jpg" alt="resource_preview_TCMD" title="resource_preview_TCMD" width="497" height="244" class="aligncenter size-full wp-image-233" /></a><br />
Jak widać forma ta posiada obsłużone dwa zdarzenia:</p>
<pre>
  OnActivate = FormActivate
  OnCreate   = FormCreate
</pre>
<p>Oba, są idealne do tego żeby podpiąć w ich obsłudze wszystkie 3 wymienione przeze mnie początkowe działania wykonywane przez większość trojanów.<br />
<strong>W pozostałych event handler’ach: </strong></p>
<pre>
TaupTimer
TsiteTimer
TcookTimer
TPrincipalTimer
</pre>
<p>związanych z eventem <strong>OnTimer</strong>:<br />
można się raczej spodziewać akcji takich jak:<br />
<strong>- aktualizacji trojana<br />
- wysyłania skradzionych danych do twórcy malware’u<br />
- monitorowania aktualnych procesów w systemie (i cykliczne ubijanie np. firewall’a)<br />
czy monitorowania odwiedzanych stron.</strong></p>
<p>Ok., mamy więc ustalone parę procek, których kod chcielibyśmy prześledzić. Nasuwa się pytanie:<br />
<strong>W jaki sposób uzyskać ich VirtualAddress?</strong><br />
Odpowiedzią jest:<br />
<strong>DeDe</strong><br />
Wszystkie informacje o DeDe jak i sam tool znajdziecie tutaj <a href="http://www.woodmann.com/collaborative/tools/index.php/DeDe">RCE Tools</a>.</p>
<p>Ładujemy naszego trojana w <strong>DeDe</strong> i po parunastu sekundach otrzymujemy taki o to rezultat:<br />
<a href="http://icewall.files.wordpress.com/2009/08/preview_into_dede1.jpg"><img src="http://icewall.files.wordpress.com/2009/08/preview_into_dede1.jpg" alt="_preview_into_dede" title="_preview_into_dede" width="497" height="586" class="aligncenter size-full wp-image-247" /></a><br />
Wspaniale! Jak możemy zaobserwować na powyższym screen’e DeDe dostarczyło nam informacji o <strong>zdeklarowanych przez użytkownika klasach (np. TCMD), Event handler’ach oraz miejscach ich lokalizacji!</strong><br />
Podsumowując uzyskane informacje mamy:</p>
<p><strong>OnTime:</strong></p>
<pre>
TaupTimer         = 004FD5C8
TsiteTimer          = 004FD0A0
TcookTimer 	      = 004FC834
TPrincipalTimer = 004FACE4
</pre>
<p><strong>oraz eventy związane bezpośrednio z formą:</strong></p>
<pre>
OnActivate = FormActivate =  004F7C44
OnCreate   = FormCreate    =  004FAC44
</pre>
<p>Oczywiście teraz nasza analiza staje się o wiele wiele prostsza, ponieważ bezpośrednio możemy zająć się interesującymi nas fragmentami kodu bez przedzierania się przez standardowe procedury.<br />
Dla potwierdzenia wcześniejszych założeń związanych z operacjami wykonywanymi na starcie przez trojana, rzućmy okien na kod wykonywany przy <strong>event’e OnCreate</strong>, czyli:<br />
<strong>FormCreate  @  004FAC44:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/oncreate.jpg"><img src="http://icewall.files.wordpress.com/2009/08/oncreate.jpg" alt="oncreate" title="oncreate" width="497" height="306" class="aligncenter size-full wp-image-235" /></a><br />
Mhmm sporo <strong>call’i, których IDA</strong> nie rozpoznała jako standardowych wywołań, więc najprawdopodobniej, są to pomocnicze metody napisane przez <strong>„programistę”</strong>. Zanim jednak przejdziemy do ich przeglądania, skorzystamy ponownie z dobrodziejstwa informacji dostarczanych przez <strong>DeDe</strong>, a  mowa tutaj dokładnie o <strong>pliku MAP</strong>.<br />
<a href="http://icewall.files.wordpress.com/2009/08/map_export.jpg"><img src="http://icewall.files.wordpress.com/2009/08/map_export.jpg" alt="map_export" title="map_export" width="497" height="269" class="aligncenter size-full wp-image-236" /></a><br />
Dzięki wyexportowaniu informacji takich jak:</p>
<pre>
- event handlers
- control references
</pre>
<p>do pliku <strong>map</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/map_file_preview.jpg"><img src="http://icewall.files.wordpress.com/2009/08/map_file_preview.jpg" alt="map_file_preview" title="map_file_preview" width="497" height="481" class="aligncenter size-full wp-image-237" /></a><br />
oraz  załadowaniu go do IDA’y: (polecam plugin <a href="http://www.woodmann.com/collaborative/tools/index.php/Fast_IDB2Sig_and_LoadMap_IDA_plugins">Fast IDB2Sig and LoadMap</a>) disassemblowany przez nas kod staje się ponownie jeszcze bardziej czytelny:<br />
<a href="http://icewall.files.wordpress.com/2009/08/oncreate_with_map.jpg"><img src="http://icewall.files.wordpress.com/2009/08/oncreate_with_map.jpg" alt="oncreate_with_map" title="oncreate_with_map" width="497" height="415" class="aligncenter size-full wp-image-239" /></a><br />
To co najbardziej rzuca się w oczy to fakt zamiany nazwy call’a i jego komentarza z :</p>
<pre>
loc_4FACBD:
mov     dl, 1
mov     eax, [ebx+318h] ;
call    unknown_libname_172 ; Delphi2006/BDS2006 Visual Component Librar
</pre>
<p>na</p>
<pre>
loc_4FACBD:
mov     dl, 1
mov     eax, [ebx+318h] ; Taup:N.A.
call    SetEnabled      ; ExtCtrls.TTimer.SetEnabled(TTimer;Boolean)
</pre>
<p>odrazu widać, że jest to fragment kodu aktywujący <strong>Timer : Taup</strong>.<br />
Ok, przyjrzyjmy się którejś z metod, której sposób działania jest nam jeszcze nie znany. Sprawdźmy jako pierwszą :<br />
<strong>sub_483BE8</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/add_to_registry.jpg"><img src="http://icewall.files.wordpress.com/2009/08/add_to_registry.jpg" alt="add_to_registry" title="add_to_registry" width="497" height="449" class="aligncenter size-full wp-image-240" /></a><br />
Ahh jak widać metoda ta wykonuje operacje na rejestrze, a po głębszej analizie okazuje się, że dodaje ona do klucza :<br />
<strong>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run</strong><br />
wartość : <strong>Windows32</strong> zawierającą scieżkę do kopi trojana, czyli<br />
<strong>sub_483BE8 możemy zaklasyfikować jako :<br />
- dodanie wpisu w rejestrze pozwalającego na auto uruchomienie trojana po reboot’e systemu</strong></p>
<p>Super!!! jedno z założeń odnalezione. Idźmy dalej:<br />
<strong>sub_483D78:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/instation_copy.jpg"><img src="http://icewall.files.wordpress.com/2009/08/instation_copy.jpg" alt="instation_copy" title="instation_copy" width="497" height="230" class="aligncenter size-full wp-image-241" /></a></p>
<p>Jak widać w najwyżej położonym bloku widocznym na screen’e,  zostaje sprawdzona wersja systemu operacyjnego <strong>( Windows XP/NT/98 itd.)</strong> i na tej podstawie podejmowane, są działanie takie jak:<br />
<strong>deskrypcja stringu<br />
pobranie parametru wywołania aplikacji<br />
oraz wykonanie kopi pliku gdzie parametrami, są rezultaty operacji dwóch poprzednich funkcji</strong>…czy coś wam to mówi <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ?,,,,,a teraz<br />
<strong>CopyFile(ParamStr(),Decrypt()) <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ?</strong><br />
Tak jest! Oczywiście widać tutaj bloki instrukcji odpowiedzialnych za kopiowanie instancji trojana do charakterystycznych katalogów uzależnionych od wersji systemu Windows.<br />
<strong>sub_483D78<br />
- kopiowanie własnej instancji do katalogu systemowego </strong></p>
<p>Na tym poprzestaniemy nasze dalsze dochodzenie, bo nie dokładna analiza techniczna była naszym celem, a jedynie przekonanie się o tym jaki potencjał niesie zastosowanie :<br />
<strong>- sygnatur IDA’y<br />
- informacji o adresach metod/obiektów uzyskanych dzięki DeDe<br />
oraz pliku MAP</strong></p>
<p><strong>A co z naszym ulubionym Olkiem <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ?</strong> Czyż  nie było by miło prowadzić dynamicznej analizy kodu mając do dyspozycji <strong>możliwości Olka ,sygnaturki IDA’y i możliwość załadowania pliku MAP</strong> ? Oczywiście byłoby, a najlepsze w tym jest to, że da się to osiągnąć!</p>
<p><font color="blue"><b>[=]Olly’s time[=]</b></font><br />
Żeby osiągnąć powyższe możliwości wystarczy tak naprawdę jeden plugin:<br />
<a href="http://www.openrce.org/downloads/details/103/GoDup">GoDup</a></p>
<p><a href="http://icewall.files.wordpress.com/2009/08/godup_preview.jpg"><img src="http://icewall.files.wordpress.com/2009/08/godup_preview.jpg" alt="GoDup_preview" title="GoDup_preview" width="497" height="168" class="aligncenter size-full wp-image-242" /></a><br />
Żeby dostrzec różnice po zastosowaniu kolejnych zabiegów w wykonaniu tego pluginu, ustawmy się na kod <strong>handler’a TPricipalTimer @ 004FACE4:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/pure_olly_code.jpg"><img src="http://icewall.files.wordpress.com/2009/08/pure_olly_code.jpg" alt="pure_olly_code" title="pure_olly_code" width="497" height="290" class="aligncenter size-full wp-image-243" /></a><br />
<strong>po zastosowaniu sygnatur:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/sig_olly_code.jpg"><img src="http://icewall.files.wordpress.com/2009/08/sig_olly_code.jpg" alt="sig_olly_code" title="sig_olly_code" width="496" height="293" class="aligncenter size-full wp-image-244" /></a><br />
<strong>dorzućmy jeszcze informacje z pliku MAP:</strong><br />
<a href="http://icewall.files.wordpress.com/2009/08/map_olly_code.jpg"><img src="http://icewall.files.wordpress.com/2009/08/map_olly_code.jpg" alt="map_olly_code" title="map_olly_code" width="497" height="292" class="aligncenter size-full wp-image-245" /></a></p>
<p>Czyż kod nie wygląda piękniej? <img src='http://www.icewall.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.icewall.pl/2009/08/07/reversowanie-trojanow-pisanych-w-delphibcb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
