Таблицы API для разных версий Windows

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 17 май 2009.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Может кому нужно: таблицы SDT и SHADOW для всех версий винды от ХР до 7 RC. Таблица выглядит следующим образом:

    Код (Text):
    1. XP SDT  NtAcceptConnectPort  0x0
    2. XP SDT  NtAccessCheck  0x1
    3. XP SDT  NtAccessCheckAndAuditAlarm  0x2
    4. XP SDT  NtAccessCheckByType  0x3
    5. XP SDT  NtAccessCheckByTypeAndAuditAlarm  0x4
    6. XP SDT  NtAccessCheckByTypeResultList  0x5
    7. XP SDT  NtAccessCheckByTypeResultListAndAuditAlarm  0x6
    8. XP SDT  NtAccessCheckByTypeResultListAndAuditAlarmByHandle  0x7
    9. XP SDT  NtAddAtom  0x8
    10. XP SDT  NtEnumerateBootEntries  0x9
    11. XP SDT  NtAdjustGroupsToken  0xA
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А могешь аналогичное собрать с 64 биток ? :)
    Лови еще и с 2003 и с 2000.
    Кстати, в инете ходит несколько перекомпиленных беток seven, и в них номера отличаются..
     
  3. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Вот ещё удобная штука http://www.metasploit.com/users/opcode/syscalls.html
     
  4. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Единственно, там куча неправильных индексов...
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Не могу найти где в х64 винде находится таблица системных функций.
     
  6. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Вручную с ntdll выдёргивай :))
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А с Vista sp2 уже собрал номера ?
     
  8. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Собрал. Нужно?
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
  10. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Вот новые таблицы включающие все сервис паки висты и win7 rc.
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо большое.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    katrus
    Полезная таблица. Вопрос как версию определять. Сегодня я юзал тоже сервисы, таким образом:
    Код (Text):
    1. SERVICE_TABLE struct
    2. _NtQueryInformationProcess  BYTE ?
    3. _NtQuerySystemInformation   BYTE ?
    4. _NtQueryVirtualMemory       BYTE ?
    5. _NtReadVirtualMemory        BYTE ?
    6. SERVICE_TABLE ends
    7. PSERVICE_TABLE typedef ptr SERVICE_TABLE
    8.  
    9. comment '
    10. +----------------------------+-------+-------+-------+-------+-------+
    11. |OS                          | 2000  |   XP  | 2003  | VISTA | WIN7  |
    12. +----------------------------+-------+-------+-------+---------------+
    13. |Version                     |  5.0  |  5.1  |  5.2  |  6.0  |  6.1  |
    14. +----------------------------+-------+-------+-------+-------+-------+
    15. |ID NtQueryInformationProcess| 0x086 | 0x09A | 0x0A1 | 0x0E4 | 0x0EB |
    16. +----------------------------+-------+-------+-------+-------+-------+
    17. |ID NtQuerySystemInformation | 0x097 | 0x0AD | 0x0B5 | 0x0F8 | 0x106 |
    18. +----------------------------+-------+-------+-------+-------+-------+
    19. |ID NtQueryVirtualMemory     | 0x09C | 0x0B2 | 0x0BA | 0x0FD | 0x10C |
    20. +----------------------------+-------+-------+-------+-------+-------+
    21. |ID NtReadVirtualMemory      | 0x0A4 | 0x0BA | 0x0C2 | 0x105 | 0x116 |
    22. +----------------------------+-------+-------+-------+---------------+'
    23.      
    24. SERVICE_ID_BASE     equ 086h
    25.  
    26. SERVICE_VERSION_TABLE struct
    27. W2000   SERVICE_TABLE <(086h - SERVICE_ID_BASE), (097h - SERVICE_ID_BASE), (09Ch - SERVICE_ID_BASE), (0A4h - SERVICE_ID_BASE)>
    28. Xp  SERVICE_TABLE <(09Ah - SERVICE_ID_BASE), (0ADh - SERVICE_ID_BASE), (0B2h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE)>
    29. W2003   SERVICE_TABLE <(0A1h - SERVICE_ID_BASE), (0B5h - SERVICE_ID_BASE), (0BAh - SERVICE_ID_BASE), (0C2h - SERVICE_ID_BASE)>
    30. Vista   SERVICE_TABLE <(0E4h - SERVICE_ID_BASE), (0F8h - SERVICE_ID_BASE), (0FDh - SERVICE_ID_BASE), (105h - SERVICE_ID_BASE)>
    31. Win7    SERVICE_TABLE <(0EBh - SERVICE_ID_BASE), (106h - SERVICE_ID_BASE), (10Ch - SERVICE_ID_BASE), (116h - SERVICE_ID_BASE)>
    32. SERVICE_VERSION_TABLE ends
    33.        
    34. ;Индексы для SERVICE_TABLE.
    35. OS_VERSION_ID_2000  equ 0
    36. OS_VERSION_ID_XP    equ 1
    37. OS_VERSION_ID_2003  equ 2
    38. OS_VERSION_ID_VISTA equ 3
    39. OS_VERSION_ID_7 equ 4
    40.  
    41. $NtQueryInformationProcess macro
    42.     mov ecx,SERVICE_TABLE._NtQueryInformationProcess
    43.     Call SystemStubEntry
    44.     lea esp,[esp + 5*4]
    45. endm
    46.  
    47. $NtQuerySystemInformation macro
    48.     mov ecx,SERVICE_TABLE._NtQuerySystemInformation
    49.     Call SystemStubEntry
    50.     lea esp,[esp + 4*4]
    51. endm
    52.  
    53. $NtQueryVirtualMemory macro
    54.     mov ecx,SERVICE_TABLE._NtQueryVirtualMemory
    55.     Call SystemStubEntry
    56.     lea esp,[esp + 6*4]
    57. endm
    58.  
    59. $NtReadVirtualMemory macro
    60.     mov ecx,SERVICE_TABLE._NtReadVirtualMemory
    61.     Call SystemStubEntry
    62.     lea esp,[esp + 5*4]
    63. endm
    64.  
    65. NTCALL macro StubName:REQ, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10
    66.     FOR Arg, <p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
    67.     IFNB <Arg>
    68.     push Arg
    69.     ENDIF
    70.     ENDM
    71.     StubName
    72. endm
    73.  
    74. ;Возвращает индекс для SERVICE_TABLE. В случае успеха EFlags.ZF = 1.
    75. GET_VERSION_ID macro
    76.     push ecx
    77.     push edx
    78.     mov ecx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMajorVersion]
    79.     mov edx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMinorVersion]
    80.     cmp ecx,5
    81.     je v_5_x_
    82.     cmp ecx,6
    83.     jne err_ver_
    84. ;6.X
    85.     test edx,edx
    86.     mov eax,OS_VERSION_ID_VISTA
    87.     jz end_ver_ ;6.0
    88.     dec edx
    89.     inc eax     ;OS_VERSION_ID_7
    90.     jz end_ver_ ;6.1
    91.     jmp err_ver_
    92. v_5_x_:
    93.     xor eax,eax ;OS_VERSION_ID_2000
    94.     test edx,edx
    95.     jz end_ver_ ;5.0
    96.     inc eax     ;OS_VERSION_ID_XP
    97.     dec edx
    98.     jz end_ver_ ;5.1
    99.     inc eax     ;OS_VERSION_ID_2003
    100.     dec edx
    101.     jz end_ver_
    102. err_ver_:
    103.     mov eax,STATUS_NOT_IMPLEMENTED
    104. end_ver_:
    105.     pop edx
    106.     pop ecx
    107. endm
    108.  
    109. SystemStubEntry proc C
    110.     GET_VERSION_ID
    111.     Call Dt_
    112. Dt_:
    113.     pop edx
    114.     lea edx,[edx + eax*sizeof(SERVICE_TABLE)]
    115.     movzx eax,byte ptr [edx + ecx + (offset ServiceTable - offset Dt_)]
    116.     add eax,SERVICE_ID_BASE
    117.     lea edx,[esp + 4]
    118.     Int 2Eh
    119.     ret
    120. ServiceTable SERVICE_VERSION_TABLE <>
    121. SystemStubEntry endp
    Вызов собственно:
    Код (Text):
    1.     lea edx,SystemInformation
    2.     NTCALL $NtQuerySystemInformation, SystemBasicInformation, edx, sizeof(SYSTEM_BASIC_INFORMATION), NULL
    Версию всегда брал из разделяемой ядром памяти(NtMajorVersion/NtMinorVersion). Выходит что этого явно не достаточно, если в сервиспаках Висты можно считать ID сервисов одинаковыми, то для W7 нужно есчо видимо проверять сборку. И постоянен ли адрес версии в UsSharedData - 0x7FFE026C/+4 ?
    Для висты такойже как и в XP: http://www.nirsoft.net/kernel_struct/vista/KUSER_SHARED_DATA.html
    Для W7 ссылок в юзермоде нет, в XP были ссылки в Kernel32!BasepIsImageVersionOk(), в W7 этого уже нет, ну или я не вижу. Посмотрел в ядре, секция INIT, для W7:
    Код (Text):
    1. 00797BEE    mov dword ptr ds:[FFDF026C],6
    2. 00797BF8    mov ecx,eax
    3. 00797BFA    mov dword ptr ds:[FFDF0270],1
    Смещения теже, значит верно, но это для версии 6.1.6956.0, для другой не известно, но вероятно что не изменяли.
    Описано тут подробно http://en.wikipedia.org/wiki/Windows_NT и далее для каждой из версий.
    Второй способ - версия есть в PEB, для XPSP3 смещение 0xA4/+4:
    Код (Text):
    1. NtMajorVersion  ULONG ?     ;00A4h  +
    2. NtMinorVersion  ULONG ?     ;00A8h  +
    3. NtBuildNumber   USHORT ?    ;00ACh  +
    Ссылки вначале ntdll!RtlGetVersion(), W7 - теже смещения, опятьже у меня ntdll версии 6.1.6956.0.
    В VistaSp0 такиеже смещения. Видимо это не меняется и не изменится для UsSharedData и PEB, ибо эти поля определяют версию, само собой что смещения должны быть фиксированы. Аналогично и смещение TEB.Peb фиксировано, поэтому двумя путями версию можно определить, предпочтительнее первый способ.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вопрос в том, как сервиспак проверять.
     
  14. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Я использую PsGetVersion.
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Без внешнего функционала из пикода, в юзермоде.
     
  16. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Кстати, выходит у vista sp1 и sp2 номера идентичны.
    Я юзаю вот такой код.
    Код (Text):
    1.      mov ecx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMajorVersion]
    2.      mov edx,dword ptr ds:[KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.NtMinorVersion]
    3.      cmp ecx,5
    4.      je v_5_x_
    5.      cmp ecx,6
    6.      jne err_ver_
    7.      test edx,edx
    8.      mov eax,3     ;OS_VERSION_ID_VISTA
    9.      jz end_ver_   ;6.0
    10.      inc eax       ;OS_VERSION_ID_7
    11.      dec edx
    12.      jz end_ver_   ;6.1
    13.      jmp err_ver_
    14. v_5_x_:
    15.      xor eax,eax   ;OS_VERSION_ID_2000
    16.      test edx,edx
    17.      jz nowin_     ;5.0
    18.      inc eax       ;OS_VERSION_ID_XP
    19.      dec edx
    20.      jz end_ver_   ;5.1
    21.      inc eax       ;OS_VERSION_ID_2003
    22.      dec edx
    23.      jz end_ver_
    24. err_ver_:
    25.      mov eax,STATUS_NOT_IMPLEMENTED
    26. end_ver_:
    27.      jnz nowin_
    28.      assume fs:nothing
    29.      mov ecx,fs:[TEB.Peb]
    30.      movzx ecx,PEB.NtBuildNumber[ecx]
    31.        .if eax == 3 ;Vista
    32.           .if ecx == 6000 ; sp 0
    33.              inc eax
    34.              inc eax
    35.           .endif
    36.        .elseif eax == 4 ;Win 7
    37.           cmp ecx,7100
    38.           jl nowin_ ; меньще 7100 - уже бета версии
    39.        .endif
    40.      mov edx,sizeof WIN32
    41.      mul edx
    42.      mov ecx,fs:[TEB.GdiBatchCount]
    43.      .if ecx == 0
    44.         lea ecx,VersionTable2
    45.       .else
    46.         lea ecx,VersionTable4
    47.      .endif
    48.      add ecx,eax
    49.      mov ServiceTablee,ecx
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Не совсем логично, либо не полностью. GdiBatchCount читает ядро и gdi32, это поле апгрейтится и инициирует вызов NtGdiFlush, не понимаю причём тут это.
     
  18. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, это проверка разрядность оси. Если там нуль, значит 32 битная ось, если не ноль, 64 битка.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Разрядность определяет BuildNumber ?
    Или могут быть одинаковые BuilNumber для x32 и x64 ?
     
  20. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    PEB.NtBuildNumber - номер бильда. Например если в win7 находимся, будет показывать то что жирным шрифтом 6.1.7100.0

    [TEB.GdiBatchCount] - в 32 битных осях = 0, в 64 битном винде - указывает на оригинальный адрес TEB вроди. Не важно куда указывает, главное что в 64 битной оси там не нуль :)