Entwickler-Ecke

Internet / Netzwerk - WinSock Encrypt on the Fly :P


moddin - Mo 19.02.07 17:46
Titel: WinSock Encrypt on the Fly :P
hiho alle zusammen

wollte in mein ultrakrasses netzwerkprogramm eine transparente verschlüsselung einbauen
hierzu eignet sich die RC4 Verschlüsselung hervorragend

ich hab jetzt die verschlüsselung so eingebaut aber das funktioniert nicht
hat jemand ahung was da falsch ist?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function mysend(s: dword; var Buf; len, flags: Integer): Integer; stdcall;
begin
  RC4Code(globalrc4,buf,buf,len);
  result := nextSend(s,buf,len,flags);
end;

function mysendto(s: dword; var Buf; len, flags: Integer; var addrto: dword;
  tolen: Integer): Integer; stdcall;
begin
  RC4Code(globalrc4,buf,buf,len);
  result := nextSendTo(s,buf,len,flags,addrto,tolen);
end;


Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt


jakobwenzel - Mo 19.02.07 18:36

Muss das nicht noch entschlüsselt werden? :wink:
(Oder haste das nur weggelassen?)


moddin - Di 20.02.07 00:13

kk

hier das ganze nochmal vereinfacht/edler

also die kommunikation funktioniert

aber

die verschlüsselung funktioniert, aber die daten werden nicht wieder entschlüsselt



Delphi-Quelltext
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:
procedure Encrypt(var Source;len:integer);
var p:pointer; globalrc4:trc4context;
begin
  GetMem(p,len);
  RC4Init(GlobalRC4,'Test');
  Rc4Code(globalrc4,Source,p^,len);
  RC4Done(GlobalRc4);
  Move(p^,Source,len);
  Freemem(p,len);
end;

//========================================================||
// Local WinSock H00k \\==================================||
function myrecvfrom(s: dword; var Buf; len, flags: Integer;
                      var from: dword; var fromlen: Integer): Integer; stdcall;
begin
  Encrypt(Buf,len);
  result := nextrecvfrom(s,buf,len,flags,from,fromlen);
end;

function myrecv(s: dword; var Buf; len, flags: Integer): Integer; stdcall;
begin
  Encrypt(Buf,len);
  result := nextrecv(s,buf,len,flags);
end;

function mysend(s: dword; var Buf; len, flags: Integer): Integer; stdcall;
begin
 Encrypt(Buf,len);
  result := nextSend(s,buf,len,flags);
end;

function mysendto(s: dword; var Buf; len, flags: Integer; var addrto: dword;
  tolen: Integer): Integer; stdcall;
begin
  Encrypt(Buf,len);
  result := nextSendTo(s,buf,len,flags,addrto,tolen);
end;


Narses - Di 20.02.07 00:21

Moin!

Ist RC4 nicht positions-kontextsensitiv? :gruebel: Kannst du denn sicherstellen, dass deine Hooks die Daten immer in exakt der gleichen Reihenfolge durch den RC4-Filter laufen lassen? Nur dann kannst du die Daten nämlich wieder korrekt entschlüsseln.

cu
Narses


HelgeLange - Di 20.02.07 01:13

Zitat:
Willst du Körper an Körper pressen? Atem spüren? Gerüche wahrnehmen? Verschiedene Stellungen probieren? Rein und raus? Von hinten nach vorne? Ja? Dann nimm den Bus!


LOL, das hört sich nach der Metro in Caracas an, Klimaanlage funktioniert nur, wenns draussen auch kalt ist und wer es nicht schafft, bauch und Hintern gleichzeitig einzuziehen, hat eh keine Chance mitgenommen zu werden :D


moddin - Di 20.02.07 19:07

user profile iconNarses hat folgendes geschrieben:
Moin!

Ist RC4 nicht positions-kontextsensitiv? :gruebel: Kannst du denn sicherstellen, dass deine Hooks die Daten immer in exakt der gleichen Reihenfolge durch den RC4-Filter laufen lassen? Nur dann kannst du die Daten nämlich wieder korrekt entschlüsseln.

cu
Narses


daran hab ich auch schon gedacht und ein paar tests gemacht (alle hooks werden aufgerufen)

also mit rc4 kann auch einzelne teile eines strings/daten entschlüsseln
zb in 2 teile teilen und beide einzeln entschlüsseln

zudem, wenn man den text auf serverseite ganz billig

Delphi-Quelltext
1:
2:
3:
4:
5:
begin
s := Socket.ReceiveText;
Encrypt(pchar(s)^,length(s));
Edit2.Text := s;
end;


(ohne hook-entschlüsseln) richtig entschlüsseln

[DEBUG]
affenhausF / /// edit1.text
+-,So? //send hook
+-,So? //yreive hiook
affenhaut //edit2.text
[/DEBUG] lol affenhaus wird zu affenhaus - not bad imho - man beachte das alle strings nur in HTML gleich aussehene


Narses - Di 20.02.07 19:44

Moin!

user profile iconmoddin hat folgendes geschrieben:
daran hab ich auch schon gedacht und ein paar tests gemacht (alle hooks werden aufgerufen)

Es geht nicht darum, ob sie aufgerufen werden, sondern wann und mit welchem RC4-Kontext! :mahn: ;)

Lass doch mal RC4 weg und mach nur ein xor $AA oder sowas, und dann schau mal, ob das klappt. Wenn es damit klappt, dann liegt es an einem Fehler in der Anwendung von RC4! :D

cu
Narses


moddin - Mi 21.02.07 00:39

nope es liegt anscheinend nicht an RC4 oder ich bin zu dumm das richtig
zu implementiern :P (was natürlich nicht sein KANN ^^ )

egal

ich verwende jetzt diese simple routine


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure Encrypt(var Source;len:integer);
type tarray = array[0..0of byte;
     pArray=^TArray;
var p:pointer; x:integer;
begin
  GetMem(p,len); Move(Source,p^,len);
  Form1.Memo.Lines.Add(pchar(p));
  FreeMem(p,len);
  // ===== ENCRYPTION ====
  for x := 0 to len-1 do // muss das nicht eigentlich bis zu len hochzählen???
    begin
      pArray(@Source)^[x] := pArray(@Source)^[x] XOR 5;
    end;
  // =====================
  GetMem(p,len); Move(Source,p^,len);
  Form1.Memo.Lines.Add(pchar(p));
  FreeMem(p,len);
end;


das ergebniss ist immer noch dasselbe -

affenhaus // MySend - davor
dcc`kmdpv // MySend - danach
dcc`kmdp // MyReceive - davor
affenhau // MyReceive - danach


Narses - Sa 24.02.07 14:57

Moin!

user profile iconmoddin hat folgendes geschrieben:
das ergebniss ist immer noch dasselbe

Quelltext
1:
2:
3:
4:
affenhaus // MySend - davor
dcc`kmdpv // MySend - danach
dcc`kmdp  // MyReceive - davor
affenhau  // MyReceive - danach

Scheint, als hättest du beim Senden oder Empfangen ein Bereichsproblem... ;)

cu
Narses