Привет всем, нужно определить какой windows только путем сканирования памяти, например PEB или KUSER_SHARED_DATA. Пока что я определяю так если 0x7FFE0300==0 то это x64. Есть у кого то еще идеи. Нужно определить без вызова сервисов или каких то апи функций. В общем так чтобы ни в каких хук мониторах не засветилось.
ааа... извини, не обратил внимания... можно попробовать выполнить какую-нить асм-команду характерную для x64 и половить исключения...
Ну это накрайнак. Просто может быть винда и на x64 проце. Поэтому так важно узнать какая имено винда стоит
На сколько помню в x64 юзается регистр Gs вместо Fs для адресации TEB. В таком случае можно использовать иснтрукции Verr/Verw. Либо сравните два значения в TEB, которые находятся по разным смещениям в зависимости от разрядности.
Rel >можно попробовать выполнить какую-нить асм-команду характерную для x64 и половить исключения... Мы в режиме совместимости. Clerk >сравните два значения в TEB, которые находятся по разным смещениям в зависимости от разрядности То же. Но можно слегка изменить фразу, чтобы стало валидно. 19841204 >Ну это накрайнак. Просто может быть винда и на x64 проце. То же. Рекомендуем перечитать мануалы. Лучший способ в данном случае по нашему мнению – определение кодового сегмента: Код (Text): #define KGDT_R0_CODE (0x08) #define KGDT_R3_CODE (0x18) #define KGDT64_R0_CODE (0x10) // kernel mode 64-bit code #define KGDT64_R3_CMCODE (0x20) // user mode 32-bit code #define KGDT64_R3_CODE (0x30) // user mode 64-bit code Не забывать про RPL_MASK (0x03).
Sol_Ksacap Надёжнее через Gs. Так как шедулер x86 обнуляет этот регистр, приложение его юзать не может. Тогда можно так: Код (Text): mov ax,gs test ax,ax jz x86 ; x64 mov ax,gs verr ax jnz x86 ; x64 Либо просто сравнить как вы сказали с KGDT64_R3_CMTEB(0x50 ?)|RPL_MASK.
Можете также проверить fs:[0C0]. По этому адресу в x64 находится адрес wow64cpu!X86SwitchTo64BitMode X86SwitchTo64BitMode EA 2C3CB878 3300 jmp far 33h:78B83C2Ch (wow64cpu!CpupReturnFromSimulatedCode) На 32-х битах это поле = 0
>Надёжнее через 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?
>>В таком случае можно использовать иснтрукции Verr/Verw. зометно будет! Так сказать доп. флажок к детекту, причем даже для придетекту
Кстати, найден линк на эту же тему год назад. Оригинально проверки сегментных регистров предлагал censored.