troushoo

WinAPIOverride:API コールの引数・戻り値の確認や、API の上書きが可能なオープンソースのツール (2)

概要

API コールの引数・戻り値の確認や、API の上書きが可能なオープンソースのツールWinAPIOverride を紹介します。
前回、API コールの引数・戻り値の確認方法を紹介しました。
今回は、API の上書き方法を紹介します。

内容

WinAPIOverride を使用すると、API を上書きすることが可能です。API を上書きするにはdll を作成しますが、サンプルコードも提供されており簡単に作成できます。
例えば、MessageBox() を上書きし、MessageBox() が呼ばれた際に表示される文字列を変更するサンプルコードがWinAPIOverride フォルダーの「winapioverride32_bin\Overriding Dll SDK\API\MessageBox」にあります。


以下、2つのセクションに分け、WinAPIOverride を用いて、API を上書きする方法を紹介します。
1. WinAPIOverride でAPI を上書きするdll の作成方法
2. 作成したdll を用いて、WinAPIOverride でAPI を上書きする方法

1. WinAPIOverride でAPI を上書きするdll の作成方法
WinAPIOverride から提供されているサンプルコードを修正し、CreateFileW() を上書きし、CreateFileW() が実行された際に、CreateProcess() を利用して電卓(= calc.exe)が実行されるようにする方法を紹介します。

1.1. WinAOPIOverride フォルダーの「winapioverride32_bin\Overriding Dll SDK\API\MessageBox\FakeMsgBox.sln」をダブルクリックします。
これは、WinAPIOverride から提供されているMessageBox() を上書きするdll のVisual Studio プロジェクトです。


1.2. FakeAPI.cpp を開きます。
サンプルコードでは、このFakeAPI.cpp で、MessageBox() を上書きしています。
すなわち、このソースのMessgeBox() に関連する部分をコメントアウトし、MessgeBox() の例にのっとりCreateFileW() を上書きするコーディングをすればOK という事になります。以下、具体的に見ていきます。


1.3. 上書きする新しい関数の宣言部分を編集します。
・MessageBox() に関連するコードはコメントアウトします。
・上書きする新しい関数名はmCreateFileW() としました。関数の引数は、上書きされるCreateFileW() と同じにする必要があります。

//int WINAPI mMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);
//int WINAPI mMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
HANDLE WINAPI mCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
                                         LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
                                         DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);

1.4. 上書きするAPI の情報を格納するaArrayFakeAPI[] の情報を編集します。
・MessageBox() に関連するコードはコメントアウトします。
・上書きするCreateFile() に関するコードを入力します。フォーマットは以下です。
{“ライブラリ名”、”上書きするAPI名”、”上書きする関数のハンドラー”、”スタックサイズ”、”FirstBytesCanExecuteAnywhereSize"}
(FirstBytesCanExecuteAnywhereSize の意味が不明な際は、0 を入力しておけば問題ありません)
STRUCT_FAKE_API pArrayFakeAPI[]=
{

// {_T("User32.dll"),_T("MessageBoxA"),(FARPROC)mMessageBoxA,StackSizeOf(HWND)+StackSizeOf(LPCSTR)+StackSizeOf(LPCSTR)+StackSizeOf(UINT),0},
// {_T("User32.dll"),_T("MessageBoxW"),(FARPROC)mMessageBoxW,StackSizeOf(HWND)+StackSizeOf(LPCWSTR)+StackSizeOf(LPCWSTR)+StackSizeOf(UINT),0},
   { _T("Kernel32.dll"), _T("CreateFileW"), (FARPROC)mCreateFileW, StackSizeOf(LPCWSTR) + StackSizeOf(DWORD) + StackSizeOf(DWORD) +
     StackSizeOf(LPSECURITY_ATTRIBUTES) + StackSizeOf(DWORD) + StackSizeOf(DWORD) + StackSizeOf(HANDLE), 0 },
   {_T(
""),_T(""),NULL,0,0}// last element for ending loops
};

5. 上書きする新し関数部分を編集します。
・MessageBox() に関連するコードはコメントアウトします。
・上書きする新しい関数であるmCreateFileW() は、CreateProcess() を利用し、電卓(= calc.exe)を実行する関数にしました。
//int WINAPI mMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
//{
// UNREFERENCED_PARAMETER(lpCaption);
//
// char szMsg[2*MAX_PATH];
// strcpy(szMsg,"Oups !! It's not your text !!!\r\n[Begin of] Original Text :\r\n");
// strncat(szMsg,lpText,MAX_PATH-strlen(szMsg)-1);
// szMsg[MAX_PATH-1]=0;// assume end of string
// return MessageBoxA(NULL,szMsg,"API Override:MessageBoxA",uType);
//}

//
//int WINAPI mMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
//{
// UNREFERENCED_PARAMETER(lpCaption);
// wchar_t szMsg[2*MAX_PATH];
//
// wcscpy(szMsg,L"Oups !! It's not your text !!!\r\n[Begin of] Original Text :\r\n");
// wcsncat(szMsg,lpText,MAX_PATH-wcslen(szMsg)-1);
// szMsg[MAX_PATH-1]=0;// assume end of string
//
// return MessageBoxW(NULL,szMsg,L"API Override:mMessageBoxW",uType);
//}


HANDLE WINAPI mCreateFileW( //上書きする関数
LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes, HANDLE hTemplateFile){
STARTUPINFO si;
PROCESS_INFORMATION pi;


ZeroMemory(&si, sizeof(si));
si.cb =
sizeof(si);
ZeroMemory(&pi,
sizeof(pi));

CreateProcess(_T(
"C:\\Windows\\System32\\calc.exe"), // 電卓(= calc.exe)を実行する
                    NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

return 0;
}

6. ビルドしdll を作成します。
(64bit でビルドした場合)FakeMsgBox64.dll が出来上がります。


2. 作成したdll を用いて、WinAPIOverride でAPI を上書きする方法
作成したdll を用いて、WinAPIOverride でCreateFileW() を上書きしてみます。
1. x86 のOS では「WinAPIOverride32.exe」を、x64 のOS では「WinAPIOverride64.exe」を起動します。


2. ここでは、新たにメモ帳を起動して、メモ帳で使用されているCreateFileW を上書きしてみます。
「Attach at application startup」にチェックを入れ、「Application Path」に「C:\Windows\System32\notepad.exe」を入力し、「Start」をクリックします。


3. “どのAPI コールを上書きするかを設定後、OK を押してください” といった旨のダイアログが表示されます。
ダイアログの言う通り、まだOK は押さないでください。


4. 「API Overriding configuration」に上記で作成したdll のパスを入力後、「Load」をクリックします。


5. 「API Overriding configuration」に、指定したdll があることを確認し、上記3 で表示されたダイアログの「OK」をクリックします。


6. 起動されたメモ帳をクリックすると、電卓が起動されます。
これは、メモ帳でCreateFileW() が実行されたため、上書きしたmCreateFileW() が実行され、結果CreateProcess() で電卓が起動されたためです。


情報元
WinAPIOverride 公式サイト (英語)

関連記事
API Monitor : アプリから呼ばれるAPI コールの引数・戻り値をモニター可能なフリーのツール (1)
API Monitor : アプリから呼ばれるAPI コールの引数・戻り値をモニター可能なフリーのツール (2)
WinAPIOverride:API コールの引数・戻り値の確認や、API の上書きが可能なオープンソースのツール (1)


  1. 2015/02/01(日) 22:45:29|
  2. ツール
  3. | トラックバック:0
  4. | コメント:0
<<.ocommand: アプリケーションからWinDbgにデバッガーコマンドを実行させる | ホーム | WinAPIOverride:API コールの引数・戻り値の確認や、API の上書きが可能なオープンソースのツール (1)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/222-32f49a09
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (22)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する