<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ModuleName &amp;mdash; Paweł Goleń, blog</title>
    <link>https://wampir.mroczna-zaloga.org/tag:ModuleName</link>
    <description></description>
    <pubDate>Thu, 16 Apr 2026 23:47:00 +0000</pubDate>
    <item>
      <title>Wykrywanie API hooking</title>
      <link>https://wampir.mroczna-zaloga.org/wykrywanie-api-hooking</link>
      <description>&lt;![CDATA[Rzuciłem okiem ostatnio na pewne narzędzie, które służyło do &#34;zabezpieczania&#34; środowiska pracy użytkownika. Nie wdając się w szczegóły procesy uruchomione w tym środowisku miały pewne dodatkowe ograniczenia, na przykład odnośnie uruchamiania innych procesów (lista dozwolonych), zapisywania danych, kopiowania plików. Gdy widzę takie rozwiązanie zawsze przede wszystkim zastanawiam się nad tym, jak je można obejść. Do tego dobrze jest wiedzieć (przynajmniej w przybliżeniu) jak to coś działa. Nie miałem na to zbyt wiele czasu, ale szybkie zbadanie sprawy przy pomocy Process Monitor pokazało, że &#34;chronione&#34; procesy ładują dodatkowe biblioteki. Moja pierwsza hipoteza zakłada więc API Hooking. Tylko jak łatwo ją potwierdzić?&#xA;&#xD;&#xA;!--more--&#xD;&#xA;Założenia&#xA;&#xA;Zakładam, że dysponuję zrzutem pamięci systemu. Zrzut pamięci jest utworzony na przykład przy pomocy narzędzia windd (nie mylić z tym windd!). Zrzut ten może być w formacie Microsoft Crash Dump lub być po prostu kopią zawartości pamięci fizycznej. Zaletą pierwszego formatu jest to, że można załadować go do Debugging Tools For Windows, format surowy jest preferowany w przypadku narzędzi takich jak Volatility czy Memoryze.&#xA;&#xA;W tym wypadku interesuje mnie usermode , czyli głównie:&#xA;&#xA;  IAT (Import Address Table),&#xA;  EAT (Export Address Table),&#xA;  Hot patching,&#xA;&#xA;Dodatkowym ograniczeniem jest fakt, iż w tym temacie nie jestem zbyt dobry, dlatego szukam rozwiązań łatwych.&#xA;&#xA;Generowanie danych testowych&#xA;&#xA;W tym eksperymencie wolę wiedzieć co powinienem znaleźć. Innymi słowy chcę kontrolować na czym i jakiego typu hook jest założony. Nie potrzebuję bardzo skomplikowanych przykładów, dlatego do wygenerowania danych testowych (czyli testowych zrzutów pamięci) w zupełności wystarczy przykładowy program zawarty w HookLib.&#xA;&#xA;EAT, hot patching i WinDbg&#xA;&#xA;Metoda wykrywania modyfikacji EAT oraz modyfikacji kodu programów i bibliotek znajdujących się w pamięci jest stosunkowo prosta. Oczywiście pod warunkiem, że poza zrzutem pamięci dysponujemy odpowiednim &#34;oryginalnym&#34; plikiem. Porównanie załadowanego obrazu z plikiem może pokazać ewentualne różnice.&#xA;&#xA;Na początek przykład bez założonego hooka:&#xA;    &#xA;    &#xD;&#xA;    0:001  !foreachmodule !chkimg -p c:\virtualpc @#ModuleName&#xD;&#xA;    0 errors : HookLibTest &#xD;&#xA;    0 errors : uxtheme &#xD;&#xA;    0 errors : MSCTF &#xD;&#xA;    0 errors : msctfime &#xD;&#xA;    0 errors : IMM32 &#xD;&#xA;    0 errors : OLEAUT32 &#xD;&#xA;    0 errors : ole32 &#xD;&#xA;    0 errors : msvcrt &#xD;&#xA;    0 errors : ADVAPI32 &#xD;&#xA;    0 errors : RPCRT4 &#xD;&#xA;    0 errors : GDI32 &#xD;&#xA;    0 errors : Secur32 &#xD;&#xA;    0 errors : kernel32 &#xD;&#xA;    0 errors : ntdll &#xD;&#xA;    0 errors : USER32 &#xD;&#xA;    &#xA;&#xA;Jak widać zarówno sam plik programu, jak i ładowane przez niego biblioteki nie zostały zmienione w pamięci.&#xA;&#xA;Sytuacja zmienia się, gdy zostanie założony hook:&#xA;    &#xA;    &#xD;&#xA;    0:001  !foreachmodule !chkimg -p c:\virtualpc @#ModuleName&#xD;&#xA;    0 errors : HookLibTest &#xD;&#xA;    0 errors : uxtheme &#xD;&#xA;    0 errors : MSCTF &#xD;&#xA;    0 errors : msctfime &#xD;&#xA;    0 errors : IMM32 &#xD;&#xA;    0 errors : OLEAUT32 &#xD;&#xA;    0 errors : ole32 &#xD;&#xA;    0 errors : msvcrt &#xD;&#xA;    0 errors : ADVAPI32 &#xD;&#xA;    0 errors : RPCRT4 &#xD;&#xA;    0 errors : GDI32 &#xD;&#xA;    0 errors : Secur32 &#xD;&#xA;    0 errors : kernel32 &#xD;&#xA;    0 errors : ntdll &#xD;&#xA;    7 errors : USER32 (7e4507e5-7e4507eb)&#xD;&#xA;    &#xA;    &#xA;    &#xD;&#xA;    0:001  !foreachmodule !chkimg -p c:\virtualpc @#ModuleName&#xD;&#xA;    0 errors : HookLibTest &#xD;&#xA;    0 errors : uxtheme &#xD;&#xA;    0 errors : MSCTF &#xD;&#xA;    0 errors : msctfime &#xD;&#xA;    0 errors : IMM32 &#xD;&#xA;    0 errors : OLEAUT32 &#xD;&#xA;    0 errors : ole32 &#xD;&#xA;    0 errors : msvcrt &#xD;&#xA;    0 errors : ADVAPI32 &#xD;&#xA;    0 errors : RPCRT4 &#xD;&#xA;    0 errors : GDI32 &#xD;&#xA;    0 errors : Secur32 &#xD;&#xA;    0 errors : kernel32 &#xD;&#xA;    0 errors : ntdll &#xD;&#xA;    4 errors : USER32 (7e414098-7e41409b)&#xD;&#xA;    &#xA;&#xA;W tych dwóch przypadkach widać, że modyfikowany jest obraz biblioteki USER32. Można uzyskać dokładniejsze dane o modyfikacjach:&#xA;    &#xA;    &#xD;&#xA;    0:001  !chkimg user32&#xD;&#xA;    4 errors : user32 (7e414098-7e41409b)&#xD;&#xA;    0:001  ln 7e414098&#xD;&#xA;    (7e413900)   USER32!$$VProcImageExportDirectory+0x798   |  (7e4184ae)   USER32!NtUserCallOneParam&#xD;&#xA;    &#xA;&#xA;W tym wypadku widać, że zmiany (obszar, który uległ zmianie pokazuje polecenie !chkimg) znajduje się prawdopodobnie w EAT (ln pokazuje najbliższe względem podanego adresu symbole).&#xA;&#xA;W drugim przypadku zmiany wglądają nieco inaczej:&#xA;    &#xA;    &#xD;&#xA;    0:001  !chkimg user32&#xD;&#xA;    7 errors : user32 (7e4507e5-7e4507eb)&#xD;&#xA;    0:001  ln 7e4507e5&#xD;&#xA;    (7e4507df)   USER32!GdiConvertMetaFilePict+0x6   |  (7e4507ea)   USER32!MessageBoxA&#xD;&#xA;    &#xA;&#xA;W zmienionym zakresie obecnie znajduje się taki kod:&#xA;    &#xA;    &#xD;&#xA;    0:001  u 7e4507e5 7e4507eb&#xD;&#xA;    USER32!GdiConvertMetaFilePict+0x6:&#xD;&#xA;    7e4507e5 e91608fb81      jmp     HookLibTest+0x1000 (00401000)&#xD;&#xA;    USER32!MessageBoxA:&#xD;&#xA;    7e4507ea ebf9            jmp     USER32!GdiConvertMetaFilePict+0x6 (7e4507e5)&#xD;&#xA;    &#xA;&#xA;Przed zmianą (albo inaczej - po naprawieniu), kod ten wyglądał tak:&#xA;    &#xA;    &#xD;&#xA;    0:001  !chkimg -f user32&#xD;&#xA;    Warning: Any detected errors will be fixed to what we expect!&#xD;&#xA;    7 errors (fixed): user32 (7e4507e5-7e4507eb)&#xD;&#xA;    0:001  u 7e4507e5 7e4507eb&#xD;&#xA;    USER32!GdiConvertMetaFilePict+0x6:&#xD;&#xA;    7e4507e5 90              nop&#xD;&#xA;    7e4507e6 90              nop&#xD;&#xA;    7e4507e7 90              nop&#xD;&#xA;    7e4507e8 90              nop&#xD;&#xA;    7e4507e9 90              nop&#xD;&#xA;    USER32!MessageBoxA:&#xD;&#xA;    7e4507ea 8bff            mov     edi,edi&#xD;&#xA;    &#xA;&#xA;Jak widać na powyższych przykładach !chkimg jest dość skutecznym sposobem wykrywania modyfikacji EAT lub modyfikacji kodu (hot patching).&#xA;&#xA;IAT i !chkimg&#xA;&#xA;Niestety, tej samej techniki nie można zastosować do wyszukiwania modyfikacji IAT, z opisu !chkimg:&#xA;&#xA;  Addresses that are occupied by the Import Address Table (IAT) are not checked. &#xA;&#xA;Dlaczego? Wynika to z tego, czym właściwie jest Import Address Table (patrz: Understanding the Import Address Table). Można przyjąć w uproszczeniu, że to co znajduje się w IAT w pamięci jest konstruowane dynamicznie, więc porównywanie pamięci z obrazem pliku jest bezcelowe.&#xA;&#xA;Jak wykryć modyfikację IAT&#xA;&#xA;Z tego co wiem, sprawa jest dość prosta, choć pracochłonna. Należy zweryfikować, czy adresy w IAT wskazują na &#34;prawidłowe&#34; adresy. Czyli przypadkowo czy adres pokazujący na funkcję MessageBoxA (bo ta jest wykorzystana w przykładach) pokazuje rzeczywiście na adres, pod którym ta funkcja jest dostępna w bibliotece USER32. Problem w tym, że nie bardzo widzę prosty sposób na wyświetlenie IAT w WinDbg, ale mogę się mylić.&#xA;&#xA;To, że coś nie jest proste, nie znaczy, że się nie da tego zrobić: Import Table Functions. Wykorzystując podane tam skrypty można zobaczyć coś takiego:&#xA;    &#xA;    &#xD;&#xA;    (...)&#xD;&#xA;    00408014  7e43b144 USER32!DialogBoxParamA&#xD;&#xA;    00408018  7e424a4e USER32!EndDialog&#xD;&#xA;    0040801c  7e42436e USER32!GetDlgItem&#xD;&#xA;    00408020  7e4507ea USER32!MessageBoxA&#xD;&#xA;    00408024  7e42f3c2 USER32!SendMessageA&#xD;&#xA;    00408028  7e43c2e7 USER32!SendDlgItemMessageA&#xD;&#xA;    0040802c  7e45085c USER32!MessageBoxExA&#xD;&#xA;    (...)&#xD;&#xA;    &#xA;    &#xA;    &#xD;&#xA;    (...)&#xD;&#xA;    00408014  7e43b144 USER32!DialogBoxParamA&#xD;&#xA;    00408018  7e424a4e USER32!EndDialog&#xD;&#xA;    0040801c  7e42436e USER32!GetDlgItem&#xD;&#xA;    00408020  00401000 HookLibTest+0x1000&#xD;&#xA;    00408024  7e42f3c2 USER32!SendMessageA&#xD;&#xA;    00408028  7e43c2e7 USER32!SendDlgItemMessageA&#xD;&#xA;    0040802c  7e45085c USER32!MessageBoxExA&#xD;&#xA;    (...)&#xD;&#xA;    &#xA;&#xA;Pierwszy zrzut to przypadek &#34;czysty&#34;. Jak widać import wskazuje na USER32!MessageBoxA. W drugim przypadku import ten jest podmieniony i wskazuje na miejsce w obrębie HookLibTest.&#xA;&#xA;Wykorzystany skrypt trzeba trochę zmodyfikować by móc go wykorzystać do nieco wygodniejszego wykrywania takich modyfikacji. Powinien przynajmniej wypisywać informację gdzie powinien dany element wskazywać, a jeszcze lepiej, gdyby wypisywał tylko te przypadki, w których teoria (to, gdzie powinien wskazywać) nie pokrywa się z praktyką (to, gdzie wskazuje).&#xA;&#xA;Co dalej?&#xA;&#xA;Co dalej? To dość oczywiste. Muszę tylko zrzucić pamięć w odpowiednim momencie, a później sprawdzić czy moja hipoteza jest słuszna. Jestem prawie pewien, że tak. Podobne rozwiązanie stosowane jest w Google Chrome jako część sandboxa (patrz: Sandbox w Google Chrome). Warto też zastanowić się jak (nie)skuteczne jest tego typu rozwiązanie, przy czym najpierw dobrze jest ustalić przed czym tak naprawdę ma ono chronić.&#xA;&#xA;Przy okazji w wolnej chwili sprawdzę, czy z wykrywaniem tego typu hooków (głównie IAT i EAT) jest w stanie poradzić sobie wspomniane już Memoryze. Jeśli chodzi o Volatility to warto tu wspomnieć o Volatility Analyst Pack (patrz: New and Updated Volatility Plug-ins Part II), który teoretycznie robi dokładnie to, czego szukam. Teoretycznie, bo jeszcze nie udało mi się z powodzeniem uruchomić tych pluginów...&#xA;&#xD;&#xA;&#xD;&#xA;Oryginał tego wpisu dostępny jest pod adresem Wykrywanie API hooking_&#xA;&#xA;smallAutor: Paweł Goleń/small]]&gt;</description>
      <content:encoded><![CDATA[<p>Rzuciłem okiem ostatnio na pewne narzędzie, które służyło do “zabezpieczania” środowiska pracy użytkownika. Nie wdając się w szczegóły procesy uruchomione w tym środowisku miały pewne dodatkowe ograniczenia, na przykład odnośnie uruchamiania innych procesów (lista dozwolonych), zapisywania danych, kopiowania plików. Gdy widzę takie rozwiązanie zawsze przede wszystkim zastanawiam się nad tym, jak je można obejść. Do tego dobrze jest wiedzieć (przynajmniej w przybliżeniu) jak to coś działa. Nie miałem na to zbyt wiele czasu, ale szybkie zbadanie sprawy przy pomocy <a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx">Process Monitor</a> pokazało, że “chronione” procesy ładują dodatkowe biblioteki. Moja pierwsza hipoteza zakłada więc API Hooking. Tylko jak <em>łatwo</em> ją potwierdzić?</p>



<h3 id="założenia">Założenia</h3>

<p>Zakładam, że dysponuję zrzutem pamięci systemu. Zrzut pamięci jest utworzony na przykład przy pomocy narzędzia <a href="http://www.msuiche.net/windd/">windd</a> (nie mylić z tym <a href="http://sourceforge.net/projects/windd/">windd</a>!). Zrzut ten może być w formacie <em>Microsoft Crash Dump</em> lub być po prostu kopią zawartości pamięci fizycznej. Zaletą pierwszego formatu jest to, że można załadować go do <a href="http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx">Debugging Tools For Windows</a>, format <em>surowy</em> jest preferowany w przypadku narzędzi takich jak <a href="https://www.volatilesystems.com/default/volatility">Volatility</a> czy <a href="http://www.mandiant.com/products/free_software/memoryze/">Memoryze</a>.</p>

<p>W tym wypadku interesuje mnie <em>usermode</em> , czyli głównie:</p>
<ul><li>IAT (Import Address Table),</li>
<li>EAT (Export Address Table),</li>
<li>Hot patching,</li></ul>

<p>Dodatkowym ograniczeniem jest fakt, iż w tym temacie nie jestem zbyt dobry, dlatego szukam rozwiązań <strong>łatwych</strong>.</p>

<h3 id="generowanie-danych-testowych">Generowanie danych testowych</h3>

<p>W tym eksperymencie wolę wiedzieć co powinienem znaleźć. Innymi słowy chcę kontrolować na czym i jakiego typu hook jest założony. Nie potrzebuję bardzo skomplikowanych przykładów, dlatego do wygenerowania danych testowych (czyli testowych zrzutów pamięci) w zupełności wystarczy <a href="http://rewolf.pl/">przykładowy program zawarty w HookLib</a>.</p>

<h3 id="eat-hot-patching-i-windbg">EAT, hot patching i WinDbg</h3>

<p>Metoda wykrywania modyfikacji EAT oraz modyfikacji kodu programów i bibliotek znajdujących się w pamięci jest stosunkowo prosta. Oczywiście pod warunkiem, że poza zrzutem pamięci dysponujemy odpowiednim “oryginalnym” plikiem. Porównanie załadowanego obrazu z plikiem może pokazać ewentualne różnice.</p>

<p>Na początek przykład bez założonego hooka:</p>

<p>    0:001&gt; !for<em>each</em>module !chkimg -p c:\virtualpc @<a href="https://wampir.mroczna-zaloga.org/tag:ModuleName" class="hashtag"><span>#</span><span class="p-category">ModuleName</span></a>
    0 errors : HookLibTest
    0 errors : uxtheme
    0 errors : MSCTF
    0 errors : msctfime
    0 errors : IMM32
    0 errors : OLEAUT32
    0 errors : ole32
    0 errors : msvcrt
    0 errors : ADVAPI32
    0 errors : RPCRT4
    0 errors : GDI32
    0 errors : Secur32
    0 errors : kernel32
    0 errors : ntdll
    0 errors : USER32</p>

<p>Jak widać zarówno sam plik programu, jak i ładowane przez niego biblioteki nie zostały zmienione w pamięci.</p>

<p>Sytuacja zmienia się, gdy zostanie założony hook:</p>

<p>    0:001&gt; !for<em>each</em>module !chkimg -p c:\virtualpc @<a href="https://wampir.mroczna-zaloga.org/tag:ModuleName" class="hashtag"><span>#</span><span class="p-category">ModuleName</span></a>
    0 errors : HookLibTest
    0 errors : uxtheme
    0 errors : MSCTF
    0 errors : msctfime
    0 errors : IMM32
    0 errors : OLEAUT32
    0 errors : ole32
    0 errors : msvcrt
    0 errors : ADVAPI32
    0 errors : RPCRT4
    0 errors : GDI32
    0 errors : Secur32
    0 errors : kernel32
    0 errors : ntdll
    7 errors : USER32 (7e4507e5-7e4507eb)</p>

<p>    0:001&gt; !for<em>each</em>module !chkimg -p c:\virtualpc @<a href="https://wampir.mroczna-zaloga.org/tag:ModuleName" class="hashtag"><span>#</span><span class="p-category">ModuleName</span></a>
    0 errors : HookLibTest
    0 errors : uxtheme
    0 errors : MSCTF
    0 errors : msctfime
    0 errors : IMM32
    0 errors : OLEAUT32
    0 errors : ole32
    0 errors : msvcrt
    0 errors : ADVAPI32
    0 errors : RPCRT4
    0 errors : GDI32
    0 errors : Secur32
    0 errors : kernel32
    0 errors : ntdll
    4 errors : USER32 (7e414098-7e41409b)</p>

<p>W tych dwóch przypadkach widać, że modyfikowany jest obraz biblioteki USER32. Można uzyskać dokładniejsze dane o modyfikacjach:</p>

<p>    0:001&gt; !chkimg user32
    4 errors : user32 (7e414098-7e41409b)
    0:001&gt; ln 7e414098
    (7e413900)   USER32!$$VProc_ImageExportDirectory+0x798   |  (7e4184ae)   USER32!NtUserCallOneParam</p>

<p>W tym wypadku widać, że zmiany (obszar, który uległ zmianie pokazuje polecenie !chkimg) znajduje się prawdopodobnie w EAT (ln pokazuje najbliższe względem podanego adresu symbole).</p>

<p>W drugim przypadku zmiany wglądają nieco inaczej:</p>

<p>    0:001&gt; !chkimg user32
    7 errors : user32 (7e4507e5-7e4507eb)
    0:001&gt; ln 7e4507e5
    (7e4507df)   USER32!GdiConvertMetaFilePict+0x6   |  (7e4507ea)   USER32!MessageBoxA</p>

<p>W zmienionym zakresie obecnie znajduje się taki kod:</p>

<p>    0:001&gt; u 7e4507e5 7e4507eb
    USER32!GdiConvertMetaFilePict+0x6:
    7e4507e5 e91608fb81      jmp     HookLibTest+0x1000 (00401000)
    USER32!MessageBoxA:
    7e4507ea ebf9            jmp     USER32!GdiConvertMetaFilePict+0x6 (7e4507e5)</p>

<p>Przed zmianą (albo inaczej – po naprawieniu), kod ten wyglądał tak:</p>

<p>    0:001&gt; !chkimg -f user32
    Warning: Any detected errors will be fixed to what we expect!
    7 errors (fixed): user32 (7e4507e5-7e4507eb)
    0:001&gt; u 7e4507e5 7e4507eb
    USER32!GdiConvertMetaFilePict+0x6:
    7e4507e5 90              nop
    7e4507e6 90              nop
    7e4507e7 90              nop
    7e4507e8 90              nop
    7e4507e9 90              nop
    USER32!MessageBoxA:
    7e4507ea 8bff            mov     edi,edi</p>

<p>Jak widać na powyższych przykładach !chkimg jest dość skutecznym sposobem wykrywania modyfikacji EAT lub modyfikacji kodu (hot patching).</p>

<h3 id="iat-i-chkimg">IAT i !chkimg</h3>

<p>Niestety, tej samej techniki nie można zastosować do wyszukiwania modyfikacji IAT, z opisu !chkimg:</p>

<blockquote><p>Addresses that are occupied by the Import Address Table (IAT) are not checked.</p></blockquote>

<p>Dlaczego? Wynika to z tego, czym właściwie jest Import Address Table (patrz: <a href="http://sandsprite.com/CodeStuff/Understanding_imports.html">Understanding the Import Address Table</a>). Można przyjąć w uproszczeniu, że to co znajduje się w IAT w pamięci jest konstruowane dynamicznie, więc porównywanie pamięci z obrazem pliku jest bezcelowe.</p>

<h3 id="jak-wykryć-modyfikację-iat">Jak wykryć modyfikację IAT</h3>

<p>Z tego co wiem, sprawa jest dość prosta, choć pracochłonna. Należy zweryfikować, czy adresy w IAT wskazują na “prawidłowe” adresy. Czyli przypadkowo czy adres pokazujący na funkcję MessageBoxA (bo ta jest wykorzystana w przykładach) pokazuje rzeczywiście na adres, pod którym ta funkcja jest dostępna w bibliotece USER32. Problem w tym, że nie bardzo widzę prosty sposób na wyświetlenie IAT w WinDbg, ale mogę się mylić.</p>

<p>To, że coś nie jest proste, nie znaczy, że się nie da tego zrobić: <a href="http://www.osronline.com/ShowThread.cfm?link=155938">Import Table Functions</a>. Wykorzystując podane tam skrypty można zobaczyć coś takiego:</p>

<p>    (...)
    00408014  7e43b144 USER32!DialogBoxParamA
    00408018  7e424a4e USER32!EndDialog
    0040801c  7e42436e USER32!GetDlgItem
    <strong>00408020  7e4507ea USER32!MessageBoxA</strong>
    00408024  7e42f3c2 USER32!SendMessageA
    00408028  7e43c2e7 USER32!SendDlgItemMessageA
    0040802c  7e45085c USER32!MessageBoxExA
    (...)</p>

<p>    (...)
    00408014  7e43b144 USER32!DialogBoxParamA
    00408018  7e424a4e USER32!EndDialog
    0040801c  7e42436e USER32!GetDlgItem
    <strong>00408020  00401000 HookLibTest+0x1000</strong>
    00408024  7e42f3c2 USER32!SendMessageA
    00408028  7e43c2e7 USER32!SendDlgItemMessageA
    0040802c  7e45085c USER32!MessageBoxExA
    (...)</p>

<p>Pierwszy zrzut to przypadek “czysty”. Jak widać import wskazuje na USER32!MessageBoxA. W drugim przypadku import ten jest podmieniony i wskazuje na miejsce w obrębie HookLibTest.</p>

<p>Wykorzystany skrypt trzeba trochę zmodyfikować by móc go wykorzystać do nieco wygodniejszego wykrywania takich modyfikacji. Powinien przynajmniej wypisywać informację gdzie powinien dany element wskazywać, a jeszcze lepiej, gdyby wypisywał tylko te przypadki, w których teoria (to, gdzie powinien wskazywać) nie pokrywa się z praktyką (to, gdzie wskazuje).</p>

<h3 id="co-dalej">Co dalej?</h3>

<p>Co dalej? To dość oczywiste. Muszę tylko zrzucić pamięć w odpowiednim momencie, a później sprawdzić czy moja hipoteza jest słuszna. Jestem prawie pewien, że tak. Podobne rozwiązanie stosowane jest w Google Chrome jako część sandboxa (patrz: <a href="http://gynvael.coldwind.pl/?id=48">Sandbox w Google Chrome</a>). Warto też zastanowić się jak (nie)skuteczne jest tego typu rozwiązanie, przy czym najpierw dobrze jest ustalić przed czym tak naprawdę ma ono chronić.</p>

<p>Przy okazji w wolnej chwili sprawdzę, czy z wykrywaniem tego typu hooków (głównie IAT i EAT) jest w stanie poradzić sobie wspomniane już <em>Memoryze</em>. Jeśli chodzi o <em>Volatility</em> to warto tu wspomnieć o <a href="http://mhl-malware-scripts.googlecode.com/files/vap-0.1.zip">Volatility Analyst Pack</a> (patrz: <a href="http://mnin.blogspot.com/2009/12/new-and-updated-volatility-plug-ins.html">New and Updated Volatility Plug-ins Part II</a>), który teoretycznie robi dokładnie to, czego szukam. Teoretycznie, bo jeszcze nie udało mi się z powodzeniem uruchomić tych pluginów...</p>

<p><em>Oryginał tego wpisu dostępny jest pod adresem <a href="https://archive.mroczna-zaloga.org/archives/827-wykrywanie-api-hooking.html">Wykrywanie API hooking</a></em></p>

<p><small>Autor: <a href="https://wampir.mroczna-zaloga.org/o-mnie">Paweł Goleń</a></small></p>
]]></content:encoded>
      <guid>https://wampir.mroczna-zaloga.org/wykrywanie-api-hooking</guid>
      <pubDate>Sat, 13 Mar 2010 17:41:00 +0000</pubDate>
    </item>
  </channel>
</rss>