通过代理对应用程序的所有连接进行隧道化

Tunneling all connections of an application through a proxy

本文关键字:连接 隧道 代理 应用程序      更新时间:2023-10-16

与freecap类似。

我希望开发一种解决方案,只在某些软件上工作,对最终用户不可见。我想将隧道器与软件包捆绑在一起(我无法访问其源代码)。

我听说这样做的唯一方法与freecap类似。使用DLL注入,然后挂钩到WinSock API。我只是想知道是否有一个更简单的方法除了通过。net或c++注入DLL。我可以把大多数c++转换成c#,所以这就是为什么我对这个集合开放。

如果没有,我将感谢您提供的有关DLL注入和挂钩到WinSock API的任何建议或链接。也许是一个类似于freecap的开源项目。

或者,如果你知道一个可以通过命令行启动的应用程序,比如freecap.exe --start myprogram.exe,这样freecap就会对最终用户不可见地运行。

API挂钩基本上是实现此目的的唯一方法。有多种方法可以用来钩入WinSock并使代码运行,DLL注入(通过替换进程"导入地址表"中的项)是其中最直接的方法。

动态链接进程的IAT存储了包含进程执行过程中所需函数的库的内存位置。该技术的工作原理是修改该表中的条目,使其指向另一个库(包含您的代码的库)。还有其他方法可以将代码插入到另一个进程中,但如果你只想影响系统中单个进程的行为,这是最稳定的方法。

如果你想避免自己做大部分的实现工作,只专注于让一些东西运行,我建议使用EasyHook。

EasyHook根据GNU宽松通用公共许可证或LGPL进行许可。

来自网站:

EasyHook从Microsoft Detours结束的地方开始。

这个项目支持扩展(挂钩)非托管代码(api)与纯托管代码,从内部一个完全托管的环境,比如c#,使用Windows 2000 SP4及更高版本,包括Windows XP x64,Windows Vista x64和Windows Server 2008 x64。还支持32位和64位内核模式的钩子以及一个非托管的用户模式API,它允许您在不需要。NET的情况下挂钩目标客户PC上的框架。一个实验性的隐形注入隐藏钩从大多数当前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}.rn", 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:rn"+ 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:rn{0}", ExtInfo.ToString()); 
           } 
       } 
    } 
}
我希望这是有帮助的。好运!