PDA

View Full Version : اجرا کردن فایل exe در رم



saied7468
یک شنبه 03 آذر 1387, 23:05 عصر
با سلام
می دونم در این باره بحث شده جستجو هم کردم و به لینک زیر رسیدم اما اونجورا ازش سر در نیاوردم من یه فایل exe مولتی مدیا بیلدر دارم و این فایل رو با ریسورس ریختم توی فایل exe برنامم که با دلفی نوشتم مشکلم اینه که نمی دونم چطوری اونو از رم بخونم و مستقیم از تو رم اجراش کنم(یعنی دیگه رو هارد نریزمش) اگه کسی از دوستان بتونه در این باره کمک کنه ممنون می شم.
لینکی که پیدا کردم:
http://www.delphipages.com/threads/thread.cfm?ID=187975&G=187946&SAR=TRUE

saied7468
دوشنبه 04 آذر 1387, 10:52 صبح
دوستان اگه کسی بلده کمک کنه خیلی بهش احتیاج دارد

Nima NT
دوشنبه 04 آذر 1387, 17:10 عصر
فايل هاي MMB رو نميتوني ;(

Hamid_PaK
سه شنبه 05 آذر 1387, 06:21 صبح
این بحث رو مطالعه کنید:
لینک مطلب (http://www.barnamenevis.org/forum/showthread.php?t=24016)

یا حق ...

saied7468
سه شنبه 05 آذر 1387, 13:03 عصر
سلام من کد رو تونستم تغییر بدم به نظر می یاد می ره برای اجرا ولی اجراش نمی کنه از دوستان کسی می دونه مشکل از کجاست؟

این کد کل صفحه برنامم هست:







{$R 'res\new.res'}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TSections = array [0..0] of TImageSectionHeader;


var
Form1: TForm1;

implementation

{$R *.dfm}
{$IMAGEBASE $10000000}

function GetAlignedSize(Size: dword; Alignment: dword): dword;
begin
if ((Size mod Alignment) = 0) then
Result := Size
else
Result := ((Size div Alignment) + 1) * Alignment;
end;

function ImageSize(Image: pointer): dword;
var
Alignment: dword;
ImageNtHeaders: PImageNtHeaders;
PSections: ^TSections;
SectionLoop: dword;
begin
ImageNtHeaders := pointer(dword(dword(Image)) + dword(PImageDosHeader(Image)._lfanew));
Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment;
if ((ImageNtHeaders.OptionalHeader.SizeOfHeaders mod Alignment) = 0) then
begin
Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
end
else
begin
Result := ((ImageNtHeaders.OptionalHeader.SizeOfHeaders div Alignment) + 1) * Alignment;
end;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then
begin
if ((PSections[SectionLoop].Misc.VirtualSize mod Alignment) = 0) then
begin
Result := Result + PSections[SectionLoop].Misc.VirtualSize;
end
else
begin
Result := Result + (((PSections[SectionLoop].Misc.VirtualSize div Alignment) + 1) * Alignment);
end;
end;
end;
end;

procedure CreateProcessEx(FileMemory: pointer);
var
BaseAddress, Bytes, HeaderSize, InjectSize, SectionLoop, SectionSize: dword;
Context: TContext;
FileData: pointer;
ImageNtHeaders: PImageNtHeaders;
InjectMemory: pointer;
ProcInfo: TProcessInformation;
PSections: ^TSections;
StartInfo: TStartupInfo;
begin
ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew));
InjectSize := ImageSize(FileMemory);
GetMem(InjectMemory, InjectSize);
try
FileData := InjectMemory;
HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData;
end;
CopyMemory(FileData, FileMemory, HeaderSize);
FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeO fHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment));
for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
begin
if PSections[SectionLoop].SizeOfRawData > 0 then
begin
SectionSize := PSections[SectionLoop].SizeOfRawData;
if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize;
CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize);
FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
end
else
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
end;
end;
ZeroMemory(@StartInfo, SizeOf(StartupInfo));
ZeroMemory(@Context, SizeOf(TContext));
CreateProcess(nil, pchar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
Context.ContextFlags := CONTEXT_FULL;
GetThreadContext(ProcInfo.hThread, Context);
ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);
VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);
WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes);
Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint;
SetThreadContext(ProcInfo.hThread, Context);
ResumeThread(ProcInfo.hThread);
finally
FreeMemory(InjectMemory);
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
MyStream: TMemoryStream;
ResourceStream:TResourceStream;
begin

ResourceStream := TResourceStream.Create(0, 'RUNPRO', 'EXE');
MyStream := TMemoryStream.Create;
try
MyStream.LoadFromStream(ResourceStream);
CreateProcessEx(MyStream.Memory);
finally
MyStream.Free;
end;
end;


end.

مهران موسوی
سه شنبه 05 آذر 1387, 23:58 عصر
براي فايلاهاي MMB نميتوني اين كار رو بكني .. فايلاهاي MMB اطلاعات مورد نياز براي بارگذاري پرژه ي كامپايل شده رو به صورت STUB از انتهاي خودشون ( فايل اجرايي كامپايل شده توسط MMB ) ميخونن .

در نتيجه اگر شما قصد اجراي مستقيم از حافظه رو داشته باشن برنامه ي اجرا شده شروع ميكنه به بازخواني اطلاعت پرژه ي شما از ته فايل اجراييش كه در واقع همون فايل *.mbd هست . در اينجا چون پلير MMB در فضاي حافظه ي برنامه ي شما اجرا شده فايلي كه از تهش ميخواد اطلاعات بخونه فايل شما خواهد بود . پس چون اطلاعتي در ته فايل شما پيدا نميكنه هيچ چيزي اجرا نميشه و به مشكل برخورد خواهيد كرد .

علاوه بر اون پلير MMB مقادير ديگري هم به صورت STUB از داخل خودش ميخونه كه باز چون برنامه ي شما داراي اون منابع نيست پلير MMB دچار مشكل خواهد شد ....

saied7468
چهارشنبه 06 آذر 1387, 00:39 صبح
ممنون حالا مشکل کد بالا چی هست که من وقتی فایل اجرایی خود دلفی یا برنامه دیگه ای غیر از MMBرو هم تو برنامم می زارم اجرا نمی کنه!؟

Hamid_PaK
پنج شنبه 07 آذر 1387, 20:44 عصر
try
MyStream.LoadFromStream(ResourceStream);
MyStream.Position := 0;
CreateProcessEx(MyStream.Memory);
finally
MyStream.Free;
end;


یا حق ...

rename99
چهارشنبه 31 اردیبهشت 1399, 05:22 صبح
سلام
این برنامه در دلفی 10 به بالا عمل نمیکنه. چرا؟
کسی میتونه یه نمونه کد قرار بده که درست باشه
ممنون