![]() |
Funktion aus der IAT in eigenem program ausführen
Hey Leute,
ich habe da ein kleines Problem, ich würde gerne die API's aus einem anderen Program in meinen eigenen Program ausführen, ohne dabei die Parameter zu kennen und das möglichst kein Fehler passiert. Ich lese auch schon alles aus aus der IAT und nun versuche ich möglichst die funktion auszuführen ohne Fehler dabei zu hinterlassen. Also ich gehe jetzt so vor: Ich lade die Übergebene funktion zb.
Delphi-Quellcode:
Das ist eine funktion die nur ein bestimmten API Befehl testet ob der auch "funktionsfähig" wäre.
function TfrmMain.WorkswithAPI(DLL, FunctionName: String): Boolean;
.. if IsOnBlackList(FunctionName) then // testet ob die funktion ExitProcess ist oder andere die nicht ausgeführt werden sollten begin Exit; end; // Hier schaue ich ob ich die DLL laden muss oder einfach die bereits geladene benutzen kann. hModule := GetModuleHandle(PChar(Dll)); if (hModule = INVALID_HANDLE_VALUE) or (hModule = 0) then begin bLoaded := True; hModule := LoadLibrary(PChar(Dll)); if hModule = INVALID_HANDLE_VALUE then begin Exit; end; end else bLoaded := False; // Hier speichere ich die addresse der funktion in einem Pointer lpFunction := GetProcAddress(hModule, PChar(FunctionName)); if lpFunction = nil then begin Exit; end; ... ... // dannach führe ich die funktion so aus das ich vorher die register sichere und dannach wiederherstelle try asm push eax push ebx push ecx push edx call lpFunction mov dwResult, eax pop edx pop ecx pop ebx pop eax end; except end; ... // dannach ein paar prüfungen mit dem dwResult um den rückgabewert anzuschauen .. zb. falls dwResult = 0 dann ist result der funktion auch True, ansonsten False end; Die funktion "klappt" auch nur jedoch einmal, beim zweiten aufruf oder so kommts zu den Fehlermeldungen
Delphi-Quellcode:
Nur das Problem ist das sich das program einfach schließt oder in Delphi die CPU kommt. Weil sich die Variablen von anderen funktionen verändert haben.
SL := TStringList.Create;
for i := 0 to IAT.wDllCount -1 do begin for j := 0 to iat.dllname[i].wFunctionCount -1 do begin Dll := IAT.DLLName[i].DLLName; FunctionName := IAT.DLLName[i].Functions[j].FunctionName; // beim 2ten aufruf ändert sich der Wert von j auf zwei hunderttausend if WorksWithAPI(Dll, FunctionName) then SL.Add(Dll + '.' + FunctionName); end; Könnte mir jemand mit diesem problem einwenig helfen? Mfg ErazerZ |
Re: Funktion aus der IAT in eigenem program ausführen
Per-se geht das erstmal nicht. Selbst wenn du das in PUSHs und POPs wrappst, gehst du Gefahr, daß die Funktion schon vorher mehr POPt als dir lieb sein kann und damit deinen Stack verwüstet.
Die Frage wäre nur was exakt du erreichen möchtest ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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 by Thomas Breitkreuz