2021年7月13日火曜日

FRIDAでKERNEL32.DLLのSearchPathWフック

(注)これは、FRIDAのIRC/Telegramチャンネルに寄せられたユーザーの課題に答えるための、簡単なブログ記事です。 

今回は、SearchPathWのWINAPIにフックすることにします。
 
1
2
3
4
5
6
7
8
DWORD SearchPathW(
  LPCWSTR lpPath,
  LPCWSTR lpFileName,
  LPCWSTR lpExtension,
  DWORD   nBufferLength,
  LPWSTR  lpBuffer,
  LPWSTR  *lpFilePart
);

この場合、最も意味のある引数を取得したいと考えており、この場合は2番目の引数であるlpFileNameを取得します。必要であれば、残りのフィールドから情報を抽出することも可能です。 この例では、次のようなプログラムを使用しています。

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// searchPathCpp.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <Windows.h>

int main()
{
    TCHAR lpBuffer[MAX_PATH];
    LPWSTR *lpFilePart{};
    DWORD result;

    result = SearchPath(NULL, L"c:\\windows\\", NULL, MAX_PATH, lpBuffer, lpFilePart);
    std::cout << "SearchPath retval: " << result;
}

c:/windowsのパスが存在するかどうかを確認するだけです。コンパイルして、アタッチしてみましょう。 

 frida -f searchPathCpp.exe
[Local::searchPathCpp.exe]-> searchPathPtr = Module.getExportByName("KERNELBASE.DLL", "SearchPathW") 
"0x76fc02f0" 
[Local::searchPathCpp.exe]-> Interceptor.attach(searchPathPtr, { onEnter: function (args) { console.log(args[1].readUtf 16String()); } }) {} 
[Local::searchPathCpp.exe]-> %resume 

 順を追って説明します。 KERNELBASE.DLLのSearchPathWのポインタを取り出す

[Local::searchPathCpp.exe]-> searchPathPtr = Module.getExportByName("KERNELBASE.DLL", "SearchPathW") 
"0x76fc02f0" 

InterceptorのonEnterフックを入力する
1
2
3
4
5
Interceptor.attach(searchPathPtr, { 
        onEnter: function (args) { 
                console.log(args[1].readUtf16String()); 
        } 
});

アプリを再開するために「%resume」と入力すると、次のような出力が得られます

[Local::searchPathCpp.exe]-> %resume Search
Path retval: 11c:\windows\ 

 他に質問があれば、Twitterで @entdark_ に連絡してください。

0 件のコメント:

コメントを投稿

FRIDAでHTTPSENDREQUESTEXのLPINTERNET_BUFFERSA構造体の解析

ソースはこちら https://azurda.github.io/posts/lpinternet_buffersa_struct_parse/