![]() |
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. ??? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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