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());
}
}
}
}
我希望這是有幫助的。祝你好運!