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

API Hook مثال بسيط

مغلقرائج
بدأه B.M.AbdelAziZ في 8 مايو 2006 · 64 رد · 9,157 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
فاذن VirtualProtect غير مهمه لها قبل ان نشرع باستخدام WriteProcessMemory.

يا حبيبي لاحظ جيدا

في مثالي فوق لم أستعمل VirtualProtect و إستخدمت WriteProcessMemory وقمت بالتعديل

في المثال الذي ذكره الأخ xc-delphi-cx إستخدم VirtualProtect وقام بالتعديل دون إستخدام WriteProcessMemory

و هناك طرق أخرى...

d4baa0.gif
#27

ما زلت غير مقتنع بعدم استخدام VirtualProtect, هل تقوم دلفي بوضع السماحيات اوتوماتيكيا!!

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

	invoke	LoadLibrary, addr _kernel32
	test	eax, eax
	je	error
	invoke	GetProcAddress, eax, addr _VirtualFree
	test	eax, eax
	je	error
	mov	dword ptr [nAddr], eax
	mov	esi, eax
;invoke	VirtualProtect, eax, nSize, PAGE_EXECUTE_READWRITE, addr oldprot
	lea	edi, oldbytes
	push	edi
	mov	ecx, 6
@@:; save original bytes
	movsb	byte ptr [edi], byte ptr [esi]
	loop	@B
; and create commands with those bytes :)
	lea	edi, [handle]
	pop	esi
	mov	ecx, 6
@@:
	movsb	byte ptr [edi], byte ptr [esi]
	loop	@B
	lea	eax, [hooker] 	 ; calculates the new offset
	mov	ebx, dword ptr [nAddr]	;
	sub	eax, ebx    ;
	sub	eax, 5    ;
	mov	byte ptr [newbytes], 0E9h; far jmp opcode
	mov	dword ptr [newbytes+1], eax; set the newbyes
	mov	byte ptr [newbytes+5], 90h; nop the 6th unused byte
	mov	edi, dword ptr [nAddr]
	lea	esi, newbytes
	mov	ecx, 6
@@:; now replace with our hook
	movsb	byte ptr [edi], byte ptr [esi]
	loop	@B

ثم اخبرني, ماذا ستحصل عند محاولة التعديل على بداية دالة VirtualFree بدون ان تستعمل VirtualProtect؟ تبعا لاني لا املك نسخة Delphi فلا استطيع اختبار الكود الذي وضعته انت.

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

« Everything looks different from another cracker point of view »

« There are 11 types of people, those who understand binary, those who don't, well I'm the rest »

« ?Do you speak Binary »

me W4R3ZD00D/

#28

السلام عليكم

عندما يقوم ال executable بتحميل ال Module (kernel32.dll) هل يقوم بتحميل كل الدوال الموجوده في ملف ال DLL أم التي يحتاجها فقط؟

و كيف تتم عملية ترتيب هذه الدوال عند اعطائها العنوانين.؟ بمعنى هل عندما يطلب ال executable داله معينه يحملها في ذاكرته أولا و يعطيها عنوان معين ثم يطلب داله ثانيه و يحملها في ذاكرته و يعطيها عنوان آخر، هل تكون العناوين عشوائيه أم مرتبه؟

h:= GetModuleHandle('kernel32.dll');
 if h = 0 then
   h:= LoadLibrary('kernel32.dll');
 @HookED:= GetProcAddress(h, 'TerminateProcess');

بالنسبة للكود السابق، كيف يتم معرفة عنوان دالة ال TerminateProcess? هل تتم مقارنة كل الدوال الموجوده في ملف ال DLL مع الداله التي حددناها و ان و جدت يتم ارجاع العنوان الينا؟

شكرا ..

#29

يتم تحميل فقط الدوال الموجودة في الـ ImportTable

لا يهم الترتيب الفعلي للدوال, يتم قراءة الـ ImportTable من خلال اللودر التابع للويندوز الذي يتكفل باحضار العناوين المباشرة للدالة من خلال المكتبة الصحيحة والتي يكون اسمها ايضا في الـ ImportTable ومن ثم يتم انشاء ما يعرف بـ IAT (Imports Address Table) تتوضع فيها العناوين التي تم استعادتها من خلال اللودر وفي الكود يتم ربط كل استخدام لدالة ما بهذه العناوين اي ان الطلب يتم من خلال IAT وينتقل مباشرة بعدها الى صورة المكتبة التي تم انشاؤها من قبل التطبيق.

اما عندما يتم استعمال LoadLibrary/GetProcAddress فهذه طريقة مباشرة للحصول على عنوان تابع لدالة ما غير موجودة في البرنامج (في الـ ImportTable) وبالتالي فانه لاستخدام هذه الدالة اكثر من مرة يجب احضار عنوانها مرة واحدة على الاقل وتخزينه في متغير يطلب بعدها عند الحاجة. او يتم طلبها في كل مرة (وهذا امر يثقل عملية التنفيذ بشكل "غير" ملحوظ في البرامج "الصغيرة")

« Everything looks different from another cracker point of view »

« There are 11 types of people, those who understand binary, those who don't, well I'm the rest »

« ?Do you speak Binary »

me W4R3ZD00D/

#30

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

موضوع جميل جدا يا دلتا , بعد ما ينتهي يتصادر على قسم الـ API :D

كان في أحد الأعضاء بيطلب الكود يكون سي , رجعته مكسور الخاطر يا دلتا

يلا تدريب بقى , اجرب كده احول للسي

الدالة المراد عمل hook لها :

BOOL TerminateProcess(
	HANDLE  hProcess,	// handle to the process 
	UINT  uExitCode 	// exit code for the process  
);

الحصول على عنوان الدالة

HMODULE h = GetModuleHandle("kernel32.dll");
if(h == NULL) 
  h = LoadLibrary("kernel32.dll");
FARPROC hocked = GetProcAddress(h, "TerminateProcess");

الدالة البديلة , تعريفها يشبه تعريف الدالة المراد عمل hook لها

BOOL NewOne(
	HANDLE  hProcess,	// handle to the process 
	UINT  uExitCode 	// exit code for the process  
);

نقوم بعمل type جديد من نوع struct ليتضمن الثلاث قيم : أمر push , عنوان العودة , امر ret

struct T6Bytes {
  Byte P;
  FARPROC addr;
  Byte R;
} OldBytes, NewBytes;

أولاً نقرأ من الذاكرة بداية من عنوان الدالة التي نريد عمل hook لها , أول 6 بايت , يعني بطول السجل OldBytes ونضعها فيه

اذا نجحت عملية القرائة نقوم بوضع القيم الجديدة و نقوم بعملية الكتابة في الذاكرة

int i;
if(ReadProcessMemory(DWORD(-1), hocked, &OldBytes, SizeOf(OldBytes), &i)) {
   NewBytes.P = 0x68;
   NewBytes.R = 0xC3;
   NewBytes.addr = NewOne; // address of our proc
   WriteProcessMemory(DWORD(-1), hocked, &NewBytes, SizeOf(NewBytes), &i);
}

لو في غلطة حد يصلحها ;)

#31

عندي بعض الأسئله ..

عندما نكتب دالتنا الجديده NewOne باستخدام WriteProcessMemory هل ننسخ اسم دالتنا الجديده مكان الداله المراد عمل Hook لها .. هل ننسخ الأسم فقط أم الاسم مع عنوانها؟ بمعنى

قبل:

اسم الداله عنوانها

0x44444 TeminateProcess

بعد:

الحاله الأولى: كتابة الداله الجديده مع تغيير عنوانها

اسم الداله عنوانها

0x44455 NewOne

الحاله الثانيه: كتابة الداله الجديده مع بقاء عنوانها، و في حالة بقاء العنوان كما هو، كيف نعرف عنوان دالتنا الجديده؟

اسم الداله عنوانها

0x44444 NewOne

بعد حفظ ال 6 بايتات في مكان ما، كيف نتأكد أننا كتبنا 6 بايتات جديده و لم نكتب أكثر، ان حدث أن كتبنا أكثر من 6 بايتات، أعتقد أننا نقوم بعمل overwrite لبايتات ثانيه

#32
Yousof كتب:
عندي بعض الأسئله ..

عندما نكتب دالتنا الجديده NewOne باستخدام WriteProcessMemory هل ننسخ اسم دالتنا الجديده مكان الداله المراد عمل Hook لها .. هل ننسخ الأسم فقط أم الاسم مع عنوانها؟ بمعنى

قبل:

اسم الداله عنوانها

0x44444 TeminateProcess

بعد:

الحاله الأولى: كتابة الداله الجديده مع تغيير عنوانها

اسم الداله عنوانها

0x44455 NewOne

الحاله الثانيه: كتابة الداله الجديده مع بقاء عنوانها، و في حالة بقاء العنوان كما هو، كيف نعرف عنوان دالتنا الجديده؟

اسم الداله عنوانها

0x44444 NewOne

بعد حفظ ال 6 بايتات في مكان ما، كيف نتأكد أننا كتبنا 6 بايتات جديده و لم نكتب أكثر، ان حدث أن كتبنا أكثر من 6 بايتات، أعتقد أننا نقوم بعمل overwrite لبايتات ثانيه

اولا, لو قمت بتغيير اسم الدالة ضمن مكتبة kernel32.dll او اي دالة اخرى في اي مكتبة اخرى فانت: 1- عزلت الدالة الخاصة بك وبالتالي لن يتم استخدامها الا من قبل برنامجك لانه يعلم ان هناك تعديل تم.

2- كل برنامج يطلب TerminateProcess الان لن يجدها وبالتالي سيحصل له crash&burn

3- الغاية هي مراقبة استخدام هذه الدالة, فاذن يجب الا يتم تعديل اي شئ لا على العنوان ولا على الاسم!! اعتقد ما زال لديك خلط كبير بالنسبة لهذا الموضوع

الفكرة:

1- اسم الدالة والعنوان يبقيان كما هما

2- ما يتم التعديل عليه هو فقط بايتات البداية في الدالة (لا في الاسم ولا في العنوان)

3- هذه البايتات بدل ان تكون بايتات نقل وحفظ والخ.. تصبح عبارة عن تعليمة JMP طويلة تقوم بنقل التنفيذ الى منطقة خاصة ببرنامجك كي يتم مراقبتها, مثلا من اي برنامج وردت, ما الى هذا من معلومات, ومن ثم يتم التعامل معها اما باعادة التنفيذ الى البايت الذي يلي البايت السادس كي يتم متابعة التنفيذ بصورة صحيحة او يتم اتخاذ اجراء اخر.

4- طبعا البايتات التي تم تعديلها يجب حفظ قيمتها قبل التعديل لانه يجب تنفيذها في حال انتهيت من مراقبة الدالة واردت ان تعيد التنفيذ لبقية اجزاء الدالة فاذن تقوم بتنفيذ البايتات ومن ثم تقوم بنقل التنفيذ الى البايت السابع كي يتم متابعة التنفيذ بصورة صحيحة.

بخصوص التاكد من كتابة 6 بايتات, في الواقع الامر تابع لك, يجب ان يكون الكود مثلا حلقة تدور 6 مرات تكتب بايت في كل مرة, هل يمكنك ان تشك بانها كتبت 7 في هذه الحالة؟

« Everything looks different from another cracker point of view »

« There are 11 types of people, those who understand binary, those who don't, well I'm the rest »

« ?Do you speak Binary »

me W4R3ZD00D/

#33
اقتباس
ما زلت غير مقتنع بعدم استخدام VirtualProtect, هل تقوم دلفي بوضع السماحيات اوتوماتيكيا!!

لا علاقة للغة بالأمر

إن كانت لديك الصلاحية في تغيير ماتريد لا تحتاج ل VirtualProtect

و إن لم يكن لديك تستخدمها،

اقتباس
عندما يقوم ال executable بتحميل ال Module (kernel32.dll) هل يقوم بتحميل كل الدوال الموجوده في ملف ال DLL أم التي يحتاجها فقط؟

ليست تحميل الدوال

ولكن تحميل مكتبة الدوال

بما فيها من دوال

اقتباس
و يحملها في ذاكرته و يعطيها عنوان آخر، هل تكون العناوين عشوائيه أم مرتبه؟

النظام هو المسؤول عن هذا

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

والدوال تكون مرتبة حسب ترتيبها في ملف المكتبة الموجود في القرص، تحتاج لفهمم بنية الملف التفيذي لتفسم ذلك Win32 PE

اقتباس
كان في أحد الأعضاء بيطلب الكود يكون سي , رجعته مكسور الخاطر يا دلتا

البركة فيك أخي asm4all

و جزاك الله كل خير على التحويل للغة C

اقتباس
عندما نكتب دالتنا الجديده NewOne باستخدام WriteProcessMemory هل ننسخ اسم دالتنا الجديده مكان الداله المراد عمل Hook لها .. هل ننسخ الأسم فقط أم الاسم مع عنوانها؟

لم تفهم

لا نغير في أي دالة و لا في موضعها لأنها تبقى كماهي

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

بحيث عند إستدعاد الدالة ينفذ أمر القفز لدالتنا وتنفذ هي

هل فهمت ؟

اقتباس
بعد حفظ ال 6 بايتات في مكان ما، كيف نتأكد أننا كتبنا 6 بايتات جديده و لم نكتب أكثر، ان حدث أن كتبنا أكثر من 6 بايتات،

إقراء Help الدالة التي إستخمت WriteProcessMemory تجد الجواب بنفسك

إنتهى المثال، السورس بدلفي وملف تنفيذي للتجربة مرفق ببداية الموضوع

d4baa0.gif
#34

ألف شككككككر DeltaAziz :)

هل ماسبق ينطبق تمام على طريقة عمل hook على داله موجوده مثلا في ntdll.dll أو فيه اختلاف

اختلاف بمعنى حاجات لابد نضيفها عشان يكون الـ hook آمن ومافيه أخطاء

#35

القاعدة نفسها

لكن الأمر يختلف حسب الدالة

فلو كانت الدالة Native فهناك أشياء أخرى تأخد بعين الإعتبار

d4baa0.gif
#36
اقتباس
فلو كانت الدالة Native فهناك أشياء أخرى تأخد بعين الإعتبار

بصراحه من أول الموضوع انتظر حاجه عن اذا كانت الداله Native :rolleyes:

#37

سيكون هناك أمثلة أخرى و بأحدها Native API Hook

و أتمنى مشاركة من هو في توقيعك ;)

d4baa0.gif
#38
اقتباس
و أتمنى مشاركة من هو في توقيعك

حول .. في حدا بيناديني ؟

انا متابع الموضوع من البداية ولكن فضلت رؤية الردود لأعلم كيف سيكون النقاش ... وأعتقد النتيجة واضحة لك

هذي اليومين مشغول قليلاً بـ Acrobat SDK لاني اريد عمل plugin . ناهيك عن العمل ...

اقتباس
بصراحه من أول الموضوع انتظر حاجه عن اذا كانت الداله Native

هناك موضوع (كل مرة أنسى كاتب الموضوع , هو اماD او كلاشنكوف ) في القسم فيه مثال على ذلك ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#39

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

15_05_06_04_14_54_1147734894hooker.gif

بالتوفيق للجميع

Do as I say, not as I do

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

#40

كاني سمعت اسم كلاشنكوف هنا :P

ان تصل متاخرا خير من ان لاتصل ابدا :D

المهم لم افهم هذه النقطة يا شباب

كيف عرفنا ان

اقتباس
NewBytes.P = 0x68;

NewBytes.R = 0xC3;

ام ان هذا الشي ثابت لهذا النوع من الدوال بينما الnative لها تعامل اخر

ولماذا وضعنا القيمة

DWORD(-1)

كبارامتر

الم يكن من المفروض ان نضع مقبس handle حسب تعريف الدالة

The ReadProcessMemory function reads data from an area of memory in a specified process. The entire area to be read must be accessible, or the operation fails.

BOOL ReadProcessMemory(
HANDLE hProcess,
LPCVOID lpBaseAddress,
LPVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesRead
);

اقتباس
فلو كانت الدالة Native فهناك أشياء أخرى تأخد بعين الإعتبار

مثل ماذا ؟

اها وهذا كود الرجوع الان فهمت

WriteProcessMemory(DWORD(-1), @HookeD, @OldBytes, SizeOf(OldBytes), Dw);

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#41
اقتباس
يف عرفنا ان

NewBytes.P = 0x68;

NewBytes.R = 0xC3

هي اوامر Assembly للقفز

يمكن استعمال أمر قفز أخر...

لمعرفتها تحتاج لتمرس بسيط و مغامرة مع لغة التجميع

اسهل طريقة لمعرفة OpCode ما هي أن تكتب بريمج صغير به امر او اثنين فقط ثم تعمل له Dessambly

اقتباس
DWORD(-1)

لنقل كانك كتبت Self

اقتباس
فلو كانت الدالة Native فهناك أشياء أخرى تأخد بعين الإعتبار

فقط مثال:في Native لا يوجد GetModuleHandle و GetProcAddress

d4baa0.gif
#42

السلام عليكم

هل انتهى الشرح ام توقف ارجو استكمال الموضوع

{ربى زدنى علما}

#43

السلام عليكم

هذا مثال بسيط جدا

شرح المثال انتهى و النتيجة بالملف المرفق في اول مشاركة بالموضوع

سيكون هناك مثال ثاني في موضوع اخر

ان شاء الله

d4baa0.gif
#44

السلام عليكم ..

هذا ما نريده بالفعل ..

لكن ليش بتقولو المنتديات العربية ما تنفع ودوروا بالمنتديات الانكليزية ..

درس جميل اخي محمد ..

اخي بارك الله فيك .. ارجو منك ان تستمر بهكذا مواضيع رائعة .. وتتطرق الى امثلة اخرى .. وياريت من ثم تتكلم عن sys. Hook

/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/

 

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

#45

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

قرأت الموضوع وعندي كم سؤال ..

اولا ،

انا استخدم لغة سي ولهذا حاولت تحويل البرنامج الى هذه اللغة لكن ظهر لي error ،

وبما انه البرنامج مكتوب بلغة دلفي ..

لذا ارجو منك اخي محمد ان تسمح لي بمناقشة الكود في منتدى السي ؟؟

ثانيا بخصوص فكرة عمل hook api ،

انا بصراحة لم افهم الفكرة ولدي كم سؤال ،

انا حابب اسأل عن الفكرة نفسها ،

المشكلة كلها تكمن في

لماذا قرأنا 6 byte ؟؟

خلي اوضح .. لأن صار عندي لخبطة :wacko:

الدالة حين تستدعى (اقصد أي دالة ) ماذا يتم ،

يتم عمل push للعنوان الحالي ،، ثم ينفذ محتوى عنوان الدالة .. ثم عملية ret الى العنوان الذي عملنا له push

تمام ؟؟

نحن الان نريد عمل هوك على الدالة ..

اريد ان اسأل ،

عملية ال push و ال ret التي تسبق وتلي استدعاء الدالة الاصلية ليس لي علاقة بها ..

تمام ؟؟

انا سأغير وسيبدأ عملي من عنوان دالتي الذي حصلت عليه من هذا السطر

@HookED:= GetProcAddress(h, 'TerminateProcess');

،،

ما ذكرت في الاعلى هل هو صحيح ؟؟

الان ماذا سأغير في عنوان الدالة المراد عمل لها هوك ..

قلت اخي محمد سنقرء 6 بايت ،

لأننا بحاجة الى ان نكتب 6 بايت ،

يعني هنا لو استخدمنا ايعاز jmp مثلا ،،

سنقرء بقدر ما يحتاج هذا الايعاز

يعني اقصد لسنا ملزمين ب 6 بايت ؟؟ (سؤال مهم بالنسبة لي )

الان نعمل push لعنوان دالتي الجديدة ،

ما صح ؟؟

ثم نكتب العنوان .. ثم ايعاز الرجوع ..

الان لو نرجع للكود ،

هنا عرفنا دالتنا الجديدة

function NewOne(hProcess: THandle; uExitCode: UINT): BOOL; stdcall;

وهنا يظهر خطأي عندما حولت البرنامج الى السي ،

الفيجوال سي يعترض بخطئين .. يقول ..

error LNK2001: unresolved external symbol "int __stdcall NewOne(void *,unsigned int)" (?NewOne@@YGHPAXI@Z)

 fatal error LNK1120: 1 unresolved externals

******************

شي ثاني ، هنا

   HookeD(hProcess, uExitCode);

اين تعريف ال hProcess ؟؟

بحثت عليه في الكود ولم اجده ،

الا يجب تعريفه قبل استخدامه ؟؟؟

،،،

شي اخير ..

هنا دالة القراءة

ReadProcessMemory(DWORD(-1),  @HookeD, @OldBytes, SizeOf(OldBytes), Dw)

وما سيقرء سيوضع في ال OldBytes ،

سؤالي ..

ماذا سنقرء ؟؟؟

هل نستطيع القول ..

لا يهم ،، ولا ندري .. المهم نقرء 6 بايت من بداية العنوان لأننا بحاجة الا ان نكتب في 6 بايت ..

هذا الجواب صحيح ؟؟

،،،

ارجو ان لا أكون ازعجتكم بأسئلتي ،،

فأنا مبتدأ جدا ،، وحابب ان افهم فكرة العمل ,,

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

/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/

 

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

#46

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

مرحبا اخي الاخير زمانه

اقتباس
انا استخدم لغة سي ولهذا حاولت تحويل البرنامج الى هذه اللغة لكن ظهر لي error ،

لذا ارجو منك اخي محمد ان تسمح لي بمناقشة الكود في منتدى السي ؟؟

لنقل لست جيدا في لفة C بقدر ما اتقن دلفي

قام الأغ Asm4All بتحويله للغة C في المشاركة #30

وطبعا يمكنك مناقشة اي موضوع في اي قسم دون حرج...

اقتباس
المشكلة كلها تكمن في

لماذا قرأنا 6 byte ؟؟

بكل بساطة لان الطريقة المتبعة لتغيير مسرى البرنامج اي امر القفز هو 6 بايت، يمكن اتباع طرق اخرى ب5 بايت او اكثر...

اقتباس
يتم عمل push للعنوان الحالي ،، ثم ينفذ محتوى عنوان الدالة .. ثم عملية ret الى العنوان الذي عملنا له push

تمام ؟؟

نعم

اقتباس
عني هنا لو استخدمنا ايعاز jmp مثلا ،،

سنقرء بقدر ما يحتاج هذا الايعاز

يعني اقصد لسنا ملزمين ب 6 بايت ؟؟

صح

jmp مثلا تحتاج 5 بايت فقط

اقتباس
وهنا يظهر خطأي عندما حولت البرنامج الى السي ،

طريقتك في التحويل بها خلل بسيط

استعمل تحويل الأخ Asm4All

او انظر فقط لتعريف الدالة المراد عمل لها hook وعرف دالتك بنفس الطريقة

لا حظ في دلفي تم استخدام stdcall لان طريقة التعامل مع parameters تختلفي في C و pascal

اقتباس
اين تعريف ال hProcess ؟؟

بحثت عليه في الكود ولم اجده ،

الا يجب تعريفه قبل استخدامه ؟؟؟

hProcess عبارة عن parameter وهو معرف في البرنامج الذي يستدعى الدالة

HookED: function(hProcess: THandle; uExitCode: UINT): BOOL; stdcall;

اقتباس
ماذا سنقرء ؟؟؟

هل نستطيع القول ..

لا يهم ،، ولا ندري .. المهم نقرء 6 بايت من بداية العنوان لأننا بحاجة الا ان نكتب في 6 بايت ..

صح

لا يهمنا

المهم هو ان نحتفظ بما عدلنا لكي نعيدها فيما بعد

اقتباس
رجو ان لا أكون ازعجتكم بأسئلتي ،،

فأنا مبتدأ جدا ،، وحابب ان افهم فكرة العمل ,,

بالعكس يا اخي

الأسئلة تفرحني

مرحبا بك وباي سؤال

d4baa0.gif
#47

جازاك الله ألف خير يا أخي ..... و نرجو منك المزيد

#48

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

كلاشنكوف :

اقتباس
كيف عرفنا ان


NewBytes.R = 0xC3;
NewBytes.P = 0x68;

ام ان هذا الشي ثابت لهذا النوع من الدوال بينما الnative لها تعامل اخر

أعتقد أن الصورة وضحت بعد معرفتك بالاسمبلي , حيث أن هذه القيم هي الـ Opcode الخاصة بالتعليمات Push , Ret

اقتباس
ولماذا وضعنا القيمة

DWORD(-1)

كبارامتر

الم يكن من المفروض ان نضع مقبس handle حسب تعريف الدالة

هذه القيمة هي القيمة العائدة من

HANDLE GetCurrentProcess(void);

الصورة الأوضح للكود تكون بهذه الطريقة

ReadProcessMemory(GetCurrentProcess(),  @HookeD, @OldBytes, SizeOf(OldBytes), Dw)

انظر في الـ SDK عن GetCurrentProcess , تلاحظ :

اقتباس

Return Values

The return value is a pseudo handle to the current process.

Remarks

A pseudo handle is a special constant, currently (HANDLE)-1, that is interpreted as the current process handle. For compatibility with future operating systems, it is best to call GetCurrentProcess instead of hard-coding this constant value. The calling process can use a pseudo handle to specify its own process whenever a process handle is required. Pseudo handles are not inherited by child processes.

تم تعديل هذه المشاركة بواسطة Asm4all في 31 أغسطس 2006 في 15:54

#49

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

بارك الله فيك اخي الكريم وزادك من علمه ،

سأقرء ردك وسأعاود المحاولة ،،

ولنا عودة بعون الله

/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/

 

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

#50

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

اقتباس
بالعكس يا اخي

الأسئلة تفرحني

مرحبا بك وباي سؤال

أشكرك اخي الكريم على سعة صدرك ،،

أسمح لي أخ محمد ان اسأل مجددا ،

المشكلة انا لا اجيد الدالفي ،،

بالنسبة للكود ،،

هنا

function NewOne(hProcess: THandle; uExitCode: UINT): BOOL; stdcall;

begin
 if MessageBox(Form1.Handle, 'Close ?', 'API HooK',
	MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) = IDYES then
  begin
	WriteProcessMemory(DWORD(-1), @HookeD, @OldBytes, SizeOf(OldBytes), Dw);
	HookeD(hProcess, uExitCode);
  end;
end;

هذه هي دالة NewOne وما تحويه ،

تمام ؟؟

طيب أين ال main

في هذا السؤال ؟؟

من أين يبدأ و أين ينتهي ؟؟

،،

ولو كان مثلا نستخدم ايعاز jmp

ماذا سيتغير ؟؟

فقط محتوى ال struct ؟؟

و هل سيكون هكذا

T5Bytes = packed record
	J: Byte;
	addr: Pointer;

،،،

بارك الله فيك ,,

/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/

 

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

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

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