NtProtectVirtualMemory Win7 x64

Тема в разделе "WASM.NT.KERNEL", создана пользователем retmas, 10 фев 2010.

  1. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Господа!!!

    Как можно вызвать NtProtectVirtualMemory на данном ядре. Идеи? Аналог?

    спасибо!

    P.S. KeServiceDescriptorTable не экспортируется ядром.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Алгоритм для всех 64-битных ядер:

    1. Вычислить индекс/смещение функции в таблице.
    2. Эвристически (почти без дизасма) найти базовый адрес таблицы системных сервисов.
    3. Вычислить адрес требуемой функции, используя информацию, полученную на предыдуших шагах.
     
  3. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Эх.. не подходит.. во втором пункте и проблема! никакого дизасма!
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Код (Text):
    1. lkd> x nt!*ProtectVirtual*
    2. fffff800`02be6984 nt!NtProtectVirtualMemory (void *, void **, unsigned long *, unsigned long, unsigned long *)
    3. fffff800`028c5e60 nt!ZwProtectVirtualMemory = <no type information>
    4. fffff800`02be6470 nt!MiProtectVirtualMemory (struct _EPROCESS *, void **, unsigned long *, unsigned long, unsigned long *)
    5.  
    6. lkd> u fffff800`028c5e60 L20
    7. nt!ZwProtectVirtualMemory:
    8. fffff800`028c5e60 488bc4          mov     rax,rsp
    9. fffff800`028c5e63 fa              cli
    10. fffff800`028c5e64 4883ec10        sub     rsp,10h
    11. fffff800`028c5e68 50              push    rax
    12. fffff800`028c5e69 9c              pushfq
    13. fffff800`028c5e6a 6a10            push    10h
    14. fffff800`028c5e6c 488d057d280000  lea     rax,[nt!KiServiceLinkage (fffff800`028c86f0)]
    15. fffff800`028c5e73 50              push    rax
    16. fffff800`028c5e74 b84d000000      mov     eax,4Dh      ; <<<<<<<<<<
    17. fffff800`028c5e79 e9c25f0000      jmp     nt!KiServiceInternal (fffff800`028cbe40)
    18. fffff800`028c5e7e 6690            xchg    ax,ax
    19. nt!ZwQuerySection:
    20. fffff800`028c5e80 488bc4          mov     rax,rsp
    21. fffff800`028c5e83 fa              cli
    22. fffff800`028c5e84 4883ec10        sub     rsp,10h
    23. fffff800`028c5e88 50              push    rax
    24. fffff800`028c5e89 9c              pushfq
    25. fffff800`028c5e8a 6a10            push    10h
    26. fffff800`028c5e8c 488d055d280000  lea     rax,[nt!KiServiceLinkage (fffff800`028c86f0)]
    27. fffff800`028c5e93 50              push    rax
    28. fffff800`028c5e94 b84e000000      mov     eax,4Eh      ; <<<<<<<<<<
    29. fffff800`028c5e99 e9a25f0000      jmp     nt!KiServiceInternal (fffff800`028cbe40)
    30. fffff800`028c5e9e 6690            xchg    ax,ax
    31. nt!ZwResumeThread:
    32. fffff800`028c5ea0 488bc4          mov     rax,rsp
    33. fffff800`028c5ea3 fa              cli
    34. fffff800`028c5ea4 4883ec10        sub     rsp,10h
    35. fffff800`028c5ea8 50              push    rax
    36. fffff800`028c5ea9 9c              pushfq
    37. fffff800`028c5eaa 6a10            push    10h
    38. fffff800`028c5eac 488d053d280000  lea     rax,[nt!KiServiceLinkage (fffff800`028c86f0)]
    39. fffff800`028c5eb3 50              push    rax
    40. fffff800`028c5eb4 b84f000000      mov     eax,4Fh      ; <<<<<<<<<<
    41. fffff800`028c5eb9 e9825f0000      jmp     nt!KiServiceInternal (fffff800`028cbe40)
    42.  
    43. lkd> ?fffff800`028c5e60 - 20*4D
    44. Evaluate expression: -8796050271040 = fffff800`028c54c0
    45.  
    46. lkd> u fffff800`028c54c0 L10
    47. nt!ZwMapUserPhysicalPagesScatter:
    48. fffff800`028c54c0 488bc4          mov     rax,rsp
    49. fffff800`028c54c3 fa              cli
    50. fffff800`028c54c4 4883ec10        sub     rsp,10h
    51. fffff800`028c54c8 50              push    rax
    52. fffff800`028c54c9 9c              pushfq
    53. fffff800`028c54ca 6a10            push    10h
    54. fffff800`028c54cc 488d051d320000  lea     rax,[nt!KiServiceLinkage (fffff800`028c86f0)]
    55. fffff800`028c54d3 50              push    rax
    56. fffff800`028c54d4 b800000000      mov     eax,0        ; <<<<<<<<<<
    57. fffff800`028c54d9 e962690000      jmp     nt!KiServiceInternal (fffff800`028cbe40)
    58. fffff800`028c54de 6690            xchg    ax,ax
    59. nt!ZwWaitForSingleObject:
    60. fffff800`028c54e0 488bc4          mov     rax,rsp
    61. fffff800`028c54e3 fa              cli
    62. fffff800`028c54e4 4883ec10        sub     rsp,10h
    63. fffff800`028c54e8 50              push    rax
    64. fffff800`028c54e9 9c              pushfq
    65.  
    66. lkd> .for (r$t0=fffff800`028c54c0, $t1=0; @$t1 < 191; r$t1=@$t1+1) {.if dwo(@$t0 + @$t1 * 20 + 15) != @$t1 {.echo wtf?}}
    67. lkd> * no "wtf"
    Как видно, ZW-стабы идут по порядку и их размер одинаков. Т.е. достаточно получить каким-либо способом номер требуемого сервиса и номер какого-либо экспортируемого, после чего воспользовать арифметику.
     
  5. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    ммм.. отлично, Sol_Ksacap, спасибо!
     
  6. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    хотя конечно никакой стабильностью данные методы и не пахнут)
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Сие зависит от рук, ну и от ДНК наверно ещё. Что я использую (вкратце см. выше), то вполне стабильно.
     
  8. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    приведите пример Вашего "эвристического" метода поиска базового адреса таблицы сс, который на 100% работает
    на winxp x64, w2k3 sp2 r1/r2 x64, vista sp1/sp2 x64, server 2k8 sp1/sp2 r1/r2 x64, win7 x64.
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    retmas
    >хотя конечно никакой стабильностью данные методы и не пахнут)
    Если уж ты посмотрел, как эти стабы реализованы на других 64-битных системах и увидел отличия, которые позволяют утверждать о нестабильности метода, то было бы здорово в таком случае привести отличительные особенности и аргументировать высказывание. Если же ты не смотрел отличия и утверждение о нестабильности голословно – что ж, ничего хорошего здесь.
     
  10. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    Sol_Ksacap, win2k8 r2, есть проблема с постоянством длинны элемента данного обобщенного массива сервисов.. А ГЛАВНОЕ никакой уверенности, что в следующем билде что-то не изменится. Данный метод хорош, если больше нет никаких вариантов.. Но я последнее время стараюсь реализовывать задачи как можно более рекомендуемыми механизмами, только при таком подходе можно быть уверенным, что драйвер будет работать стабильно.. Но метод неплох, так же как и метод с непосредственным поиском смещения KeServiceDescriptorTable. Спасибо, господа, за помощь.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    4. Распарсить сервис и вытянуть MiProtectVirtualMemory().
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Зачем?