حالة الموضوع:
مغلق
  1. unCoder

    unCoder Developer

    الأنتساب:
    ‏3 ديسمبر 2012
    المشاركات:
    11
    الإعجابات المتلقاة:
    0
    نقاط الجائزة:
    1
    الإقامة:
    NTOSKRNL
    [​IMG]


    R I N G (Zer0) H O O K
    kernel-mode hooking
    coding a simple driver


    الدرس الثاني من سلسلة الـ [COLOR=Teal]Ring[/COLOR][SIZE=3][COLOR=Teal]0 Hook[/COLOR][SIZE=3]
    [SIZE=3]
    [SIZE=3]أولا [SIZE=3]يجب أن تطلع على [SIZE=3]ال[SIZE=3]د[SIZE=3]ر[SIZE=3]س السابق وإعادة قرائته حتى تستوعب كل مافيه
    [SIZE=3][COLOR=Teal]بالإضاف[/COLOR][SIZE=3][COLOR=Teal]ة إلى البحث والتع[/COLOR][SIZE=3][COLOR=Teal]مق أكثر في الموضوع [/COLOR]
    [/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE][/SIZE]

    Ring0 hook - الهوك الأكثر تقدم ماهو Part1

    [​IMG]

    أولا لبرمجة الدرايفر نحتاج لكومبايلر خاص
    كما نستطيع برمجته بـ C - Delphi - Assembly

    ولإنعدام خبرتي في الدلفي سنتطرق لمستلزمات برمجته بالسي
    ملاحظة [ C وليس C++ لأن الغالبية تخلط بينهم ]

    أولا لبرمجة درايفر بلغة السي نحتاج لحزمة Windows Driver Kits 7

    تحميل الحزمة :

    Microsoft Download -619 MB - .ISO

    حمل الملف ثم أفتحه بإستخدام Winrar وشغل ملف التنصيب KitSetup.exe

    أو من رفعي على جزئين [ مركز الخليج ]

    Part 1 - 338 MB
    Part 2 - 255 MB


    [​IMG]

    شرح التنصيب [ لكي لاتواجه أي أخطاء أثناء التنصيب ]

    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]


    [​IMG]

    بعد أن إنتهينا من تنصيب
    نستطيع أن نبدء برمجة أول درايفر لنا
    يمكنك إستخدام c++ ide لآتوجد إختلافات كثيره بين السي والسي ++

    أيضا كما نعلم في برمجة مكتبات الـ dll يجب أن يكون هناك dll entry
    واللذي هو DllMain

    في الدرايفر الإنتري الخاص به هو DriverEntry
    وتعريفه :

    كود PHP:
    NTSTATUS DriverEntry(
      
    IN PDRIVER_OBJECT DriverObject,
      
    IN PUNICODE_STRING RegistryPath
    )
    أيضا كما للمكتبة Detach او نستطيع أن ندعوه بـ [ unload ]
    للدرايفر كذلك ونستطيع إسناده له عن طريق المدخل DriverObject
    وذلك بوضع ادرس فنكشن الأنلود فيه وبعدم وضعه ذلك يعني إستحالة عمل Unload للدرايفر
    إلا بعمل ريستارت للجهاز

    مثال على درايفر بسيط جدا

    كود PHP:
    #include <ntddk.h>

    NTSTATUS UnloadFunction(IN PDRIVER_OBJECT DriverObject)
    {

    }

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObjectIN PUNICODE_STRING RegistryPath)
    {
        
    DriverObject->DriverUnload UnloadFunction
        return 
    STATUS_SUCCESS;
    }

    لنستطلع عن بعض المعلومات

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

    جميع مستلزمات الناتيف وتعريفات الدرايفر وغيره موجودة في الهيدر [ Ntddk.h ]
    لذلك تم عمل include له في الكود السابق



    [​IMG]

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

    والطريقة تكون كالتالي :

    بعد برمجة كود الدرايفر وليكن Main.c
    يجب أن نقوم بعمل ملف جديد بإسم Makefile
    ونضعه في مجلد مع سورسات الدرايفر واللتي في حالتنا هي [ Main.c ]


    ثم نضع في محتوى الـ Makefile التالي :

    كود PHP:
    !include $(NTMAKEENV)\makefile.def
    ثم نحتاج عمل ملف ونسميه Sources ونضعه مع الملفات السابقة أيضا
    ونضع محتواه كالتالي :

    كود PHP:
    TARGETNAME=MyDriver
    TARGETPATH 
    =.
    TARGETTYPE=DRIVER
    SOURCES
    =Main.c

    في الخانة الإولى إسم الدرايفر الناتج
    الخانة الثانية هي مسار إنتاج الدرايفر نضعها [ . ] لينتجه في نفس الملف
    الخانه الثالثه وهي نوع الملف وهو درايفر
    الخانه الرابعه وهي سورس الدرايفر أو سورساته فلو كان لدينا أكثر من سورس نستطيع عمل التالي


    كود PHP:
    SOURCES=Main.c src1.c source.c
    أما الآن فالخطوة النهائية وهي عمل كومبايل للدرايفر

    لعمل كومبايل نذهب لقائمة إبدء ونبحث عن Windows Driver Kits 7


    [​IMG]

    كما نرى يوجد بيلدر لكل وندوز ولكل نواة
    أي عند عمل بيلد للدرايفر عن طريق x64 Free Build Environment
    لن يعمل الدرايفر إلا على وندوز 7 64 bit وهكذآ مع البقية

    نفتح البيلدر المطلوب وندخل لمسار ملفات الدرايفر


    [​IMG]


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

    [​IMG]


    [​IMG]

    إنتهى درسنا هنا اليوم

    أتمنى ان يكون الدرس سهل ومفهوم الدرس لم يكن إلا تحميل المستلزمات وتحظير بسيط للدرايفر وفهم كيفية برمجته

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

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

    )5:"
     
  2. йỘ-įṖ

    йỘ-įṖ Active DeveloPer

    الأنتساب:
    ‏24 يوليو 2012
    المشاركات:
    100
    الإعجابات المتلقاة:
    2
    نقاط الجائزة:
    18
    رد: Ring0 hook - الهوك الأكثر تقدم - برمجة درايفر Part2

    بارك الله فيك على الطرح ما قصرت ي الطيب

    تحياتي.. :{8}:​
     
حالة الموضوع:
مغلق

مشاركة هذه الصفحة