2010-12-23 2 views
0

C# 응용 프로그램에서 서버 B가있는 소켓을 여는 플래시 응용 프로그램 A를로드하면 A와 B 서버간에 교환되는 패킷을 읽을 수 있도록 로컬 후크를 설정할 수 있습니까?후크 플래시 응용 프로그램

  • 필요한 경우 내가 플래시 응용 프로그램 소스를 얻을 수 있습니다,하지만 난 (솔직히 그들에게 나는 C#을 새로운 해요
  • 을 쓴 사람이 아니에요, 난 아직도 궁금하네요에 가장 좋은 언어 무엇 Windows의 경우) 및 후킹에 대한 응용 프로그램의이 종류를 쓰기 때문에, 어떤 예를 정말 감사하겠습니다 :) 내가 클라이언트 측 예 당신이 할 수있는
+0

와이어 샤크를 사용해보십시오 : 여기

은 예입니다? – Amy

+0

달성하려는 목표는 무엇입니까? 개발 중에 분석 할 패킷을 보려면 @ yodaj007이 (가) 가야합니다! 런타임 중에 뭔가를해야한다면 api-hooking으로 들어가기 전에 pcap 라이브러리를 고려해야합니다. – TCS

+0

wireshark이 첫 번째 옵션 이었지만 모든 무선 카드가 promiscous 모드로 설정되지는 않았습니다. (예를 들어 광산입니다.) 모든 Windows PC에서 프로그램을 실행해야합니다. 다른 솔루션을 사용하고 싶지만 아무 것도 내 마음에 오지 않습니다 : 대안을 제안하는 것이 자유 롭습니다 :) – kaharas

답변

1

을 일하고 있어요

  • . EasyHook 라이브러리를 사용하여 C#에서 네이티브 소켓 API 호출을 후크해야합니다. connect, sendrecv에 후크를 배치하면 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 
        } 
    } 
    
  • +0

    이 대답을 참고하십시오. "A와 서버 B간에 교환 된 패킷을 읽을 수 있도록 로컬 훅을 설정할 수 있습니까?"라는 질문에 대한 답입니다. –

    +0

    좋은 예입니다.나는 모든 _variables 선언을 "void hook()"함수 (즉, ConsoleApplication)에서 recv, connect 및 send 함수에 결코 도달하지 못했습니다. ws2_32.dll ... http를 사용하는 프로그램을 시작한다는 것을 알고 있습니다. : //paste.kde.org/727724/ – dezza