2017-07-27 7 views
1

フックを覚えようとしていて、.exeのsend/recv関数だけをフックしたい。C++フックws2_32.dll recv

私は.dllファイルとしてプロジェクトをビルドして、.exeの

にそれを注入する今私の問題は、私はこだわっていますですよ。

私はこれは私の.cppある ..次に何をすべきかにはほとんどのガイドPLS

..次の私が受信されていたパケットを見たいのですが、成功したrecv関数のアドレスを見つけることができています

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "dll.h" 

#include <Winsock.h> 
#pragma warning(disable:4996) 
#pragma comment (lib,"ws2_32.lib") 

typedef int(*WINAPI oldsend)(SOCKET s, const char* buf, int len, int flags); 



void Proc_Attach() 
{ 
DWORD dwProtect; 
HINSTANCE hLib = LoadLibrary(L"WS2_32.dll"); 
DWORD OldFuncAddr = (DWORD)GetProcAddress(hLib, "recv"); 
WCHAR szTest[100]; // WCHAR is the same as wchar_t 
        // swprintf_s is the same as sprintf_s for wide characters 
swprintf_s(szTest, 100, L"%d", OldFuncAddr); // use L"" prefix for wide chars 
MessageBox(0, szTest, L"A", MB_ICONINFORMATION); 
//MessageBox(0, L" Process Attached!\n", L"Hi", MB_ICONINFORMATION); 
} 



BOOL APIENTRY DllMain(HINSTANCE hInst  /* Library instance handle. */, 
DWORD reason  /* Reason this function is being called. */, 
LPVOID reserved  /* Not used. */) 
{ 
switch (reason) 
{ 
case DLL_PROCESS_ATTACH: 

    Proc_Attach(); 

    break; 

case DLL_PROCESS_DETACH: 

    break; 

case DLL_THREAD_ATTACH: 

    break; 

case DLL_THREAD_DETACH: 

    break; 
} 


return TRUE; 
} 

ヘッダファイル

#pragma once 
#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void Proc_Attach(void); 



#endif /* _DLL_H_ */ 

答えて

1

私の知る限りでは、API呼び出しをフックの3通りの方法があります。

  1. API呼び出しのアドレスを含むインポートアドレステーブルを書き換えるアプリケーションにDLLを注入します。これにより、アプリケーションが代わりに関数を呼び出すようになります。
  2. フックしてアプリケーションのルートディレクトリに配置するAPI呼び出しで、DLLと同じ名前のダミーDLLを作成します。これにより、システムの代わりにAPIがロードされます。
  3. API呼び出しをJMP yourfuncなどのコードで書き換えて、同様の効果を得てください。

方法1を使用すると、this one、またはthis oneのように、それをGoogleにあれば、それはでもWikipedia page about Hookingに、様々な例で説明しています、かなり人気です。

方法2はちょっと難しいですが、模倣しているものと同じ名前とエクスポートでDLLを作成し、関心のないすべての機能をバイパスして、カスタムコードを書き込む必要がありますあなたはそうです。メモリを変更する必要がないため、外部プログラムを使用してこのDLLを明示的に注入する必要はないため、この方法は非常にきれいです.Windowsはあなたのためだけであり、プラスでは一般的にアンチデバッグおよびアンチハック検出。 Here is an exampleそれを行う方法(32ビット)。

方法3はMicrosoft's favoriteです。これには特に有利な点があります。あらゆる関数、メソッド、または仮想呼び出しをフックできます。これは外部的に呼び出される関数に依存しないため、例えばDirectXメソッドをフックするのは非常に一般的です。これは、FRAPS、Discord Overlay、Overwolf Overlayなど、ゲームや記録ゲームプレイにオーバーレイを配置する他のほとんどすべてのソフトウェアで使用される方法です。特にMicrosoft Detoursを使用する必要はありません。generic alternativeもあります。

関連する問題