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

تعريف بدوال الNative API

مغلق
بدأه احمد غريب في 21 فبراير 2006 · 16 رد · 8,161 مشاهدة · في المواضيع و الدروس القيّمة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

-9

السلام عليكم

دوال الـNative API هى مكتبة هامة جداً فى الوندوز تعتمد عليها باقى المكتبات امثال user32.dll و Kernel32.dll وGDI32.dll وغيرهم الكثير...

مكتبة ntdll.dll والتى تحتوى على دوال الـNative Api لم تقم مايكروسفت بشرحها كما هو الحال بالنسبة لباقى المكتبات, ومكتبة Kernel32.dll تعتبر تغليف لمكتبة ntdll.dll..

اغلب الدوال فى مكتبة ntdll.dll تبداء بالحروف Rt او Nt و Zw ولكن هناك دوال لا تتبع هذا النهج..

كيف الوصول إلى هذه الدوال ؟

هناك برنامج dumpbin تستطيع من خلاله الاطلاع على اسماء الدوال, هذا البرنامج يعمل من سطر الاوامر console ويتطلب بعض الاضافات للوصول إلى محتويات مكتبات الـdll ..

يمكننا الاطلاع على الدوال بكتابة الامر

C:\WINDOWS\system32>dumpbin ntdll.dll /exports |more

Microsoft ® COFF Binary File Dumper Version 5.12.8078

Copyright © Microsoft Corp 1992-1998. All rights reserved.

Dump of file ntdll.dll

File Type: DLL

Section contains the following exports for ntdll.dll

0 characteristics

3B7DE01E time date stamp Sat Aug 18 05:25:18 2001

0.00 version

1 ordinal base

1408 number of functions

1408 number of names

ordinal hint RVA name

8 0 0000B5D2 CsrAllocateCaptureBuffer

9 1 0000B62A CsrAllocateMessagePointer

10 2 0001AFFE CsrCaptureMessageBuffer

11 3 00012157 CsrCaptureMessageMultiUnicodeStringsInPlace

12 4 0000F91A CsrCaptureMessageString

13 5 00046F19 CsrCaptureTimeout

14 6 000034AF CsrClientCallServer

15 7 00018D38 CsrClientConnectToServer

16 8 0000B584 CsrFreeCaptureBuffer

17 9 00046F13 CsrGetProcessId

18 A 00046EA7 CsrIdentifyAlertableThread

19 B 00008A8E CsrNewThread

20 C 00046F89 CsrProbeForRead

21 D 00046F43 CsrProbeForWrite

22 E 00046ED8 CsrSetPriorityClass

-- Mer --

.....

1130 469 0002F333 ZwSetVolumeInformationFile

1131 46A 0002F343 ZwShutdownSystem

1132 46B 0002F353 ZwSignalAndWaitForSingleObject

1133 46C 0002F363 ZwStartProfile

1134 46D 0002F373 ZwStopProfile

1135 46E 0002F383 ZwSuspendProcess

1136 46F 0002F393 ZwSuspendThread

1137 470 0002F3A3 ZwSystemDebugControl

1138 471 0002F3B3 ZwTerminateJobObject

1139 472 0002F3C3 ZwTerminateProcess

1140 473 0002F3D3 ZwTerminateThread

1141 474 0002F3E3 ZwTestAlert

........

الملف يحتوي تقريباُ على 1400 دالة وكما تلاحظ فإن بعض الدوال يبداء بالحرفين Zw .

قم الان بالاطلاع على ملف Kernel32.dll لتشاهد الدوال التى تقوم المكتبة بإستيرادها من مكتبة ntdll.dll وذلك بكتابة الامر التالي..

C:\WINDOWS\system32>dumpbin kernel32.dll /imports |more

Microsoft ® COFF Binary File Dumper Version 5.12.8078

Copyright © Microsoft Corp 1992-1998. All rights reserved.

Dump of file kernel32.dll

File Type: DLL

Section contains the following imports:

ntdll.dll

77E61000 Import Address Table

77ED2DF6 Import Name Table

FFFFFFFF time date stamp

FFFFFFFF Index of first forwarder reference

77F54B99 52B _wcsnicmp

77F7E8F3 9F NtFsControlFile

77F7E603 6E NtCreateFile

77F516F8 18A RtlAllocateHeap

77F51597 238 RtlFreeHeap

77F7EAF3 BF NtOpenFile

77F7ED23 E3 NtQueryInformationFile

77F7ECE3 DF NtQueryEaFile

77F610D6 2A1 RtlLengthSecurityDescriptor

77F7EE33 F5 NtQuerySecurityObject

77F7F153 128 NtSetEaFile

77F7F283 13B NtSetSecurityObject

77F7F1B3 12E NtSetInformationFile

77F534AF 6 CsrClientCallServer

77F7E7D3 8D NtDeviceIoControlFile

77F7E543 62 NtClose

77F7F5DF 26D RtlInitUnicodeString

77F5FAF7 574 wcscspn

77F52611 339 RtlUnicodeToMultiByteSize

77F51901 575 wcslen

77FAF94A 518 _memicmp

77F81165 550 memmove

77F7EEC3 FE NtQueryValueKey

77F7EB23 C2 NtOpenKey

77F7E8A3 9A NtFlushKey

77F7F323 145 NtSetValueKey

77F7E643 72 NtCreateKey

77F51220 2BA RtlNtStatusToDosError

77F52599 23D RtlFreeUnicodeString

77F657DB 1FB RtlDnsHostNameToComputerName

77F52916 578 wcsncpy

-- Mer --

نلاحظ ان هناك العديد من الاوامر التى يتم إستيرادها من ملف ntdll.dll, من إسم الدالة نستطيع ان نستنتج طريقة عملها ولكن بما انه لا يوجد اى شرح من مايكروسفت, فهناك ثلاثة طرق لمعرفة عمل الدالة..

الاولى الاستنتاج والتجربة

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

الثانية جوجل.

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

الثالثة هندسة عكسية

كلمة مخيفة ولكن فى بعض الاحيان شر لا بد منه, الهندسة العكسية هى مسئلة تعود, وإحتراف الهندسة العكسية يتطلب ممارسة وصبر, تستطيع فتح الملف فى برنامج مثل ollydbg ومتابعته الدالة التى تريد التعرف عليها سطر بسطر ومحاولة معرفة ما يحدث, ولكن انصح ان تبحث فى جوجل اولاً لان بعض الدوال معقدة جداً وتتطلب معرفة ليس فقط بالهندسة العكسية ولكن بالـdata structure وكل ما له علاقة بالخوارزميات, لقد حاولت فى مرة متابعة احد هذا الدوال وبعد عدة ايام من المتابعة اكتشفت انه يستخدم hash table, الشفرى كانت تقفز من عنوان إلى عنوان من ما جعل متابعة ما يحدث صعب جداً, لذلك إذا وجدت ان هناك اشياء غريبة فى الشفرة مثل القفز المتكرر اعلم انه يستخدم data structure معين ويجب عليك فى هذه الحالة محاولة إستنتاج نوع الخوارزمية التى تستخدمها الدالة ومن ثم متابعة الشفرة لترى إذا كان تحليلك مظبوط..

ملاحظة اخيرة

نلاحظ فى نهاية الـexports لملف الـntdll.dll مجموعة من الدوال المعروفة والتى طالما استخدمناها فى لغة مثل السي.

1368 557 0005FD27 sscanf

1369 558 0003150D strcat

1370 559 000315FD strchr

1371 55A 000316B9 strcmp

1372 55B 000314FD strcpy

1373 55C 0003173E strcspn

1374 55D 0003177B strlen

1375 55E 000317F4 strncat

1376 55F 00031917 strncmp

1377 560 0003194F strncpy

1378 561 00031A4D strpbrk

1379 562 00031A86 strrchr

1380 563 00031AAD strspn

1381 564 00031AEA strstr

1382 565 0005FD61 strtol

1383 566 0002D61C strtoul

1384 567 0000B2CA swprintf

إذا اردت ان تجرب تستطيع إستدعاء هذه الدوال دون الاعتماد على مكتبة kernel32.dll او ملف windows.h وستلاحظ انها نفس الدوال...

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

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

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

#2

رائع أخى أحمد غريب

مما فهمت أن ال native api هى جزء رئيسى فى نظام التشغيل تعتمد عليه بقية المكتبات التى نعتمد عليها بدورنا فى البرمجه

و لكن على ما أعتقد أنه تختلف المكتبة ntdll.dll من أصدار ويندوز لآخر ؟ هل هذا صحيح ؟

و فى أختلافها هل يتم زيادة دوال على المكتبه مع كل إصدار أم يتم حذف دوال أم ماذا ؟

و شكرا

لا تراجع و لا إستسلام

#3

السلام عليكم

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

وبالتاكيد مكتبة الـntdll تختلف من وندوز لاخر ومن تحديث لاخر..

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

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

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

#4

موضوع رائع ومقدمة ممتازة ...

تضعنا على أول الطريق...

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

وننتظر المزيد :)

#5

و أين وصلة ال dumpbin هذا ؟؟؟

#6

هي جزء من نظام التشغيل ويمكن إستدامها تماماً كما تستخدم الدالة dir

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

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

#7

شكرا علي المعلومة

#8

لماذا مايكروسوفت .. غلفت هذه الدوال ..

مثلا //

NtOpenFile

اعتقدت دالة معروفة .. هل ستفرق معي .. اذا استخدمت NtOpenFile .. او OpenFile

يا ليت معلومات اكثر ,,, وخاصة ... سبب تغليف هذه الدوال .. من مايكروسوفت . . والسبب الذي يجعلني استخدم هذه الدوال مع انه يوجد دوال شبيهة لها ,,,,

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

دائماً عندما تقوم بتصميم أي نظام كبير و تتوقع أن يقوم اخرون باستخدام هذه النظام في تطوير تطبيقات عليه فيجب عليك أن تحتفظ بحيز من الحرية بينك (كمطور النظام) و بين مستخدمين النظام و يكون عن طريق Abstract Layer فتقوم بتغليف تفاصيل النظام المعقدة التي تتوقع أن تتغير باستمرار بسبب تطور النظام بطبقة أكثر ثباتاً و أكثر سهولة فما يهم المطور هو ثبات الAbstraction Layer مع تقديم خدمات أكثر في المستقبل و تطوير الخدمات الموجودة فمادامت الAPI المسماة XXX تقوم بوظيفتها دائماً فلا أهتم اذا كانت تستخدم الوظيفة الداخلية للنظام YYY أو ZZZ أو كلاهما فهذا شئ قد يتغير و لكن الوظيفة هي التي لا تتغير و اسم الAPI أيضاً لن يتيغير مما سيعطي عمراً أطول لبرامجي

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#10

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

بصراحة موضوع ومقدمة سهلة ممتازة ،

جزاك الله خيرا اخ احمد ،

يعني انا الان ممكن استخدم دوال ال Native مباشرة من برنامجي بدون اضافة او ربط شيء ،

يعني المثال التالي ،

كيف يحول بأستخدام ال Native

#include<windows.h>
Int WINAPI WinMain (HINSTANCE  , HINSTANCE  , LPSTR , int)
{

MessageBox(NULL," Hello World ! " , " prog1", MB_OK);

Return 0;

}

عموما انا سأبحث في هذا الموضوع ،،

واذا عدكم شي ،، اكيد ما راح تبخلون به علينا ؟؟

تحياتي للجميع

و مشكور اخي على هذه المعلومات .

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

 

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

#11

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

اظنني اخطأت في السؤال السابق

دوال ال native هي تغطية لدوال kernel.dll

حاولت استدعاء دالة NtTerminateProcess

بدل دالة TerminateProcess

لكن يخبرني ان هذه الدالة غير معرفة ،

ما الحل ؟

الا يوجد ملف هيدر خاص بهذه الدوال ؟

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

 

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

#12
اقتباس
دوال ال native هي تغطية لدوال kernel.dll

:wacko:

هيك أنت قلبت الأمور ...

اقتباس
حاولت استدعاء دالة NtTerminateProcess

بدل دالة TerminateProcess

لكن يخبرني ان هذه الدالة غير معرفة ،

ما الحل ؟

الا يوجد ملف هيدر خاص بهذه الدوال ؟

جزء من هذه الدوال ستجدها معرفة في DDK إن كنت منزلها لديك ...

لتعريف أي Native API Function يمكنك إستعمال الطرق التي تستخدمها مع WIN32 API Function ...

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

===

اقتباس

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

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

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

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

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

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

===

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

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

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

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

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

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

#13
اقتباس
هيك أنت قلبت الأمور ...

:lol:

معك حق ،، اقصد العكس ..

اقتباس
جزء من هذه الدوال ستجدها معرفة في DDK إن كنت منزلها لديك

بصراحة لسه ما نزلتها ،

بس لازم انزلها لأني راح احتاجها ،

اقتباس
لتعريف أي Native API Function يمكنك إستعمال الطرق التي تستخدمها مع WIN32 API Function ...

لم افهم .. كيف ؟؟

انظر اخي الى هذا

هذه الدالة من ال msdn

NtCreateFile

Header Declared in Winternl.h.

DLL Requires Ntdll.dll.

حاولت استخدام هذا الهيدر لكنه ليس موجود عندي ،

انا فكرت انو استخدم دالة GetProcAddress لأحصل على العنوان مباشرة من ال dll (لسه ما جربت هذا الشي)

من اين احصل على هذا الهيدر ؟

للعلم انا اعمل على VC 6

سأحاول تنزيل ال DDK ،

تحياتي

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

 

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

#14
اقتباس
لم افهم .. كيف ؟؟

هذه إحدى الطرق

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

كما أشرت مسبقاً DDK يحتوي على تعريف جزء من تلك الدوال ....

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

===

اقتباس

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

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

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

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

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

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

===

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

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

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

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

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

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

#16
اقتباس
لم اجد dumpbin المذكورة اعلاه

تجده مع Visual C++

او استخدم بديل مثل الرد 27

d4baa0.gif

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

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