Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Loading DLL from memory

Avatar for ry0kvn ry0kvn
January 22, 2020
110

Loading DLL from memory

Avatar for ry0kvn

ry0kvn

January 22, 2020
Tweet

Transcript

  1. メモリからDLLを読み込んでみる “DLL(dynamic link library) は通常、 Windows API の Loadlibrary 関数や

    LoadlibraryEX 関数を使ってディスク上から読み込んで使用する。 この LoadLibrary や LoadLibraryEx 関数は、ファイルシステム上のファイルでのみ機能し 直接メモリから DLL をロードすることはできない。 またこれを端的に実現できる公式の Windows API も存在しない。 メモリから DLL を読み 込むには疑似的な PE ローダーを実装する必要がある。 ”
  2. DLLとは? “A dynamic-link library (DLL) is a module that contains

    functions and data that can be used by another module (application or DLL).” 引用 : Dynamic-Link Libraries (Dynamic-Link Libraries) - Win32 apps
  3. PEファイルフォーマット “Portable Executable ( PE )は、主に 32 ビットおよび 64 ビット版の

    Microsoft Windows 上で 使用される実行ファイル (EXE) 、オブジェクトファイル、 DLL 、 SYS ( デバイスドライバ ) 、 FON フォントファイル等のファイルフォーマットである。 PE フォーマットは実行コードを管 理するために Windows OS ローダが必要とする情報をカプセル化するデータ構造であ る。 ” 引用 : https://ja.wikipedia.org/wiki/Portable_Executable
  4. メモリへの展開 On Disk On Memory DOS Header NT Header ...

    Section Header Section ... DOS Header NT Header Section Header ... Section ... そのまま配置 ローダーによる調整
  5. IATの解決前 IMAGE_IMPORT_DESCRIPTOR OriginalFirstThunk TimeDateStamp ForwarderChain Name FirstThunk kernel32.dll IMAGE_THUNK_DATA[0] IMAGE_THUNK_DATA[]

    (INT) IMAGE_THUNK_DATA[...] IMAGE_THUNK_DATA[N] IMAGE_THUNK_DATA[0] IMAGE_THUNK_DATA[] (IAT) IMAGE_THUNK_DATA[...] IMAGE_THUNK_DATA[N] 0x1, AcquireSRWLockExclusive ... 0x65D, uaw_wcsrchr
  6. IATの解決後 IMAGE_IMPORT_DESCRIPTOR OriginalFirstThunk TimeDateStamp ForwarderChain Name FirstThunk kernel32.dll IMAGE_THUNK_DATA[0] IMAGE_THUNK_DATA[]

    (INT) IMAGE_THUNK_DATA[...] IMAGE_THUNK_DATA[N] IMAGE_THUNK_DATA[0] IMAGE_THUNK_DATA[] (IAT) IMAGE_THUNK_DATA[...] IMAGE_THUNK_DATA[N] 0x1, AcquireSRWLockExclusive ... 0x65D, uaw_wcsrchr 0x7ff9ba0e0000 ... 0x7ff9be539000
  7. DLLの実行 using DLLEntry = BOOL(WINAPI*)(HINSTANCE dll, DWORD reason, LPVOID reserved);

    DLLEntry DllEntry = (ntHeaders->OptionalHeader.AddressOfEntryPoint + dllBase); (*DllEntry)(dllBase, DLL_PROCESS_ATTACH, 0);