AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktion aus der IAT in eigenem program ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion aus der IAT in eigenem program ausführen

Ein Thema von ErazerZ · begonnen am 15. Jul 2006 · letzter Beitrag vom 10. Sep 2006
Antwort Antwort
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
Olli
(Gast)

n/a Beiträge
 
#2

Re: Funktion aus der IAT in eigenem program ausführen

  Alt 10. Sep 2006, 12:05
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 ...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 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