نمایش نتایج 1 تا 9 از 9

نام تاپیک: اجرا کردن فایل exe در رم

  1. #1

    Question اجرا کردن فایل exe در رم

    با سلام
    می دونم در این باره بحث شده جستجو هم کردم و به لینک زیر رسیدم اما اونجورا ازش سر در نیاوردم من یه فایل exe مولتی مدیا بیلدر دارم و این فایل رو با ریسورس ریختم توی فایل exe برنامم که با دلفی نوشتم مشکلم اینه که نمی دونم چطوری اونو از رم بخونم و مستقیم از تو رم اجراش کنم(یعنی دیگه رو هارد نریزمش) اگه کسی از دوستان بتونه در این باره کمک کنه ممنون می شم.
    لینکی که پیدا کردم:
    http://www.delphipages.com/threads/t...87946&SAR=TRUE

  2. #2

    نقل قول: اجرا کردن فایل exe در رم

    دوستان اگه کسی بلده کمک کنه خیلی بهش احتیاج دارد

  3. #3
    کاربر دائمی
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    تهران
    پست
    2,397

    نقل قول: اجرا کردن فایل exe در رم

    فايل هاي MMB رو نميتوني ;(

  4. #4
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125

    نقل قول: اجرا کردن فایل exe در رم

    این بحث رو مطالعه کنید:
    لینک مطلب

    یا حق ...

  5. #5

    Question نقل قول: اجرا کردن فایل exe در رم

    سلام من کد رو تونستم تغییر بدم به نظر می یاد می ره برای اجرا ولی اجراش نمی کنه از دوستان کسی می دونه مشکل از کجاست؟

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



    {$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.


  6. #6

    نقل قول: اجرا کردن فایل exe در رم

    براي فايلاهاي MMB نميتوني اين كار رو بكني .. فايلاهاي MMB اطلاعات مورد نياز براي بارگذاري پرژه ي كامپايل شده رو به صورت STUB از انتهاي خودشون ( فايل اجرايي كامپايل شده توسط MMB ) ميخونن .

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

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

  7. #7

    نقل قول: اجرا کردن فایل exe در رم

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

  8. #8
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125

    نقل قول: اجرا کردن فایل exe در رم


    try
    MyStream.LoadFromStream(ResourceStream);
    MyStream.Position := 0;
    CreateProcessEx(MyStream.Memory);
    finally
    MyStream.Free;
    end;


    یا حق ...

  9. #9

    نقل قول: اجرا کردن فایل exe در رم

    سلام
    این برنامه در دلفی 10 به بالا عمل نمیکنه. چرا؟
    کسی میتونه یه نمونه کد قرار بده که درست باشه
    ممنون

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •