私は、WinAPIフック関数でデータをバイパス/実行するためにフラムとトランポリンの概念を学びました(別の実行可能ファイルで、DLL注入)。これまでのところ、私はアセンブリとCの混合物を使ってトランポリンとフックを作る方法を知っていますが、私は何かが欠けているように、Cを使うだけではできないようです。誰かが私が間違ってやっていることやそれをどうやって解決するか教えてもらえればと思っています。WinAPIフックのためのフックとトランポリンの機能の作り方
は今の私のコード:
#include <Windows.h>
unsigned char* address = 0;
__declspec(naked) int __stdcall MessageBoxAHookTrampoline(HWND Window, char* Message, char* Title, int Type) {
__asm
{
push ebp
mov ebp, esp
mov eax, address
add eax, 5
jmp eax
}
}
int __stdcall MessageBoxAHook(HWND Window, char* Message, char* Title, int Type) {
wchar_t* WMessage = L"Hooked!";
wchar_t* WTitle = L"Success!";
MessageBoxW(0, WMessage, WTitle, 0);
return MessageBoxAHookTrampoline(Window, Message, Title, Type);
}
unsigned long __stdcall Thread(void* Context) {
address = (unsigned char*)GetProcAddress(LoadLibraryA("user32"), "MessageBoxA");
ULONG OP = 0;
if (VirtualProtect(address, 1, PAGE_EXECUTE_READWRITE, &OP)) {
memset(address, 0x90, 5);
*address = 0xE9;
*(unsigned long*)(address + 1) = (unsigned long)MessageBoxAHook - (unsigned long)address - 5;
}
else {
MessageBoxA(0, "Failed to change protection", "RIP", 0);
}
return 1;
}
// Entry point.
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
CreateThread(0, 0, Thread, 0, 0, 0);
}
else if (fdwReason == DLL_PROCESS_DETACH) {
}
return true;
}
そこで質問です:どのように私は、関数がフックをインストールし、私は簡単にそれを使用することができるようにトランポリンを返します
InstallHook
を言う作るでしょうか? 関数のプロトタイプはおそらく:void* InstallHook(void* originalFunc, void* targetFunc, int jumpsize)
なので、私はオンラインで読むことを理解しましたが、何がjumpsize
に使用されるのか分かりません。
これまでのところ、最初の5バイトを保存して復元する必要があり、元のフック機能のアドレスにジャンプする必要があることがわかりました。だから私はメモリを割り当てるためにmallocを使う必要があります。memcpyはバイトをコピーします。0xE9
はジャンプ命令などの値ですが、純粋なCを使って実装する方法は分かりません。I figure it would be something similar to the code in this question.私はWinAPI関数のための純粋なCを使用してトランポリンを返すフック関数を書いていますか?
フックとトランポリンが単独で純粋なCで書かれたことができない、いくつかの低レベルのアセンブリが必要とされ、コールスタックを直接操作する必要があるため。あなたはそれを避けることはできません。あなたのためのこの種のものを処理する利用可能なライブラリをフックしてたくさんあります。なぜそれらの1つを使用しないのですか? –
@RemyLebeau私はあなたがmemcpyとmemsetを使ってそれを行うことができるという印象を受けましたか?私が話したプログラマーの少なくとも一人がそれを暗示していました。 – Annabelle
確かに、実行時にメモリのブロックを割り付け、生のアセンブリ命令をそのブロックにmemcpyすると、しかし、それはフックとトランスフリンが実行時にアセンブリ命令を使用しているという事実を変えず、純粋なC言語で書かれていません。 –