質問

C# アプリケーションにサーバー B とのソケットを開くフラッシュ アプリケーション A をロードした場合、A とサーバー B の間で交換されるパケットを読み取ることができるようにローカル フックをセットアップすることは可能ですか?

  • 必要に応じて Flash アプリケーションのソースを入手することもありますが、それらを作成したのは私ではありません
  • 私は C# (正直に言うと、Windows 用のこの種のアプリケーションを作成するのに最適な言語は何かとまだ考えています) とフックの初心者なので、どんな例でも本当に感謝します :)
  • 私はクライアント側で作業しています
役に立ちましたか?

解決

はい、できます。使用する必要があります イージーフック C# からのネイティブ ソケット API 呼び出しをフックするライブラリ。そしてフックを付けることで、 接続する, 送信 そして 受信 Windows ベースのアプリケーションであらゆるトラフィックをフックできる機能。

以下に例を示します。

private IntPtr _socketsLib;
private LocalHook _createConnectHook;
private LocalHook _createRecvHook;
private LocalHook _createSendHook;

_socketsLib = NativeAPI.LoadLibrary("Ws2_32.dll");
_createConnectHook = LocalHook.Create(LocalHook.GetProcAddress("Ws2_32.dll", "connect"), new NativeSocketMethod.DConnect(connect_Hooked), this);
_createRecvHook = LocalHook.Create(LocalHook.GetProcAddress("Ws2_32.dll", "recv"),
                                           new NativeSocketMethod.Drecv(recv_Hooked), this);

_createSendHook = LocalHook.Create(LocalHook.GetProcAddress("Ws2_32.dll", "send"),
                              new NativeSocketMethod.Dsend(send_Hooked), this);
_createConnectHook.ThreadACL.SetExclusiveACL(new int[1]);
_createRecvHook.ThreadACL.SetExclusiveACL(new int[1]);
_createSendHook.ThreadACL.SetExclusiveACL(new int[1]);

private static int connect_Hooked(IntPtr socketHandle, ref NativeSocketMethod.sockaddr name, ref int namelen)
    {
        // TODO: do something with data here
        return NativeSocketMethod.connect(socketHandle, ref name, ref namelen);
    }

private static int recv_Hooked(IntPtr socketHandle, IntPtr buf, int count, int socketFlags)
    {
        // TODO: do something with data here
        return NativeSocketMethod.recv(socketHandle, buf, count, socketFlags);
    }

private static int send_Hooked(IntPtr socketHandle, IntPtr buf, int count, int socketFlags)
    {
        // TODO: do something with data here
        return NativeSocketMethod.send(socketHandle, buf, count, socketFlags);
    }

そしてNativeSocketMethod.cs

public static class NativeSocketMethod
{
    [DllImport("Ws2_32.dll")]
    public static extern int connect(IntPtr socketHandle, ref sockaddr Address, ref int Addresslen);
    [DllImport("Ws2_32.dll")]
    public static extern int getpeername(IntPtr s, ref sockaddr Address, ref int namelen);
    [DllImport("ws2_32.dll")]
    public static extern IntPtr inet_ntoa(in_addr a);
    [DllImport("ws2_32.dll")]
    public static extern ushort ntohs(ushort netshort);
    [DllImport("Ws2_32.dll")]
    public static extern int recv(IntPtr socketHandle, IntPtr buf, int Buffercount, int socketFlags);
    [DllImport("Ws2_32.dll")]
    public static extern int send(IntPtr socketHandle, IntPtr buf, int count, int socketFlags);

    public enum AddressFamily
    {
        AppleTalk = 0x11,
        BlueTooth = 0x20,
        InterNetworkv4 = 2,
        InterNetworkv6 = 0x17,
        Ipx = 4,
        Irda = 0x1a,
        NetBios = 0x11,
        Unknown = 0
    }

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true)]
    public delegate int DConnect(IntPtr socketHandle, ref NativeSocketMethod.sockaddr Address, ref int Addresslen);

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true)]
    public delegate int Drecv(IntPtr socketHandle, IntPtr buf, int Buffercount, int socketFlags);

    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet=CharSet.Unicode, SetLastError=true)]
    public delegate int Dsend(IntPtr socketHandle, IntPtr buf, int count, int socketFlags);

    [StructLayout(LayoutKind.Sequential)]
    public struct in_addr
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)]
        public byte[] sin_addr;
    }

    public enum ProtocolType
    {
        BlueTooth = 3,
        ReliableMulticast = 0x71,
        Tcp = 6,
        Udp = 0x11
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct sockaddr
    {
        public short sin_family;
        public ushort sin_port;
        public NativeSocketMethod.in_addr sin_addr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
        public byte[] sin_zero;
    }

    public enum SocketType
    {
        Unknown,
        Stream,
        DGram,
        Raw,
        Rdm,
        SeqPacket
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top