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 Datei überwachen / Auf DLL-Start reagieren (https://www.delphipraxis.net/59426-datei-ueberwachen-auf-dll-start-reagieren.html)

Westcliff 22. Dez 2005 09:12


Datei überwachen / Auf DLL-Start reagieren
 
Längere Geschichte: Ziel ist es, eine kleine "Firewall" zu schreiben, die Aufrufe von ODBC-Funktionen unterbindet.
Konkret sollen ODBC-Anfragen von EXCEL und ACCESS über einen bestimmten Treiber verhindert werden. Der Aufruf von anderen, explizit bekannten Programmen soll weiterhin gestattet werden.

Erster Ansatzpunkt war die jeweilige Prozessliste mit den entsprechenden geladenen Modulen in einer Schleife auszuwerten (die ODBC-DLL wird dann auch entsprechend angezeigt). Dies würde jedoch unnütz Rechenleistung verpulvern, zudem ja nur in einem gewissen Zeitintervall auf das Laden der DLL reagiert werden kann.

Geht das nicht doch etwas eleganter, evtl. über einen Systemhook?
Hat jemand evtl. eine andere Idee?

Danke schonmal :)

Robert Marquardt 22. Dez 2005 09:32

Re: Datei überwachen / Auf DLL-Start reagieren
 
Warum nicht die DLL ersetzen?
Die DLL ist der ODBC-Treiber, aber die Aufrufe werden an die umbenannte originale DLL weitergeleitet.
In der DLL kann man nun beim Laden der DLL (PROCESS_ATTACH bzw THREAD_ATTACH) den Pfadamen des aufrufenden Programms herausbekommen und entsprechend reagieren.
Alternativ macht man das in den einzelnen Funktionsaufrufen.
GetModuleFileName(0, ...) liefert auch in der DLL den Namen des aufrufenden EXEs.

Westcliff 22. Dez 2005 09:43

Re: Datei überwachen / Auf DLL-Start reagieren
 
Das wäre auch eine Idee. Beim Aufruf der DLL entsprechend zu reagieren dürfte nicht wirklich das Problem sein. Aber wir kann ich die entsprechenden Funktionsaufrufe Transparent weiterleiten? Ich denke es macht wenig Sinn, sämtliche Funktionsaufrufe vorher in Erfahrung zu bringen und pro Aufruf eine Weiterleitungsfunktion zu erstellen.

Oder mache ich mir da wieder zu viele Gedanken?

Robert Marquardt 22. Dez 2005 11:03

Re: Datei überwachen / Auf DLL-Start reagieren
 
Doch genau das. Es muss doch irgendwo ein ODBC API geben.

Westcliff 22. Dez 2005 11:39

Re: Datei überwachen / Auf DLL-Start reagieren
 
Soweit bin ich mittlerweile auch, aber mir fehlen noch header-files und die dazugehörige Delphi-Umsetzung da die Funktionen mit ODBC-spezifischen Datentypen arbeiten die Delphi von Haus aus scheinbar nicht kennt.

Das wären knapp 30 Funktionen, eine durchaus machbare Anzahl.

Robert Marquardt 22. Dez 2005 12:37

Re: Datei überwachen / Auf DLL-Start reagieren
 
Da kann man bestimmt ein bischen bescheissen. Ich bin sicher es werden nur Zeiger auf Strukturen uebergeben.
Da man die Strukturen nicht veraendern will, kann man einfach mit Pointer arbeiten. Einfach nur weiterreichen.

Olli 9. Jan 2006 21:59

Re: Datei überwachen / Auf DLL-Start reagieren
 
Wenn du beliebige DLL-Starts unterbinden willst oder eben darüber benachrichtigt werden willst, kannst du mit PsSetLoadImageNotifyRoutine() und einem Treiber einiges reißen. Ansonsten wohl nur dann, wenn du den Prozeß, welcher die DLL lädt kontrollieren kannst und die DLL nicht implizit (statisch) geladen wird.

Vjay 11. Jan 2006 09:04

Re: Datei überwachen / Auf DLL-Start reagieren
 
Zitat:

Zitat von Olli
...und die DLL nicht implizit (statisch) geladen wird.

Wird bei einem ODBC-Treiber wohl nicht der Fall sein.
Ja, Funktionshook auf loadLibrary(Ex) ist auch nicht so super-schön, da du dich in sämtliche Prozesse einklinken müßtest.

Olli 11. Jan 2006 12:40

Re: Datei überwachen / Auf DLL-Start reagieren
 
Das ist das Schöne bei PsSetLoadImageNotifyRoutine() - du wirst nämlich "zurückgerufen" und entscheidest anhand des Objektes, ob du interessiert bis irgendwas zu machen (z.B. RT-Patches oder Laden verhindern usw.).

Vjay 11. Jan 2006 14:42

Re: Datei überwachen / Auf DLL-Start reagieren
 
Mag sein, aber die Nachteile für einen reinen Delphiprogrammierer sind dabei auch nicht von der Hand zu weisen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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