C# 패킷 데이터 가져 오기
-
13-09-2019 - |
문제
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);
}
}