Что нового

Узнать аппаратную поддержку процессора

mekez

Новичок
Сообщения
11
Репутация
0
Всем привет, подскажите, можно ли как-той средствами Autoit узнать, какие алгоритмы поддерживает процессор? А если конкретно, то узнать, поддерживает ли процессор AES
 

Skif_off

Знающий
Сообщения
173
Репутация
12
mekez
Средствами самого, похоже, нет, как варианты: смотреть, что покажет WMI; что-нибудь консольное; может быть, что-то есть здесь HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0\. Есть ещё такая штука.
Поделитесь, пожалуйста, найденным решением.

Upd:
CPU-Z можно запустить без GUI, с параметром -txt=filename, а потом посмотреть получившийся текстовый файл.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Узнать можно выполнив инструкцию CPUID.
 
Автор
M

mekez

Новичок
Сообщения
11
Репутация
0
Prog сказал(а):
Узнать можно выполнив инструкцию CPUID.
За эти инструкции в курсе, находил примеры. Но вот как раз интересен вопрос, как это можно попробовать реализовать на Autoit, если не использовать ничего стороннего)
 

Prog

Продвинутый
Сообщения
537
Репутация
65
mekez [?]
если не использовать ничего стороннего)
Нужна ассемблерная вставка в код autoit.



Добавлено:
Сообщение автоматически объединено:

Как вставить асм в код так и не разобрался (возможно это нельзя сделать), но опкоды никто же не запрещает разместить в коде. :smile:
Код (x86) используя инструкцию CPUID считывает модель процессора. :smile:
Код:
#include <StringConstants.au3>

$Struct = DllStructCreate("int eax; int ebx; int ecx; int edx")
$StrCode = "0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800"
$Code=Binary($StrCode)
$tBinData = DllStructCreate("byte[100]")
DllStructSetData($tBinData, 1, $Code)

DllCallAddress("none", DllStructGetPtr($tBinData), "ptr", DllStructGetPtr($Struct), "int", 0x80000002)
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 1)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 2)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 3)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 4)))

DllCallAddress("none", DllStructGetPtr($tBinData), "ptr", DllStructGetPtr($Struct), "int", 0x80000003)
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 1)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 2)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 3)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 4)))

DllCallAddress("none", DllStructGetPtr($tBinData), "ptr", DllStructGetPtr($Struct), "int", 0x80000004)
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 1)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 2)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 3)))
ConsoleWrite(BinaryToString(DllStructGetData($Struct, 4)))

ConsoleWrite(@CRLF)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Prog
IMHO:
Код:
$StrCode = "0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800"
$tBinData = DllStructCreate("byte["& BinaryLen($StrCode) &"]")
DllStructSetData($tBinData, 1, $StrCode)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Prog
Так а AES данные получить? Нужно больше асемблера... и как вы это 0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800 делаете? Это какая то магия.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
inververs [?]
Так а AES данные получить?
В вики написано что следует в регистр eax поместить число 1, вызвать CPUID и прочитать результат из 25 бита регистра ecx.
Код:
#include <StringConstants.au3>

$Struct = DllStructCreate("int eax; int ebx; int ecx; int edx")
$StrCode = "0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800"
$tBinData = DllStructCreate("byte["& BinaryLen($StrCode) &"]")
DllStructSetData($tBinData, 1, $StrCode)

DllCallAddress("none", DllStructGetPtr($tBinData), "ptr", DllStructGetPtr($Struct), "int", 1)
ConsoleWrite(BitAND(DllStructGetData($Struct, 3), 0x2000000)) ; Выделение 25 бита в регистре ecx.

ConsoleWrite(@CRLF)
Если AES поддерживается результат будет не нулевой, иначе 0.

inververs сказал(а):
как вы это 0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800 делаете?
Это не сложно и заняло у меня несколько минут. Для получения машинного кода необходим компилятор создающий как можно меньше "мусорного" кода (не относящегося к нужному нам) и размер исполняемого файла. Это существенно упростит и ускорит поиск нужного фрагмента машинного кода.
Для этой цели я взял код на PB (он был готовый и его писать не пришлось).
Код:
Structure CPUINFO
  eax.i
  ebx.i
  ecx.i
  edx.i
EndStructure

ProcedureDLL CPUID(*CP.CPUINFO, eax)
  !PUSH eax
  !PUSH ebx
  !PUSH edx
  !PUSH ecx
  !mov dword edi,[p.p_CP+16]
  !mov dword eax,[p.v_eax+16]
  !CPUID
  !mov dword [edi],eax
  !mov dword [edi+4],ebx
  !mov dword [edi+8],ecx
  !mov dword [edi+12],edx
  !pop ecx
  !pop edx
  !pop ebx
  !pop eax
EndProcedure

CPUID(@CP.CPUINFO,$80000002)
Затем я скомпилировал программу и открыл ее в PE Explorer и дизассемблировал.
index.php

Кода не много и найти процедуру CPUID можно за несколько секунд бегло взглянув на код. Она начинается с метки SUB_L00401069: и заканчивается инструкцией retn 0008h
Также в листинге присутствуют опкоды инструкций. Процедура начинается с 50 53 52 51, а заканчивается 31C0 C20800. Необходимо скопировать эти опкоды и вставить в код autoit. Проще всего это сделать в hex редакторе найдя по опкодам начало и конец процедуры.
Таким несложным образом был получен этот машинный код.
 

Вложения

  • asm.png
    asm.png
    13.4 КБ · Просмотры: 246

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Prog
Доходчиво, спасибо.


Добавлено:
Сообщение автоматически объединено:

Кстати, в Autoit тоже можно asm вставлять. Вот здесь https://www.autoitscript.com/forum/topic/173919-inline-assembler-snippets сделали даже UDF
 

Prog

Продвинутый
Сообщения
537
Репутация
65
inververs [?]
Кстати, в Autoit тоже можно asm вставлять.
Можно но если посмотреть что в файле FASM.au3 то становится понятно что не эффективно для коротких асм вставок...
 

Prog

Продвинутый
Сообщения
537
Репутация
65
helecu [?]
А вот например на виртуализации Hyper-V не работает.
Если вирутализация не работает, то и AES аппартано не будет поддерживаться.

Попробуйте вариант с dll. http://rgho.st/7dwsJx9rY
Код:
If _AES() = 0 Then
    msgbox(0,"","нет аес")
Else
    msgbox(0,"","есть аес")
Endif

Func _AES()
$Struct = DllStructCreate("int eax; int ebx; int ecx; int edx")

if @AutoItX64 then
   $dll="CPUID_x64.dll"
Else
   $dll="CPUID_x86.dll"
endif

DllCall($dll, "none", "CPUID", "ptr", DllStructGetPtr($Struct), "int", 1)
$AES = (BitAND(DllStructGetData($Struct, 3), 0x2000000))
Return $AES
EndFunc
Код:
Structure CPUINFO
  eax.i
  ebx.i
  ecx.i
  edx.i
EndStructure

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  
  ProcedureDLL CPUID(*CP.CPUINFO, eax)
    !PUSH eax
    !PUSH ebx
    !PUSH edx
    !PUSH ecx
    !mov dword edi,[p.p_CP+16]
    !mov dword eax,[p.v_eax+16]
    !CPUID
    !mov dword [edi],eax
    !mov dword [edi+4],ebx
    !mov dword [edi+8],ecx
    !mov dword [edi+12],edx
    !pop ecx
    !pop edx
    !pop ebx
    !pop eax
  EndProcedure
  
CompilerElse
  
  ProcedureDLL CPUID(*CP.CPUINFO, rax)
    !PUSH rax
    !PUSH rbx
    !PUSH rdx
    !PUSH rcx
    !mov qword rdi,[p.p_CP+32]
    !mov qword rax,[p.v_rax+32]
    !CPUID
    !mov qword [rdi],rax
    !mov qword [rdi+8],rbx
    !mov qword [rdi+16],rcx
    !mov qword [rdi+24],rdx
    !pop rcx
    !pop rdx
    !pop rbx
    !pop rax
  EndProcedure
  
CompilerEndIf
 

Prog

Продвинутый
Сообщения
537
Репутация
65
helecu [?]
Не поможете это перенести все в AutoIt, чтобы не было доп. фаилов?
Код аналогичный. Разница в том что в первом случае функция в коде, а во втором в dll.

[?]
При компилирование AutoIt'а в 64 бит, все также не работает
Попробуйте заменить строку
Код:
$Struct = DllStructCreate("int eax; int ebx; int ecx; int edx")
на
Код:
$Struct = DllStructCreate("UINT_PTR eax; UINT_PTR ebx; UINT_PTR ecx; UINT_PTR edx")
 
Верх