2011-08-06 44 views
2

freecap類似。通過代理隧道傳輸應用程序的所有連接

我正在尋求開發一種解決方案,該方案僅適用於某些軟件,並且無形地運行給最終用戶。我想將tunneler與一個軟件包捆綁在一起(我無法訪問源代碼)。

我聽說要做到這一點的唯一方法是類似於freecap所做的。使用DLL注入,然後掛鉤到WinSock API。我只是想知道除了通過.NET或C++的DLL注入之外還有更簡單的方法。我可以將大多數C++轉換爲C#,這就是爲什麼我對該集合開放。

如果沒有,我將不勝感激任何建議或鏈接,您可以提供關於DLL注入和掛鉤到WinSock API。也許是一個類似於freecap的開源項目。

或者,如果您知道可以通過命令行啓動的應用程序,則說明freecap.exe --start myprogram.exe這樣,freecap將以無形方式運行到最終用戶。

回答

3

API掛鉤基本上是做到這一點的唯一方法。有許多方法可以用來鉤入WinSock並讓代碼運行和DLL注入(通過替換進程中的條目「導入地址表」)是最直接的。

動態鏈接進程'IAT存儲包含執行期間需要的函數的庫的內存位置。此技術通過修改此表中的條目以指向另一個庫(其中包含您的代碼)來工作。還有其他方法可以將代碼插入到另一個進程中,但如果您只想影響系統上單個進程的行爲,那麼這是最穩定的。

如果你想避免自己完成大部分的實現工作,只專注於讓某些東西運行,我會建議使用EasyHook

EasyHook按照GNU Lesser General Public License or LGPL許可。

從網站:

EasyHook開始的地方Microsoft Detours結束。

該項目支持延長(掛鉤)非託管代​​碼(API)的純管理的,從內 全面管理的環境下,如使用的是Windows 2000 SP4及更高版本,包括Windows XP 64位, 於Windows Vista x64和Windows Server 2008的C# 64。此外,還支持32位和64位內核模式掛鉤 以及非託管用戶模式API,該API允許您在客戶PC上不需要NET Framework的情況下掛接目標。實驗性的隱形注射隱藏了當前AV軟件的絕大部分。

如上所述,該項目應該允許您極大地簡化掛鉤過程,並允許您在使用C#時進行此操作。

從文檔,這裏的注入簡單Filemon(現在的Process Monitor)型工具到目標進程的作者例如:

// Copyright © 2008 Christoph Husse 

using System; 
using System.Collections.Generic; 
using System.Runtime.Remoting; 
using System.Text; 
using EasyHook; 

namespace FileMon 
{ 
    public class FileMonInterface : MarshalByRefObject 
    { 
     public void IsInstalled(Int32 InClientPID) 
     { 
      Console.WriteLine("FileMon has been installed in target {0}.\r\n", InClientPID); 
     } 

     public void OnCreateFile(Int32 InClientPID, String[] InFileNames) 
     { 
      for (int i = 0; i < InFileNames.Length; i++) 
      { 
       Console.WriteLine(InFileNames[i]); 
      } 
     } 

     public void ReportException(Exception InInfo) 
     { 
      Console.WriteLine("The target process has reported an error:\r\n"+ InInfo.ToString()); 
     } 
    } 

    class Program 
    { 
     static String ChannelName = null; 

     static void Main(string[] args) 
     { 
      try 
      { 
       Config.Register( 
       "A FileMon like demo application.", 
       "FileMon.exe", 
       "FileMonInject.dll"); 

       RemoteHooking.IpcCreateServer<FileMonInterface>(ref ChannelName, WellKnownObjectMode.SingleCall); 

       RemoteHooking.Inject( 
       Int32.Parse(args[0]), 
       "FileMonInject.dll", 
       "FileMonInject.dll", 
       ChannelName); 

       Console.ReadLine(); 
      } 
      catch (Exception ExtInfo) 
      { 
       Console.WriteLine("There was an error while connecting to target:\r\n{0}", ExtInfo.ToString()); 
      } 
     } 
    } 
} 

我希望這是有幫助的。祝你好運!