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

    .:: RSS ::. عضوية آلية

    الأنتساب:
    ‏9 سبتمبر 2011
    المشاركات:
    14,005
    الإعجابات المتلقاة:
    0
    نقاط الجائزة:
    36
    الإقامة:
    IQ-T34M


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



    إن شاء الله تكونوا في تمام الصحة والعافية إخواني


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

    وقبل البدأ أرجو منكم إخواني متابعة هذين الشرحين لأننا حنشتغل على عمليات بين أنظمة العد : الثنائي ،العشري و السداسي العشري .

    كود PHP:
    http://vb.ehcommunity.com/showthread.php?t=73152


    كود PHP:
    http://vb.ehcommunity.com/showthread.php?t=73251



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

    كود PHP:
    http://vb.ehcommunity.com/showthread.php?t=74096



    دراسة الهدف

    نقوم بفتح البرنامج gaza1 مع immunity debugger :

    [​IMG]


    ونقوم بتشغيله ثم نقوم بالتنفيذ سطر بسطر

    بالظغط على F8 إلى أن نصل إلى هذا السطر كما في الصورة التالية :

    [​IMG]



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

    وظيفة createfile api للبحث عن الملف المسمى Keyfile.dat .

    ثم إن واصلنا التنفيذ حتظهر لنا الرسالة السيئة .

    هذا يعني أن البرنامج gaza1 يبحث عن الملف المسمى Keyfile.dat لذلك حنقوم بإعطائه هذا الملف .

    نفتح النوتباد وننشء به ملف جديد ونسميه Keyfile.dat

    ونخزنه في نفس مسار البرنامج gaza1

    [​IMG]

    [​IMG]

    طيب نظغط على F8 لتنفيذ هذا السطر :

    كود PHP:
    00401073 . E8 0B020000 CALL ; |\CreateFileA


    نلاحظ أن البرنامج وجد الملف Keyfile.dat وذلك لأن EAX لاتساوي ناقص واحد أي FFFFFFFF كما في الصورة التالية :

    [​IMG]

    نظغط F8 وبذلك تخطينا الرسالة السيئة وتم مواصلة تنفيذ البرنامج بشكل طبيعي .

    نواصل التنفيذ سطر بسطر بالظغط على F8 إلى أن نصل إلى هذا السطر كما في الصورة التالية :

    [​IMG]


    [​IMG]

    طيب الوظيفة ReadFile حتنجح في قرائة الملف KeyFile.dat بما أنه موجود لكن الملف

    Keyfile.dat فارغ .

    طيب .. نظغط F8 ونشوف ذلك .

    [​IMG]

    طيب الآن نظغط على F8 فلدينا هذا السطر التالي :

    [​IMG]

    في هذا السطر لدينا القفزة JNZ والتي يقع تنفيذها بشرط الراية Z تساوي 0 وهذا متوفر يعني أن القفزة ستنفذ .

    طيب نظغط على F8 فننتقل إلى هذا السطر :

    [​IMG]

    نواصل التنفيذ سطر بسطر بالظغط على F8 إلى إن نصل إلى هذا السطر التالي :

    [​IMG]

    لدينا هنا عملية مقارنة مع 10

    فمذا يمثل 10h ؟

    وماذا يمثل أيضا 402173h ؟

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

    10 بالهيكس تساوي 16 بالنظام العشري .. يعني ذلك أن البرنامج قام بمقارنة شيء ما بالرقم 16 ..

    فماهو الشيء الذي تمت مقارنته بالرقم 16 ؟؟

    طيب نرجع للصورة السابقة لبرامترات الوظيفة كالتالي :

    [​IMG]

    نلاحظ هنا :

    pBytesRead = gaza1.00402173

    فالبارامتر pBytesReadيمثل مكان قرائة الوظيفة ReadFile لكمية من

    البايتات وهذا المكان عنوانه هو 00402173

    طيب نظغط F8 ونواصل كالتالي:

    [​IMG]

    لدينا في هذا السطر قفزة JL وكنا قد شفنا في الدرس الأول أن بعد تنفيذ هذا السطر ينقلنا إلى مكان

    الرسالة السيئة .. وهذا يعني أنه إذا كانت عدد البايتات التي يتم قرائتها من قبل الوظيفة ReadFile

    أصغر من 16d فإن الكود ينتقل إلى الرسالة السيئة .

    يعني خلاصة الأمر أن عدد البيتات التي تقرئها الوظيفة ReadFile من الملف KeyFile.dat يجب أن

    يكون على الأقل يساوي 16d .

    طيب دعونا الآن نجعل البرنامج كأنه قرأ على الأقل 16d بايت .

    وذلك بتغيير قيمة الراية S إلى 0 (شرحنا ذلك في الدرس الأول) .

    تمام .. قمنا بمنع عملية القفز إلى الرسالة السيئة .

    نظغط على F8 ونواصل كالتالي :

    [​IMG]

    في هذا السطر سيقوم البرنامج بنسخ قيمة إلى العنوان [EBX + 40211A] في المسجل AL

    ولو نشوف قيمة EBX في هذه اللحظة نجدها تساوي 0 (قبل قليل عملنا XOR EBX , EBX ولازالت

    تساوي 0)كما في الصورة التالية :

    [​IMG]


    هذا يعني أن EBX + 40211A = 40211A

    مع العلم أن [40211A] يمثل عنوان أول بايت تقرأه الوظيفة ReadFile وتضعه في البافر بعنوان 40211A وهذا يعني أن القيمة المقروؤة "فارغة"

    يمكن أن نشاهد ذلك في الأسفل هنا كما في الصورة التالية :

    [​IMG]

    ALتمثل أول 2 بايت على اليمين في المسجل EAX

    ونشوف أيضا أن الوظيفة ReadFileقامت بقرائة القيمة 00 في أول بايت.

    يعني بإختصار سيقوم البرنامج بنسخ أول بايت قرأتها الوظيفة ReadFile من الملف Keyfile.dat

    ثم تضعها في المسجل AL

    نضغط ونواصل للسطر التالي :

    [​IMG]

    في هذا السطر سيتم مقارنة AL ب 0

    فإذا كانت تساوي 0 مثل الآن فيتم إذا القفز بالقفزة JE إلى العنوان 004010D3 مثل ماهو مبين في السطر التالي مباشرة كما في الصورة الآتية :

    [​IMG]

    وبعد القفز إلى العنوان 004010D3 يتم مقارنة المسجل ESI ب 8 مثل ماهو مبين في الصورة التالية :

    [​IMG]

    فإذا كانت ESI أصغر من 8 فحينئذ يتم القفز بالقفزة JL إلى الرسالة السيئة مثل ماهو مبين في السطر التالي مباشرة كما في الصورة الآتية :

    [​IMG]

    هذا يعني أننا نحتاج المسجل ESI يكون يساوي أو أكبر من 8 لنتمكن من الإستمرار والقفز إلى رسالة التهنئة .

    لكن المسجل ESIقبل مقارنته ب 8 فهو يساوي 0 منذ قمنا بعمل XOR ESI , ESI .

    نظغط على F8 ولدينا كما في الصورة التالية :

    [​IMG]

    بعد تغيير الراية Z إلى 0 نظغط على F8 وننتقل إلى السطر التالي كما في الصورة التالية :

    [​IMG]

    تذكروا أن تALتمثل أول بايت يتم قرئتها بواسطة الوظيفة ReadFile من الملف Keyfile.datوالآن في هذا السطر حيتم مقارنتها بالقيمة 47h

    والقيمة 47 بالهيكس يقابلها الحرف 'G'بالآسكي .

    هذا يعني أن البرنامج في هذا السطر يفحص ما إذا كانت أول بايت من الملف Keyfile.datتساوي الحرف 'G'

    طيب نظغط F8 وننتقل للسطر التالي كما في الصورة التالية :

    [​IMG]

    الملف Keyfile.dat فارغ وقلنا تم مقارنة أول بايت فيه بالحرف 'G'وعندنا أيضا في هذا السطر قفزة حتتم

    نفهم من هذا أنه إذا كانت أول بايت من الملف مخالفة ل الحرف 'G' فإنه يتم القفز إلى العنوان 004010D0

    وفي هذا العنوان 004010D0 نجد السطر التالي :

    [​IMG]

    ونلاحظ أنه قبل ذلك يوجد هذا السطر والذي قفزنا من فوقه :

    [​IMG]

    الشكل العام للتعليمة INC هو :

    INC register

    التعليمة INC هي عكس التعليمة DEC فهي تقوم بزيادة القيمة ب 1 مع وضع الرايات Z و O

    وتذكروا أننا نريد ESI >= 8


    يعني لو لم نقفز من فوق هذا السطر سيتم إظافة 1 إلى ESI

    طيب التنفيذ الآن وصل إلى هذا السطر التالي :

    [​IMG]

    طيب ال EBX كانت 0 والآن بهذه التعليمة سيتم إضافة 1 لها .

    نواصل .. بالضغط على F8 فننتقل إلى السطر التالي كالآتي :

    [​IMG]

    نشوف أننا لو نفذنا هذا السطر نرجع إلى وراء على هذا العنوان 004010C1 أي إلى هذا السطر التالي :

    [​IMG]


    وفي هذا السطر يتم الإنتقال لفحص البت الثانية من الملف Keyfile.dat يعني أننا في حلقة تكرارية لفحص جميع بايتات المكتوبة في الملف .

    فعلينا إذ جعل 8 =< ESI وهذا لن يتم إلا في حالة ماجعلنا أول بايت من الملف Keyfile.dat تساوي الحرف "G"

    فإذا كانت البايت الثانية تساوي 0 هذا يعني نهاية البايتات المكتوبة داخل الملف Keyfile.dat (يتحقق منها إذا كانت ESI أصغر من 8)

    ==> يعني يتحقق من الحرف "G" على الأقل 8 مرات .



    أيضا تذكروا أننا في البداية فحصنا ماإذا كانت عدد البايتات المقروؤة من الملف KeyFile.dat تساوي على الأقل 16d بايت .

    نفهم من ذلك أن EBX تلعب دور العداد في الحلقة التكرارية .

    يتم زيادة 1 لل EBX وهذه القيمة يتم إضافتها لقيمة المؤشر الذي يشير إلى البايت الثانية من الملف Keyfile.dat

    مرة أخرى يتم فحص ماإذا كانت البايت الثانية تساوي 0 فيتم القفز إلى العنوان 004010D3 لمقارنة ESI إذا كانت تساوي أو أكبر من 8

    فإذا لم يكن هناك "G" يتم القفز إلى إلى العنوان 004010F7 أين توجد الرسالة السيئة كمافي الصورة التالية :

    [​IMG]

    وإلا فإننا نقفز إلى رسالة التهنئة بعد تنفيذ القفزة JMP الموجودة في العنوان 004010D8

    طيب .. الآن لدينا مايكفي من المعلومات لحل المشكل

    يجب أن يكون في الملف Keyfile.dat مكتوب مالايقل عن 8 حروف "G" وملايقل عن 16 بايت في الجملة .

    نفتح الملف KeyFile.dat ونكتب فيه ماذكرنا .

    [​IMG]

    ثم نقوم بتخزين الملف (تذكروا أنه يجب أن يكون على نفس مسار البرنامج gaza1 )



    ونقوم بإعادة تشغيل البرنامج gaza1

    قبل تشغيل البرنامج نضع نقطة وقوف في العنوان 0040107B كما في الصورة التالية :

    [​IMG]

    وبعد الظغط على F9 يشتغل البرنامج ثم يتوقف في عنوان نقطة الوقوف التي وضعناها منذ قليل , ثم نضع نقطة وقوف أخرى في العنوان 004010B0 كما في الصورة التالية :

    [​IMG]

    بعد الظغط على F9 لمواصلة البرنامج وتخطي الرسالة السيئة نقف في العنوان 004010B0 كما في الصورة التالية :

    [​IMG]

    ثم نواصل التنفيذ سطر بسطر إلى أن نصل إلى العنوان 004010B8 كما في الصورة التالية :

    [​IMG]

    نظغط F8 فننتقل إلى هذا السطر بعنوان 004010BF

    كود PHP:
    JL SHORT gaza1.004010F7


    وفي هذا السطر لن يتم القفز إلى الرسالة السيئة .

    ثم نظغط F8 فننتقل إلى السطر التالي كما في الصورة التالية :

    [​IMG]

    نظغط على F8 فننتقل إلى السطر التالي :

    كود PHP:
    CMP AL,0


    هنا حيتم مقارنة المسجل AL ب 0 وبما أنه يحتوي على الحرف "G" يعني ليس فارغ فالقفزة JE التي توجد في السطر الموالي بعنوان 004010C9 لن تتم .

    كود PHP:
    JE SHORT gaza1.004010D3


    نواصل الظغط على F8 إلى أن نصل إلى السطر التالي بعنوان 004010CB

    كود PHP:
    CMP AL,47


    لدينا مقارنة قيمة AL ب 47h أي الحرف "G" وبما أن AL يحتوي على الحرف "G" فالقفزة JNZ الموجودة في السطر التالي مباشرة بعنوان 004010CD لن تتم .

    كود PHP:
    JNZ SHORT gaza1.004010D0


    نظغط على F8 وننتقل إلى السطر التالي بعنوان 004010CF

    كود PHP:
    INC ESI


    في هذا السطر لدينا ESI = 0 و تقوم التعليمة INC بزيادة قيمة ESI ب 1 فتصبح ESI = 1

    نظغط على F8 فننتقل إلى السطر التالي بعنوان 004010D0

    كود PHP:
    INC EBX


    في هذا السطر لدينا EBX = 0 و تقوم التعليمة INC بزيادة قيمة EBX ب 1 فتصبح EBX = 1

    يعني قلنا أن EBX تمثل العداد فبعد قرائتنا لأول بايت من الملف Keyfile.dat تم إضافة 1 لل EBX فبالتالي حننقل للبايت الثانية من الملف Keyfile.dat

    نظغط على F8 فننتقل إلى السطر التالي بعنوان 004010D1 أين حنجد القفزة JMP كالتالي :

    كود PHP:
    JMP SHORT gaza1.004010C1


    نظغط على F8 فننتقل إلى السطر بعنوان 004010C1 كما هو موضح في الصورة التالية :

    [​IMG]

    نحن الآن في فحص البايت الثانية من الملف Keyfile.dat وبعد قرائة البايت الثانية يتم إضافة 1 لل

    EBX(العداد) ثم يتم مقارنة هذه البايت بالحرف "G" فإن كانت تساوي "G" يتم إضافة 1 لل ESI ثم

    يتم إضافة 1 مرة أخرى لل EBX فننتقل مرة أخرى لفحص البايت الثالثة ... وهكذا دواليك

    يتم مغادرة الحلقة التكرارية فقط إذا كانت البايت فارغة . لاحظوا أني قلت فارغة ولم أقل تساوي 0 .

    بالنسبة للرقم 0 في الآسكي يساوي 30 بالهيكس ويساوي 48 بالنضام العشري .

    نواصل الظغط على F8 إلى أن نصل إلى العنوان 00401205 كما في الصورة التالية :

    [​IMG]

    لو نلاحظ أنه السطر السابق مباشرة بعنوان 004010D6 والذي كنا قد نفذناه وأخذنا إلى الرسالة

    السيئة بعد مقارنة ESI ب 8 وكانت وقتها تساوي 0 لكن الآن ESI = 8 لهذا لم تتم القفزة إلى

    الرسالة السيئة وإنتقلنا إلى القفزة JMP التي بعد تنفيذها حتأخذنا إلى رسالة التهنئة.

    نواصل الظغط على F8 فننتقل إلى رسالة التهنئة كما في الصورة التالية :

    [​IMG]

    نقوم بالظغط على F9 ونشوف كما في الصورة التالية :

    [​IMG]



    لاتنسوني من صالح دعاؤكم

    في أمان الله




     
حالة الموضوع:
مغلق

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