Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateProcess importieren / API Hooks umgehen (https://www.delphipraxis.net/87500-createprocess-importieren-api-hooks-umgehen.html)

Zacherl 1. Mär 2007 14:59


CreateProcess importieren / API Hooks umgehen
 
Hi,

ich will die CreateProcess API dynamisch in mein Programm einbinden. Dazu verwende ich:

Delphi-Quellcode:
function CreateProcess(lpApplicationName: PChar; lpCommandLine: PChar;
  const lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  out lpProcessInformation: TProcessInformation): BOOL; stdcall;
var
  pCreateProcess: function(lpApplicationName: PChar; lpCommandLine: PChar;
  const lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  out lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
  pCreateProcess := GetRealProcAddress(GetModuleHandle('kernel32'), 'CreateProcess');
  Result := pCreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes,
                           lpThreadAttributes, bInheritHandles, dwCreationFlags,
                           lpEnvironment, lpCurrentDirectory, lpStartupInfo,
                           lpProcessInformation);
end;
Leider kommt nun nach dem Start des Programmes sofort die Meldung, dass ein Fehler verursacht wurde und das Programm beendet wird.

Woran kann das liegen?

PS: GetRealProcAddress ermittelt nur die "ursprüngliche" Adresse der API, somit werden Userlevel API Hooks nicht gecallt.

sirius 1. Mär 2007 15:01

Re: CreateProcess dynamisch importieren
 
kernel32.dll

Zacherl 1. Mär 2007 15:07

Re: CreateProcess dynamisch importieren
 
Geht leider auch nicht .. es müssen die Parameter Datentypen sein, die nicht stimmen =/

Win32.API 1. Mär 2007 15:17

Re: CreateProcess dynamisch importieren
 
@pCreateProcess := GetRealProcAddress(GetModuleHandle('kernel32.dll') , 'CreateProcessA');

turboPASCAL 1. Mär 2007 15:22

Re: CreateProcess dynamisch importieren
 
Zwischenfrage, warum möchtest du denn CreateProcess dynamisch implementieren?
Diese ist doch in der Unit Windows enthalen.

Zacherl 1. Mär 2007 15:24

Re: CreateProcess dynamisch importieren
 
Argh das A hat gefehlt :wall: Danke ..

@TurboPascal: Ich möchte die API Hooks umgehen, deshalb ..

Win32.API 1. Mär 2007 15:27

Re: CreateProcess dynamisch importieren
 
Das A und noch viel wichtiger das "@" ... Du solltest pointer _immer_ auf nil pruefen .

Zacherl 1. Mär 2007 15:55

Re: CreateProcess dynamisch importieren
 
Ja, hab ich schon eingebaut ..

brechi 1. Mär 2007 16:20

Re: CreateProcess dynamisch importieren
 
Damit umgehst du vielleicht 10% der API hooks, mehr aber auch nicht...

Zacherl 1. Mär 2007 16:20

Re: CreateProcess dynamisch importieren
 
Die API Hooks werden komplett umgangen .. nur die Kernel Hooks nicht.

brechi 1. Mär 2007 16:26

Re: CreateProcess dynamisch importieren
 
Quatsch, Code overwriting oder Exporttable hooks werden nicht umgangen und selbst bei Importtable hooks haben viele Hook-Funktionen schon automatisch eingebaut, dass bei einem Aufruf von GetProcAddress die falsche Adresse zurückgegeben wird.

Zacherl 1. Mär 2007 16:29

Re: CreateProcess dynamisch importieren
 
Ich beharre weiterhin darauf. Hier die Funktion:

Delphi-Quellcode:
function GetRealProcAddress(hModule: HMODULE; lpProcName: pchar): pointer;
var
  Proc: pointer;
  CodeInfo: TCodeInfo;
  FunctionInfo: TFunctionInfo;
begin
  Proc := GetProcAddress(hModule, lpProcName);
  Result := Proc;
  CodeInfo := ParseCode(Proc);
  if not (CodeInfo.Call or CodeInfo.Jmp) then Exit;
  FunctionInfo := ParseFunction(Proc);
  if FunctionInfo.CodeLen <> 5 then Exit;
  repeat
    Result := FunctionInfo.FarCalls[Low(FunctionInfo.FarCalls)].Target;
    FunctionInfo := ParseFunction(FunctionInfo.FarCalls[Low(FunctionInfo.FarCalls)].Target);
  until FunctionInfo.CodeLen = 10;
end;
Benötigt wird die madDisAsm

brechi 1. Mär 2007 16:31

Re: CreateProcess dynamisch importieren
 
Das ist zwar schön, aber ich habe die uallCollection selbst geschrieben. Es wird nur die richtige Adresse geholt, d.h. noch lange nicht das vorher ein Export Table hook installiert war oder die Funktion mit Code Overwriting gehookt ist.

Zacherl 1. Mär 2007 16:32

Re: CreateProcess dynamisch importieren
 
Die madDisAsm Unit meine ich .. die sollte doch die Library disassemblieren und genau den Originalcode aufrufen, oder?

brechi 1. Mär 2007 16:35

Re: CreateProcess dynamisch importieren
 
Ach wat, die macht auch nix besonderes. Kann sein, dass die für nen speziellen Hook funktioniert. Aber allein schon der gebracuht von GetProcAddress is blödssinn wenns nen Exporttablehook gibt.

Zacherl 1. Mär 2007 16:37

Re: CreateProcess dynamisch importieren
 
Mh also da gibt es keine Möglichkeit das zu umgehen?

brechi 1. Mär 2007 16:39

Re: CreateProcess dynamisch importieren
 
Nein, jedefalls nicht wenn man keine Ahnung hat wie das alles funktioniert.

Zacherl 1. Mär 2007 16:40

Re: CreateProcess dynamisch importieren
 
Aber du hast Ahnung denke ich doch mal ..

brechi 1. Mär 2007 16:43

Re: CreateProcess dynamisch importieren
 
Wofür wirds gebraucht?

Zacherl 1. Mär 2007 16:45

Re: CreateProcess dynamisch importieren
 
Ich möchte eine EXE direkt im RAM ausführen. Dafür habe ich schon Teilweise Quelltexte von Nico gefunden (InMemExe).
Leider hat meine Firewall was dagegen (aus was für Gründen auch immer). Nun ist es für den Benutzer ja nicht sehr benutzerfreundlich, wenn seine Firewall zufällig grade die benötigten APIs hookt und somit das Programm nutzlos macht.

Daher will ich versuchen, zumindest die API Hooks zu ungehen. Wäre dir sehr dankbar, wenn du mir da helen könntest.

brechi 1. Mär 2007 16:48

Re: CreateProcess dynamisch importieren
 
Exe im Ram ausführen ist bei meiner uallCollection dabei und da sollte auch keine Firewall meckern.

Zacherl 1. Mär 2007 17:04

Re: CreateProcess dynamisch importieren
 
Norton 2007 meckert, wenn man mit WriteProcessMemory die Datei in den Speicher schreiben will. Ich habe jetzt nur mein Programm schon total an die Routinen von Nico angepasst.

Perfekt wäre es halt, wenn ich de Hooks von WriteProcessMemory umgehen kann.

Win32.API 1. Mär 2007 17:21

Re: CreateProcess dynamisch importieren
 
wenn du userland hooks umgehen willst, lade eine temp kernel32 .. 100%tig keine hooks ;)

brechi 1. Mär 2007 17:29

Re: CreateProcess dynamisch importieren
 
In welchen Speicher denn? Im eigenen brauchst du kein WriteProcessMemory... und im Speicher von anderen Programmen meckert Norton zurecht. Ohne zu sagen was du machen willst gibts keine weitere Hilfe.

@Win32.API: 100% bestimmt nicht...

Win32.API 1. Mär 2007 17:37

Re: CreateProcess dynamisch importieren
 
ja gut, aber zu 99% :>

Zacherl 1. Mär 2007 17:42

Re: CreateProcess dynamisch importieren
 
Zitat:

Zitat von Win32.API
wenn du userland hooks umgehen willst, lade eine temp kernel32 .. 100%tig keine hooks ;)

Wie mache ich das?

Zitat:

Zitat von brechi
In welchen Speicher denn? Im eigenen brauchst du kein WriteProcessMemory... und im Speicher von anderen Programmen meckert Norton zurecht. Ohne zu sagen was du machen willst gibts keine weitere Hilfe.

Alle Leute sind direkt so negativ zu den Dingen eingstellt .. der Packer Source von Nico:

http://www.luckie-online.de/dirindex.../Importe/Nico/ -> inmemexe.zip

Benötigt WriteProcessMemory, um die Datei im Speicher auszuführen. Es wird übrigens sozusagen im eigenen Speicher geschrieben, weil das Programm sich selbst nocheinmal startet. Und in diesen Speicherbereich kommen dann die Daten der auszuführenden EXE.

Win32.API 1. Mär 2007 17:47

Re: CreateProcess importieren / API Hooks umgehen
 
Du kopierst die kernel32.dll einfach in den Tempordner und laedst sie mit LoadLibrary.

Um in den eigenen Speicher zu schreiben brauchst du kein wpm.

Zacherl 1. Mär 2007 17:53

Re: CreateProcess importieren / API Hooks umgehen
 
Zitat:

Zitat von Win32.API
Du kopierst die kernel32.dll einfach in den Tempordner und laedst sie mit LoadLibrary.

Um in den eigenen Speicher zu schreiben brauchst du kein wpm.

Vielen Dank, das werde ich mal ausprobieren.

Es ist nicht ganz mein eigener Speicher. Mein Prozess startet sich selbst ein zweites mal; diesmal aber SUSPENDED. Dann schreibt er in den Adressbereich des zweiten Prozesses die Daten der auszuführenden EXE und lässt diesen weiterlaufen.

brechi 1. Mär 2007 18:10

Re: CreateProcess importieren / API Hooks umgehen
 
Als wenn Norton keinen Kernel-Hook hat. Den Sinn von deinem Vorgehen hab ich immer noch nicht verstanden...
Und ist ja auch super sauber die Kernel32.dll umzukopieren. Selbst das bringt dir nix wenn auf NtCreateProcess ein Hook ist.
Solange keine guten Argumente kommen warum so ein Vorgehen sinnvoll ist, werd ich dir keine saubere Lösung anbieten.
Es wird immer nur die Hälfte erklärt und am Schluß nach 50 Posts sellt es sich herraus, dass das ganze viel einfacher zu machen ist und man umsonst wieder seien Zeit geopfert hat um dem Threadersteller zu helfen.

Zacherl 1. Mär 2007 18:17

Re: CreateProcess importieren / API Hooks umgehen
 
1) Mir ist bekannt, dass ich Kernel Hooks damit nicht umgehen kann
2) Argumente:

* Ich habe mein Programm bereits voll auf den Code von Nico ausgelegt und es geht alles wunderbar
* Weil nur Norton (und vielleicht noch andere) Firewalls meckern beim Aufruf von WriteProcessMemory will ich die API Hooks aller verwendeten APIs umgehen
* Die Hooks zu umgehen ist wohl sinnvoller als den Kernel rumzukopieren, wie du schon gesagt hast
* Ich will den Benutzern ein funktionierendes Programm bieten können, dem nicht einige Firewall dazwischenfunken

Reichen die? Fals du weißt wie man einen API Hook umgehen kann, dann bitte ich dich mir dabei zu helfen. Wenn du dir Nicos Beispiel mal angeguckt hast, dann kannst du sicher erkennen, wie das mit dem WriteProcessMemory gemeint ist. Da steckt nichmal die Absicht hinter in einen wirklich "fremden" Prozess etwas zu schreiben.

Fals du denkst, das Vorgehen den API Hook zu umgehen ist ineffizient, da Norton eh einen Kernel Hook hat, dann kann man ja evtl auch da was machen, wobei ich vermute, dass dies höchst kompliziert ist.

brechi 1. Mär 2007 18:20

Re: CreateProcess importieren / API Hooks umgehen
 
Ich wollte eher ein Argument warum du einen 2. Prozess starten musst und dann da den COde nochmal reinzuladen. Ich sehe da keinen Sinn drin. Von den Umgehmethoden mal abgesehen, werden die eh beim nächsten Update wieder geschlossen. Zumal du hier versuchst ein Virenprogramm zu umgehen -> was im Forum nicht gedultet wird.
Deshalb schreib doch erstmal warum du überhaupt dein Programm in einen 2. Prozess laden willst, das ist imho total unklar...

Zacherl 1. Mär 2007 18:24

Re: CreateProcess importieren / API Hooks umgehen
 
Nein ich will nicht Norton Antivirus umgehen .. es geht mir um die Firewall. Diese stört anscheinend, dass ich Code in einen "fremden" Prozess schreibe.

Der zweite Prozess wird sozusagen nur als Container für die auszuführende Datei verwendet. Dieses Vorgehen gefällt mir, deshalb möchte ich es gerne verwenden. Es erfüllt nämlich alle Dinge, die ich brauche.

//Edit: ich glaube wir reden aneinander vorbei .. es soll in der zweiten EXE nicht der Prozess nochmal ablaufen, sondern im Speicherbereich der zweiten EXE befindet sich hinterher die auszuführende EXE, die ich aus einer Resource lade.

brechi 1. Mär 2007 18:37

Re: CreateProcess importieren / API Hooks umgehen
 
Du willst den Schutz von Norton umgehen, so ist das nunmal. Norotn meckert nicht wenn in der eigenen Exe geschrieben wird. Du kannst die Ressource auch im eigenen Prozess laden (der hat dann so viel ich noch weiß 2 Fenster).
Oder aber du musst den 2. Prozess Debuggen und dann WriteProzessMemory benutzen, dann müsste Norton nicht meckern.

Aber das vorgehen an sich ist für ein normales Programm einfach total unsinnig, du hast imemr noch nicht gesagt warum du es für dein Vorgehen undbedingt brauchst. Welchen VORTEIL hat es denn gegenüber einem normalen starten des Programs?

Zacherl 1. Mär 2007 18:44

Re: CreateProcess importieren / API Hooks umgehen
 
Ich möchte einen Packer erstellen.

ErazerZ 1. Mär 2007 19:03

Re: CreateProcess importieren / API Hooks umgehen
 
Zitat:

Zitat von Florian Bernd
Ich möchte einen Packer erstellen.

Lol, diese "Packer" die mittels z.b. aphex's CreateProcessEx funktionieren gibts wie Sand am Meer..

Zacherl 1. Mär 2007 19:10

Re: CreateProcess importieren / API Hooks umgehen
 
Ich verwende nicht Aphex CreateProzessEx ..

(Wenn ich die Kernel Datei kopiere und mittels LoadLibrary lade, dann der GetProcAddress Funktion das DLL Handle übergebe wird die Funktion perfekt geladen, allerdings sehe ich kein Resultat nach dem Ausführen)

ErazerZ 1. Mär 2007 19:21

Re: CreateProcess importieren / API Hooks umgehen
 
Zitat:

Zitat von Florian Bernd
Ich verwende nicht Aphex CreateProzessEx ..

(Wenn ich die Kernel Datei kopiere und mittels LoadLibrary lade, dann der GetProcAddress Funktion das DLL Handle übergebe wird die Funktion perfekt geladen, allerdings sehe ich kein Resultat nach dem Ausführen)

Schaue mal ob das Handle der original Kernel32 das selbe ist wie bei dem neu geladenen.

Zacherl 1. Mär 2007 19:27

Re: CreateProcess importieren / API Hooks umgehen
 
Wenn ich das Handle mit GetModuleHandle ermittele ist dies in der Tat der Fall. Das von LoadLibrary zurückgegebene Handle scheint ungültig zu sein .. zumindest ist es eine 10 Stellige Zahl :shock:

Woran liegt das, dass die Handles gleich sind?

//Edit 1: Ah mist .. falsch geguckt .. nein, die Handles sind unterschiedlich, wobei der original Kernel die 10 stellige Zahl hat.
//Edit 2: Der Prozess wird sogar gestartet, allerdings verabschiedet sich selbiger, wenn ResumeThread aufgerufen wird oO

Hier gehts weiter für das Kopieren der kernel32.dll:
http://www.delphipraxis.net/internal...t.php?t=104690


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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