Траблы с TEB (Лист DLL из ring0)

Тема в разделе "WASM.WIN32", создана пользователем valinor, 5 июн 2005.

  1. valinor

    valinor New Member

    Публикаций:
    0
    Регистрация:
    7 май 2005
    Сообщения:
    27
    Захотел я, находясь в ядре, получить список загруженный в текущий процесс DLL.

    Реализовал это через поиск в GDT дескриптора fs и далее по накатанной: TEB->PEB->список LDR_DATA_TABLE_ENTRY

    Но вот беда - в моей XP TEB, расположенный по адресу 0x7ffde000, есть не во всех процессах!!!

    Т.е., например, в процессе services.exe, в GDT есть запись 0x3b (значение FS в ring3), указывающая на этот адрес, но по этому адресу ничего нет!

    Отчего такое может быть? Нет ли других способов листануть DLL-ы загруженные в текущий процесс из ring0?
     
  2. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    есть, держи код, когда то писал драйвер, который должен был запускать exeшник из ring0, получилось, но работает через раз, будет время, разберусь до конца и выложу статью :)

    так я искал модуль kernel32.dll в процессе из р0 :)


    Код (Text):
    1. typedef struct  _KMODULEINFOLISTENTRY {
    2.      DWORD      Flink;
    3.      DWORD      Blink;
    4.      DWORD      ModuleIBase;
    5.      DWORD      DllEntryPoint;
    6.      DWORD      Unknown2;
    7.      DWORD      Unknown3;
    8.      PWCHAR     ModuleName;
    9.  } KMODULEINFOLISTENTRY, *PKMODULEINFOLISTENTRY, **PPKMODULEINFOLISTENTRY;
    10.  
    11.  DWORD kwsGetModule(PWCHAR ModuleNameW)
    12.  {
    13.  int                    MNameLen;
    14.  int                    buflen;
    15.  PWCHAR                 pl;
    16.  PKMODULEINFOLISTENTRY  p,firstentry;
    17.  static WCHAR           s_array[0x200];
    18.  DWORD                  i,j;
    19.  static PPEB            pPeb = (PPEB)0x7ffdf000; // PEB
    20.  
    21.  __try{
    22.  
    23.  MNameLen = 0;
    24.  if (MmGetPhysicalAddress(pPeb).QuadPart == 0) return 0; // no user space this process has
    25.  
    26.   for (MNameLen=0; ModuleNameW[MNameLen] !=0; MNameLen++)
    27.    ModuleNameW[MNameLen] = RtlUpcaseUnicodeChar(*(ModuleNameW+MNameLen));
    28.      
    29.  (DWORD)p = (DWORD)firstentry = *(PDWORD)pPeb->ProcessModuleInfo->ModuleHeader.List3.Flink;
    30.  
    31.  for (i = 0; i<10001 ;++i)
    32. {
    33.       if (MmGetPhysicalAddress(p->ModuleName).QuadPart == 0) return 0;
    34.          
    35.       pl = p->ModuleName;
    36.          
    37.   RtlZeroMemory(s_array,sizeof(s_array));  // îáíóëÿåì ìàññèâ
    38.     buflen = 0;
    39.   for (pl; *pl!=0;pl++)
    40.   {   s_array[buflen] = RtlUpcaseUnicodeChar(*pl);
    41.       buflen++;
    42.   }  
    43.  
    44.     j = buflen*2 - MNameLen*2; // àäðåñ ñòðîêè â áóôåðå îòêóäà ñðàâíèâàòü
    45.     j = (DWORD)s_array + j;
    46.     // if strings are equal then return Ib of Kernel32.dll
    47.     if (!memcmp((PCHAR)j,ModuleNameW,MNameLen*2)) {return p->ModuleIBase;}
    48.      if (MmGetPhysicalAddress((PKMODULEINFOLISTENTRY)p->Flink).QuadPart == 0) return 0;
    49.     p = (PKMODULEINFOLISTENTRY)(p->Flink);
    50.               // no kernel32.dll module mapped at this process space :)
    51.         if ((PDWORD)firstentry == (PDWORD)p) return 0;
    52.    
    53. }
    54.  }
    55.  __except(EXCEPTION_EXECUTE_HANDLER){}
    56.     return 0; // oOPS!? :))
    57.  }