![]() |
Programm im RAM ausführen
Hallo,
ich möchte folgendes realisieren. Ich habe eine EXE (mein Programm)und eine zweite EXE ( mein Unterprogramm) Die zweite exe ist eine art kopierschutz. So, ich möchte jetzt wenn man die erste EXE startet ( also mein Programm), dass die zweite EXE, welche in der ersten am ENDE dranhängt in den Arbeitsspeicher geladen wird und dann ausgeführt wird. Ich will praktisch ein Programm starten welches direkt keine EXE hat. Die ist sozusagen in meinem START Modul. Ich hoffe ihr wisst was ich meine. Danke im Voraus und noch ne schöne Nacht. bye, skunker |
Re: Programm im RAM ausführen
Hmm, warum speicherst du die 2. EXE nicht einfach beim Start des Programms temporär ab?
|
Re: Programm im RAM ausführen
Es könnte ja jemand auf die Idee kommen und beim Ausführen den Ordner offen zu lassen.
Dieser könnte dann ja die Datei ebend mal kopieren und untersuchen, was ich ja nicht will. |
Re: Programm im RAM ausführen
Wenn du das unter C:\Windows\Temp speicherst, müsste man das auch erst mal finden.
Und außerdem kann man ja auch den RAM auslesen, oder? |
Re: Programm im RAM ausführen
Unter NT möglich aber nicht einfach. Siehe dazu:
![]() |
Re: Programm im RAM ausführen
Also den RAM kann man doch mit Assembler auslesen, oder? So schön mit MOV? Also ich kann kein Assembler (nicht mal annähernd), aber das müsste doch gehen?
|
Re: Programm im RAM ausführen
Zitat:
|
Re: Programm im RAM ausführen
ich hab mal deinen code in ein testprog kopiert:
Delphi-Quellcode:
jedoch sagt er mir beim compilieren:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ntddk; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function Protect(Characteristics: ULONG): ULONG; const Mapping: array [0..7] of ULONG = ( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE ); begin Result := Mapping[Characteristics shr 29]; end; type PImageSectionHeaders = ^TImageSectionHeaders; TImageSectionHeaders = array [0..95] of TImageSectionHeader; var ProcessInfo: TProcessInformation; StartupInfo: TStartupInfo; Success: Boolean; Context: TContext; BaseAddress: Pointer; BytesRead: DWORD; Resource: Pointer; NtHeaders: PImageNtHeaders; BytesWritten: DWORD; Sections: PImageSectionHeaders; i: ULONG; OldProtect: ULONG; begin FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := SizeOf(TStartupInfo); if CreateProcess(nil, PChar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartupInfo, ProcessInfo) then begin Success := False; try Context.ContextFlags := CONTEXT_INTEGER; if GetThreadContext(ProcessInfo.hThread, Context) and ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress), BytesRead) and (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0) then begin Resource := LockResource( LoadResource(0, FindResource(0, 'Image', 'EXE'))); if Assigned(Resource) then begin NtHeaders := PImageNtHeaders( Cardinal(Resource) + Cardinal(PImageDosHeader(Resource)._lfanew)); BaseAddress := ntddk.VirtualAllocEx(ProcessInfo.hProcess, Pointer(NtHeaders.OptionalHeader.ImageBase), NtHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); if Assigned(BaseAddress) and WriteProcessMemory(ProcessInfo.hProcess, BaseAddress, Resource, 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(Resource) + Sections[i].PointerToRawData), Sections[i].SizeOfRawData, BytesWritten) then ntddk.VirtualProtectEx(ProcessInfo.hProcess, Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress), Sections[i].Misc.VirtualSize, Protect(Sections[i].Characteristics), OldProtect); if WriteProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress), BytesWritten) then begin Context.Eax := ULONG(BaseAddress) + NtHeaders.OptionalHeader.AddressOfEntryPoint; Success := SetThreadContext(ProcessInfo.hThread, Context); end; end; end; end; finally if not Success then TerminateProcess(ProcessInfo.hProcess, 0) else ResumeThread(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; procedure TForm1.Button1Click(Sender: TObject); begin Close(); end; [Fehler] Unit1.pas(117): Anweisung erwartet, aber 'PROCEDURE' gefunden wo liegt der Fehler ? danke im Voraus. cu, skunker |
Re: Programm im RAM ausführen
Du musst die procedure am Ende noch var das type tuen.
Der direkt auszuführende Code in einer Unit muss immer nach den Routinenimplementationen stehen. |
Re: Programm im RAM ausführen
ich will ja das der code nach einem klick später auf nem button ausgeführt wird.
Ich dachte ich da bräuchte ich dann nur die protect function aufrufen. ??? |
Re: Programm im RAM ausführen
Wenn du willst, dass der Code in nem Button Click ausgeführt wird, musst du den Code in die Ereignisbehandlunsroutine zu Button.OnClick schreiben.
|
Re: Programm im RAM ausführen
ahh ok habs.
thx :) bei müdigkeit coden lol ich glaub dat bringt nix. |
Re: Programm im RAM ausführen
Zitat:
|
Re: Programm im RAM ausführen
Eigendlich ist die Lösung des Problems recht einfach.
1. Programm mit CREATE_SUSPENDED-Flag starten 2. Speicher per ReadProcessMemory und WriteProcessMemory decodieren 3. per ResumeThread das programm laufen lassen Das sezt natürlich voraus das du den EXE-Header (inkl. PE-Header) nicht mitverschlüsselst und du dich vorher ein bisschen mit dem aufbau des PE-Headers beschäftigt hast. Gruß MCQ |
Re: Programm im RAM ausführen
Alter Thread, aber neues Problem :D Es geht um folgendes. Der Sinn sei jetzt bitte mal dahingestellt ..
Ich starte eine als Resource eingebundene EXE über die oben gepostete Funktion. Das funktioniert solange gut, wie beide EXEn die gleiche ImageBase haben. Nun hat meine eigene EXE aber die ImageBase $13140000 und die eingebundene EXE die ImageBase $00400000. Das Starten und Ausführen der eingebundenen EXE klappt trotzdem wunderbar - - - bis zu der Stelle wo ich in dieser versuche mittels CreateThread einen Thread zu erzeugen. Folgender Aufruf:
Delphi-Quellcode:
Ich vermute mal, dass die Adressenermittlung mittels @ fehlschlägt. Hat jemand eine Idee wie ich das umgehen kann?
CreateThread(nil, 0, @ThreadFunc, nil, 0, TID);
Gruß |
Re: Programm im RAM ausführen
lass Dir doch einfach mal den Wert anzeigen, den @ThreadProc liefert. Sollte der *immer* relativ zu $00400000 sein, musst Du einfach noch was dazu addieren, ich bezweifle allerdings, dass das so funktioniert.
|
Re: Programm im RAM ausführen
Was mir das gerade durch den Kopf geht wo ich diesen Thread lese, geht das auch mit einer Dll, diese aus dem Speicher zu laden? Vorzugsweise aus einem TMemoryStream. Hat da jemand eine Quelle zu ob und wie?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz