Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi getaddrinfo hooken (https://www.delphipraxis.net/154034-getaddrinfo-hooken.html)

diabox 25. Aug 2010 15:10

getaddrinfo hooken
 
Hallo,

ich arbeite gerade an einem ganz simplen Internetfilter, aber irgendwie komme ich hier nicht vorran.
Es geht um die ws2_32 Funktion "getaddrinfo". Meine Definition der Funktion sieht folgendermaßen aus:

Code:
var orig_getaddrinfo, new_getaddrinfo: function(nodename: PAnsiChar; servname : PAnsiChar; hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall;
Da ich keine Defintion von PAddrInfo finden konnte, benutze ich diese:
Code:
type
  PAddrInfo = ^TAddrInfo;
  TAddrInfo = packed record
    ai_flags: Integer;
    ai_family: Integer;
    ai_socktype: Integer;
    ai_protocol: Integer;
    ai_addrlen: LongWord;
    ai_canonname: Array of AnsiChar;
    ai_addr: PSOCKADDR;
    ai_next: PAddrInfo;
  end;

Wenn ich meine Hook-DLL zum Beispiel in Firefox "einfüge", stürzt Firefox direkt beim Start ab.
Am Hooken selbst kann es eigentlich nicht liegen, da alle anderen Hooks gut funktionieren.
Ich nehme daher an, dass an meiner gebastelten Funktionsdefinition irgendwas faul ist,
also hab ich ein bisschen mit PAnsiChar und PWideChar rumgespielt, aber am Fehler ändert sich nichts.
Ich hoffe ihr könnt mir - trotz weniger Informationen - helfen.

[EDIT]
Betriebssystem: Windows 7 - 64bit
[/EDIT]

diabox 26. Aug 2010 11:51

AW: getaddrinfo hooken
 
Ich glaube mittlerweile, es liegt doch am Hooken.
Ich hab es zur Abwechselung jetzt mit "connect" versucht, aber ich denke mal ich mache was falsch mit den var-Parametern.
Zum Hooken benutzte ich die uall-Collection.

Hook setzen:
Delphi-Quellcode:
@orig_connect := GetProcAddress(LoadLibrary('ws2_32.dll'),'connect');
uallHook.HookCode(@orig_connect,@callback_connect,@new_connect);
Delphi-Quellcode:
var orig_connect, new_connect: function(s: Integer; var name: sockaddr_in; namelen: Integer): Integer; stdcall;
Delphi-Quellcode:
function callback_connect(s: Integer; var name: sockaddr_in; namelen: Integer): Integer; stdcall;
begin
 Result:=orig_connect(s, name, namelen); //Ohne diese Zeile läuft es, aber das nutzt mir ja nichts...
end;
Sobald ich anfange die Paramter zu benutzen, verabschiedet sich Firefox...

himitsu 26. Aug 2010 12:22

AW: getaddrinfo hooken
 
Ich bin mir schonmal ganz sicher, daß die WinAPI keine Delphi-Arrays (Array of ...) kennt.

Delphi-Quellcode:
type
  PAddrInfo = ^TAddrInfo;
  TAddrInfo = packed record
    ai_flags: Integer;
    ai_family: Integer;
    ai_socktype: Integer;
    ai_protocol: Integer;
    ai_addrlen: LongWord;
    ai_canonname: PAnsiChar; // Pointer auf "Array[0..0] of AnsiChar"
    ai_addr: PSOCKADDR;
    ai_next: PAddrInfo;
  end;
Delphi-Quellcode:
var orig_getaddrinfo, new_getaddrinfo: function(nodename: PAnsiChar;
  servname: PAnsiChar; hints: PAddrInfo; res: PAddrInfo): Integer; stdcall;
// nodename, servname und hints = nur Lesezugriff
// res = Schreibzugriff
oder eventuell auch so
Delphi-Quellcode:
var orig_getaddrinfo, new_getaddrinfo: function(nodename, servname: PAnsiChar;
  const hints: TAddrInfo; var res: TAddrInfo): Integer; stdcall;

diabox 26. Aug 2010 12:28

AW: getaddrinfo hooken
 
Das ist mir nach dem Posten auch komisch vorgekommen.
Ich hab den Typ von ai_canonnam auch bereits geändert, aber das scheint überhaupt nicht das Problem zu sein...
Selbst wenn ich alle Typen durch Pointer ersetze - meine Definitionen also irrelevant sind. Geht das Hooken schief :-/
Sobald ich die Parameter in der Callback-Function anrühre, ists vorbei...

diabox 1. Sep 2010 16:02

AW: getaddrinfo hooken
 
Ganz vergessen meinen eigenen Fehler zu korrigieren:

Delphi-Quellcode:
function callback_connect(s: Integer; var name: sockaddr_in; namelen: Integer): Integer; stdcall;
begin
 Result:=[B]new[/B]_connect(s, name, namelen);
end;
Manchmal sieht man vor lauter Bäumen den Wald kaum... :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz