• 0
مهند سليمان

anti debug

سؤال

السلام عليكم

هذه الخدعة تستعمل لمعرفة المنقح إذا كان موجود في الذاكرة إم لا

وهي تتاخص في أن القيمة الموجودة في التسجبل DR7 تساوي

400h إن لم يكن هناك منقح في الذاكرة

الكود

mov eax,DR7

cmp eax,400h

jnz no

....

no:

........

والمشكلة أن هذه الخدعة لاتعمل إلا في ring 0

كيف يمكن الوصل إلي ring 0 في ويندوز NT

بأستخدم VXd or SEH

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

12 إجابة على هذا السؤال .

  • 0

Switch to Ring0 by LDT (Locale Descriptor Table):
-----------------------------------------------------------------------
.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc

Extrn SetUnhandledExceptionFilter : PROC

.data

msg1            db "Switch to Ring0 by LDT",0
msg2            db "Ring0 activated",0

gdt_            df 0
call_           dd 00
               dw 0Fh
o_gate          dw 0
               dw 028h          ;segment for RING0
               dw 0EC00h
               dw 0
.code

Start:

               mov  eax, offset ring0
                                 ;our Ring0 routine

               mov  [o_gate],ax  ;set address of our new Ring0 service to our "callgate"
               shr  eax,16
               mov  [o_gate+6],ax

               xor  eax, eax
               sgdt fword ptr gdt_
                                 ;save GDT
               mov  ebx,dword ptr [gdt_+2]
                                 ;GDT base address
               sldt ax
               add  ebx,eax      ;discriptor address

               mov  al,[ebx+4]
               mov  ah,[ebx+7]
               shl  eax,16      ;LDT address

               mov  ax,[ebx+2]  ;callgate's discriptor address

               add  eax,8
               mov  edi,eax      ;set in callgate for changes
               mov  esi,offset o_gate
                                 ;our "callgate" address
               movsd            ;move it to real callgate
               movsd            ;for jump to Ring0

               call fword ptr [call_]
                                 ;jump to Ring0 to our Ring0 service

               xor  eax, eax
               sub  edi,8        ;delete our changes in callgate
               stosd
               stosd


               call MessageBoxA,0, offset msg2, offset msg1,0

               call ExitProcess, -1


;----------------------------------------------------------
;Our new Ring0 service
;----------------------------------------------------------

ring0:
               mov eax, dr7      ;test for Ring0

               retf              ;back to RING3

ends
end Start

Switch to Ring0 by IDT (Interupt Descriptor Table) aka EliCZ's method:
--------------------------------------------------------------------------------------------------
.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc


Extrn SetUnhandledExceptionFilter : PROC

Interrupt       equ 5            ;interrupt number which we will use
                                 ;if you use Int 1h or 3h, it will be
                                 ;more harder debugg your program
.DATA

msg1            db "Switch to Ring0 by IDT",0
msg2            db "Ring0 activated",0


.CODE
Start:

               push edx
               sidt [esp-2]      ;read IDT to stack
               pop  edx          ;address of Interrupt table
               add  edx,(Interrupt*8)+4
                                 ;Interrupt table base+Int number+size for
                                 ;Int in Interrupt table=Int vector address
               mov  ebx,[edx]
               mov  bx,word ptr [edx-4]
                                 ;read old address our interrupt (INT 5h)

               lea  edi,InterruptHandler
               mov  [edx-4],di
               ror  edi,16      ;set our new interrupt handler
               mov  [edx+2],di

               push ds          ;save registers
               push es


               int  Interrupt    ;jump to Ring0 (our int 5h handler)

               pop  es          ;restore registers
               pop  ds


               mov  [edx-4],bx  ;set old int 5h handler
               ror  ebx,16
               mov  [edx+2],bx

               call MessageBoxA,0, offset msg2, offset msg1,0
               call ExitProcess, -1



;-----------------------------------------------------------------------------
;OUR NEW INT 5h HANDLER (it run in Ring0)
;-----------------------------------------------------------------------------

InterruptHandler:

               mov  eax,dr7      ;test for Ring0
               iretd            ;jump back to Ring3



ends
end Start

تم تعديل بواسطه Xacker
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

للتنبيه، الملف المرفق من الاخ Delta يحوي على نفس السورس في المشاركة اعلاه بالاضافة الى سورس بلغة C (لكنه ليس بالسهل على مبرمجي الـ C الجدد)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بصراحة لم اجد وقت كافي للكتابة في المنتدى... ولكن لفت إنتباهي هذا السؤال

-

هذا السؤال لي قصة معه وهي التعرف على الداله الغامضة GetThreadSelectorEntry

-

بإختصار تريد الوصول لمسجلات المعالج التابعة للنظام في بيئة 32 بت

القصة بسيطة ... لاحظ هذا الكود من مايكروسوفت

CONTEXT Context;
  LDT_ENTRY SelEntry;
  DWORD dwDsBase;
  DWORD DR7;
  BYTE Buffer[4];

  /* Get Context */
  Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
  GetThreadContext( hThread, &Context );

  /* Calculate the base address of DS */
  GetThreadSelectorEntry(hThread, Context.SegDs, &SelEntry);
  dwDsBase = ( SelEntry.HighWord.Bits.BaseHi << 24) |
               (SelEntry.HighWord.Bits.BaseMid << 16) |
               SelEntry.BaseLow;

  /*
   * Disable all hardware breakpoints before reading the process
   * memory. Not doing so will lead to nested breapoints.
   */
  DR7 = Context.Dr7;
  Context.Dr7 &= ~0x3FF;
  SetThreadContext( hThread, &Context );

  /* Read DWORD at the location of DR0 */
  ReadProcessMemory( hProcess,
                     (LPVOID)((DWORD)Context.Dr0-dwDsBase),
                     Buffer, sizeof(Buffer), NULL);

  /* Restore hardware breakpoints */
  Context.Dr7 = DR7;
  SetThreadContext( hThread, &Context );

وبالتوفيق ,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

مشكورين إخواتي علي الردود وجاري التطبيق والقراءة

وإن شاء الله سأضع مجموعة من الخدع ضد التنقيح

ومشكورين مرة أخرى وماقصرتم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

:) الواحد يظهر علشان بقاله فترة مقرأش فى الأسيمبلي نقريبا نسيت كل حاجة :D ربنا يستر و الواحد يحاول يبدأ من تانى :) أدعولي يا جماعة أنا تقريبا جالى "ذهيمر" :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يكون بعون الزهايمر :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لم يعمل في winXp

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اعتقد ان الانتقال من ring3 الى ring0 يخضع لقوانين عديدة خصوصا انه قد تم رفع مستوى الامان لمنع الفيروسات من الانتقال الى طبقة الـ ring0 بسهولة.. يمكن الحل يكون في الـ vxd او الـ sys لكن مش متاكد من هالنقطة..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كيف يمكن أن أبرمج vXD

وأسف على تاخري في الرد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

للانتقال من Ring3 الى Ring0 في الغالب يتطلب عمل driver اما vxd أو wdm .

في مقال هنا بعنوان

ٌWIN NT/2K/XP Running Ring0 code without driver

كاتب المقال webcrazy

http://www.geocities.jp/webcrazyjp/ntring0.htm

هناك جزء من مقال بالانجليزية هنا

المقال باسم Crazyl0rd

http://www.phrack.org/phrack/59/p59-0x10.txt

لم أطلع على الموضوعين بشكل دقيق ( ليس لدي وقت لذلك ) ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .