Asm4all

عمل Hooking ل Native API

30 ردود في هذا الموضوع

إصطياد دوال الـ Native API والتحكم في إنشاء عملية جديدة

مقدمة:

مؤخراً رأيت برنامج أمني رائع, إسمه Sanctuary , هذا المنتج يقوم بمنع تنفيذ أي برنامج لا يظهر في قائمته الخاصة بالبرامج القابلة للتنفيذ

والنتيجة , مستخدم الكمبيوتر محمي من أي various add-on spyware, worms and trojans , حتى لو وجدت بعض الـ malware طريقها للحاسوب , فلا يوجد عندها فرصة للتنفيذ, و من هنا لا توجد لها فرصة لإلحاق أي تدمير بالحاسوب.

بكل تأكيد وجدت أن هذه الميزة ممتعة , وبعد قليل من التفكير , خرجت بطريقتي في إنجاز هذه الوظيفة.

لذلك, هذه المقالة توضح كيف يمكن برمجياً مراقبة عملية process creation والتحكم فيها وذلك على مستوى النظام ككل و باستخدام مفهوم اصطياد Hook دوال الـ Native API.

هذه المقالة تفترض افتراض مهم وهو أن الـ process المراد مراقبتها والتحكم بها target process تم إنشائها عن طريق الـ user-mode code أي في مستوى المستخدم باحد الطرق (shell functions, CreateProcess(), manual process creation as a sequence of native API calls, etc)

على الرغم من أنه, نظرياً , يمكن إنشاء process في مستوى النظام kernel-mode code , ومع وجود هذا الإحتمال و لسبب عملي يمكن تجاهل مثل هذه المشكلة , فلا تقلق من هذه الطريقة , و لكن لماذا ؟؟؟

لنفكر بطريقة منطقية, لتشغيل عملية process في مستوى النظام kernel-mode code , نحتاج أولاً إلى تحميل driver والتي تتضمن في عملها تنفيذ بعض الخطوات في مستوى المستخدم user-mode code .

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

بسم الله نبدأ ...

توضيح استراتيجية العمل:

مبدئيا , دعونا نحدد ما هو المطلوب فعله تماما لنقوم بمراقبة والتحكم في إنشاء عملية process creation on a system-wide basis

إنشاء عملية للتنفيذ أمر معقد بحق , حيث أنها تشمل الكثير من الوظائف (إذا لم تصدقني, يمكنك عمل disassemble للدالة CreateProcess , وسوف ترى ما اتحدث عنه بعينيك), لنقوم ببدأ عملية جديدة لابد من المرور بهذه الخطوات وبهذا الترتيب:

1 - Executable file has to be opened for FILE_EXECUTE access.

يتم فتح الملف بغرض التنفيذ FILE_EXECUTE

2 - Executable image has to be loaded into RAM.

يتم تحميل نسخة من الملف التنفيذي في الذاكرة

3 - Process Executive Object (EPROCESS, KPROCESS and PEB structures) has to be set up.

يتم إعداد متطلبات التنفيذ , مثل جدول مكتبات الربط المطلوبة والدوال الخارجية و ...

4 - Address space for the newly created process has to be allocated.

تخصيص مساحة من الذاكرة للـ process الجديدة

5 - Thread Executive Object for the primary thread of the process (ETHREAD, KTHREAD and TEB structures) has to be set up.

ألإعداد للـ Thread الرئيسية في الـ process

6 - Stack for the primary thread has to be allocated.

تخصيص مساحة من الذاكرة كمكدس للـثريد الرئيسية في الـ process

7 - Execution context for the primary thread of the process has to be set up.

إعداد سياق التنفيذ للثريد الرئيسية

8 - Win32 subsystem has to be informed about the new process

إخبار النظام ببيانات الـ process الجديدة

لنجاح أي خطوة من هذه الخطوات يشترط نجاح الخطوات السابقة لها (لا يمكنك مثلا تنفيذ الخطوة رقم 3 دون نجاح الخطوة رقم 2 , ولا يمكنك تنفيذ الخطوة رقم 2 دون نجاح الخطوة رقم 1, وهكذا..)

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

مفهوم طبعا أن كل خطوة من هذه الخطوات يتم تنفيذها عن طريق استدعاء دالة من دوال الـ Native API , لذلك , لكي نستطيع التحكم في انشاء process جديدة, فكل ما نحتاج فعله هو عمل hook على هذه الدوال التي لا يمكن تجنب تنفيذها في كود يقوم بإنشاء prcess جديدة

ولكن أي الدوال يجب عمل hook لها ؟ على الرغم من ان الدالة NtCreateProcess تبدوا وكأنها الاجابة الأكثر مناسبة لهذا السؤال, إلا أن هذه الإجابة تعتبر خاطئة - يمكن إنشاء process جديدة دون استدعاء هذه الدالة. على سبيل المثال CreateProcess تقوم بإعداد process-related kernel-mode structures دون استدعاء NtCreateProcess.لهذا عمل Hook للدالة NtCreateProcess وحدها لا يجدي.

لمراقبة إنشاء process جديدة, يجب عمل hook للدالة NtCreateFile و الدالة NtOpenFile أو عمل hook للدالة NtCreateSection. بكل تأكيد لا توجد طريقة لتشغيل أي برنامج بدون استدعاء هذه الدوال.

لو قررنا عمل hook على دوال فتح الملفات NtCreateFile و NtOpenFile يجب إضافة خطوات للتمييز بين فتح ملف تنفيذي و فتح ملف عادي بغرض عمليات الإدخال والإخراج, وهذه العملية ليست بهذه السهولة دائما, على سبيل المثال ماذا نفعل لو تم فتح ملف تنفيذي بغرض FILE_ALL_ACCESS ؟؟؟ هل هي مجرد عملية قرائة وكتابة من ملف أم إنها مرحلة من مراحل انشاء process جديدة ؟؟

من الصعب الحكم على مثل هذه الحالة, حيث أننا يجب أن نتابع ما هي الخطوة التالية لفتح الملف.

ولهذا عمل hook على دوال فتح الملف NtCreateFile و NtOpenFile لا يعتبر الخيار الأمثل.

عمل Hook على الدالة NtCreateSection يعتبر الأكثر مناسبة في هذه العملية, فلو قمنا باعتراض استدعاء الدالة NtCreateSection عند الطلب بتحميل الملف التنفيذي كنسخة بهذه الخاصية SEC_IMAGE مع طلب حماية المنطقة المخصصة في الذاكرة للسماح بالتنفيذ , يمكننا التأكد بأن هناك process سوف يتم تنفيذها, في هذه اللحظة لدينا الخيار لنقوم باتخاذ أي قرار مناسب , وفي حالة لو أردنا منع إنشاء هذه الـ process نجعل الدالة NtCreateSection تعيد القيمة STATUS_ACCESS_DENIE.

و لهذا للحصول على تحكم تام في إنشاء process جديد كل ما علينا هو عمل hook على الدالة NtCreateSection.

تصريح الدالة :

NTSYSAPI NTSTATUS NTAPI NtCreateSection(
   PHANDLE             SectionHandle, /*[OUT]*/
   ULONG                DesiredAccess, /*[IN] SECTION_MAP_EXECUTE or SECTION_ALL_ACCESS*/
   POBJECT_ATTRIBUTES   ObjectAttributes, /*[IN] OPTIONAL*/
   PLARGE_INTEGER       MaximumSize, /*[IN] OPTIONAL*/
   ULONG                PageAttributess, /*[IN] PAGE_EXECUTE or PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_EXECUTE_WRITECOPY*/
   ULONG                SectionAttributes, /*[IN] SEC_IMAGE*/
   HANDLE               FileHandle); /*[IN] OPTIONAL*/

مثل أي دالة من دوال ntdll.dll تقوم الـدالة NtCreateSection بتحميل السجل EAX برقم الخدمة , وجعل EDX يشير الى باراميترات الدالة , ونقل التحكم الى KiDispatchService و الأخيرة من kernel-mode routine ( يتم هذا عن طريق المقاطعة INT 0x2E في كل من ويندوز NTأو 2000 أو عن طريق التعليمة SYSENTER في ويندوز XP).

بعد التحقق من باراميترات الدالة , تقوم الدالة KiDispatchService بنقل التحكم الى التمثيل الحقيقي للوظيفة داخل نواة النظام , عنوان هذه المنطقة يكون متاح في Service Descriptor Table مؤشر هذا الجدول يتم استيراده عن طريق ntoskrnl.exe كـ KeServiceDescriptorTable , لهذا فهي متاحة لسواقات الـ kernel-mode (لذلك نحتاج لبناء درايفر)

تتمثل الـ Service Descriptor Table بهذا الشكل

struct SYS_SERVICE_TABLE { 
   void **ServiceTable;
   unsigned long CounterTable;
   unsigned long ServiceLimit;
   void **ArgumentsTable;
};

المؤشر ServiceTable في هذا الهيكل يشير الى مصفوفة تحمل عناوين الدوال التي تمثل خدمات النظام system services. لذلك كل ما علينا فعله لعمل hook على أحد دوال الـ Native API هو كتابة عنوان دالتنا الخاصة في مكان عنوان الدالة التي نريد عمل hook عليها وليكن ترتيبها i , نقوم بوضع العنوان في ServiceTable في الخانة رقم i في الـ KeServiceDescriptorTable.

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

التحكم في إنشاء process جديدة:

الحل يتلخص في بناء درايفر a kernel-mode driver و برنامج user-mode application.

طريقة العمل: للبدأ في عملية المراقبة يقوم البرنامج بتمرير (رقم الوظيفة the service index والذي يمثل الدالة NtCreateSection , إضافة إلى عنوان الـ exchange buffer مكان تبادل البيانات بين البرنامج والدرايفر) الى الـ driver , ويتم هذا عن طريق هذا الكود:

//open device
device=CreateFile("\\\\.\\PROTECTOR",GENERIC_READ|GENERIC_WRITE,
      0,0,OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM,0);

// get index of NtCreateSection, and pass it to the driver, along with the
//address of output buffer
DWORD * addr=(DWORD *)
  (1+(DWORD)GetProcAddress(GetModuleHandle("ntdll.dll"),
                                    "NtCreateSection"));
ZeroMemory(outputbuff,256);
controlbuff[0]=addr[0];
controlbuff[1]=(DWORD)&outputbuff[0];
DeviceIoControl(device,1000,controlbuff,256,controlbuff,256,&dw,0);

الكود تقريبا يشرح نفسه, الشيء الوحيد الذي يستحق الاهتمام هي الطريقة التي نحصل بها عن رقم الخدمة المناظرة للدالة NtCreateSection

جميع الوظائف داخل ntdll.dll تبدأ بالتعليمة

MOV EAX, ServiceIndex

وهي تعليمة تتمثل في 5 بايت , حيث mov eax - opcode - يتمثل في 1 بايت (الأول), والـ service index يتمثل في 4 بايت (الباقي) , ولذلك كل ما علينا هو قرائة 4 بايت من ثاني بايت في الدالة NtCreateSection لنحصل على قيمة ServiceIndex

والآن لنرى ماذا يفعل الـدرايفر الخاص بنا عند استلامه IOCTL من برنامجنا :

NTSTATUS DrvDispatch(IN PDEVICE_OBJECT device,IN PIRP Irp)
{
   UCHAR*buff=0; ULONG a,base;

   PIO_STACK_LOCATION loc=IoGetCurrentIrpStackLocation(Irp);

   if(loc->Parameters.DeviceIoControl.IoControlCode==1000)
   {
       buff=(UCHAR*)Irp->AssociatedIrp.SystemBuffer;
       
       // hook service dispatch table
       memmove(&Index,buff,4);
       a=4*Index+(ULONG)KeServiceDescriptorTable->ServiceTable;
       base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a),4,0);
       a=(ULONG)&Proxy;
       
       _asm
       {
           mov eax,base
           mov ebx,dword ptr[eax]
           mov RealCallee,ebx
           mov ebx,a
           mov dword ptr[eax],ebx
       }
       
       MmUnmapIoSpace(base,4);
       
       memmove(&a,&buff[4],4);
       output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
   }

   Irp->IoStatus.Status=0;
   IoCompleteRequest(Irp,IO_NO_INCREMENT);
   return 0;
}

كما يتضح هنا , لا يوجد شيء خاص بالاهتمام , قمنا فقط بتخطيط الـ exchange buffer في مساحة عناوين النواة عن طريق الدالة MmMapIoSpace , إضافة إلى كتابة عنوان الدالة البديلة our proxy function إلى الـ Service Table (ملحوظة : نقوم أولاً بحفظ عنوان الدالة الأصلية لكي يتم استخدامها لاحقاً في المتغير العام RealCallee ).

لكي نتمكن من إعادة الكتابة على الـ Service Table نقوم بتخطيط المكان المستهدف بالدالة MmMapIoSpace. لماذا ؟ لدينا بالفعل الصلاحية للتعامل مع الـ Service Table , أليس كذلك ؟

المشكلة تكمن في أنه يمكن للـ Service Table أن تتواجد في منطقة من الذاكرة مخصصة للقرائة فقط, ولهذا يجب التأكد أن لدينا الصلاحية للكتابة في الذاكرة الخاصة بالـ Service Table , وإذا لم تكن لدينا هذه الصلاحية فإنه يتحتم علينا تغيير الحماية على هذه المنطقة من الذاكرة ليتم السماح لنا بالكتابة عليها, مجهود كبير أليس كذلك ؟

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

والآن دعونا نلقي نظرة عن الـدالة البديلة أو ما تعرف بــ our proxy function :

//this function decides whether we should 
//allow NtCreateSection() call to be successfull
ULONG __stdcall check(PULONG arg)
{

   HANDLE hand=0;PFILE_OBJECT file=0;
   POBJECT_HANDLE_INFORMATION info;ULONG a;char*buff;
   ANSI_STRING str; LARGE_INTEGER li;li.QuadPart=-10000;

   //check the flags. If PAGE_EXECUTE access to the section is not requested,
   //it does not make sense to be bothered about it
   if((arg[4]&0xf0)==0)return 1;
   if((arg[5]&0x01000000)==0)return 1;
   
   
   //get the file name via the file handle
   hand=(HANDLE)arg[6];
   ObReferenceObjectByHandle(hand,0,0,KernelMode,&file,&info);
   if(!file)return 1;
   RtlUnicodeStringToAnsiString(&str,&file->FileName,1);
   
   a=str.Length;buff=str.Buffer;
   while(1)
   {
       if(buff[a]=='.'){a++;break;}
       a--;
   }
   ObDereferenceObject(file);
   
   //if it is not executable, it does not make sense to be bothered about it
   //return 1
   if(_stricmp(&buff[a],"exe")){RtlFreeAnsiString(&str);return 1;}
   
   //now we are going to ask user's opinion.
   //Write file name to the buffer, and wait until
   //the user indicates the response
   //(1 as a first DWORD means we can proceed)
   
   //synchronize access to the buffer
   KeWaitForSingleObject(&event,Executive,KernelMode,0,0);
   
   
   // set first 2 DWORD of a buffer to zero,
   // copy the string into the buffer, and loop
   // until the user sets first DWORD to 1.
   // The value of the second DWORD indicates user's
   //response
   strcpy(&output[8],buff);
   RtlFreeAnsiString(&str);

   a=1;
   memmove(&output[0],&a,4);
   while(1)
   {
       KeDelayExecutionThread(KernelMode,0,&li);
       memmove(&a,&output[0],4);
       if(!a)break;
   }
   memmove(&a,&output[4],4);
   KeSetEvent(&event,0,0);
   
   return a;
}

//just saves execution contect and calls check()
_declspec(naked) Proxy()
{
   _asm{
       //save execution contect and calls check()
       //-the rest depends upon the value check() returns
       // if it is 1, proceed to the actual callee.
       //Otherwise,return STATUS_ACCESS_DENIED
       pushfd
       pushad
       mov ebx,esp
       add ebx,40
       push ebx
       call check
       cmp eax,1
       jne block
       
       //proceed to the actual callee
       popad
       popfd
       jmp RealCallee
       
       //return STATUS_ACCESS_DENIED
       block:popad
       mov ebx, dword ptr[esp+8]
       mov dword ptr[ebx],0
       mov eax,0xC0000022L
       popfd
       ret 32
   }
}

تقوم الدالة Proxy بـحفظ السجلات والأعلام, تقوم بتمرير مؤشر لـ service parameters للدالة check والخطوات التالية تعتمد على القيمة التي تعيدها الدالة check

لو أعادت TRUE (أي اننا نريد تنفيذ البرنامج) , تقوم الدالة Proxy بإعادة قيم السجلات والأعلام واستدعاء الخدمة الأصلية NtCreateSection

لو أعادت FALSE (أي اننا نعترض على تنفيذ البرنامج) , تقوم الدالة Proxy بتمرير القيمة STATUS_ACCESS_DENIED إلى EAX , استرجاع القيمة ESP والعودة من الخدمة - من وجهة نظر مستدعي الوظيفة NtCreateSection يبدوا وكأن الوظيفة فشلت و أعادت القيمة STATUS_ACCESS_DENIED .

كيف تبني الدالة check قراراها ؟ بمجرد ما تتسلم الدالة check المؤشر للـ service parameters كبراميتر لها , يمكنها اختبار هذه الباراميترات

أولا: تختبر الأعلام والخصائص - لو الـ Section المطلوبة لم يطلب تخطيطها كنسخة قابلة للتنفيذ , أو انها طلبت حماية تمنع التنفيذ في هذا الـ Section من الذاكرة , ومنه يمكننا التأكد أن الخدمة NtCreateSection لن تفعل شيء مع هذا الطلب , وفي هذه الحالة نقوم بتمرير القيمة TRUE مباشرة.

ما عدا هذا , تقوم الدالة check باختبار امتداد الملف لأن الخاصية SEC_IMAGE و حماية الذاكرة بغرض التنفيذ يمكن طلبه لملفات الـ dll أيضا , لهذا لو كان امتداد الملف غير .exe تقوم الدالة check بإعادة القيمة TRUE

في حالة ما يكون الملف التنفيذي بامتداد .exe فانها تعطي الفرصة للبرنامج في مستوى الـ user-mode باتخاذ القرار, ولهذا تقوم فقط بكتابة إسم الملف و مكانه على القرص في الـ exchange buffer , وتنتظر القرار من المستخدم لتمرره مره أخرى الى الـ Proxy Function

قبل تشغيل الدرايفر الخاص بنا يقوم البرنامج الخاص بنا بانشاء ثريد يقوم بتشغيل هذه الدالة أولاً:

void thread()
{
   DWORD a,x; char msgbuff[512];
   
   while(1)
   {
       memmove(&a,&outputbuff[0],4);
       
       //if nothing is there, Sleep() 10 ms and check again
       if(!a){Sleep(10);continue;}
           
       // looks like our permission is asked. If the file
       // in question is already in the white list,
       // give a positive response
       char*name=(char*)&outputbuff[8];
       for(x=0;x<stringcount;x++)
       {
           if(!stricmp(name,strings[x])){a=1;goto skip;}
       }
   
       // ask user's permission to run the program
       strcpy(msgbuff, "Do you want to run ");
       strcat(msgbuff,&outputbuff[8]);
       
       // if user's reply is positive, add the program to the white list
       if(IDYES==MessageBox(0, msgbuff,"WARNING",
          MB_YESNO|MB_ICONQUESTION|0x00200000L))
       {a=1; strings[stringcount]=_strdup(name);stringcount++;}
       else a=0;
   
       // write response to the buffer, and driver will get it
       skip:memmove(&outputbuff[4],&a,4);

       //tell the driver to go ahead
       a=0;
       memmove(&outputbuff[0],&a,4);
   }
}

الكود واضح , يقوم الثريد بقرائة الـ exchange buffer كل 10 ms , لو اكتشف أن الدرايفر صدر طلب للـ buffer , فإنه يقوم باختبار إسم الملف الممرر له ويختبر لو إسم الملف في القائمة المصرح لها بالتشغيل , لو كان ضمن القائمة فإنه يعطي OK للدرايفر ليسمح بتنفيذ العملية , وإلا فإنه يعطي رسالة تسأل المستخدم هل يسمح بتشغل هذا البرنامج أم لا , مع عرض إسم الملف ومكانه في الرسالة , لو الرد إيجابي نقوم بإضافة إسم البرنامج إلى القائمة المسموح بتشغيلها, أخيرا نمرر قرار المستخدم الى الدرايفر

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

الخلاصة :

في النهاية يجب أن اقول أن عملية الـ hook لدوال الـ native API واحدة من أهم تقنيات البرمجة الموجودة, هذه المقالة أعطتك فقط مثال لما يمكن إنجازه بهذه التقنية , كما ترى تمكنا من مراقبة و التحكم في تنفيذ البرامج التي لم نعطيعا صلاحية التشغيل , وهذا فقط بعمل hook على دالة واحدة فقط (!!!) من دوال الـ native API, يمكنك التوسع في هذا المجال الى حد بعيد والتحكم في العتاد بصورة كاملة , التحكم في عمليات القرائة والكتابة , التحكم في الشبكات ...الخ

المقالة الأصلية

كود المقالة , المالفات التنفيذية للتجربة

1

شارك هذا الرد


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

لا لا لا

بجد أنا زعلان ....

موضوع كهذا هو الذي يجب أن يمتلئ بالردود .....

والنقاشات والتحاليل ....

ولا رد ؟

عفواً أخي صاحب الموضوع ، لا تتوقف عن اتحافنا بهذه المواضيع ...

وأرجو ممن يمكنه الاضافة أو المناقشة أن يدخل ,...

الى متى سنبقى نناقش انواع المتغيرات ومجال رؤية النتغير....

هذه النوعية من المواضيع هي ما نريده ....

أكرر شكري لأخي Asm4all

وأعتذر عن عدم وجود ردود وهذا لا يعني ان الموضوع لا يهمنا....

0

شارك هذا الرد


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

نعـم بالفعـل ........

أنا آسف أنه لا يوجد ردود من أعضاء المنتدى ...........

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

0

شارك هذا الرد


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

مشكوووووووووور Asm4all

طبعا مافي ردود عشان مثل المواضيع هذي تحتاج لحفظ واطلاع وبعدين نرجع نكتب ردود

لانها رااااااائعه

:)

0

شارك هذا الرد


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

السلام عليكم

جزاك الله كل خيرAsm4all على الطرح المميز والاجر عند الله وليس العبد

ربما سبب عدم الردود هو ان معظم رودا منتدى الـc\c++ من الطلبة والذين مازالو مبتدئين وهذا الموضوع متقدم ويحتاج دراسة وتحليل

عن نفسى لم افهم اجزاء كثيرة :D لتركى السى منذ فترة طويلة جدا ولكن ساقوم باعادة القراءة مرارا واسترجاع المعلومات

فالموضوع فاتح للشهية جدا ويستحق المتابعة ....

وبالفعل مثل هذا الموضوع وعـدم وجود ردود يسبب صدمـة لمن يكتبـه

اتمنى الا تصاب بصدمة :D وتستمر فى العطاء لانى ناوى اراجع السى من اول وجديد وانت السبب ;)

0

شارك هذا الرد


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

انا من شاهدت " mov " في داخل الكود .. طلعت على طول ..

أعرف نفسي .. ماراح افهم .. لكن الدرس ..أكيد مفيد .. جزاك الله خير .

0

شارك هذا الرد


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

السلام عليكم

الطريقة على ما يبدو لا تعمل معى وندوز 2003 وهذا من عيوب الاعتماد على الـNative API لان شركة مايكروسفت يحق لها تغير الدوال او عناوين الدوال طالما انها لم تسرح بإستخدامها.

كما لاحظت وجود الامر

mov eax,eax

عند بداية كل دالة فى الـAPI الجديد بعد إصدار sp2 لوندوز XP وهذه مشكلة كبيرة لمن اراد الاعتماد على عناوين الدوال, لابد ان هناك طريقة تستخدمها مايكروسفت للوصول إلى الدوال دون الحاجة لتعريف العناوين بطريقة وضع العنوان مباشرة..

وواضح طبعاً من الكود انه لا يقوم بعمل شئ سوى انه يغير عنوان الدالة.

انا اعتقد ان تعلم دوال الـNative API مضيعة للوقت لانها تتغير بتغير نسخة الوندوز, وليس هذا فحسب بل تستطيع مايكروسفت تغيرها بمجرد وضع اي تحديث للوندوز, وبذلك لن يعمل برنامجك لمجرد انه قام بعمل تحديث.

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

0

شارك هذا الرد


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

أولا أن أشكر ASM4All على هذه المقالة الرائعة

أنا أتفق مع الأخ أحمد غريب في أنه لا يجب أن يقحم الفرد نفسه في الAPIs و يتعب نفسه بحفظها بل أنه يمكن أن يتعرف على الدوال المهمة منها فقط و يستخدم MSDN لإيجاد مايريده بين الحين و الأخر

ولكن هذا لا علاقة له بهذه المقالة فتصيد دوال الِِِAPI هو من أشيق و أجمل المواضيع في برمجة الويندوز و هناك عدد كبير من التطبيقات التي تستفيد منه كAntivirus & Firewall Applications

0

شارك هذا الرد


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

السلام عليكم

اخى اسامة انت خلطت بين الAPI و الNative API الاولى موثقة ولن تستطيع مايكروسفت ايقاف دعمها لان العديد من البرامج وخاصة التجارية تعتمد عليها, اما الـNative API فهى غير موثقة والتعرف عليها يتم عبر عملية Debug يعنى طريقة غير شرعية, وتستطيع مايكروسفت إيقاف دعمها دون تنبيه الشركات الاخرى..

الـNative API تجدها فى ملف ntdll.dll وهى التى يعتمد عليها kernel32.dll يعنى kernel32.dll ماهى سوى تغليف للـNative API .

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

0

شارك هذا الرد


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

شكرا على التوضيح يا أخ أحمد :)

0

شارك هذا الرد


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

السلام عليكم

شخصياً أطلعت على الموضوع بصورة سريعة بعد ساعات من كتابته .

إختيار هذا الموضوع كان موفقاً ومجهود كبير من الأخ Asm4all يغبط عليه ...

لكن هناك نقطة أود الإشارة إليها وكنت سأكتبها بعد قراءتي للموضوع وعدلت عن ذلك حتى لا يظن البعض أني أحب الإنتقاد فقط ..

هو ليس إنتقاد ولكن نقطة بسيطة ووجه نظر

الموضوع أؤكد أنه سيفيد الكثيرين بل لنقل انه قد أفاد الكثيرين الى الآن ...

لكن قبل وضع مثل هكذا موضوع من العيار الثقيل كان من الافضل البدء باساسيات ذات علاقة به ...

سأفترض ان نسبة 70% ممن سيقرأ الموضوع لا يعلمون ما هي Native API

ونسبة 95% لا يعملون كيف يتم عمل Driver . ربما يكونوا سمعوا بـ DDK وWDM و ... لكن على الأقل في منتديات الفريق العربي قلة من كتبوا موضوعات *جادة وجيدة* في هذا المجال..

ما أعلمه ان الأخ هاني كتب بحثاً من قبل أثناء دراسته الجامعية ووضع موضوعاً عن ذلك في قسم السي ...

الأخ JAAS كتب مثالاً عن كيفية عمل WDM لكن الأساسيات في هذا المجال لا يعلمها إلا قلة قليلة ...

تخيل أن في موضوع للأخ أحمد غريب عندما بدأ الكلام عن processes and thread وحينها الكل هرب و في مقدمة هذا الموضوع نتحدث عن

هذه المقالة توضح كيف يمكن برمجياً مراقبة عملية process creation والتحكم فيها وذلك على مستوى النظام ككل و باستخدام مفهوم اصطياد Hook دوال الـ Native API.

يعني الناس غير مستوعبه ما هي process وكيفيه تكوين process في حين المقال يتحدث عن مراقبة process creation ... يعني قفزنا مراحل كثيرة ...

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

ما أقصده أن نبدأ من الأساسيات وإلا سيكون الحال على ما هو عليه الآن مجرد ردود شكر ولا يوجد أي نقاش في الموضوع ....

هنا لا ألوم الأخ Asm4all بل بالعكس أشكره على الجهد المبذول في ترجمة مثل هكذا مقال , فترجمة مثل هذا المقال تستوجب فهم مسبق للمقال بشكل جيد وإلا ما كانت الترجمة بهذه الروعة ....

أعتقد ايضا انه لا لوم بسبب عدم وجود ردود فالمقال سبق الوضع بمراحل ...

سؤال للإدارة :

هل سنظل ننتظر إختفاء مواضيع رائعة كهذه في دهاليز المنتديات دون وضعها في المكان المناسب لها .

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

0

شارك هذا الرد


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

:D

انا قلت الموضوع نام , ويا دوب 6 شهور أو سنه على ما حد يشوفه :D

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

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

زعلتني يا شمري :( , يا عم على معنى mov فهي تشبه = في السي يعني

MOV EAX, ServiceIndex

تفسر بهذا الشكل

EAX = ServiceIndex

لكن هنا احنا محتاجين شكلها في الـ OPCODE لأننا محتاجين نستخرج القيمة ServiceIndex منها

SOLO.NET: فرحتني يا شيخ أصلي باحب السي قوي :D

نرجع لموضوع ألـ Native API , انا لقيت بيانات الدالة NtCreateSection في كتاب The Undocumented Functions Microsoft Windows NT/2000

و ال XP SP2 لم تختلف , ولكن كما تقول يابو غريب طالما انها غير موثقة من ميكروسوفت يبقى في أي وقت ممكن تغير في تركيبها وطريقة عملها وعناوينها

اسامه : مفيش عاقل بيفكر يحفظ الـ API :D , ملف user32.dll لوحده فيه 732 دالة , مين يحفظ الدوال دي ؟؟؟ زيها زي كلاسات الدوت نت مثلا ولا دوال أي لغة برمجه مين بيحفظها , حتى لو حفظها مش هيستفيد منها أكثر من اللي معاه مرجع يرجعله لما يكون عايز يعرف داله معينه

الف شكر ليكم يا شباب على رفع معناوياتي اللي وصلت للسقف :lol:

0

شارك هذا الرد


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

أضفت الرد الأخير قبل أن اقرأ رد خبيرنا cipher , خبير مش عادي ;)

يا خي والله نقدك بناء , ليه ما كتبته من بدري :D , والله بنطالب الاداره انها تعمل لنا قسم للـمواضيع المتقدمه زي الـ API اللي بيتفق عليها أغلب المبرمجين على أغلب اللغات التي تعمل على منصة ويندوز

وفعلا كلامك صحيح ان الموضوع كان بيحتاج قاعده قبله , بس الموضوع اني لقيت المقاله وعجبتني جدا وكان في وقت اني اترجمها , قلت خير البر عاجله :D

الموضوع محتاج تنظيم واهتمام , ورعاية كمان من الادارة - قسم خاص بالـ API - بعدها تظل المواضيع المهمه في مكان محفوظ يحفظ قدرها

رجاء من المهتمين نكش ابو غريب الى ان يتم تأييد بناء القسم :rolleyes:

0

شارك هذا الرد


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

من غير نكش يا عاصم انا من زمان نفسي فى قسم خاص بالـAPI بس خايف يشاركونا فيه جماعة الـVB وجماعة الـC#, وعندك كمان جماعة الدوت نت إلي فاكرين نفسهم بيبرمجو وندوز .. اوعى حد يزعل انا بهزر ...

إن شاء الله اناقش الاخ هيثم ونتفق على عمل قسم للـAPI.

وانا شايف إن القسم دا يكون المشاركاة فيه مقصورة على بعض الاشخاص الذين اثبتو جدارتهم فى برمجة الوندوز عشان ما نشوفش فيه اسئلة زى كيف اقوم بعمل نافذه واضع فيها زر..

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
من غير نكش يا عاصم انا من زمان نفسي فى قسم خاص بالـAPI بس خايف يشاركونا فيه جماعة الـVB وجماعة الـC#, وعندك كمان جماعة الدوت نت إلي فاكرين نفسهم بيبرمجو وندوز .. اوعى حد يزعل انا بهزر ...

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

:D :D :D :D :D :D

هههههههه

يا ويلك من جماعة الـVB....

أنا فكرت مثيراً في إنه ينقص هذا المنتدى قسم متقدم (لا يدخله إلاَ المتقدمون).. وبدون أسئلة من اللي بتهز البدن ..

زى كيف اقوم بعمل نافذه واضع فيها زر..

تحياتي -waf

0

شارك هذا الرد


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

وماذا تريدون لقسم السي والسي بلس بلس أن يفعل

لم يكون هـناك قسم للجافا ... وفصلتوه عـن قسم السي بلس بلس وسكتنا ...

ولم يكن هـناك قسم لبرمجـة الألعاب والجرافكس ... وفصلتوه عـن قسم السي والسي بلس بلس وسكتنا أيضاً

والآن تريدون فصل دوال الـ Win32 APIs عـن القسم .............

وماذا بعـد ؟!!!!!!!!!!!!!!!!!!!!!!!!!!

هل ستفصلون قسم الأسئلة وحل الواجبات عـن قسم السي والسي بلس بلس

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

أنا لست من المؤيديـن

على الأقل في قسم السي لن يأتي أحد من جماعـة الـ vb :D (حسب ما يتمنى أحمد غريب) ويزعـجكم :rolleyes:

أرجـو التفكير في مصير قسم السي والسي بلس بلس جيداً

إذا كان لديكم إبداعات فلا داعي لتحرمـوا قسم السي منها :(

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
Win32 APIs

ولم يكن هـناك قسم لبرمجـة الألعاب والجرافكس

هل هي مقصورة على السي ++

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

كيف يعني اثبت جدارته؟؟

تم تعديل بواسطه romanof
0

شارك هذا الرد


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

ليست مقصورة على السي بلس بلس

ولكن 90% ممن يسأل عـنها في المنتدى يسأل عـنها بواسطـة لغـة السي أو السي بلس بلس وفي هذا القسم بالذات

ثم .... ما الذي سيبقى لقسم السي إن فصلت عـنه

0

شارك هذا الرد


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

يا جماعة يا جماعة (على رائي فيصل القاسم)

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

المواضع المتقدمة فى قسم السى بلس بلس لا تتعدى 10 مواضيع, وفى قسم الاسمبلي ربما اكثر بقليل, ولكن المشكلة انها تختفي معى مرور الزمن, هناك مواضيع مميزة للاخ هانى االتاسي ولكنها فى الصفحات الاخيرة من منتدى السى بلس بلس, هناك مواضيع مميزة للاخ jaas وقد اختفت واصبح من الصعب الوصول إليها, هذا النوع من المواضيع لا يقتصر على مواضيع الـAPI ولكن هناك حماس اكثر لهذه الجزئية, وهذا ما دفعنى لتشجيع الفكرة..

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

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

0

شارك هذا الرد


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

أول ما استخدمت دوال API كان من 4 سنين مع الفيبي :P , بعدها دخلت عالم السي والأسمبلي على 16 بيت , الى ان دخلت الأسمبلي 32 بيت واستخدمت دوال الـ API لأنها تعتمد عليها وعليها فقط

بعدها - مش بعدها في نفس الوقت - دخلت في سي للويندوز وطبعا السهوله في الموضوع اني قادم من أسمبلي يعني فطاحلة المنتدى هم أساتذتي , وصراحة النصيب الأكبر من الأسئلة كان لقسم الأسمبلي

بعدها استخدمت API في الـسي شارب , أضف الدلفي كمان - انا مش باعرف اقرأ كود دلفي غير لما اشوف API لأنها قياسية اقارن بينها وبين السي لأني ماعرفش سينتكس الباسكال أصلاً - باختصار الـ API لم تتغير طريقة استخدامها من اي لغة الى الأخرى , لكن أجملهم شكل في الكود - بالنسبة لي - السي

بدل ما كل واحد يضع موضوع بلغته المفضله في قسم اللغة - ويفضل منتظر المهتمين من الأقسام الاخرى انهم يشوفوا الموضوع صدفه في المواضيع النشطه مؤخرا - و يموت في قسمه , لا احنا نخلي قسم واحد للـ API حتى الواحد يدخل وهو عارف نوعية المشاركات هتكون عامله ايه , واجدع حاجه مفيش واجبات في الـ API :P , يعني مواضيع القسم كلها حاجه تفيد أكثر ما تحرق الأعصاب

وما تزعلش نفسك يا ابو السلاطين هتحتفظ بمواضيع خاصة بالسي و بالسي++ كلغة برمجة , ده غير الواجبات عمرك ما هتتحرم منها ابدا :D

0

شارك هذا الرد


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

الـ Win32 APIs تستحق أن يكون لها قسم خاص ... لأن برمجـة الويندوز بالفعل ممتعـة ..... ولو كنت أدري أنها ممتعـة بهذا الشكل لكنت تعلمتها من زمان .... ولكني حالياً أتعلمها ........ لذلك لن تحرمـوني أن اسألكم في المنتدى الجـديد :D .......... هل تريدون من مشرف قسم السي أن يسأل في قسمـه (h) ........

0

شارك هذا الرد


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

السلام عليكم

أحمد الله أولاً أنه لم يفهم قصدي بالشكل الخاطئ .. فقد كنت قلقاً الى أن استطعت الرجوع قبل دقائق الى الكمبيوتر لكتابة هذا الرد ...(مشغول هاليومين بشكل كبير طبعا بشئ لا علاقة له بالبرمجة )...

بالنسبة لإضافة قسم جديد فهي فكرة جيدة ولكن يرجى أن يكون له اسم جيد . إسم كـ win32api لا أظنه مناسباً ...

زمان كان قسم نظم التشغيل الغرض منه عمل قسم شبية بما يريده الأخوة الآن , فيه مواضيع تخص Low Level سواء من ناحية برمجية أو نظرية لكن في الأخير وبعد أن تم افتتاح القسم وكان المشرف الأخ العزيز حسام development.net وأجبرت أن أكون مشرف عليه ولكن وبعد أيام من افتتاحه لاحظت أن الغرض الأساسي من القسم في الشرق والمواضيع في الغرب غير بعض مواضيع قليلة لذا لم أقبل بالوضع حينها ...

حالياً كل مرة نرى موضوع رائع كهذا بعد كم يوم يختفي وهكذا دواليك دواليك...

كنت أود كتابة رد أطول لكن الظروف لا تسمح خلال هذين الاسبوعين

أضفت الرد الأخير قبل أن اقرأ رد خبيرنا cipher , خبير مش عادي

شو الحكاية مع خبير و مو خبير ... انا ما بحب الألقاب

0

شارك هذا الرد


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

cipher لو ماتستاهلها ماكتبوا :خبير دلفي: ;)

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

شكررا...

0

شارك هذا الرد


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

لالالا عنجد موضوع مش معقوول !!

شرحت الموضوع بطريقه بسيطه ومفهومي جدا

موضوع بهاذ المستوى..!! لا بد حفظه على جهازي قد يحصل شيء قبل اتمامي الدرس !!

اسمحي لي اخي بالشكر فقط الاني شغال على برويكت نهائي الان !!

لكن اتمنى ان تبقى انتي ومواضيعك بالمنتدى طويلا ..

تقبل اجمل التحيات..

0

شارك هذا الرد


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

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

لكن قبل وضع مثل هكذا موضوع من العيار الثقيل كان من الافضل البدء باساسيات ذات علاقة به ...

سأفترض ان نسبة 70% ممن سيقرأ الموضوع لا يعلمون ما هي Native API

ونسبة 95% لا يعملون كيف يتم عمل Driver . ربما يكونوا سمعوا بـ DDK وWDM و ... لكن على الأقل في منتديات الفريق العربي قلة من كتبوا موضوعات *جادة وجيدة* في هذا المجال..

ما أعلمه ان الأخ هاني كتب بحثاً من قبل أثناء دراسته الجامعية ووضع موضوعاً عن ذلك في قسم السي ...

الأخ JAAS كتب مثالاً عن كيفية عمل WDM لكن الأساسيات في هذا المجال لا يعلمها إلا قلة قليلة ...

يعني الناس غير مستوعبه ما هي process وكيفيه تكوين process في حين المقال يتحدث عن مراقبة process creation ... يعني قفزنا مراحل كثيرة ...

اوافقك الرأي تماما اخي cipher لأن هذا الذي يحصل معي في مثل هكذا مواضيع ..

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

و لكن من يلزم زمام المبادرة .. -_-

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .