الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تنفيذ برنامج داخل برنامجي ,,, ب Thread منفصل ,,

بدأه Syntax_err في 23 يونيو 2008 · 9 رد · 1,622 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله والصلاة والسلام على رسول الله ,,,

أردت أن أقوم لعمل برنامج يقوم بتنفيذ برنامج آخر داخل نفسه :S ,,, قد تتضح الفكرة للأغلبية ,,

أنا أرى إنها ممكنة التنفيذ ولكن لا أدري كيف سأقوم بتنفيذها ,,,

صحيح أن ما سأقوم به من محاولة بالفيجول بيسك ,, لكني لن ألقى التجاوب هناك , وأيضاَ لن يفهمني أكثرهمـ ,, مثل قسم الدلفي :D

وبما أن الموضوع أغلبه API أردت أن أضعه في قسمم الخاص ,, لكن ,, ممنوعـ !!

قلت ما عندي إلا حبايبي ,, الأسمبلي ,,, لا تردوني عاد زي الباقيين ,,

------------------------

المهمـ ندخل لصلب الموضوع ,,,

عندي برنامج لإستعادة كامل جدول الـ SDT ,, المهمـ كوده بالسي ,, وما قدرت أحوله للفيجول لصعوبة التعامل مع الفيزيكل ميموري ,,

قال ليـ GM إني أحوله لـ dll ومن ثمن أستعمله ببرنامجي ,, دام إني ما أقدر أحوله لـ ShellCode وأستدعيه بـ CallWindowProc

أيضاَ لا أريد المخاطرة بجعل الملف مكشوف للجميع ,,, أو أن أضيفه كـ exe لأنه ستتم مراقبته من قبل الـ Monitors و سيتم كشف تشغيله ,,

رأيت مثال عن تشغيل برنامج داخل ذاكرة برنامج آخر ,,, عن طريق إنشاء عملية جديدة بإسم البرنامج الآخر بوضعية الـ سسبند ,,, ومن ثم كتابة بيانات

البرنامج الآخر فوقها ,,, وإستكمال العملية ,,,

ففكرت في إمكانية عمل ثريد في برنامجي ,, وتكون به بيانات البرنامج الآخر ,,, فأريد منكمـ تأكيد ـأو نفي إمكانية تنفيذ الأمر ,,, وإذا كان يمكن ,, سأطرح أكواد ودوال تشغيل برنامج بذاكرة برنامج آخر ,,, لننتهي بالنهاية بتشغيل برنامج في ثريد منفصل بنفس العملية اللي بها برنامجي ,,,

آسف عالإطالة ,,,

منتظر الرد ,,,,

أخوكمـ Syntax_err

#2

من الممكن تشغيل برنامج من الذاكرة مباشرة دون الحاجة لإنشاء ملف أولا كما ذكرت أنت , لكن ...

الأسهل والأضمن هو تحويل الكود الى لغتك او استخدام dll .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

أخي الكريم ,,, أنا لن أقوم بإنشاء ملف ,,,,

لتقليل حجم السيرفر سأعتمد على المصادر ,,, يعني إذا كانت توجد قيم بالمصار الريسورسس ,,قم بعمل التالي ,,,

إستخراج البيانات من المصادر ,, فك تشفيرها أو ضغطها , ومن ثم إستدعاءها للذاكرة مباشرة ,,, بدون ملفات ولا هم يحزنون ,,, أنا لا أريد إستخدام dll لكي لا رفق ملفات مع برنامجي ,,, حتى إستخراج الملف لـ dll بعد التنفيذ ,, كلها واحده ,,,

لكن أريد إستخراج من المصادر ومن ثم تنفيذها للذاكرة ,,, بدون أي تدخل ,,,

لو عالتحويل ,,, طرحت محاولتي لتحويل كود من دلفي إلى فيجول ,,, لم أظن أنه إلا بقي القليل ,,, المشاهدات 60 ولا رد ,,,

والكود ,, USer Mode Unhooking فكيف لو حاولت أحول الـ Kernel Mode Unhooking ??

:] لا يوجد إلا إستخدام المصادر ,,, ولكن لا أريد إستخراج للملفات أبداً ,, ـ أريد من المصادر للذاكرة ,,,

منتظر ردك لإكمال الموضوع ,,

تم تعديل هذه المشاركة بواسطة Syntax_err في 23 يونيو 2008 في 22:16

#4

طالما نحن في قسم الأسمبلي فإليك هذا المثال بالأسمبلي كنت كتبته لأحد الأصدقاء من قبل :P

اذا فهمت طريقة عمل الـ Loading بهذا المثال فيمكنك تطبيقها على ملف dll بنفس الطريقة وبذلك تحل مشكلة عدم استخدام ملفات خارجية :wink: .

ExecuteFromMem.rar

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5

تمنعون وضع المواضيع في قسم الـ API وعندما نطرحها هنا تلزمونا بأمثلة أسمبلي :angry:

لا يوجد عندي إعترضا على هذا ,,, ومشكور على تعبك :D ويا ريت لو في مكان تجمع فيه مشاريع مثل هذه ليستفيد الجميع ,, لأنها والله كنوز خفية عنا :)

المعذرة لأني لم أقم للآن بتحويلها للفيجول ,, لكن أريد أن أسأل ,,, هل لا تزال العملية الأصلية قيد التشغيل .؟؟

يعني بهذا هل بإمكاني تشغيل المفكرة والحاسبة مثلاُ في عملية واحدة وThreads منفصلة ؟؟؟

أرجو الرد لأتمكن من الإستمرار في عملي ,, والمعذرة على العنوان ومشكورين عالتغيير ,,

#6
اقتباس
يعني بهذا هل بإمكاني تشغيل المفكرة والحاسبة مثلاُ في عملية واحدة وThreads منفصلة ؟؟؟

لم أفكر بهذا من قبل لذلك فلا استطيع أن أجزم ....

هل قرأت أخر سطر لي في المشاركة السابقة ؟؟ يمكنك عمل load للـdll من الذاكرة مع بعض الاضافات .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

مشكور أخـ محمد عالمتابعة ,,,

بالنسبة لي لن أستخدم dll بل سأستخدم exe سأقوم بإخراجه من المصادر , فك ضغطه سواء LZW أو أي طريقة أخرى ,, ومن ثم إرساله لثريد جديد ,,

بدون إستخراجه للهارد ,, فقط بالذاكرة ,,, فهل هذا ممكن ,, وهل هو ممكن مع الفيجول علماً أن برامج الـ Multi-Threads غير مستقرة بالفيجول ,

البرنامج المستهدف ( الذي سينفذ ) مكتوب بالسي , وبدون واجهات , فهل ممكن إستخراج قيمة الدالة Main بعد تنفيذها ؟؟؟ يعني هل ستكون بمثابة ExitCode للثريد التي تكمت بها العملية ؟

يعني ,,, ينفذ البرنامج كدالة :) ولا يزال برنامجي الأول قيد التشغيل ,, وينتظر قيمة الدالة التي ستكون إما بنجاح عملية دالة Main بإرجاع قيمة 1 أو 2 حسب الحالة أو بفشلها وإرجاع قيمة 0 مثلاُ ,,,,

مبدأ رفضي للـ dll عدم الرغبة في إستخراج أي ملف من برنامجي وكذلك إستخدام exe وتنفيذه سؤدي لكشف خطة العمل :) ,, وكثير من يراقب العمليات لكن ليس هناك من يراقب الثريدز :)

إذا كان كذلك سأتطرق لكود الأسبملي سطر بسطر لأحاول مجاراته بالفيجول ,,, والله يوفقـ الجميع ,,,

#8

خلّي بالك المثال يقوم بتشغيل البرنامج من الذاكرة لكن في process اخر وليس في thread بنفس الـprocess .

بالنسبة لارجاع القيمة استخدم :

VOID ExitProcess(

	UINT uExitCode 	// exit code for all threads  
   );

ضع الـExitCode بالقيمة التي تريد , ثم استخدم :

BOOL GetExitCodeProcess(

	HANDLE hProcess,	// handle to the process 
	LPDWORD lpExitCode 	// address to receive termination status 
   );

لمعرفة قيمة الـExitCode في برنامج آخر , لاحظ ان lpExitCode مؤشر لـDWORD و ليس DWORD مباشرة (لا اعرف كيف ستقوم بها في VB :wacko: , انت ادرى عموما) .

اقتباس
مبدأ رفضي للـ dll عدم الرغبة في إستخراج أي ملف من برنامجي

معنى هذا انك لم تفهم كلامي :angry: , يمكنك تحميل الـdll بدون استخراجه على الهارد بنفس طريقة تحميل exe لكن ربما يحتاج بهارات اخرى .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

المعذرة منكـ ,,, بالنسبة للـ dll لم أرد أي إضافات ,, وأعتقد أن التطبيق بشكل exe سيكون أصغر من dll ويتيح لي ضغطه بعده برامج ,,,

نحن عندما نتحدث عن ExitCode نتحدث عنه بالنسبة لثريد وليس بروسس ,, يعنني هل سينفع وهل تعتبر هناك ExitCodes للثريدز ؟؟؟

"(لا اعرف كيف ستقوم بها في VB wacko.gif , انت ادرى عموما) " أنا أيضاَ لا أعرف :) لأني سمعت أن الفيجول لا يقوم بأمور المتغيرات بنفس طريقة البرامج التالية ,,, وعن وجود دوال غير مصرح بها :) حتى الفيجول عنده undocumented :) مثل StrPtr اللي تجيب لك مؤشر السترنج أو شي زي كذا اللي يب ييشوف المثالـ ’,,,

Private Sub Form_Load()
Dim mm  As String
mm = "Hello !!"
MsgBox StrPtr(mm)
End Sub

الناتج ,, عبارة عن عنوان للمتغير ,, لا أدري إذا كان هذا صحيح ,, أم مجرد إفتراض منيـ ,,, أرجو من الخبراء أن يفيدونا في هذا ,,,

الـ dll أظنه سيضاف لقائمة الـ Modules ?? بهذا لن ينفعني ,, لا أدري ,,,

إذا رأيت أن إضافته كـ dll يستدعى بدالته التي ترجع قيمة ,, أفضل من إستخراجه كـ exe لـ Thread وجلب نتيجة الـ exitcode لها أرجو إخباري لأحدد طريق أمشي عليه ,,,

بالأخير ,,, إذا كان معي عنوان المتغير ,, هل أستخدم CopyMemory لنسخ البيانات منه لمتغير بالفيجول ؟ بهذا أعيد قيمته ؟

#10

بالنسبة لـDLL ستضيفه بنفس طريقة الـEXE ... ريسورسات يعني ولا زي ما قلت انت .

بالنسبة لموضوع الـExitCode فبعد ان قرأت الـremarks التابع للدالة تبين انه يمكن الاستغناء عن ExitProcess و بدلا من ذلك قم بوضع الـExitCode كـreturn من دالة الـWinMain او main .

الاخيرة اسأل فيها اهل الـvb .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

مواضيع مشابهة