Как определить windows x86 или x64

Тема в разделе "WASM.X64", создана пользователем СFF, 21 апр 2010.

  1. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Привет всем, нужно определить какой windows только путем сканирования памяти, например PEB или KUSER_SHARED_DATA. Пока что я определяю так если 0x7FFE0300==0 то это x64. Есть у кого то еще идеи. Нужно определить без вызова сервисов или каких то апи функций. В общем так чтобы ни в каких хук мониторах не засветилось.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.284
    http://msdn.microsoft.com/en-us/library/ms724958(VS.85).aspx
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.284
    ааа... извини, не обратил внимания... можно попробовать выполнить какую-нить асм-команду характерную для x64 и половить исключения...
     
  4. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Ну это накрайнак. Просто может быть винда и на x64 проце. Поэтому так важно узнать какая имено винда стоит
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    На сколько помню в x64 юзается регистр Gs вместо Fs для адресации TEB. В таком случае можно использовать иснтрукции Verr/Verw. Либо сравните два значения в TEB, которые находятся по разным смещениям в зависимости от разрядности.
     
  6. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Rel
    >можно попробовать выполнить какую-нить асм-команду характерную для x64 и половить исключения...
    Мы в режиме совместимости.

    Clerk
    >сравните два значения в TEB, которые находятся по разным смещениям в зависимости от разрядности
    То же. Но можно слегка изменить фразу, чтобы стало валидно.

    19841204
    >Ну это накрайнак. Просто может быть винда и на x64 проце.
    То же. Рекомендуем перечитать мануалы.

    Лучший способ в данном случае по нашему мнению – определение кодового сегмента:
    Код (Text):
    1. #define KGDT_R0_CODE        (0x08)
    2. #define KGDT_R3_CODE        (0x18)
    3.  
    4. #define KGDT64_R0_CODE      (0x10)  // kernel mode 64-bit code
    5. #define KGDT64_R3_CMCODE    (0x20)  // user mode 32-bit code
    6. #define KGDT64_R3_CODE      (0x30)  // user mode 64-bit code
    Не забывать про RPL_MASK (0x03).
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Надёжнее через Gs. Так как шедулер x86 обнуляет этот регистр, приложение его юзать не может. Тогда можно так:
    Код (Text):
    1.     mov ax,gs
    2.     test ax,ax
    3.     jz x86
    4.     ; x64
    5.    
    6.     mov ax,gs
    7.     verr ax
    8.     jnz x86
    9.     ; x64
    Либо просто сравнить как вы сказали с KGDT64_R3_CMTEB(0x50 ?)|RPL_MASK.
     
  8. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Можно выполнить инструкцию str cx [считываем селектор tss]. В x64 вернет 40h, в 32 - 28h.
     
  9. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Можете также проверить fs:[0C0].

    По этому адресу в x64 находится адрес wow64cpu!X86SwitchTo64BitMode

    X86SwitchTo64BitMode EA 2C3CB878 3300 jmp far 33h:78B83C2Ch (wow64cpu!CpupReturnFromSimulatedCode)

    На 32-х битах это поле = 0
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >Надёжнее через Gs
    А мы раньше так и проверяли (если там нуль – x32, если KGDT64_R3_DATA|RPL_MASK – x64). Но потом вдруг подумалось, что если выбирать между GS и CS, то через CS будет надёжнее, поскольку значение GS поток таки может изменить (пусть система и сбросит это значение почти сразу).

    Можно ещё попробовать lsl:
    mov ax, fs
    lsl eax, ax

    w7 x64 sp0: eax == 3c00 на нулевом процессоре, eax == 7c00 на первом (при переключении потоков база для KGDT64_R3_CMTEB в текущей реализации устанавливается безусловно для всех потоков как DWORD(_kthread.Teb + 0x2000), а лимит вроде нигде не меняется). Для x32 в лимите вроде должно быть 0xfff?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Да, PAGE_SIZE - 1.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >>В таком случае можно использовать иснтрукции Verr/Verw.
    зометно будет! Так сказать доп. флажок к детекту, причем даже для придетекту ;)
     
  13. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Кстати, найден линк на эту же тему год назад. Оригинально проверки сегментных регистров предлагал censored.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Зачатки ума и не нужны никакие линки.