Что нового

Как правильно вызвать CryptUnprotectData?

Rivald

Новичок
Сообщения
61
Репутация
1
Вот набросал такой пример:
Код:
$str = DllStructCreate("dword cbData;byte pbData")
DllStructSetData($str, 'cbData', 0x01000000)
DllStructSetData($str, 'pbData', 0x10)
$ptr = DllStructGetPtr($str)
$str1 = DllStructCreate("dword cbData;byte pbData")
$ptr1 = DllStructGetPtr($str1)
$call = DllCall("crypt32.dll", 'bool', 'CryptUnprotectData', 'ptr', $ptr, 'int', 0, 'int', 0, 'int', 0, 'int', 0, 'int', 0, 'ptr', $ptr1)
$error = DllCall("Kernel32.dll", "DWORD", "GetLastError")
MsgBox(0, '', $call[0] & @CRLF & $error[0])
MsgBox(0, '', DllStructGetData($str1, 'cbData') & @CRLF & DllStructGetData($str1, 'pbData'))

Ошибок никаких не возвращает, результата тоже, есть идеи что не так?
PS
call = 0
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
может вы что ни будь не правильно функции передаете?
можно еще проверить код ошибки
Код:
#Include <WinAPI.au3>
_WinAPI_GetLastError ( )



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

dllcall кстати в основном передает массив где 0 ячейка имеет возвращенные коды
 
Автор
R

Rivald

Новичок
Сообщения
61
Репутация
1
Не покажите пример? У меня никак не получается.
Код:
$decrypt = UncryptRDPPassword(FileRead('data.bin'))
$struct = DllStructCreate('byte[146]')
DllStructSetData($struct, 1, FileRead('data.bin'))
$ptr = DllStructGetPtr($struct)
MsgBox(0, '', UncryptRDPPassword($struct) & @CRLF & $decrypt & @CRLF & UncryptRDPPassword($ptr) & @CRLF & DllStructGetData($struct,1))
Func UncryptRDPPassword($bin)
    Local Const $CRYPTPROTECT_UI_FORBIDDEN = 0x1
    Local Const $DATA_BLOB = "int;ptr"

    Local $passStr = DllStructCreate("byte[1024]")
    Local $DataIn = DllStructCreate($DATA_BLOB)
    Local $DataOut = DllStructCreate($DATA_BLOB)
    $pwDescription = 'psw'
    $PwdHash = ""

    DllStructSetData($DataOut, 1, 0)
    DllStructSetData($DataOut, 2, 0)

    DllStructSetData($passStr, 1, $bin)
    DllStructSetData($DataIn, 2, DllStructGetPtr($passStr, 1))
    DllStructSetData($DataIn, 1, BinaryLen($bin))

    $return = DllCall("crypt32.dll","int", "CryptUnprotectData", _
                                    "ptr", DllStructGetPtr($DataIn), _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "dword", $CRYPTPROTECT_UI_FORBIDDEN, _
                                    "ptr", DllStructGetPtr($DataOut))
									;$error = DllCall("Kernel32.dll", "DWORD", "GetLastError")
;MsgBox(0, '', $return[0] & @CRLF & $error[0])
    If @error Then Return ""

    $len = DllStructGetData($DataOut, 1)
	;MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$len' & @lf & @lf & 'Return:' & @lf & $len) ;### Debug MSGBOX
    $PwdHash = Ptr(DllStructGetData($DataOut, 2))
    $PwdHash = DllStructCreate("byte[" & $len & "]", $PwdHash)
    Return BinaryToString(DllStructGetData($PwdHash, 1), 2)
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Rivald
Если ваш файл data.bin действительно являются бинарным(как например exe), то конечно такие функции как FileRead(..),даже если использовать FileOpen(..,16) не возвратят "адекватное" содержимое из файла. А функции которые вам передал beliy работают нормально.
 
Автор
R

Rivald

Новичок
Сообщения
61
Репутация
1
В msgbox-е вообще ничего нет. data.bin вытащил из sqlite базы. А в структуре как раз и есть байты.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Мда при чтении exe файла в структуре что-то есть, но в коде действует строка
Код:
If @error Then Return ""
 
Автор
R

Rivald

Новичок
Сообщения
61
Репутация
1
Я проверял, структура содержит байты. Вы можете показать мне конкретный пример, с расшифровкой?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Вы можете показать мне конкретный пример, с расшифровкой?

Код:
$sText = InputBox("inputbox", "Введите текст для шифрования:")
$sHashText = _CryptProtectData($sText)
MsgBox(64, "Crypt text", "Crypt: " & $sHashText)
MsgBox(64, "Uncrypt text", "Uncrypt: " & _CryptUnprotectData($sHashText))

Func _CryptProtectData($sString)
    Local Const $CRYPTPROTECT_UI_FORBIDDEN = 0x1
    Local Const $DATA_BLOB = "int;ptr"

    Local $sHashStr = DllStructCreate("byte[1024]")
    Local $DataIn = DllStructCreate($DATA_BLOB)
    Local $DataOut = DllStructCreate($DATA_BLOB)
    $pwDescription = 'psw'
    $PwdHash = ""

    DllStructSetData($DataOut, 1, 0)
    DllStructSetData($DataOut, 2, 0)

    DllStructSetData($sHashStr, 1, StringToBinary($sString,2)); UTF16 Little Endian
    DllStructSetData($DataIn, 2, DllStructGetPtr($sHashStr, 1))
    DllStructSetData($DataIn, 1, StringLen($sString)*2)

    $return = DllCall("crypt32.dll","int", "CryptProtectData", _
                                    "ptr", DllStructGetPtr($DataIn), _
                                    "wstr", $pwDescription, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "dword", $CRYPTPROTECT_UI_FORBIDDEN, _
                                    "ptr", DllStructGetPtr($DataOut))
    If @error Then Return ""

    $len = DllStructGetData($DataOut, 1)
    $PwdHash = Ptr(DllStructGetData($DataOut, 2))
    $PwdHash = DllStructCreate("byte[" & $len & "]", $PwdHash)
    Return DllStructGetData($PwdHash, 1)
EndFunc

Func _CryptUnprotectData($sString)
    Local Const $CRYPTPROTECT_UI_FORBIDDEN = 0x1
    Local Const $DATA_BLOB = "int;ptr"

    Local $sHashStr = DllStructCreate("byte[1024]")
    Local $DataIn = DllStructCreate($DATA_BLOB)
    Local $DataOut = DllStructCreate($DATA_BLOB)
    $pwDescription = 'psw'
    $PwdHash = ""

    DllStructSetData($DataOut, 1, 0)
    DllStructSetData($DataOut, 2, 0)

    DllStructSetData($sHashStr, 1, $sString)
    DllStructSetData($DataIn, 2, DllStructGetPtr($sHashStr, 1))
    DllStructSetData($DataIn, 1, BinaryLen($sString))

    $return = DllCall("crypt32.dll","int", "CryptUnprotectData", _
                                    "ptr", DllStructGetPtr($DataIn), _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "ptr", 0, _
                                    "dword", $CRYPTPROTECT_UI_FORBIDDEN, _
                                    "ptr", DllStructGetPtr($DataOut))
    If @error Then Return ""

    $len = DllStructGetData($DataOut, 1)
    $PwdHash = Ptr(DllStructGetData($DataOut, 2))
    $PwdHash = DllStructCreate("byte[" & $len & "]", $PwdHash)
    Return BinaryToString(DllStructGetData($PwdHash, 1), 2)
EndFunc
 
Автор
R

Rivald

Новичок
Сообщения
61
Репутация
1
Хм, интересно почему при разных переменных $pwDescription и $PwdHash, данные все равно дешифруются?
 

beliy

Продвинутый
Сообщения
372
Репутация
72
в crypt32.dll не ковырялся, мб наши Гуру подскажут...
 
Автор
R

Rivald

Новичок
Сообщения
61
Репутация
1
Что-то мне подсказывает, что все гуру в отпуске ;)
 
Верх