| Autor |
Beitrag |
ScorpionKing
      
Beiträge: 1150
Win XP
|
Verfasst: Mo 06.02.06 00:32
Hi Leute,
ich habe mich jetzt ein bisschen in die Raw Sockets eingearbeitet und folgenden Quelltext zusammengebaut (aus einem anderen in C++):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148:
| program Project1;
{$APPTYPE CONSOLE}
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Dialogs, WinSock;
type IPHDR = record verlen: integer; tos: integer; totallength: short; id: short; offset: short; ttl: integer; protocol: integer; checksum: short; srcaddr: integer; dstaddr: integer; end;
type TCPHDR = record srcport: short; dstport: short; seqno: integer; ackno: integer; offset: integer; flags: integer; window: short; checksum: short; urgptr: short; end;
type FORCSUM = record srcaddr: integer; dstaddr: integer; padzero: integer; protocol: integer; tcplength: short; end;
function CheckSum(var Buffer; Size : integer) : Word; type TWordArray = array[0..1] of Word; var ChkSum : LongWord; i : Integer; begin ChkSum := 0; i := 0; while Size > 1 do begin ChkSum := ChkSum + TWordArray(Buffer)[i]; inc(i); Size := Size - SizeOf(Word); end;
if Size=1 then ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]);
ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF); ChkSum := ChkSum + (Chksum shr 16);
Result := Word(ChkSum); end;
function RawSocket(destIP, srcIP: pchar; fd, destPort, srcPort, tcpFlag: word; content: string): integer; var dest: sockaddr_in; forc: FORCSUM; tcp: TCPHDR; ip: IPHDR; iErr: integer; buf: array[0..60] of char; begin dest.sin_family := AF_INET; dest.sin_port := htons(destPort); dest.sin_addr.S_addr := inet_addr(destIP);
ip.verlen := $45; ip.tos := $0; ip.totallength := 24; ip.id := 1; ip.offset := 0; ip.ttl := $80; ip.protocol := IPPROTO_TCP; ip.checksum := 0; ip.dstaddr := inet_addr(destIP); ip.srcaddr := inet_addr(srcIP);
tcp.dstport := htons(destPort); tcp.ackno := 0; tcp.offset := 80; tcp.flags := tcpFlag; tcp.window := htons($4000); tcp.urgptr := 0; tcp.checksum := 0;
forc.dstaddr := ip.dstaddr; forc.padzero := 0; forc.protocol := IPPROTO_TCP; forc.tcplength := htons(sizeof(tcp));
tcp.srcport := htons(srcPort); randomize; tcp.seqno := htonl(random(16));
forc.srcaddr := inet_addr(srcIP);
copymemory(@buf, @forc, sizeof(forc)); copymemory(buf + sizeof(ip), @tcp, sizeof(tcp));
tcp.checksum := checksum(buf, sizeof(forc)+sizeof(tcp));
copymemory(@buf, @ip, sizeof(ip)); copymemory(buf+sizeof(ip), @tcp, sizeof(tcp));
copymemory(buf + sizeof(ip) + sizeof(tcp), @content, sizeof(content));
ip.checksum := checksum(buf, sizeof(ip) + sizeof(tcp));
copymemory(@buf, @ip, sizeof(ip));
iErr := sendto(fd, buf, sizeof(ip) + sizeof(tcp), 0, dest, sizeof(dest)); end;
function SockAttemp: integer; var SockVersion: word; data: WSADATA; iErr, opt: integer; fd: integer; begin SockVersion := MAKEWORD(2,2); WSAStartup(SockVersion, data); fd := socket(AF_INET, SOCK_RAW, IPPROTO_RAW); setsockopt(fd, IPPROTO_IP, 2, @opt, sizeof(opt)); Result := fd; end;
var sock: integer;
begin sock := SockAttemp; RawSocket(pchar('127.0.0.1'), pchar('127.0.0.1'), sock, 888, 888, 0, 'hallo'); readln; end. |
Jetzt habe ich auf Port 888 einen TCP-Server mit Indy erstellt, der mir alles anzeigt was er empfängt (OnExecute etc. ist klar). Wenn ich nun das Proggie oben ausführe, zeigt es zwar keinen Error an (habe ich mit if iErr = SOCKET_ERROR getestet), aber es kommt auch nichts an meinem Server an. Kann mir da jemand helfen?
MfG, ScorpionKing!
_________________ Aus dem Urlaub zurück!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 06.02.06 02:06
Moin!
Hmm, wenn ich mir so deine letzten Postings ansehe, dann finde ich, du könntest zunächst mal erklären, wozu du das brauchst; IMHO ist es praktisch völlig unnötig, es sei denn, man hat da so ganz bestimmte Dinge im Auge...
Wenn du dich jetzt aufregst, dass ich dir Hacken unterstelle, dann sag mir doch einfach ein (Gegen-)Beispiel, wozu du das tatsächlich brauchst, dann helfe ich dir gerne und entschuldige mich auch.  Andernfalls sollten "wirkliche Hacker" doch sowas Einfaches problemlos selbst in den Griff kriegen.
cu
Narses
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Mo 06.02.06 09:31
Die Frage ist ob er was sendet und das evtl. gefiltert wird (durch FW oder Switch) oder ob er garnicht erst sendet. Vielleicht mal mit netstat überprüfen ob da ein Port überhaupt aufgemacht wird.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 06.02.06 09:40
Ansonsten kann ich für sowas nur winPcap und Ethereal empfehlen ... Der Umgang damit sollte jedem selbst klar sein ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ScorpionKing 
      
Beiträge: 1150
Win XP
|
Verfasst: Mo 06.02.06 10:32
Narses hat folgendes geschrieben: | Moin!
Hmm, wenn ich mir so deine letzten Postings ansehe, dann finde ich, du könntest zunächst mal erklären, wozu du das brauchst; IMHO ist es praktisch völlig unnötig, es sei denn, man hat da so ganz bestimmte Dinge im Auge...
Wenn du dich jetzt aufregst, dass ich dir Hacken unterstelle, dann sag mir doch einfach ein (Gegen-)Beispiel, wozu du das tatsächlich brauchst, dann helfe ich dir gerne und entschuldige mich auch. Andernfalls sollten "wirkliche Hacker" doch sowas Einfaches problemlos selbst in den Griff kriegen.
cu
Narses |
Hacken habe ich nun ehrlich nicht vor! Der Source dient für ein Schulprojekt, in dem ich den Aufbau des IP Headers erkläre und zeige, wie er von Sockets (normalen, keinen Raw Sockets) gesendet wird.
_________________ Aus dem Urlaub zurück!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 06.02.06 11:57
Moin!
Sorry, aber ich kann mir einfach beim besten Willen nicht vorstellen, dass dein Lehrer von dir verlangt, dass du IP-Pakete selbst per RawSocket versenden sollst... (ich bin mit dem Thema Info-Lehrer nicht so ganz unvertraut und kann das durchaus einschätzen; unglaubwürdig? -> PM)
cu
Narses
|
|
ScorpionKing 
      
Beiträge: 1150
Win XP
|
Verfasst: Mo 06.02.06 13:32
So hat sich geklärt. Hab den Code den ich in C geschrieben habe genommen und klappt jetzt.
Trotzdem danke!
_________________ Aus dem Urlaub zurück!
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Mo 06.02.06 14:15
Ich muß gestehen ich wußte garnicht das man das auf Programmebene machen kann, da ich vorher nur winPCap kannte...
|
|
|