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());
}
}
}
}
私はこれが便利です願っています。がんばろう!