使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.ComponentModelを。 使用してSystem.Dataを。 使用System.Drawingを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threading.Tasksを。 使用してのSystem.Windows.Formsを。 使用にSystem.Collectionsを。 使用してSystem.Runtime.InteropServicesを。 名前空間HOOKsend { クラスAPIHOOK { #regionのアピ声明 [DLLIMPORT(" Kernel32.dllの"、エントリーポイント= "GetModuleHandleA "項目CharSet = CharSet.Ansi)] 静的 にexternのIntPtrのGetModuleHandle(ストリングlpModuleName); [DLLIMPORT(" Kernel32.dllの」)] 静的 にextern BOOL VirtualProtect(のIntPtr lpAddress、INT dwSize、INT flNewProtect、REF INT lpflOldProtect); [DLLIMPORT (" Kernel32.dllの"、エントリーポイント= " lstrcpynA "、項目CharSet = CharSet.Ansi)] 静的 にexternIntPtr lstrcpyn(バイト [] lpString1、バイト [] lpString2、INT iMaxLength)。 [DLLIMPORT(" Kernel32.dllの" )] 静的 にexternのIntPtrのGetProcAddress(のIntPtr HMODULE、ストリングlpProcName)。 [DLLIMPORT(" Kernel32.dllの" )] 静的 にextern BOOL にFreeLibrary(のIntPtr HMODULE)。 #endregion #region常量定义表 のconst int型 PAGE_EXECUTE_READWRITE = 0x40の。 #endregionの #region变量表 のIntPtr ProcAddress。 int型 lpflOldProtect = 0 ; バイト [] OldEntry = 新しい バイト [ 5 ]。 バイト [] NewEntry = 新しい バイト [ 5 ]。 IntPtr OldAddress; #endregion パブリックAPIHOOK(){} 公共 APIHOOK(ストリング ModuleNameを、列PROCNAME、のIntPtr lpAddress) { インストール(ModuleNameを、PROCNAME、lpAddress)。 } パブリック ブールインストールします(文字列ModuleNameを、文字列PROCNAME、のIntPtr lpAddress) { のIntPtr HMODULE =のGetModuleHandle(ModuleNameを)は、// モジュールハンドルを取得 IF(HMODULE == IntPtr.Zero)リターン falseに、 ProcAddress =のGetProcAddress(HMODULE、PROCNAME); // 取得したエントリのアドレス IF( == IntPtr.Zero ProcAddress)復帰 はfalse ; IF(VirtualProtect(ProcAddress ,! 。5、PAGE_EXECUTE_READWRITE ,, REF)lpflOldProtect)復帰 はfalse ; // 修正記憶特性 Marshal.Copy(ProcAddress、OldEntry、0、5); // 最初の5バイト読み取る NewEntry = AddBytes(新しい新しい バイト [ 1 ] { 233 }、BitConverter.GetBytes((Int32)を((Int32)をlpAddress - (Int32)をProcAddress - 5))); // 計算新しいエントリジャンプ Marshal.Copy(NewEntry、0、ProcAddress、5); // バイト5書き込む前 OldEntry = AddBytes(OldEntry、新しい新しい バイト [ 5 ] { 233、0を、0、0、0 }); oldAddress = lstrcpyn(OldEntry、OldEntry、0); // ポインタ変数得る Marshal.Copy(BitConverter.GetBytes((ダブルする)((Int32)をProcAddress - (Int32)をoldAddress - 。5))、0、( IntPtr)(OldAddress.ToInt32()+ 。6)、4。); // 保存JMP にFreeLibrary(HMODULE); // 解放ハンドルモジュール リターン 真へ; } 公共 ボイドサスペンド() { Marshal.Copy(OldEntry、0、ProcAddress、5 )。 } 公共 ボイドは続行() { Marshal.Copy(NewEntry、0、ProcAddress、5 )。 } パブリック ブールアンインストール() { 場合(ProcAddress == IntPtr.Zero)リターン 偽。 Marshal.Copy(OldEntry、0、ProcAddress、5 )。 ProcAddress = IntPtr.Zero; 返す 真; } 静的 バイト [] AddBytes(バイト [] A、バイト[] B) { ArrayListのretArray = 新しいArrayListを()。 以下のために(INT iが= 0 ; I <a.Length; I ++ ) { retArray.Add([I])。 } ため(INT iは= 0 ; I <てb.length; I ++ ) { retArray.Add(B [I])。 } 戻り(バイト [])retArray.ToArray(typeof演算(バイト))。 } } }