C#のNET:APIHOOKソースコード

使用してシステムを。
使用して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、05); // 最初の5バイト読み取る    
            NewEntry = AddBytes(新しい新しい バイト [ 1 ] { 233 }、BitConverter.GetBytes((Int32)を((Int32)をlpAddress - (Int32)をProcAddress - 5))); // 計算新しいエントリジャンプ    
            Marshal.Copy(NewEntry、0、ProcAddress、5); // バイト5書き込む前    
            OldEntry = AddBytes(OldEntry、新しい新しい バイト [ 5 ] { 2330を000 }); 
            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演算バイト))。
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/wz2988/p/12527885.html