与freecap类似。
我希望开发一种仅适用于某些软件的解决方案,并且无形地运行给最终用户。我想将隧道捆绑软件包(我无法访问源代码)。
我听说这样做的唯一方法与freecap相似。使用DLL注入然后挂钩到WinSock API。我只是想知道除了通过.NET或C ++注入DLL之外是否还有一种更简单的方法。我可以将大多数C ++转换为C#,这就是为什么我对那个集合开放。
如果没有,我将不胜感激任何关于DLL注入和挂钩到WinSock API的建议或链接。也许是类似于freecap的开源项目。
或者,如果您知道我可以通过命令行启动的应用程序说freecap.exe --start myprogram.exe
这样,freecap将无形地运行给最终用户。
答案 0 :(得分:3)
API挂钩基本上是唯一的方法。您可以使用多种方法挂钩到WinSock并运行代码,并且DLL注入(通过替换进程'导入地址表中的条目)是最简单的方法。
动态链接进程'IAT存储库的内存位置,这些库包含执行期间所需的函数。此技术的工作原理是修改此表中的条目以指向另一个库(包含您的代码的库)。还有其他方法可以将代码插入到另一个进程中,但如果您只想影响系统上单个进程的行为,则这是最稳定的。
如果你想避免自己完成大部分的实施工作而只是专注于运行某些东西,我建议你使用EasyHook。
EasyHook根据GNU Lesser General Public License or LGPL获得许可。
来自网站:
EasyHook从Microsoft Detours结束的地方开始。
该项目支持从内部扩展(挂钩)非托管代码(API)和纯托管代码(API) 使用Windows 2000 SP4及更高版本的C#等完全托管环境,包括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}.\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());
}
}
}
}
我希望这会有所帮助。祝你好运!