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

[ تمت الإجابة ]كيف يمكن تحميل مكتبة داخل برنامج لا يستخدم الدالة Loadlibrary؟

بدأه GHOST2010 في 28 أغسطس 2009 · 18 رد · 2,477 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

كنت أقوم ببعض تدريبات الهندسة العكسية وكنت أجرب عملية حقن الكود Code Injection

استطعت بفضل الله عمل هذا الأمر لكن عندما حاولت إجراء نفس العملية بداخل برنامج مكتوب بلغة الأسمبلى لم أجده يستورد الدالة LoadLibrary وهى الدالة الرئيسية فى العملية التى أريد إجراءها فكيف يمكن تحميل مكتبة واستدعاء دالة بداخلها فى برنامج كهذا؟

قرأت أن كل البرامج تستخدم هذه الدالة لتحميل المكتبات المطلوبة لكنى عندما دخلت من خلال برنامج Olly على نافذة الدوال Ctrl+N لم أجد الدالة المطلوبة

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

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#2

سؤال جيد اخي في انتضار احد الاخوان للتفسير

فقط لدي سؤال ، كيف قمت بحقن كود داخل ملف تنفيدي ، اقصد متلا حقن كود يضهر رسالة MsgBox واي برنامج يفتح في الداكرة يتم حقن الكود به

تم بعدها يعود البرنامج لنقطة الادخال ليشتغل بشكل عادي

تم تعديل هذه المشاركة بواسطة aderfiad في 28 أغسطس 2009 في 20:31

#3

السلام عليكــم ورحمـة الله وبركاتــه ،،

لإتمام عملية حقن الكود أو Code Injection فلابد أن تجد مكانا خاليا داخل قسم الكود يمكن أن يستوعب عدد التعليمات التى تريد إضافتها وهو ما يسمى بالكهف أو Cave

عند تحميل البرنامج داخل Olly فإنه يتوقف تلقائيا عند نقطة الإدخال أو Entry Point فيجب عليك حفظ هذا العنوان لتحويل مسار التنفيذ إليه بعد إنهاء الكود الخاص بك

إذاً الخطوات التى قمت بها كانت كالتالى :

1- تحميل البرنامج داخل Olly

2- حفظ نقطة الإدخال الأصلية

3- البحث عن Cave يتسع للكود الذى سأقوم بحقنه

4- كتابة الكود داخل هذه المنطقة

5- حفظ الملف النهائى

6- تغيير نقطة الإدخال إلى العنوان الذى بدأت الكود منه وذلك باستخدام برنامج LordPE أو أى برنامج تحب أو عمل ذلك بطريقة يدوية

أما بالنسبة للطريقة مفصلة فيمكنك قراءة الدرس الموجود فى المرفقات للمشرف السابق المتميز جدا JAAS

_________________________________________.rar

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#4

شكرا لك اخي لكن الطريقة التي شرحتها اعمل بها :happy:

انا كنت اقصد برمجة برنامج تنفيدي عند فتحه يقوم بحقن الكود في اي برنامج تم فتحه بالداكرة

وهو نفس مبدأ عمل الفايروسات وليس الهدف صنع فايروسات فقط من باب التعلم والاستفادة :lol:

واضن هدا هو الامر الدي يقوم به فايروس Sality العنيد عند دخوله الجهاز ، اي برنامج فتحته يقوم بحقن كود بداخله حيت يصبح البرنامج معطوب ولا يفتح

( تعلم طريقة حقنه لكود تمكنك من اصلاح الملفات وقد دمر لي هدا الفايروس برامج كبيرة في الحجم متل 3dmax و photoshop ....

ازلت الفايروس بمكافح فايرروسات لكن البرامج التنفيدية بقيت حاملة للكود ولم استطع اصلاحها واضطررت لتحميل البرامج من جديد :( )

تم تعديل هذه المشاركة بواسطة aderfiad في 28 أغسطس 2009 في 21:53

#5

اهلا اخي ghost

كاضافة.. في حالة عدك وجود cave كبير كفاية يمكن اضافة section جديدة و اعطائها الخاصية readable, executable ثم حقن الكود فيها و تحويل نقطة الادخال

ايضا يمكن ان تستعمل .data كمنطقة لحقن الكود بشرط ان تكون دات خاصية executable

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

يمكن ان تقوم بتغيير نقطة ادخال دالة معينة نحو الكود المضاف ثم تقفز الى الدالة من جديد

ارجو ان اكون اضفت اكثر

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#6

السلام عليكــم ورحمـة الله وبركاتــه ،،

اقتباس
ايضا يمكن ان تستعمل .data كمنطقة لحقن الكود بشرط ان تكون دات خاصية executable

هل تقصد طريقة الـShell Code ؟

أعذرنى فأنا جديد فى هذه اللغة ولا أعرف سوى القليل جدا فيها

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

يمكن ان تقوم بتغيير نقطة ادخال دالة معينة نحو الكود المضاف ثم تقفز الى الدالة من جديد

هذا هو ما قصدته حينما قلت

اقتباس
عمل ذلك بطريقة يدوية

لكنى لم أستطع التعبير بالطريقة المناسبة

اقتباس
ارجو ان اكون اضفت اكثر

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

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#7

رمضان مبارك لك ايضا اخي ghost

اقتباس
هل تقصد طريقة الـShell Code ؟

شيئ من هادا القبيل كلاهما داتا.. لكن الشل فيض

اعدرني لاني لست في المنزل لدلك فلن اسهب في الشرح كثيرا.. لكن اعدك ان اضع درسا يتكلم عن ال pe format و يشرح الفكرة التي اشرت اليها

على العموم لنبدا من الصفر.. اهد مهندسي ميكو العباقرة و الدي يعرف ب mark Zbikowsky وهو المهندس الاول لنظام دوس و os/2 اقترح طريقة لتخزين البرنامج بحيث يمكن ان يتجاوز الكود عتبة 64 كيلو وهي ما يعرف بال pe format (يمكن ان تلاحظ ان الحرفين الاولين من اسمه موجودان في اول اي ملف تنفيدي على الوين)

يمكن ان تلاحظ ان الملف التنفيدي يحتوي على عدة اقسام

executable code section .text (mico) or code (borland)
data sections .data, .rdata, or bss(mico), data(dorland)
resources section .rsrc$
export data .edata
import data .idata
debug information section .debug

تتغير هده الاقسام حسب الملف و نوعه

لناخد الان الصلاحيات التي تكلمت عليها

في ال lordpe يمكن ان تلاحظ في خصائص اي section عدة صلاحيات. عندما يكون flag الخاص ب executable code موجودا فان المعلومات الموجودة في تلك ال section يمكن ان تنفد على انها كود ( لاحظ ان pe loader الخاص بالوندوز يستعمل الرايات لحماية الداكرة و المعلومات الموجودة). في نفس الةقت ادا تم تفعيل الراية writable فان المعلومات يمكن ان تكتب ( idata او bss تعرف على انها writable .... في نفس الوقت البرامج المحمية او الفيروسات المتغيرة polymorphic تغير code section الى writable كي تستطيع ان تغير ال opcodes دون ان تحدث exception)

ادن الفكرة بسيطة جدا.. حول الراية نحو executable لقسم الداتا و قم بحقن كودك

او انشا section جديدة وافعل نفس الشيئ

سامحني ادا لم اسهب اكثر :D

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#8

السلام عليكــم ورحمـة الله وبركاتــه ،،

جزاك الله خيرا أخى fkugd2003 (هل إسمك أمين؟)

لكن مازال سؤالى يحتاج إلى إجابة

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#9

السلام عليكم ورحمة الله وبركاته

نعم انا اسمي امين اخي ghost

ما تحتاج ان تقوم به هو ان تستعمل طريقة الشل كود لكي تحمل المكتبة..

راجع هدا لعله يفيدك

http://zetarace.blogspot.com/2009/02/shell...x63-x6f_40.html

فكرة اخرى جائتني تتمثل في تغيير ال import section يدويا لتحميل الدالة ... لم اجربها لكن اظن انها ممكنة

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

لي عودة ان شاء الله

فقط كاضافة سريعة

بالفرنسية موضوع جيد جدا

http://geo0w.blogspot.com/2009/08/injectio...de-dans-un.html

تم تعديل هذه المشاركة بواسطة fkugd2003 في 30 أغسطس 2009 في 00:14

العمل كثير و الوقت قليل أعاننا الله

seo zen SEO Enlightment amazon danbo

#10

السلام عليكــم ورحمـة الله وبركاتــه ،،

ورمضان مبارك عليكم جميعا

إجابة للسؤال في الاغلب هناك دوال اكثر تواجدا بكثير من LoadLibrary مثل GetModuleHandle

وغالبا GetProcAddress وبوجود هذه الدالتين يمكن الحصول تقريبا على اي دالة.

باستخدامهم بامكانك الحصول على الدالة LoadLibrary.

push "kernel.dll";مثلا طبعا
call GetModuleHandle
push "LoadLibrary";يجب الانتباه هنا الى انه يجب كتابة اسماء الدوال  بالشكل الصحيح فهي Case Sensitive فلو كتبنا مثلا LoAdLibrary  ستفشل الدالة
push eax
call GetProcAddress

اقتباس
قرأت أن كل البرامج تستخدم هذه الدالة لتحميل المكتبات المطلوبة لكنى عندما دخلت من خلال برنامج Olly على نافذة الدوال Ctrl+N لم أجد الدالة المطلوبة

كثير من البرامج تستخدم GetProcAddress للحصول على دوال أخرى ، جرب في اوللي وضع BreakPoint على هذه الدالة في البرنامج وتابعها.

تم تعديل هذه المشاركة بواسطة AND في 30 أغسطس 2009 في 16:54

#11

السلام عليكــم ورحمـة الله وبركاتــه ،،

جزاكم الله خيرا جميعا

عزيزى AND , لم أجد الدالة GetProcAddress

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

ch2_sec1_1.rar

إن قلت قال الله قال رسولـه همزوك همز المنكر المتعالي
أو قلت قد قال الصحابة والألـى تبعاً لهم بالقول والأعمال
أو قلت قـال الشافعي وأحمد و أبو حنيفة والإمام الغالي
صدوا عن وحي الإله ودينـه واحتالوا على حرام الله بالإحلال
يا أمةً لعبت بدين نبيها كتلاعب الصبيان في الأوحال
حاشا رسول الله يحكم بالهوى تلك إذاً حكومة الضلال

feed.1.gif

#12
aderfiad كتب:
انا كنت اقصد برمجة برنامج تنفيدي عند فتحه يقوم بحقن الكود في اي برنامج تم فتحه بالداكرة

اذا فهمت سؤالك صح،، تريد حقن كود معين في جميع البرامج التي تعمل (processes)

يمكنك ذلك بان تكتب الكود الذي تريد حقنه داخل ملف dll

ثم يمكنك استخدام طريقة CreateRemoteThread لحقن ملف الdll ،، داخل ال thread ستكون فقط دالة LoadLibrary وتعطي اسم ملف ال dll ، طبعا في هذه الطريقة يلزمك اولا

ان تحسب البروسيس التي تعمل في الذاكرة حاليا.

ايضا طريقة اخرى ،، يمكنك استخدام امكانية system message hook ، تعمل hook على نوع من انواع المسج و تستفاد من خاصية الحقن التلقائي لل message hook وتكتب الكود

الذي تريد حقنه في نفس ملف ال dll الذي يحوي على ال message hook

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 30 أغسطس 2009 في 21:32

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#13

السلام عليكم ،،

شكرا لكم شباب اسفدت من الموضوع كتيرا

اخي ' الاخير زمانه ' نعم هدا ما اقصد بالضبط // ممكن ان تشرح دالة CreateRemoteThread // جازاك الله خيرا

الطريقة التانية صعب علي عملها ^^

#14

انظر اخي في هذا الرابط

Three Ways to Inject Your Code into Another Process

اقرءه لتكون لك فكرة اولية عن الموضوع

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

عذرا لا اعرف مصدر بالفرنسية،، <_<

بالمناسبة الطرية الثانية ،، message hooking موضحة جيدا في ال msdn

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#15

انظر اخي هذا الكود للتوضيح

مثلا لو كان لديك زر عند الضغط عليه تتم عملية الحقن

BOOL retval;
	wchar_t szlibfile[MAX_PATH];

	GetModuleFileNameW(NULL,szlibfile,sizeof(szlibfile));
			wcscpy(wcsrchr(szlibfile,TEXT('\\'))+1,L"library_name.dll");

			hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
			pe.dwSize=sizeof(PROCESSENTRY32);
			retval=Process32First(hSnapshot,&pe);

			while(retval)
			{

					InjectLib(pe.th32ProcessID,szlibfile);

				pe.dwSize=sizeof(PROCESSENTRY32);
				retval=Process32Next(hSnapshot,&pe);

			}


			CloseHandle(hSnapshot);

نقوم بحسابة جميع البروسيس التي تعمل الان في الوندوز ، و لكل بروسيس نستدعي دالة InjectLib لكي نقوم بعملية الحقن

BOOL WINAPI InjectLib(DWORD dwProcessId,  const wchar_t* pszLibFile) {

// Definition.----------------------------------.-------


	HANDLE hProcess = NULL;
	LPVOID loadLibraryW;
	LPVOID pInjectionData;
	wchar_t szDllPath[MAX_PATH];
	SIZE_T notUsed;
	bool funcResult;
	funcResult= false;
	DWORD threadId;
	HANDLE hThread;
	HMODULE hModule;


//--------------------------------------------------------
__try{

	/*OpenProcess

		The OpenProcess function opens an existing process object.


		HANDLE OpenProcess(
		  DWORD dwDesiredAccess,
		  BOOL bInheritHandle,
		  DWORD dwProcessId
		);

*/
		hProcess = OpenProcess(
			PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,
			FALSE,
			dwProcessId);
		if(hProcess == NULL) __leave;

		 hModule = GetModuleHandleA("kernel32.dll");
	if (hModule == NULL) __leave;


		 loadLibraryW= GetProcAddress(hModule,"LoadLibraryW");
	if (loadLibraryW == NULL)  __leave;



	/*
		VirtualAllocEx

		The VirtualAllocEx function reserves or 
		commits a region of memory within the virtual address space 
		of a specified process. The function initializes the memory it allocates to zero,
		 unless MEM_RESET is used.


		LPVOID VirtualAllocEx(
		  HANDLE hProcess,
		  LPVOID lpAddress,
		  SIZE_T dwSize,
		  DWORD flAllocationType,
		  DWORD flProtect
		);

  */


	pInjectionData = VirtualAllocEx(
			hProcess,
			NULL,
			sizeof(szDllPath),
			MEM_COMMIT,
			PAGE_READWRITE);

	if (pInjectionData == NULL) __leave;

		/*
		Copy a string.

	wchar_t *wcscpy(
   wchar_t *strDestination,
   const wchar_t *strSource 
);


  */
		wcscpy(szDllPath, pszLibFile);

		/*

	The WriteProcessMemory function writes data to an area of memory in 
				  a specified process. The entire area to be written to must be accessible or
				  the operation fails.


				BOOL WriteProcessMemory(
				  HANDLE hProcess,
				  LPVOID lpBaseAddress,
				  LPCVOID lpBuffer,
				  SIZE_T nSize,
				  SIZE_T* lpNumberOfBytesWritten
				);


  */

		WriteProcessMemory(hProcess,
			pInjectionData,
			szDllPath,
			sizeof(szDllPath),
			&notUsed);

		 /*

  CreateRemoteThread

		The CreateRemoteThread function creates a thread that runs in the
		 virtual address space of another process.


		HANDLE CreateRemoteThread(
		  HANDLE hProcess,
		  LPSECURITY_ATTRIBUTES lpThreadAttributes,
		  SIZE_T dwStackSize,
		  LPTHREAD_START_ROUTINE lpStartAddress,
		  LPVOID lpParameter,
		  DWORD dwCreationFlags,
		  LPDWORD lpThreadId
		);

  */


		threadId= 0;

		 hThread = CreateRemoteThread(
			 hProcess,
			 0,
			 0,
			 (LPTHREAD_START_ROUTINE)loadLibraryW,
			 pInjectionData,
			 0,
			 &threadId);

	if (hThread==NULL)  __leave;

	funcResult=true;
	}




	 __finally { 

	/*
		  VirtualFreeEx

		The VirtualFreeEx function releases,
		 decommits, or releases and decommits a region of memory within 
		 the virtual address space of a specified process.


		BOOL VirtualFreeEx(
		  HANDLE hProcess,
		  LPVOID lpAddress,
		  SIZE_T dwSize,
		  DWORD dwFreeType
		);

  */
	 // Free the remote memory that contained the DLL's pathname


		 /*if (pInjectionData != NULL) 
		 VirtualFreeEx(
		 hProcess,
		 pInjectionData,
		 0,
		 MEM_RELEASE);*/


	  if (hProcess != NULL) 
		 CloseHandle(hProcess);

	  if (hThread	 != NULL) 
		 CloseHandle(hThread);

	  if (hModule	!= NULL) 
		 CloseHandle(hModule);
   }

		 return funcResult;
 }

راجع اخي الكتاب الذي سبق ان ذكرته لك لمزيد من المعلومات فالكود الذي في الاعلى ماخوذ منه

ايضا لتوضيح كيف تعمل Eject للمكتبة بعد تحميلها

================

اخي صاحب الموضوع انا اسف جدا و اعتذر منك على خروجي عن موضوع سؤالك

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 31 أغسطس 2009 في 05:02

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#16

شكرا لك اخي متالك واضح

سأحاول ترجمة الموضوع الى الفرنسية ليسهل علي فهمه

#17

للاسف ترجم بشكل مبعتر وغير واضح :hmm:

لو امكن من احد الاخوة الدين يجيدون الانجليزية الاجتهاد و ترجمة المقال جزاكم الله خيرا

هناك العديد يريد تعلم هده التقنية لكن لديه مشكل الانجليزية

:( :( :( :( :( :(

تم تعديل هذه المشاركة بواسطة aderfiad في 31 أغسطس 2009 في 06:33

#18
اقتباس
عموما ,, فى المرفقات أحد البرامج التى أقصدها ,, أتمنى لو استطاع أحد تنفيذ ما أريده عليه أن يخبرنى بالطريقة

هل شاهدت هذا الدرس اخي GHOST :happy:

-

ملحوظة ستبدأ من المرحلة الثانية لان مكتبة ال Kernel32 موجودة بالفعل في البرنامج.

_____________________________________.rar

تم تعديل هذه المشاركة بواسطة Ahmed18 في 31 أغسطس 2009 في 12:24

#19
اقتباس
ملحوظة ستبدأ من المرحلة الثانية لان مكتبة ال Kernel32 موجودة بالفعل في البرنامج.

post-77919-1251729106_thumb.jpg

كيف حصلت على عناوين LoadLibrary و GetProcAddress ؟!

من عناوين ال Export للدالة kernel32.dll ؟!

اذا كان كذلك فهذه الطريقة ستنجح على جهازه والنسخ المماثلة فقط .

تم تعديل هذه المشاركة بواسطة AND في 31 أغسطس 2009 في 17:49

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…