AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi 64bit Anw. soll 32bit Anw. ausm Speicher starten
Thema durchsuchen
Ansicht
Themen-Optionen

64bit Anw. soll 32bit Anw. ausm Speicher starten

Ein Thema von TheGame1492 · begonnen am 20. Apr 2012 · letzter Beitrag vom 21. Apr 2012
Antwort Antwort
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#1

64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 20. Apr 2012, 17:55
Hoi,

ich versuche grad mittels einer 64bit Anwendung eine 32bit Anwendung aus dem Speicher zu starten, dies klappt aber irgendwie nicht so recht.

(Eine 64bit Anwendung zu starten dagegen schon).

Ich benutze dazu folgenden Code:

Code:
.
.
.
var
  mem: TMemoryStream;
  NtHeaders: PImageNtHeaders;
  ProcessInfo: TProcessInformation;
  Success: Boolean;
  Context: TContext;
  BaseAddress: Pointer;
  BytesWritten: NativeUInt;
  Sections: PImageSectionHeaders;
  i: ULONG;
  OldProtect: ULONG;
  StartupInfo: TStartupInfo;
  BytesRead: nativeuint;//SIZE_T;
  parameter: string;
  filename: string;
.
.
.

    filename := ExtractFilePath(paramStr(0))+'HelloWorldInFile64.exe';
    if not FileExists( filename ) then
      exit;

    mem := TMemoryStream.Create;
    mem.LoadFromFile( filename );

    FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
    FillChar(StartupInfo, SizeOf(TStartupInfo),       0);

    StartupInfo.wShowWindow := SW_HIDE;
    startupinfo.cb := sizeof(STARTUPINFO);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    parameter := ParamStr(0);

    if CreateProcess(nil, pchar(parameter), nil, nil, False, CREATE_SUSPENDED,
      nil, nil, StartupInfo, ProcessInfo) then
    begin

      Success := False;
      try
        Context.ContextFlags := CONTEXT_INTEGER;
        if GetThreadContext(ProcessInfo.hThread, Context) then
        begin
          if ReadProcessMemory( ProcessInfo.hProcess, Pointer(Context.Rdx + 16 ), @BaseAddress, SizeOf(BaseAddress), BytesRead ) then
          begin
            if zwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0 then
            begin
   
              NtHeaders := PImageNtHeaders( Cardinal(mem.Memory) + Cardinal(PImageDosHeader(mem.Memory)._lfanew));

              BaseAddress := VirtualAllocEx( ProcessInfo.hProcess,
                                                   Pointer(NtHeaders.OptionalHeader.ImageBase),
                                                   NtHeaders.OptionalHeader.SizeOfImage,
                                                   MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); //hier muss der fehler liegen?!?!??

              if Assigned(BaseAddress) then
              if WriteProcessMemory( ProcessInfo.hProcess, BaseAddress, mem.Memory, NtHeaders.OptionalHeader.SizeOfHeaders, BytesWritten) then
              begin
                Sections := PImageSectionHeaders(ImageFirstSection(NtHeaders));
                for i := 0 to NtHeaders.FileHeader.NumberOfSections - 1 do
                  if WriteProcessMemory( ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Pointer(Cardinal(mem.Memory) + Sections[i].PointerToRawData), Sections[i].SizeOfRawData, BytesWritten) then
                    VirtualProtectEx( ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Sections[i].Misc.VirtualSize, Protect(Sections[i].Characteristics), OldProtect);

                if WriteProcessMemory( ProcessInfo.hProcess, Pointer(Context.Rdx + 16 ), @BaseAddress, SizeOf(BaseAddress), BytesWritten) then
                begin
                  Context.Rcx := ULONG(BaseAddress) + NtHeaders.OptionalHeader.AddressOfEntryPoint;
                  Success := SetThreadContext(ProcessInfo.hThread, Context);
                end;
              end;
            end;
          end;
        end;
      finally

        if not Success then
        begin
          TerminateProcess(ProcessInfo.hProcess, 0);
        end
        else
        begin
          ResumeThread(ProcessInfo.hThread);

          while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
          begin
            ProcessMessage;
            Sleep(50);
          end;
          WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

        end;

      end;

    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);

    mem.Free;
  end;
Meine Frage, kann das überhaupt funzen???

Beim VirtualAllocEx scheint der Fehler zu liegen!?
It's Time to Play TheGame
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: 64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 20. Apr 2012, 19:32
Kurz und knapp: Das wird relativ sicher niemals funktionieren.

Das Problem wird WriteProcessMemory, VirtualAllocEx, etc. darstellen. Diese Art von prozessübergreifenden Funktionen funktionieren in der Regel nur von 32 zu 32 bit und 64 zu 64 bit Prozessen, aber nicht gemischt. Zumindest habe ich es nie geschafft aus meinem 32 bit Prozess aus Daten beispielsweise mit ReadProcessMemory zu lesen, also gehe ich mal davon aus, dass es umgekehrt von 64 zu 32 bit auch nicht geht.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (20. Apr 2012 um 19:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#3

AW: 64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 20. Apr 2012, 22:35
Hmm hät gedacht das wenn unter Win7-64bit die 32Bit Progs laufen, das denn das starten aus dem Speicher raus auch möglich sei
It's Time to Play TheGame
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#4

AW: 64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 20. Apr 2012, 23:02
Win32 läuft dort in einem eigenen Subsystem, mit eigenen Schnittstellen (WinAPIs).
Es gibt zwar einige Schnittstellen, welche an gewissen Stellen Daten konvertieren und so für ein Zusammenspiel sorgen, aber deshalb ist es nicht unbedingt möglich, daß alle Funktionen, für solche fast direkten Datenverbindungen, funktionieren.

Stell es dir wie ein Windowsprogramm vor, welches über Wine im Linux läuft.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Apr 2012 um 23:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#5

AW: 64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 20. Apr 2012, 23:46
Ok dank euch, werd denn doch eine komplette 64Bit version aus meinem Prog. machen müssen
It's Time to Play TheGame
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: 64bit Anw. soll 32bit Anw. ausm Speicher starten

  Alt 21. Apr 2012, 10:20
Warum eigentlich unbedingt aus dem Speicher starten?
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 08:38 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