За эти инструкции в курсе, находил примеры. Но вот как раз интересен вопрос, как это можно попробовать реализовать на Autoit, если не использовать ничего стороннего)Prog сказал(а):Узнать можно выполнив инструкцию CPUID.
Нужна ассемблерная вставка в код autoit.если не использовать ничего стороннего)
#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)
В вики написано что следует в регистр eax поместить число 1, вызвать CPUID и прочитать результат из 25 бита регистра ecx.Так а AES данные получить?
#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)
Это не сложно и заняло у меня несколько минут. Для получения машинного кода необходим компилятор создающий как можно меньше "мусорного" кода (не относящегося к нужному нам) и размер исполняемого файла. Это существенно упростит и ускорит поиск нужного фрагмента машинного кода.inververs сказал(а):как вы это 0x505352518B7C24148B4424180FA28907895F04894F0889570C595A5B5831C0C20800 делаете?
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)
Можно но если посмотреть что в файле FASM.au3 то становится понятно что не эффективно для коротких асм вставок...Кстати, в Autoit тоже можно asm вставлять.
Если вирутализация не работает, то и AES аппартано не будет поддерживаться.А вот например на виртуализации Hyper-V не работает.
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
Код аналогичный. Разница в том что в первом случае функция в коде, а во втором в dll.Не поможете это перенести все в AutoIt, чтобы не было доп. фаилов?
Попробуйте заменить строкуПри компилирование 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")