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

Run Programs Directly From the memory

مغلق
بدأه visual basic في 26 فبراير 2006 · 18 رد · 1,756 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل ممكن ان اشغل برنامج exe مباشره من الذاكره من Memory map

وكيف

#2

لماذا تريد تحميله بنفسك في الMemory Map و تشغيله

إستخدم CreateProcess لتحميله مباشرة

و عموما أن أظن أن سؤالك غير واضح فأرجو توضيحه قليلا و توضيح الغرض من هذه الفكرة من البداية حتى يسهل تحديد الحل لها إذا كان موجودا

#3
visual basic كتب:
السلام عليكم

هل ممكن ان اشغل برنامج exe مباشره من الذاكره من Memory map

وكيف

بما ان البرنامج موجود في الـ memory map فاذن هو يعمل سلفا..

لنقل انك تريد ان تقوم بتشغيل ملف ما من الذاكرة وهو موجود بالاصل مضمنا ضمن برنامج اخر, اذن يجب ان تقوم بحجز ذاكرة كافية.. استخدم memalloc مثلا, عليك ان تقوم بانشاء process عبر CreateProcess ولكن في وضع suspended, استخدم SuspendThread, الان انقل بيانات الملف المضمّن الى ذلك الفراغ بواسطة WriteProcessMemory, اخيرا قم بتشغيل البرنامج عبر ResumeThread..

هناك امثلة كثيرة عن هذا الموضوع, مثلا هذا الكود مثال ماخوذ من مقال لـ Detten, فكرته تختلف قليلا فهو لعمل loader بقراءة ملف موجود سلفا على القرص ومن ثم نقل بياناته الى الذاكرة والتعديل على بعض الاجزاء ومن ثم تنفيذه.. لكن التعديل عليه لا ياخذ الا بضع اسطر, حذف او اضافة.

	<-------------Code Snippet----------------->
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


.data
FileName db "C:\somedir\crackme.exe",0
notloaded db "It did not work :-(",0
Letsgo db "The process is started",13,10,
   "Let's change smthg and run it now :-)",0
NewText db "Dettens Caption",0

Startup STARTUPINFO <>
processinfo PROCESS_INFORMATION <>

.data?
hInstance HINSTANCE ?
byteswritten dd ?
uExitCode dd ?

.code
start:

	invoke GetModuleHandleA, NULL
	mov    hInstance,eax 
; Create a process and load the crackme in it, and
; immediatly suspend the thread (pause it)
	invoke CreateProcess, ADDR FileName, NULL, NULL, NULL, NULL, CREATE_SUSPENDED,
         NULL, NULL, ADDR Startup, ADDR processinfo
	.IF eax == NULL; Creation of new process failed?
  invoke MessageBox, NULL, ADDR notloaded, NULL, MB_ICONEXCLAMATION
	.ELSE
         invoke MessageBox, NULL, ADDR Letsgo, NULL, MB_OK; Display Message
        ; I will change the text string in the crackme used in
        ; the captionbar (004050FCh)
                invoke WriteProcessMemory, processinfo.hProcess, 004050FCh, ADDR NewText,
                      13, byteswritten
        ; Let the process run happily;)
         invoke ResumeThread, processinfo.hThread
        ;Let the process run for 5 sec. and then terminate it
         invoke Sleep, 5000
         invoke TerminateProcess, processinfo.hProcess, uExitCode
	.ENDIF
	invoke ExitProcess,eax
end start
	<-------------End Code Snippet------------->

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

شكرا

ولكن انا اريد ان اشغل البرنامج مباشره من الذاكره

حيث ان الملف موجود في الرسولس ولا اريد ان افكة على القرص

انا اضن اني احتاج الى اعادة بناء ال Import Table

#5

في الـ resource او في غيره.. في النهاية انت تحتاج لتطبيق ما ذكرته اعلاه ولا تحتاج لان تقوم بوضعه على القرص ابدا. كما قلت الكود السابق يحتاج الى تعديل بعض اسطر فقط لا غير.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

السلام عليكم

اخواني الكرام يا ريت نلاقي شخص يحل هذه المسألة لانها ةتعتبر هامة جدا في مجال البرمجة

#7

عشان أقدر اساعد أحب ان افهم الموضوع

ما ذا تقصد بالضبط انك تشغل exe من الذاكرة...

خبرنا ايش تبغى تعمل "من إلى"

لأن عندما تشغل الـ exe فانت تشغلها من الذاكرة...

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#8

اسف على التاخير

اريد ان اكتب في الذاكره البايتات لل exe بعد ان تكون مشفرة

وثم اشغلها المشكلة ان Shell لا تاخذ الا من الملف

وسوف تصبح بلا فائدة اذا كتبتها على الهارد ديسك ثم اشغلها

#9

عدنا الى نفس الموضوع في الاعلى, الكود السابق او الطريقة هو ما تبحث عنه.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

الكود السابق ياخذ FileName وانا لا اريد ان اعطية اسم الملف من الهارد ديسك

لان ال exe في الذاكره في Memory Map

واريد ان اشغلة من هناك

#11

السلام عليكم

سؤال للاخ السائل من اين اتى الملف التنفيذي لا بد ان يكون فى الهارددسك مسبقاً, ثانياً كيف وصل للذاكرة, هناك طريقتين اما انه تم تشغيله, او انه تم تحميلة إلى الذاكرة برانامج اخر..

فى الحالة الثانية يمكنك إستخدام CreateProcess وتضع عنوان الذاكرة التى تم تحميل الملف التنفيذي إليها بدل عنوان الملف..

فى الحقيقة سؤالك غير واضح او بالاحرى الغرض من تشغيل برنامج بعد تحميلة للذاكرة غير واضح ولا اجد سبب منطقي له..

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#12

يا اخي سالناك الملف موجود ضمن برنامجك قلت نعم.. قلنالك الكود السابق هو ما تبحث عنه كطريقة مع تحويل بضع اسطر.. ابحث, تم التكلم في هذا الموضوع القديم من ايام جدي وجدك مليار مرة.. كلمتين CreateProcess و WriteProcessMemory بيطالعولك بلاوي لوحدهم!

لم اقل لك انسخ والصق الكود السابق واعمل run وخلاص!!! هل قمت بكتابة اي تطبيق اسمبلي بالاصل من قبل؟ هذا المنتدى لن يعطي اي كود فيجوال للمعلومية وكل نقاشه سيكون لمبرمجي الاسمبلي فقط.

راجع موضوع للاخ Delta كان فيه تطبيق محمي ببرنامج ضغط كتبه هو.. الحماية تعتمد نفس الطريقة ان كنت تعلم كيف تقوم بتنقيح البرامج.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#13

السلام عليكم

أخي visual basic

لووضعت مثال بسيط به برنامج بالذاكرى لكان أحسن

ووفرت وقتك ووقت غيرك

:D

قلت EXE في الذاكرة

كيف وصل إليها ؟

هل كال في Resource ؟

في هذه الحاله إستخدم الدالة LoadFromResource

والبقية مكتوبة فوق

ليس باResource ووصل بطريقة ما للذاكرة ؟

مدمج ببرنامجك ؟ و تعرف موضعه بالذاكرة، يمكن إستخدام CopyMemory لتحويلة لمكان أخر إن أردت ثم نفس الشيئ المكتوب فوق

.

أعرف، تريد مثال جاهز!

mPACK مكتوب بنفس الطريقة

d4baa0.gif
#14
Xacker كتب:
هل قمت بكتابة اي تطبيق اسمبلي بالاصل من قبل؟ هذا المنتدى لن يعطي اي كود فيجوال للمعلومية وكل نقاشه سيكون لمبرمجي الاسمبلي فقط.

نعم كتبت اسمبلي من قبل

ولا لم اطلب كود فجوال

DeltaAziz كتب:

أعرف، تريد مثال جاهز!

mPACK مكتوب بنفس الطريقة

اخي DeltaAziz هذا تحديدا ما اريده مثل برنامجك اريد ان اعرف الطريقة فقط

وشكرا

#15

أكتب القسم الخاص بك

أي برنامج به ملف تنفيذي بالذاكرة

و أرفقه هنا

و سأريك كيف تكون التتمة

d4baa0.gif
#16
HINSTANCE hModel = GetModuleHandleA(NULL);
	HRSRC hRes = FindResourceW(hModel,MAKEINTRESOURCE(IDC_EXE1),_T("IDC_EXE"));

	if (!hRes) return;

	HGLOBAL hGlob = LoadResource(hModel,hRes);

	if(!hGlob) return;

	void * data = LockResource(hGlob);

	if(!hGlob) return;

	DWORD size = SizeofResource(hModel,hRes);

اخي ال exe موجود في المتغير data

#17

بالملف المرفق دالة تعمل تقريبا نفس عمل CreateProcessEx

لكن ب Parameter واحد فقط هو مؤشر لمكان الملف في الذاكرة

* ملحوظة :

يرجى الإبقاء على حقوق الكاتب الأصلي Aphex ....

d4baa0.gif
#18

شكرا اخي DeltaAziz هذا بالتحديد ما اريده

#19

هل المرفق موجود (وانا احلم باني لا اراه) او انه في رسالة خاصة؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

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