Einzelnen Beitrag anzeigen

Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#1

Funktion aus der IAT in eigenem program ausführen

  Alt 15. Jul 2006, 15:32
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
  Mit Zitat antworten Zitat