السلام عليكم,
كما اقترح في الموضوع السابق :
نقلت الموضوع إلى هنا لنحاول أن ننا قش مختلف الطرق لهذا.
قبل أن نبدأ بتقنية الديبوغر سأبدأ بتقنية ربما أسهل منها ولو أنها تتشابه في بعض الحالات.
عندنا البرنامج الموجود في الرابط السابق test.exe الذي يطلب منا كلمة سر وسنحاول أن نتفادى هذا بدون عمل باتش فزيائي يعني بدون أن نغير الملف الأولي بل سنعمل له باتش عند الإنجاز.
الطريقة الأولى التي سأعطيها هنا تكمن في :
- نفتح بروسس جديد للبرنامج الهدف وهنا هو test.exe ولهذا الغرض سنستعمل الدالة :
invoke CreateProcess,0,addr file,0,0,0,CREATE_SUSPENDED,0,0,addr sinfo,addr pinfo
ولهذه الدالة بارامترات مختلفة يمكن أن نرى التعليقات عنها في مكتبة مايكروسوفت ونحن سنستعمل هنا إلا البارامترات الضرورية لعملنا وهي كما يلي :
file فهو اسم البرنامج الذي نريد فتحه وهنا سيكون test.exe .
- البارامتر CREATE_SUSPENDED يعني كيف سنفتح البرنامج أو البروسسوس وبارامترنا هنا يعني أنه بعد فتح البرنامج يتوقف ولا يشتغل وهذا هو Suspend وهنا نريده أن يتوقف حتى نقوم بالتغييرات اللازمة قبل نطلب منه تتم التشغيل وإلا فإنه سيشتغل كالمعتاد ويكون عملنا لا جدوى منه.
البارامترات sinfo و pinfo هي ستركترات ستقوم الدالة بملإئهما بمختلف المعلومات حول البرنامج والتي قد نحتاجها حسب نوعية البرنامج.
بعد هذا سنستعمل الدالة :
invoke OpenProcess,PROCESS_ALL_ACCESS,0,[esi].dwProcessId
وهي ستقوم بفتح البروسسوس السابق والهدف هنا أنها ستعطينا هاندل لهذا كما ستمكننا من اختيار بعض البارامترات التي نحتاجها. فالبارامتر الأول PROCESS_ALL_ACCESS يمكننا من اختيار الصلاحيات التي يمكن أن نعطيها للبروسسوس المفتوح وهنا بدون وجع الرأس سنأخذ كل الإمتيازات أو All Access . والبارامتر الأخير ليس إلا رقم البروسسوس الذي نريد فتحه وهنا طبعا نريد البروسسوس test ورقم البروسسوس سنأخذه من الستركت السابقة pinfo فهي تعطينا كلا من رقم البروسسوس والشريد وذا الهاندل الخاص بهما كما يمكن أن نتعرف أكثر على هذه الستراكت في مكتبة مايكروسوفت أيضا. وإذا تم الكل بنجاح سنحصل على هاندل الذي سنستعمله فيما سيأتي.
بعد هذا نعلم أن الكود الي سينجزه برنامجا ما غالبا ما يكون في مقطوعة يسمح لها في غالب الأحيان بالإنجاز والقراءة. وهنا غرضنا أننا سنغير قطعة من الكود لذا سوف لا يمكننا تاكتابة مباشرة إلا إذا غيرنا الصلاحيات. وهنا يقوم دور الدالة :
invoke VirtualProtectEx,hand,address,number,PAGE_EXECUTE_READWRITE,addr old
هذه ستمكن من تغيير صلاحيات عنوان معين في بروسسوس معين وبابرامتراتها كما يلي :
hand هو هاندل البروسسوس والذي عثرنا عليه بعد فتح البروسسوس السابق.
address وهو العنوان الذي نريد أن نغير صلاحياته.
number هو عدد البايتات ابتداءا من address الذي سنغير لها الصلاحيات
PAGE_EXECUTE_READWRITE الصلاحية الجديدة التي نريدها وهنا كما يدل على ذلك الإسم سنعطيها كل الصلاحيات إنجاز كتابة قراءة.
old هذا بونتر نعطيه للدالة لتعطينا فيه الصلاحية السابقة إذا كنا نريد أن نرجع له صلاحيته السابقة لكن هنا لا يهمنا أن نغيرها مرة أخرى لأصلها.
فإذا تمت العملية بنجاح فسوف يمكننا أن نكتب أو نغير البايتات الموجودة في الذاكرة المقصودة ةللكتابة سنتعامل مع الدالة التالية:
invoke WriteProcessMemory,hand,address,addr good,number,addr written
هذه مثل الدالة السابقة تقريبا سنعطيها هاندل البروسسوس والعنوان الذي نريد أن نكتب فيه . good هي الذاكرة التي ستكون فيها المعطيات التي نريد كتابتها . number هو عدد البايتات التي نريد كتابتها و written هي مؤشر يستقبل عدد البتات التي كتبت بالفعل.
بعد هذا ما علينا سوى أن نقول للبرنامج أن يستمر في شغله بواسطة :
invoke ResumeThread,[esi].hThread
كل ما سنعطيها هي هاندل الثريد الذي وقفناه في بداية الأمر وهذا نحصل عليه أيضا بواسطة الستراكت السالفة الذكر.
فيما يخص مثالنا test.exe فكما تشاهدون في كود البرنامج لهذا أو باستعمال أي ديبوغر تريدون ستلاحظون أن عملية المقرانة بالباسوورد ستكون في الذاكرة .
40105A وهي تحتوي على التعليمة jz x وهي قفز مشروط إلى العنوان x ونلاحظ أنه إذا تم القفز فكأن الباسوورد صحيح وفي الحالة الأخرى سيكون خطأ. لذى لو نغير القفز المشروط إلى قفز غير مشروط jmp ففي جميع الحالات سيتم القفز وكيفما كان الباسوورد ستتم عملة القفز وسيكون كأن الباسوورد الذي أعطيناه صحيح والبايت الذي يدل على القفز المشروط هو 74 هكس الذي في الذاكرة أعلاه لو نغيره بالقيمة 0EB فكأننا غيرنا التعليمة من jz إلى jmp وهذا هو الهدف.
فيمكن أن نزيد مثلا لو أردنا أن يكون الباسوورد دائما خطء فسنجعل البرنامج لا يقفز أبدا في الذاكرة السالفة وهنا يمكن أن نفعل ذلك بتغيير البايتان 74 1D في الذاكرة السالفة إلى بايتين 90 90 وهما تعليمتان NOP أو No Operation أي أن البروسسوس لا يقوم بأي شيء وهذا سيجعل البرنامج يندرج مباشرة إلى الكود الذي يعطينا باسوورد خطأ.
ويمكننا أيضا أن نمر مباشرة إلى النافذة الثانية بدون أن يطلب منا أي شيء وهنا يمكن مثلا أن نغير بعض المعطيات الخاصة بالنافذة ا|لأولى لنجعلها تشير إلى النافذة الثانية وهكذا عند الإنجاز سنتصل مباشرة بالنافذة الثانية. وكل ما سنغيره في بارامترات DialogBoxParam هو عنوان الرسورس ليدل هذه المرة على اسم رسورس النافذة الثانية وكما يجب أن نغير أيضا عنوان DialogProc لنعطيه عنوان الدالة الخاص بالنافذة الثانية.
وفي الملف المرفق ستجدون البرنامج loader الذي سيقوم بالباتشوقد وضعت فيه الإختيار أي نختار أحد الطرق الثلاثة يعني إما أن يكون الباسوورد دائما صحيح أو دائما غلط أو الذهاب مباشرة إلى النافذة الثانية. مع العلم أن هذا البرنامج يجب أن يكون في نفس المجلد للبرنامج test.exe وقد وضعت هذا البرنامج هنا أيضا للذين لا يتذكرونه وكوده الخاص به هو الرابط السابق. وكما ستجدون المشروع الكامل لهذا البرنامج هنا.
وفي المرة القادمة سأحاول أن أنجز نفس العمل ولكن بطريقة الديبوغر أي أننا سنضع نقاط توقف داخل البرنامج ويقوم برنامجنا بمعالجتها ويغير مسرى البرنامج حسب ما نريده.
إلى اللقاء