📄 idrawfunctions.pas
字号:
// copy header
Move(HdrIcmp, ABuffer, Id_ICMP_MASK_HSIZE);
Result := TRUE;
end;
function IdRawBuildIcmpUnreach(AType, ACode: byte; AnOrigLen: word;
AnOrigTos: byte; AnOrigId, AnOrigFrag: word; AnOrigTtl, AnOrigProtocol: byte;
AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload, APayloadSize: integer; var ABuffer): boolean;
var
HdrIcmp: TIdIcmpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrIcmp.icmp_type := AType;
HdrIcmp.icmp_code := ACode;
HdrIcmp.icmp_hun.echo.id := 0;
HdrIcmp.icmp_hun.echo.seq := 0;
// attach original header
IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
pointer(integer(@ABuffer) + Id_ICMP_UNREACH_HSIZE)^);
// copy header
Move(HdrIcmp, ABuffer, Id_ICMP_UNREACH_HSIZE);
Result := TRUE;
end;
function IdRawBuildIcmpTimeExceed(AType, ACode: byte; AnOrigLen: word; AnOrigTos: byte;
AnOrigId, AnOrigFrag: word; AnOrigTtl: byte; AnOrigProtocol: byte;
AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload; APayloadSize: integer; var ABuffer): boolean;
var
HdrIcmp: TIdIcmpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrIcmp.icmp_type := AType;
HdrIcmp.icmp_code := ACode;
HdrIcmp.icmp_hun.echo.id := 0;
HdrIcmp.icmp_hun.echo.seq := 0;
// attach original header
IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
pointer(integer(@ABuffer) + Id_ICMP_TIMEXCEED_HSIZE)^);
// copy header
Move(HdrIcmp, ABuffer, Id_ICMP_TIMEXCEED_HSIZE);
Result := TRUE;
end;
function IdRawBuildIcmpTimestamp(AType, ACode: byte; AnId, ASeq: word;
AnOtime, AnRtime, ATtime: TIdNetTime; const APayload; APayloadSize: integer; var ABuffer): boolean;
var
HdrIcmp: TIdIcmpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrIcmp.icmp_type := AType;
HdrIcmp.icmp_code := ACode;
HdrIcmp.icmp_hun.echo.id := GStack.WSHToNs(AnId);
HdrIcmp.icmp_hun.echo.seq := GStack.WSHToNs(ASeq);
HdrIcmp.icmp_dun.ts.otime := GStack.WSHToNL(AnOtime); // original timestamp
HdrIcmp.icmp_dun.ts.rtime := GStack.WSHToNL(AnRtime); // receive timestamp
HdrIcmp.icmp_dun.ts.ttime := GStack.WSHToNL(ATtime); // transmit timestamp
// copy payload
if ((@APayload <> nil) and (APayloadSize > 0)) then
Move(APayload, pointer(integer(@ABuffer) + Id_ICMP_TS_HSIZE)^, APayloadSize);
// copy header
Move(HdrIcmp, ABuffer, Id_ICMP_TS_HSIZE);
Result := TRUE;
end;
function IdRawBuildIcmpRedirect(AType, ACode: byte; AGateway: TIdInAddr;
AnOrigLen: word; AnOrigTos: byte; AnOrigId, AnOrigFrag: word; AnOrigTtl, AnOrigProtocol: byte;
AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload; APayloadSize: integer; var ABuffer): boolean;
var
HdrIcmp: TIdIcmpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrIcmp.icmp_type := AType;
HdrIcmp.icmp_code := ACode;
HdrIcmp.icmp_hun.gateway := AGateway; // gateway address
// attach original header
IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
pointer(integer(@ABuffer) + Id_ICMP_REDIRECT_HSIZE)^);
// copy header
Move(HdrIcmp, ABuffer, Id_ICMP_REDIRECT_HSIZE);
Result := TRUE;
end;
function IdRawBuildIgmp(AType, ACode: byte; AnIp: TIdInAddr;
const APayload, APayloadSize: integer; var ABuffer): boolean;
var
HdrIgmp: TIdIgmpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrIgmp.igmp_type := AType;
HdrIgmp.igmp_code := ACode;
HdrIgmp.igmp_sum := 0;
HdrIgmp.igmp_group := AnIp; // group address or 0
// copy payload
if ((@APayload <> nil) and (APayloadSize > 0)) then
Move(APayload, pointer(integer(@ABuffer) + Id_IGMP_HSIZE)^, APayloadSize);
// copy header
Move(HdrIgmp, ABuffer, sizeof(HdrIgmp));
Result := TRUE;
end;
function IdRawBuildRip(ACommand, AVersion: byte; ARoutingDomain, AnAddressFamily,
ARoutingTag: word; AnAddr, AMask, ANextHop, AMetric: longword;
const APayload; APayloadSize: integer; var ABuffer): boolean;
var
HdrRip: TIdRipHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrRip.rip_cmd := ACommand;
HdrRip.rip_ver := AVersion;
HdrRip.rip_rd := GStack.WSHToNS(ARoutingDomain);
HdrRip.rip_af := GStack.WSHToNS(AnAddressFamily);
HdrRip.rip_rt := GStack.WSHToNS(ARoutingTag);
HdrRip.rip_addr := GStack.WSHToNL(AnAddr);
HdrRip.rip_mask := GStack.WSHToNL(AMask);
HdrRip.rip_next_hop := GStack.WSHToNL(ANextHop);
HdrRip.rip_metric := GStack.WSHToNL(AMetric);
// copy payload
if ((@APayload <> nil) and (APayloadSize > 0)) then
Move(APayload, pointer(integer(@ABuffer) + Id_RIP_HSIZE)^, APayloadSize);
// copy header
Move(HdrRip, ABuffer, sizeof(HdrRip));
Result := TRUE;
end;
// TODO: check nibbles in TCP header
function IdRawBuildTcp(ASourcePort, ADestPort: word; ASeq, AnAck: longword;
AControl: byte; AWindowSize, AnUrgent: word;
const APayload, APayloadSize: integer; var ABuffer): boolean;
var
HdrTcp: TIdTcpHdr;
begin
// init result
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrTcp.tcp_sport := GStack.WSHToNS(ASourcePort);
HdrTcp.tcp_dport := GStack.WSHToNS(ADestPort);
HdrTcp.tcp_seq := GStack.WSHToNL(ASeq);
HdrTcp.tcp_ack := GStack.WSHToNL(AnAck); // acknowledgement number
HdrTcp.tcp_flags := AControl; // control flags
HdrTcp.tcp_x2off := ((Id_TCP_HSIZE div 4) shl 4) + 0; // 20 bytes div 4, x2 unused
HdrTcp.tcp_win := GStack.WSHToNS(AWindowSize); // window size
HdrTcp.tcp_sum := 0;
HdrTcp.tcp_urp := AnUrgent; // urgent pointer
// copy payload
if ((@APayload <> nil) and (APayloadSize > 0)) then
Move(APayload, pointer(integer(@ABuffer) + Id_TCP_HSIZE)^, APayloadSize);
// copy header
Move(HdrTcp, ABuffer, sizeof(HdrTcp));
Result := TRUE;
end;
function IdRawBuildUdp(ASourcePort, ADestPort: word; const APayload;
APayloadSize: integer; var ABuffer): boolean;
var
HdrUdp: TIdUdpHdr;
begin
Result := FALSE;
// check input
if (@ABuffer = nil) then
Exit;
// construct header
HdrUdp.udp_dport := GStack.WSHToNS(ASourcePort);
HdrUdp.udp_dport := GStack.WSHToNS(ADestPort);
HdrUdp.udp_ulen := GStack.WSHToNS(Id_UDP_HSIZE + APayloadSize);
HdrUdp.udp_sum := 0;
// copy payload
if ((@APayload <> nil) and (APayloadSize > 0)) then
Move(APayload, pointer(integer(@ABuffer) + Id_UDP_HSIZE)^, APayloadSize);
// copy header
Move(HdrUdp, ABuffer, sizeof(HdrUdp));
Result := TRUE;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -