문제

HTTP 헤더를 스니핑하는 대본을 쓰려고 노력했습니다. 지금까지 나는 소켓을 포트 80에 묶었 고 패킷을받는 것처럼 보이지만 문자열 형태로 가져갈 수는 없습니다. 모든 출력은 "E"입니다. 바이트를 일찍 16 진수로 변경했는데 일부 데이터가 들어오는 것처럼 보이지만 현재 코드는 바이트를 문자열로 변경할 수 없습니다. 적절한 문자열을 줄 바이트를 디코딩하는 다른 방법이 있습니까?

byte[] input = BitConverter.GetBytes(1);
byte[] buffer = new byte[4096];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse(strIP), 80));
s.IOControl(IOControlCode.ReceiveAll, input, null);
int bytes;
bytes = s.Receive(buffer);
while (bytes > 0)
{
    log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes));
    bytes = s.Receive(buffer);
}
도움이 되었습니까?

해결책

a를 사용하여 데이터를 스니핑 할 때 날것의 소켓, 인터넷 프로토콜 (IP) 패킷을 받고 있습니다. 각 IP 패킷은 IP 헤더. 이 헤더는 일반적으로 20 바이트 길이이지만 그보다 길 수 있습니다. IP 헤더를 따르면 전송 레이어의 헤더가 있습니다. 전송 제어 프로토콜 (TCP) 헤더 또는 사용자 데이터 그램 프로토콜 (UDP) 헤더. 이 헤더가 원하는 데이터가 나온 후, 즉 HTTP입니다. 따라서 데이터를 구문 분석 할 때는 먼저 IP 헤더와 전송 계층 헤더를 건너 뛰어야합니다.

다른 팁

이 C# Network Sniffer의 소스 코드를 확인할 수 있습니다. 여기.

첫째, 원시 소켓을 사용하여 이것을 작성하고 iocontrol을 변경하는 이유는 무엇입니까? Vista에서 코드를 실행하려고 시도했지만 관리자 로서도 작동하지 않을 것입니다. 대신 tcpclient와 같은 더 높은 수준의 추상화를 사용할 수 있습니까?

둘째, 응답을 받기 전에 요청을 보내야합니다. 당신이 보낼 수있는 가장 간단한 요청은 "get / n"입니다. 여기서 n은 새 라인의 캐릭터입니다.

다음은 사용할 수있는 몇 가지 코드입니다 (쓰기 방법은 반환 값도 확인해야하지만 단순성을 위해 생략됩니다).

        using (TcpClient tcpClient = new TcpClient(strIP, 80))
        {
            using (Stream s = tcpClient.GetStream())
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes("GET /\n");
                s.Write(bytesToSend, 0, bytesToSend.Length);
                int bytes;
                byte[] buffer = new byte[4096];
                do
                {
                    bytes = s.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes));
                } while (bytes > 0);
            }
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top