TF6M
13-01-2011, 04:42 PM
السلام عليكم و رحمة الله و بركاته
- يمكن إستدعاء روتينات Ntxxx من الـ User Mode , دون الحاجة إلى تصريح تصدير الدالة من NtDLL
آلية العملية بسيطة , يتم الإنتهاء من الـ SysTem Call الى قلب النظام (Win32.sys & NtosKrnl.exe)
حيث يحدد طبيعة الإستدعاء (Gui or Native) , على أساس قيمة ServiceTable (. (http://img146.imageshack.us/img146/4219/sst.gif))
- يتم تمرير بيانات الإستدعاء عن طريق SysEnter = $2E , تعتبر بوابة الكيرنل مود و كتعريف بسيط
هي عبارة عن روتين ينفذ عن إستدعاء Ntxxx/Zwxxx أو عند تنفيذ المقاطعة Int $2E من اليوزر مود(.. (http://img145.imageshack.us/img145/2189/downloadpw.png))
- للـ SysEnter , بارامتران الأول يسجل في EAX و الثاني في الـ EDX
EAX سيؤشر إلى ترتيب الدالة المستهدفية أو الموافقة لـ SysCall في ServiceTable
EDX سيؤشر إلى بارامترات الدالة المستهدفة المحجوزة في الـ Stack
- مثال , دالة NtTerminateProcess , تنقيح المكتبة NtDLL بـ IDA Pro
.text:7C91DE50 public ZwTerminateProcess
.text:7C91DE50 ZwTerminateProcess proc near
.text:7C91DE50
.text:7C91DE50 mov eax, 101h ; NtTerminateProcess
.text:7C91DE55 mov edx, 7FFE0300h
.text:7C91DE5A call dword ptr [edx]
.text:7C91DE5C retn 8
.text:7C91DE5C ZwTerminateProcess endp- الفكرة واضحة الآن , يكفي دفع ببرامترات الدالة :
Asm
push Dword(-1)
Push 0
mov eax, 101h // TerminateProcess
mov edx,$7FFE0300
call dword ptr [edx]
ret 8
End;- الأن يمكن الإستغناء على إعادة تصريح التصدير & مساحة أقل & سرعة تنفيذ (Inline) .
- أيضا يمكن إستغلال الطريقة من الكيرنل مود , لم أحضر مثال بعد http://www.delphi4arab.com/forum/images/icons/icon10.gif .
بالتوفيق,,
- يمكن إستدعاء روتينات Ntxxx من الـ User Mode , دون الحاجة إلى تصريح تصدير الدالة من NtDLL
آلية العملية بسيطة , يتم الإنتهاء من الـ SysTem Call الى قلب النظام (Win32.sys & NtosKrnl.exe)
حيث يحدد طبيعة الإستدعاء (Gui or Native) , على أساس قيمة ServiceTable (. (http://img146.imageshack.us/img146/4219/sst.gif))
- يتم تمرير بيانات الإستدعاء عن طريق SysEnter = $2E , تعتبر بوابة الكيرنل مود و كتعريف بسيط
هي عبارة عن روتين ينفذ عن إستدعاء Ntxxx/Zwxxx أو عند تنفيذ المقاطعة Int $2E من اليوزر مود(.. (http://img145.imageshack.us/img145/2189/downloadpw.png))
- للـ SysEnter , بارامتران الأول يسجل في EAX و الثاني في الـ EDX
EAX سيؤشر إلى ترتيب الدالة المستهدفية أو الموافقة لـ SysCall في ServiceTable
EDX سيؤشر إلى بارامترات الدالة المستهدفة المحجوزة في الـ Stack
- مثال , دالة NtTerminateProcess , تنقيح المكتبة NtDLL بـ IDA Pro
.text:7C91DE50 public ZwTerminateProcess
.text:7C91DE50 ZwTerminateProcess proc near
.text:7C91DE50
.text:7C91DE50 mov eax, 101h ; NtTerminateProcess
.text:7C91DE55 mov edx, 7FFE0300h
.text:7C91DE5A call dword ptr [edx]
.text:7C91DE5C retn 8
.text:7C91DE5C ZwTerminateProcess endp- الفكرة واضحة الآن , يكفي دفع ببرامترات الدالة :
Asm
push Dword(-1)
Push 0
mov eax, 101h // TerminateProcess
mov edx,$7FFE0300
call dword ptr [edx]
ret 8
End;- الأن يمكن الإستغناء على إعادة تصريح التصدير & مساحة أقل & سرعة تنفيذ (Inline) .
- أيضا يمكن إستغلال الطريقة من الكيرنل مود , لم أحضر مثال بعد http://www.delphi4arab.com/forum/images/icons/icon10.gif .
بالتوفيق,,