In DLL-Funktionen einklinken
-
Hallo liebe Forenmitglieder,
folgendes habe ich vor: Jedes Mal, wenn ein Programm eine bestimmte Windows-Funktion aufruft, die in einer zentralen DLL steht, sollen bestimmte Bedingungen geprüft werden und ggf. der Benutzer gefragt werden, ob das Ausführen dieser Funktion zugelassen werden soll. Dazu habe ich mir folgenden Ansatz überlegt:Ich hole mir Schreib- und Leserechte von Windows für die DLL (im RAM, die Festplatte soll unberührt bleiben) - z.B. "user32.dll". Dann hole ich mir den Funktionspointer ("MessageBoxA") und weiß damit, wo die Funktion beginnt. Ich sichere die ersten 5 Bytes von MessageBoxA und überschreibe sie mit JMP und der Adresse, wo meine Funktion beginnt, die die Bedingungen prüft. Wenn das Ausführen der ursprünglichen Funktion erlaubt ist, sollen die gesicherten 5 Bytes ausgeführt werden, gefolgt von einem JMP zurück zur alten Funktion.
Abgesehen davon, dass man für sowas wahrscheinlich (hoffentlich
) Admin-Rechte braucht, bin ich mir nicht sicher, ob das so funktionieren würde. Ich kenne mich nicht gut mit Asm-Code aus, was ist z.B. wenn der erste Befehl von MessageBox länger als 5 Bytes ist? Den würde ich dann ja "kaputthacken". Alternativ kann man natürlich nicht nur die ersten 5 Bytes, sondern gleich die ganze Funktion backuppen, aber dazu müsste man erstmal ihre Länge herausfinden und ich habe keine Ahnung, wie das geht.
Ich würde mich freuen, wenn mir jemand vom Fach sagen könnte, ob der Ansatz grundsätzlich gehen würde oder ob ich mich total auf dem Holzweg befinde (dann bitte mit Begründung
).
Frohes neues Jahr wünsche ich!
-
Mr Train schrieb:
Abgesehen davon, dass man für sowas wahrscheinlich (hoffentlich
) Admin-Rechte braucht
Nö
http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx
-
Erstmal vielen, vielen Dank für den Link! Ich habe mir ein wenig Info zu der Library durchgelesen und ich glaube das ist genau das, was ich brauche.
Werde das demnächst mal testen.
-
Siehe auch John Robbins Bug Slayer Artikel und entsprechenden Code
http://www.codeproject.com/KB/DLL/hookimport.aspx
-
Benutz die Funktion DetourFunc von der Detour Lib.
das müsste die richtige für dich sein.
Fürs entfernen DetourRemove.