Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› LDT.
Посл.ответ Сообщение

Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 16 января 2011 01:38 · Поправил: Clerk
· Личное сообщение · #1

Здрасте.
Нужно из ядра установить LDT. Возможные способы:
o Вручную. Выделить пул, сформировать там дескриптор и загрузить в EPROCESS. При этом возникают некоторые проблемы.
o NtSetLdtEntries.
o NtSetInformationProcess(ProcessLdtInformation).
o KiGetTickCount(Int 0x2A).
Желательно использовать прерывание:
Code:
  1. align 16
  2.         ENTER_DR_ASSIST kitx_a, kitx_t,NoAbiosAssist
  3.         PUBLIC  _KiGetTickCount
  4. _KiGetTickCount proc
  5.  
  6.         cmp     [esp+4], KGDT_R3_CODE OR RPL_MASK
  7.         jnz     short @f
  8.  
  9. Kgtc00:
  10.         mov     eax,dword ptr cs:[_KeTickCount]
  11.         mul     dword ptr cs:[_ExpTickCountMultiplier]
  12.         shrd    eax,edx,24                  ; compute resultant tick count
  13.  
  14.         iretd
  15. @@:
  16.         ;
  17.         ; if v86 mode, we dont handle it
  18.         ;
  19. .errnz (EFLAGS_V86_MASK AND 0FF00FFFFh)
  20.  
  21.         test    byte ptr [esp+8+2], EFLAGS_V86_MASK/010000h
  22.         jnz     ktgc20
  23.  
  24.         ;
  25.         ; if kernel mode, must be get tick count
  26.         ;
  27. .errnz (MODE_MASK AND 0FFFFFF00h)
  28.         test    byte ptr [esp+4], MODE_MASK
  29.         jz      short Kgtc00
  30.  
  31.         ;
  32.         ; else check if the caller is USER16
  33.         ; if eax = ebp = 0xf0f0f0f0 it is get-tick-count
  34.         ; if eax = ebp = 0xf0f0f0f1 it is set-ldt-entry
  35.         ;
  36.  
  37.         cmp     eax, ebp                ; if eax != ebp, not USER16
  38.         jne     ktgc20
  39.  
  40.         and     eax, 0fffffff0h
  41.         cmp     eax, 0f0f0f0f0h
  42.         jne     ktgc20
  43.  
  44.         cmp     ebp, 0f0f0f0f0h         ; Is it user16 gettickcount?
  45.         je      short Kgtc00            ; if z, yes
  46.  
  47.  
  48.         cmp     ebp, 0f0f0f0f1h         ; If this is setldt entry
  49.         jne     ktgc20                  ; if nz, we don't know what
  50.                                         ; it is.
  51.  
  52.         ;
  53.         ; The idea here is that user16 can call 32 bit api to
  54.         ; update LDT entry without going through the penalty
  55.         ; of DPMI.
  56.         ;
  57.  
  58.         push    0                       ; push dummy error code
  59.         ENTER_TRAP      kitx_a, kitx_t
  60.         sti
  61.  
  62.         xor     eax, eax
  63.         mov     ebx, [ebp+TsEbx]
  64.         mov     ecx, [ebp+TsEcx]
  65.         mov     edx, [ebp+TsEdx]
  66.         stdCall _NtSetLdtEntries <ebx, ecx, edx, eax, eax, eax>
  67.         mov     [ebp+TsEax], eax
  68.         and     dword ptr [ebp+TsEflags], 0FFFFFFFEH ; clear carry flag
  69.         cmp     eax, 0                  ; success?
  70.         je      short ktgc10
  71.  
  72.         or      dword ptr [ebp+TsEflags], 1 ; set carry flag
  73. ktgc10:
  74.         jmp     _KiExceptionExit
  75.  
  76. ktgc20:
  77.         ;
  78.         ; We need to *trap* this int 2a. For exception, the eip should
  79.         ; point to the int 2a instruction not the instruction after it.
  80.         ;
  81.  
  82.         sub     word ptr [esp], 2
  83.         push    0
  84.         jmp     _KiTrap0D
  85.  
  86. _KiGetTickCount endp

1.
ISR устанавливает LDT, если вызов из UM, тоесть для VDM процессов. В ядре кодовый селектор имеет значение KGDT_R0_CODE и нулевой CPL, таким образом проверка:
Code:
  1.         test    byte ptr [esp+4], MODE_MASK
  2.         jz      short Kgtc00

не пройдёт. Это проблема первая.

2.
Далее сервис NtSetLdtEntries не допустит загрузку ядерного дескриптора, так как выполняются проверки DPL, адресов и пр. в следующей функции:
Code:
  1.          call PspIsDescriptorValid
  2.          test eax,eax
  3.          je Error
  4.          ...
  5.          
  6. Error:
  7.          mov Reg32,0xC000011A      ; #STATUS_INVALID_LDT_DESCRIPTOR
  8.          ...

Это вторая проблема.

Интересуют способы решения. Условие: патчить ничего нельзя, ну в общем как обычно.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 16 января 2011 13:00
· Личное сообщение · #2

Clerk
Эток код из \WindowsResearchKernel-WRK\WindowsResearchKernel-WRK\WRK-v1.2\base\nto s\k\i386\trap.asm?

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 16 января 2011 13:26 · Поправил: Alchemistry
· Личное сообщение · #3

Coderess
Откуда еще то? Из врк и из исходников винды 2000.
В общем очередной топег "светла солнышка" несущий 0 полезной нагрузки и предназначенный тешать ЧСВ ТС.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 16 января 2011 15:01
· Личное сообщение · #4

Coderess
Да, откуда же есчо.

Alchemistry
Какое есчо чсв, по мойму ты бредишь. LDT используется для смещения сегмента, дабы реальное положение кода не было определено.

Предлагайте идеи.



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 22 января 2011 14:01 · Поправил: sys_dev
· Личное сообщение · #5

/offtop:
Мне вот не понятно откуда у людей стоко времени? Чтобы ковыряться в задачах подобного рода. По-моему это одно лишь любопытство "как устроена венда" и только. Прошу привести реально конкретный пример где это реально надо? Оценить в человеко-часах и в деревянных тубриках



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 22 января 2011 16:01 · Поправил: Модератор
· Личное сообщение · #6

sys_dev
Это реально нужно чтоб авер отсосал. Есчо нужны аргументы ?

HiEndsoft
Пермутация элементарно эту задачу решает.

От модератора: сообщение немного исправлено, заодно забанен на неделю за срач



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 22 января 2011 17:55 · Поправил: Модератор
· Личное сообщение · #7

Это форум где собираются и общаются крякеры если ты есчо не понял. Главные слова здесь - общаются и крякеры. Ты не умеешь общаться и ты не крякер, не ходи сюда больше.

От модератора: сообщение исправлено, оставлена основная мысль, заодно забанен на неделю за срач

| Сообщение посчитали полезным: Evol, KViNTO
 eXeL@B —› Программирование —› LDT.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати