//폼시작시 콜백으로 패킷캡쳐 시작./////////////////////////
procedure TMainform.FormCreate(Sender: TObject);
var
I : integer;
Dev: ppcap_if_t;
AllDevs: ppcap_if_t;
ErrBuf: array[0 .. PCAP_ERRBUF_SIZE - 1] of Char;
rt : integer;
begin
//아답터 가져오기..
if AdapterNames = nil then exit;
AdapterNames.Capacity := 10;
i := pcap_findalldevs(@AllDevs, ErrBuf);
if i <> 0 then // if error occured
begin
memlog.Lines.Add(ErrBuf);
exit;
end;
Dev := AllDevs;
while Dev <> nil do
begin
AdapterNames.Add(Dev^.name);
Dev := Dev^.next;
end;
FAdapterName := pChar(AdapterNames.Strings[0]);
pcap_freealldevs(AllDevs);
//아답터 엔드~
//pcap열기
FillChar(errbuf,PCAP_ERRBUF_SIZE-1,'#0');
fp := pcap_open_Live(FAdapterName,65536,1,1000,errbuf);
if (fp = nil) then
begin
memlog.Lines.Add(errBuf);
exit;
end;
//캡쳐 콜백으로 연결
rt := pcap_loop(fp,0,@Packet_handler,0);
end;
//패킷보내는 함수////////////////////////////////////////////////
procedure TMainform.SendPacket();
const
UDP_BLOCK_DATA_SIZE = sizeof(ETH_HDR) + sizeof(IP_HDR) + sizeof(UDP_HDR) + 20;
var
i : integer;
packet : array[0..61] of Ansichar;
BufferStr: AnsiString;
Size : integer;
CH : byte;
begin
FAdapterName := '';
//Input 2
bufferStr := '7C 2E 0D 00 44 8F 6C F0 49 02 E5 C4' + ' 08 00 ' + {//DestMac/sourceMac/Type}
'45 00 00 30 C8 D9 00 00 80 11 ' + 'F0 12' + ' C0 A8 00 03 C0 A8 00 7D ' + {//IP정보 + 체크섬 + sorceIP/desinationIP}
'2F B8 26 B6 00 1C ' + 'BC CE ' + {//UDP정보 + 체크섬}
'10 14 59 6E 00 00 00 00 00 26 00 00 01 00 00 00 00 00 00 00'; {//UDP데이터}
//패킷을 버퍼에 넣는다.
Size := 0;
while BufferStr <> '' do
begin
i := Pos(' ', BufferStr);
if i = 0 then i := Length(BufferStr) + 1;
Ch := StrToInt('$' + Copy(BufferStr, 1, i - 1));
packet[Size] := AnsiChar(Ch);
BufferStr := Copy(BufferStr, i + 1, Length(BufferStr) - i);
inc(Size);
end;
//패킷보낸다.
if pcap_sendpacket(fp,packet,size) <> 0 then
begin
memlog.Lines.Add(format('Error Sending Packet: %s',[pcap_geterr(fp)])); //에러보이기
end;
end;
이렇게 할려고 하고 있습니다만....
패킷을 저렇게 구분하지 않고, 각 헤더값으로 구분해서 보낼려고 하는데 각 헤더값으로 구분하게되면 이상하게 저 값이 안나오더라구요 -_-;
각 헤더값으로 변경할때 어떻게 변환해야될지 난감합니다.(그로인헤 체크섬도 안맞구요 ㅠㅠ)
저걸 어떻게 넣어야될가요?;;
> 패킷을 저렇게 구분하지 않고, 각 헤더값으로 구분해서 보낼려고 하는데
var
packet : array[0..61] of Ansichar;
begin
ethHdr = (ETH_HDR*)packet;
// ethHdr 값 세팅
ipHdr = (IP_HDR)(unsigned char*)packet + sizeof(ETH_HDR));
// ipHdr 값 세팅
udpHdr = (UDP_HDR*)((unsigned char*)ipHdr + sizeof(IP_HDR));
// udpHdr 값 세팅
udpData = (unsigned char*)udpHdr + sizeof(UDP_HDR);
// udpDatat 값 세팅...
end;
1. 충분히 큰 버퍼를 잡는다.
2. 각 헤더 포인터(ethHdr, ipHdr, udpHdr, udpData)값을 알아 오고 그 포인터를 이용하여 각 헤더의 member 값 세팅을 해 준다.
그냥 이렇게 하면 되죠.
각 헤더의 포인터간의 간격이 제대로 되어 있는지 확인해 보세요.