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:
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;
Das ist eine funktion die nur ein bestimmten
API Befehl testet ob der auch "funktionsfähig" wäre.
Die funktion "klappt" auch nur jedoch einmal, beim zweiten aufruf oder so kommts zu den Fehlermeldungen
Delphi-Quellcode:
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;
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.
Könnte mir jemand mit diesem problem einwenig helfen?
Mfg ErazerZ