View Full Version : لینک یک برنامه به برنامه دیگر !
Unique
چهارشنبه 01 اردیبهشت 1389, 10:55 صبح
سلام
شاید من عنوان مناسبی انتخاب نکردم (چون تا حالا این کار را نکردم که بدونم بهش چی میگن !)
به هر حال من میخوام کاری کنم که یک برنامه را که با دلفی نوشته شده Bind کنم به یک فایل اجرایی دیگه (حالا این برنامه ممکنه با هر زبانی که فرمت PE (فایل اجرائی استاندارد ویندوز) ایجاد میکنه نوشته شده باشه). مشکل اینجاست که من اصلا نمیدونم باید چیکار کنم ، کسی مفاله ای (مهم نیست فارسی یا انگلیسی) یا هر سرنخی به من میتونه بده ؟
خیلی راحت بگم میخوام یک قفل ساده بگذارم ابتدای هر فایل exe که خواستم و تا زمانی که برنامه من روالش به پایان نرسیده ، برنامه ای که بهش Bind شده اجرا نشه.
Unique
چهارشنبه 01 اردیبهشت 1389, 13:40 عصر
فکر نکنم هیچ کس ندونه چطور باید این کار را کرد یا موضوع پیچیده ای را مطرح کرده باشم ! اگر کسی کمترین اطلاعاتی را داره خوشحال میشم در اشتراک بگذاره !
Felony
چهارشنبه 01 اردیبهشت 1389, 18:24 عصر
با کامپوننت هایی مثل VCL ZIP میتونید یه همچین کاری بکنید .
lord_viper
چهارشنبه 01 اردیبهشت 1389, 19:01 عصر
تو کتاب زیر در بخش Stream ها در مورد اساس کار بیندرها صحبت کرده خوندنش حتما به شما کمک میکنه
http://www.iranled.com/forum/showthread.php?tid=16930
Unique
چهارشنبه 01 اردیبهشت 1389, 19:25 عصر
دوستان فکر کنم شما اصلا متوجه نیستین من میخوام چیکار کنم ! VCLZip که برای zip کردن فایلها هستش !!!!!
چه ربطی به این موضوع داره ؟؟
کتابی هم که cyberfox معرفی کرد را من نتونستم Download کنم ! لینک Rapid کار نمیکنه.
عذر میخوام ، اما لطفا جواب صحیح بدین ! من آماتور نیستم ...
lord_viper
چهارشنبه 01 اردیبهشت 1389, 22:44 عصر
این هم سورس یه binder
2 تا فایل رو به سرور اضافه میکنه
موقع اجرا 2 تا فایل رو exteracr و اجرا میکنه
شما اینو بسته به نیازتون تغییر بدین
Unique
پنج شنبه 02 اردیبهشت 1389, 00:43 صبح
ببین ، این برنامه میاد دو تا فایل را با FileStream میچسبونه بهم ، یعنی میگذاره پشت سر هم !
من اینو نمیخوام ! من میخوام وقتی روی فایل Bind شده کاربر کلیک میکنه ! فایل اولی اجرا بشه و فایل اولی بتونه فایل دوم را اجرا کنه و خودش terminate بشه !
من که توضیح دادم میخوام چکار کنم ! قفل هایی که برای فایلهای اجرائی میسازند ! مثلا نرم افزار هایی که روی یک فایل اجرایی Password میگذارند. اصول کارشون چطوره ؟
نرم افزار هایی مثل Exe Wrapper یا Exe Protector
Unique
پنج شنبه 02 اردیبهشت 1389, 01:20 صبح
بسیار خوب ! همونطور که گفتم ، ایراد از عنوان بنده است ! با یکم اینترنت گردی متوجه شدم که به کاری که من میخوام انجام بدم میگویند : Code Injection ! که برای ساخت virus و یا protector و از این حرفا ازش استفاده میشه !
حالا که من میدونم چی میخوام کسی هست منبع معرفی کنه ؟ یا یک نمونه بگذاره ؟
lord_viper
پنج شنبه 02 اردیبهشت 1389, 08:17 صبح
اولا شما سوالتونو اشتباه مطرح کردین
دوما شما نیاز به code injection و این قضایا ندارین
اگه میخواهید چیزی شبیه پکرها بنویسین برای محافظت از فایل اجرایی شما به Memory Execute نیاز دارین به این صورت که فایل مورد نظر شما بر روی فایل اول قرار می گیره و توسط همون هم در حافظه بارگذاری میشه و در انتها میتونین برنامه اولی رو Terminate کنین
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); export;
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
ufs:tmemorystream;
begin
ufs:=tmemorystream.Create;
ufs.LoadFromFile('master.exe');
CreateProcessEx(ufs.Memory);
end;
Felony
پنج شنبه 02 اردیبهشت 1389, 11:58 صبح
دوستان فکر کنم شما اصلا متوجه نیستین من میخوام چیکار کنم ! VCLZip که برای zip کردن فایلها هستش !!!!!
چه ربطی به این موضوع داره ؟؟
بعضی مواقع یه چیزایی اینجا میبینم که ... ، شما سوال خودت رو یک با بخون ، مگر نمیخوای یک برنامه مثل برنامه هایی که روی exe قفل میزارن بنویسی ؟ تا به حال با قسمت Archive نرم افزار WinRar کار نکردی ؟!
ربطش به همونه !
عذر میخوام ، اما لطفا جواب صحیح بدین ! من آماتور نیستم ...
!!!
بسیار خوب ! همونطور که گفتم ، ایراد از عنوان بنده است ! با یکم اینترنت گردی متوجه شدم که به کاری که من میخوام انجام بدم میگویند : Code Injection ! که برای ساخت virus و یا protector و از این حرفا ازش استفاده میشه !
حالا که من میدونم چی میخوام کسی هست منبع معرفی کنه ؟ یا یک نمونه بگذاره ؟
تزریق کد چه ربطی به سوال شما داره ! هر جور فکر میکنم نمیشه هیچ رابطه ای براش تعیین کرد !
شما با VCLZIP یک برنامه Zerver میسازید ، حالا با یک برنامه دیگه فایل های مورد نظر به همراه رمز رو به برنامه سرور پاس میدید ، برنامه سرور فایل ها رو در خودش Embedded میکنه ، از این پس با اجرای برنامه سرور و وارد کردن رمز فایل Extract میشه !
لطفا وقتی از چیزی اطلاع ندارید دیگران رو زیر سوال نبرید !
Unique
پنج شنبه 02 اردیبهشت 1389, 15:26 عصر
بعضی مواقع یه چیزایی اینجا میبینم که ... ، شما سوال خودت رو یک با بخون ، مگر نمیخوای یک برنامه مثل برنامه هایی که روی exe قفل میزارن بنویسی ؟ تا به حال با قسمت Archive نرم افزار WinRar کار نکردی ؟!
دوست عزیز من ، چرا ناراحت میشین !!!
البته شما اصلا متوجه نشدین من چی میگیم ! من کجا حرف از Archive کردن یا Extract کردن زدم ؟
من کی گفتم میخوام روی فایل اجرائی رمز بگذارم ، گفتم یک قفل اما نگفتم چطور عمل کنه !!! ؟
خب اگه این بود که نیاز به برنامه نویسی نبود و با Winrar یک Archive میساختم و Pass میگذاشتم روش !!!
بعدشم هر کسی فایل را Extract میکرد میداد دست یکی دیگه و اونوقت اون قفل فقط یکبار به درد میخورد !
من توی سوالم گفتم ممکنه عنوان مناسب نباشه و شما هم اومدی سراغ بحث archive کردن ! که اصلا منظور من این نیست !
تزریق کد چه ربطی به سوال شما داره !هر جور فکر میکنم نمیشه هیچ رابطه ای براش تعیین کرد !
عزیز من زیاد فکر نکن ! توی همین Forum یک جستجو بکن ببین هر جا صحبت از پروتکتور و قفل نرم افزاری هست (شتاب ، Hot Lockو ...) از تزریق کد هم حرف هست !
لطفا وقتی از چیزی اطلاع ندارید دیگران رو زیر سوال نبرید !
از چی اطلاع ندارم ؟! اگه میدونستم دقیقا چطور این کار انجام میشه که اینجا مطرح نمی کردم یکی بیاد بگه برو Archive کن بعد Extract کن !! اینو که ما توی Novel و Dos انجام میدادیم! اصلا اطلاعات کد نویسی نمیخواد ! یا اصلا Installer میساختم یا از Exe Wrapper استفاده میکردم !!!
مرسی از وقتی که گذاشتی اما اگه میخوای از این روش دفاع کنی، جاش اینجا نیست منم نمیخوام با همدیگه کل کل کنیم !
اگه راه حل جالبتری داره ارائه بده ...
Unique
پنج شنبه 02 اردیبهشت 1389, 16:05 عصر
cayberfox ، حالا شد یه چیزی ، من تست میکنم و خبرشو میدم ! توی حالتی که شما گفتیم فایل host من باید روی دیسک یا resource های فایل protector باشه تا بریزیمش توی memory streamو هر وقت خواستیم اجراش کنیم ! این خوبه ، اما :
تنها تفاوتی که بحث شما با مطالبی که من خوندم توی این دو روز اینه که معمولا همه جا یک Section به فایل هدف که میخوایم روش قفل بگذاریم اضافه میکنند و به عنوان Entry Point قرارش میدهند ! حالا شما مثالی میتونی بزنی که یک فایل به نام protector.exe را بگذاریم توی Entry Point Section فایل host.exe و زمانی که protector اجرا شده با کلیک روی فرم protector بتونیم jump کنیم روی host.exe تا اجرا بشه و protector را Terminate کنیم !
lord_viper
پنج شنبه 02 اردیبهشت 1389, 17:55 عصر
cayberfox ، حالا شد یه چیزی ، من تست میکنم و خبرشو میدم ! توی حالتی که شما گفتیم فایل host من باید روی دیسک یا resource های فایل protector باشه تا بریزیمش توی memory streamو هر وقت خواستیم اجراش کنیم ! این خوبه ، اما :
تنها تفاوتی که بحث شما با مطالبی که من خوندم توی این دو روز اینه که معمولا همه جا یک Section به فایل هدف که میخوایم روش قفل بگذاریم اضافه میکنند و به عنوان Entry Point قرارش میدهند ! حالا شما مثالی میتونی بزنی که یک فایل به نام protector.exe را بگذاریم توی Entry Point Section فایل host.exe و زمانی که protector اجرا شده با کلیک روی فرم protector بتونیم jump کنیم روی host.exe تا اجرا بشه و protector را Terminate کنیم !
کدی که قرار دادم رو xp کامل کار میکنه
ببین این تکنیک memory execute در Execrypto ها مورد استفاده قرار میگیره شما برای نگهداری فایل اصلی میتونین 2 کار انجام بدین
1.راحت مثل binder ها کل فایل رو به ته فایل server اضافه کنین و در زمان اجرا اونو به صورت stream خوانده و تو حافظه اجرا کنیم
2.قسمت دیکودر رو به صورت 1 سکشن روی فایل اصلی قرار میدم و خاصیت سکشن رو اجرایی میکنیم اطلاعات این سکشن جدید رو به header اضافه میکنیم سایزشو fix میکنیم وimagebase و Entrypoint رو به imagebase وEntrypoint دیکودر منتقل میکنیم بعد سکشن کد فایل اصلی رو کد میکنیم و میزاریم سر جاشimagebase و entrypoint اونو هم جایی یاداشت میکنیم که بعد از دیکود بشه اجرا کرد وقتی برنامه اجرا میشه اول دیکودر تو حافظه بارگزاری میشه و سکشن کد اصلی رو میخونه و دیکود میکنه و با استفاده از imagebase و Entrypoint فایل اصلی اونو تو حافظه بارگزاری میکنه
انتخاب روش با خودته
Unique
شنبه 04 اردیبهشت 1389, 19:59 عصر
cayberfox ، من کد شما را خیلی تست کردم ! به یک سری مشکل بر خورد ! مثلا نمیشه یکسری فایلها را باهاش باز کرد ! نمونه قابل امتحانش ، فایل های Setup هستند.
بعضی برنامه ها هم که باز می شوند Theme اونها شبیه 98 میشه ! مثلا برنامه calc.exe خود ویندوز را چک کنید.
من یک برنامه تستی از کد شما Attach میکنم !. امیدوارم بشه واسه این مشکلات راه حل پیدا کرد. سعی کن فاییل های setup مانند winamp , quicktime یا هر چیز دیگه را باهاش اجرا کنی.
lord_viper
شنبه 04 اردیبهشت 1389, 22:54 عصر
مشکل لود ریسورسها رو میتونی با استفاده از توابع api حل کنی یک نمونه مثال تو سایت Delphibasics.uk هست
در مورد ستاپها هم مشکل از اونجاست که
مرد مومن تو فایل ستاپ رو از تو stream لود میکنی اونوقت اون برنامه ستاپ که خودش از Stream داره لود میشه فایلهای ستاپ خودش رو از کجا باز کنه؟(اون هم فایلها رو درون خودش داره که باید از ادری فیزیکی بخونه)
Unique
یک شنبه 05 اردیبهشت 1389, 11:05 صبح
خوب پس اینطور که معلومه این روش زیاد به درد کار من نمیخوره چون محدودیت داره ! و من نمیتونم تضمینی داشته باشم که فایل هدف من به هر حال از توی حافظه درست و بی اشکال Load میشه !
پس راهی نمیمونه جز اینکه بریم سراغ تزریق کد و ایجاد یک section جدید توی فایل exe هدف. من در این مورد هم خیلی گشتم و اکثر کدها به زبان C هستش و کار منو کند میکنه ، کسی نمونه کد یا مقاله ای که با دلفی توضیح داده باشه داره ؟
lord_viper
یک شنبه 05 اردیبهشت 1389, 11:45 صبح
شخصی بنام ErazerZ یونیتی بنام untPeFile نوشته که میتونین از اون استفاده کنین
(تو گوگل سرچ کنین پیدا میشه)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.