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 Eigene Callback in einer DLL, die injected wird (https://www.delphipraxis.net/149746-eigene-callback-einer-dll-die-injected-wird.html)

Yakumo500 29. Mär 2010 08:27


Eigene Callback in einer DLL, die injected wird
 
Hi,
Ich hoffe ihr könnt mir helfen. Ich habe mir eine DLL geschrieben, die in eine WinApi Funktion injected werden soll. Dazu verwende ich madCodeHook. Soweit so gut.
Jetzt möchte ich der DLL eine Callback Funktion übergeben, die ausgeführt wird wenn die WinApi Funktion aufgerufen wird. Leider passier aber absolut gar nichts. Gehen eigene Callback Funtionen nicht in einer DLL, die injected wird?

Hier der Code:

DLL:
Delphi-Quellcode:
library TestLIB;

uses
  Windows, SysUtils, WinSock, madCodeHook;

type
  THKLibOnPermission = procedure();
  PHKLibOnPermission = ^THKLibOnPermission;

{$R *.res}

var
  { Externe Funktionen }
  OnPermission: THKLibOnPermission;
  { Hooks }
  AcceptNext: function(S: TSocket; Addr: PSockAddr; AddrLen: PInteger): TSocket; stdcall;

{ Legt die Funktion die ausgeführt werden soll fest }
procedure Init(_OnPermission: Pointer);
var pp: PHKLibOnPermission;
begin
  pp := _OnPermission;
  OnPermission := pp^;
end;

function AcceptProc(S: TSocket; Addr: PSockAddr; AddrLen: PInteger): TSocket; stdcall;
begin
  if Assigned(OnPermission) then
    OnPermission();
end;

exports
  Init;

begin
  { CollectHooks ausführen um Hooks zu beschleunigen }
  CollectHooks();

  { WSOCK32.DLL hooken }
  HookAPI('WSOCK32.DLL', 'accept', @AcceptProc, @AcceptNext);

  FlushHooks();
end.
Und jetzt der Code meiner Anwendung:

Delphi-Quellcode:
program Test;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, madCodeHook, WinSock;

type
  THKLibOnPermission = procedure();

procedure Init(_OnPermission: Pointer); register; external 'TestLIB.dll';

procedure sPermission();
begin
  { Um anzuzeigen das die Prozedur ausgeführt wurde }
  FileClose(FileCreate('C:\test.txt'));
end;

begin
  readln;
  Init(@sPermission);
  InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'TestLIB.dll');
  Sleep(20000);
  UnInjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'TestLIB.dll');
end.

Blup 29. Mär 2010 10:41

Re: Eigene Callback in einer DLL, die injected wird
 
Die Variable OnPermission existiert nicht nur einmal, sondern für jeden Prozess in den die DLL geladen wird separat.
Init wirk sich deshalb nur auf den eigenen Prozess aus.
Wie man das umgeht wurde schon sehr oft zu Hooks erklärt.

Yakumo500 29. Mär 2010 11:08

Re: Eigene Callback in einer DLL, die injected wird
 
Könntest du mir bitte einen Link schicken, da ich zwar Themen zu DLL Injection finde aber nicht zu meinem Thema?

Medium 29. Mär 2010 11:20

Re: Eigene Callback in einer DLL, die injected wird
 
Passende Suchbegriffe wären hier z.B.: IPC, Named Pipes, Memory mapped Files, Mailslots - kurzum: Deine DLL-Instanzen müssen miteinander quatschen können, und das hat mit der Injection selbst garnix zu tun.

Yakumo500 29. Mär 2010 12:28

Re: Eigene Callback in einer DLL, die injected wird
 
Vielen Dank an euch!
An Mapped Files hatte ich auch schon gedacht, aber so wäre es einfacher gewesen.
Auf jeden Fall werde ich mich mal mit den von Medium genannten Begriffen auseinander setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.

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