2011-08-06 11 views
2

freecapと似ています。プロキシを介したアプリケーションのすべての接続のトンネリング

私は特定のソフトウェア上だけで動作し、エンドユーザーに見えないように走るソリューションを開発するために探しています。私はソフトウェアパッケージ(私はソースコードにアクセスできない)とトンネルをバンドルしたいと思います。

これを行うための唯一の方法は、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終了を開始します。

このプロジェクトは、Windows 2000 SP4を使用してC#のような 内から完全に管理された環境、純粋に管理するもので(フック)アンマネージコード(API)を拡張し、以降、Windows XP x64の、 Windows Vistaのx64およびWindows Server 2008の含むをサポートしていますx64。また、32ビットおよび64ビットのカーネルモードフッキングは、 と、顧客PC上でNET フレームワークを必要とせずにターゲットをフックできるアンマネージドユーザーモードAPIと同様にサポートされています。実験的なステルス注射は、現在のAVソフトウェアの のほとんどからのフッキングを隠す。

このように、このプロジェクトでは、フッキングプロセスを大幅に簡素化できるようになり、C#で作業している間に行うことができます。ドキュメントから

は、ここでターゲットプロセスに簡単なFilemon(現在プロセスモニター)型ユーティリティを注入する著者の一例です:

// 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()); 
      } 
     } 
    } 
} 

私はこれが便利です願っています。がんばろう!

関連する問題