Здравствуйте уважаемые.
Собственно проблема имеется код для расшифровки логинов и паролей firefox (функция PK11SDR_Decrypt), а мне нужна функция PK11SDR_Encrypt.
Документация на nss3.dll
mxr.mozilla.org/mozilla-central/source/security/nss/lib/pk11wrap/pk11sdr.c#303
Собственно проблема имеется код для расшифровки логинов и паролей firefox (функция PK11SDR_Decrypt), а мне нужна функция PK11SDR_Encrypt.
Документация на nss3.dll
mxr.mozilla.org/mozilla-central/source/security/nss/lib/pk11wrap/pk11sdr.c#303
Код:
#include <WinAPI.au3>
#include <WinAPIFiles.au3>
#include <Array.au3>
Opt("MustDeclareVars", 1)
Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
Global Const $CRYPT_STRING_BASE64 = 0x0000001
Global $h_NSS3 = 0, $h_msvcr = 0, $h_msvcp = 0, $h_mozglue = 0
Global Const $eURL = 1
Global Const $eUser = 3
Global Const $ePass = 5
Global Const $tagSECItem = "dword SECItemType;ptr Data;dword Len"
Global Const $aLibraries[] = ["msvcr120.dll", "msvcp120.DLL", "mozglue.dll", "nss3.dll"] ; msvcr100.dll msvcp100.DLL OLD
Global $hSlot = 0
Local $sFireFoxPath = StringTrimRight(GetFireFoxPath(), 1)
Local $sFireFoxProfilePath = @AppDataDir & "\Mozilla\Firefox\"& StringReplace(_FireFoxProFilePath(), "/", "\")
;Try manualy if it doesnt work
;Local $sFireFoxPath = "C:\Program Files (x86)\Mozilla Firefox" ;GetFireFoxPath() ;this function not working ;path without \ at the end
;Local $sFireFoxProfilePath = "C:\Users\%username_here%\AppData\Roaming\Mozilla\Firefox\Profiles\%yourprofile here%.default" ;_FireFoxProFilePath() ; this function not working ; change your username and profilepath
ConsoleWrite($sFireFoxPath & @CRLF); for debugging
ConsoleWrite($sFireFoxProfilePath & @CRLF); for debugging
;Start
If _LoadLibraries($sFireFoxPath) And _iniNSS3($sFireFoxPath, $sFireFoxProfilePath) Then
ConsoleWrite("Libaries Loaded" & @CRLF)
ConsoleWrite("FireFox Recovery" & @CRLF)
;Recovery FireFox
FireFoxRecovery($sFireFoxProfilePath)
Exit
Else
ConsoleWrite("Can't load the Libaries" & @CRLF)
Exit
EndIf
Func FireFoxRecovery($sFireFoxProfilePath)
Local $sJsonFile = $sFireFoxProfilePath & "\logins.json" ; \
Local $aList = GetJsonArray(FileRead($sJsonFile))
If Not (IsArray($aList)) Or Not (UBound($aList) >= 6) Then
Return False
EndIf
ConsoleWrite("!>>>>>>FireFox Password Recovery<<<<<<" & @CRLF & @CRLF)
For $i = 0 To UBound($aList) - 1 Step 6
ConsoleWrite("URL: " & $aList[$i + $eURL] & @CRLF)
ConsoleWrite("UserName: " & FireFoxDecrypt($aList[$i + $eUser]) & @CRLF)
ConsoleWrite("PassWord: " & FireFoxDecrypt($aList[$i + $ePass]) & @CRLF)
ConsoleWrite(@CRLF)
Next
ConsoleWrite("!>>>>>>FireFox Password Recovery<<<<<<" & @CRLF & @CRLF)
Free()
EndFunc ;==>FireFoxRecovery
Func FireFoxDecrypt($sCryptedData)
Local $iRet = 0
Local $tByteData = DllStructCreate("byte Data[1024]")
Local $dwSize = 0
Local $sDecrypData = ""
Local $DataIn = 0
Local $DataOut = 0
Local $tData = 0
$iRet = DllCall("Crypt32.dll", "bool", "CryptStringToBinary", "str", $sCryptedData, "dword", StringLen($sCryptedData), "dword", $CRYPT_STRING_BASE64, "ptr", DllStructGetPtr($tByteData), "dword*", 8096, "ptr", 0, "ptr", 0)
If $iRet[0] = True Then
$dwSize = $iRet[5]
$hSlot = DllCall($h_NSS3, "ptr:CDECL", "PK11_GetInternalKeySlot")
$hSlot = $hSlot[0]
If Not $hSlot Then
Return $sDecrypData
EndIf
$iRet = DllCall($h_NSS3, "dword:CDECL", "PK11_Authenticate", "ptr", $hSlot, "BOOL", True, "ptr", Null)
Local $iStatus = $iRet[0]
If $iStatus Then Return $sDecrypData
Local $DataIn = DllStructCreate($tagSECItem)
Local $DataOut = DllStructCreate($tagSECItem)
$DataIn.Data = DllStructGetPtr($tByteData)
$DataIn.len = $dwSize
$iRet = DllCall($h_NSS3, "DWORD:CDECL", "PK11SDR_Decrypt", "ptr", DllStructGetPtr($DataIn), "ptr", DllStructGetPtr($DataOut), "ptr", Null)
$iStatus = $iRet[0]
If $iStatus Then Return $sDecrypData
$tData = DllStructCreate("char String[" & $DataOut.len & "]", $DataOut.Data)
;~ if not isobj($tData) then
$sDecrypData = $tData.String
;~ Else
;~ $sDecrypData = " "
;~ EndIf
Return $sDecrypData
Else
Return $sDecrypData
EndIf
EndFunc ;==>FireFoxDecrypt
Func GetJsonArray($sData)
Local $aList = StringRegExp($sData, '\"(hostname|encryptedPassword|encryptedUsername)":"(.*?)"', 3)
Return $aList
EndFunc ;==>GetJsonArray
Func _FireFoxProFilePath() ;not working correct ; function not in use atm
;~ Local $sPath = @AppDataDir & "\Mozilla\Firefox\"
;~ ConsoleWrite(($sPath & IniRead($sPath & "profiles.ini", "Profile0", "Path", "") & "\")& @CRLF)
;~ Return ($sPath & IniRead($sPath & "profiles.ini", "Profile0", "Path", "") & "\")
;~ ConsoleWrite(IniRead(@AppDataDir & "\Mozilla\Firefox\profiles.ini", "Profile0", "Path", "Error") & @CRLF)
Return (IniRead(@AppDataDir & "\Mozilla\Firefox\profiles.ini", "Profile0", "Path", "Error"))
EndFunc ;==>_FireFoxProFilePath
Func GetFireFoxPath()
LOCAL $FF_VERSION
$FF_VERSION = REGREAD ("HKLM\SOFTWARE\MOZILLA\MOZILLA FIREFOX","CURRENTVERSION")
IF $FF_VERSION = "" THEN
$FF_VERSION = REGREAD ("HKLM\SOFTWARE\WOW6432NODE\MOZILLA\MOZILLA FIREFOX","CURRENTVERSION")
ENDIF
IF $FF_VERSION = "" THEN
CONSOLEWRITE ("! FAILD READ VERSION FROM REGISTRY" & @CRLF)
ELSE
$FF_VERSION = StringSplit($FF_VERSION, " ")
;~ $FF_VERSION = StringTrimLeft($FF_VERSION, StringInStr($FF_VERSION, " "))
CONSOLEWRITE ("+ FireFox Version: " & $FF_VERSION[1] & @CRLF)
ENDIF
Local $sPath = ""
Local Const $sRegFireFox = "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox "& $FF_VERSION[1] & "\bin"
Local Const $sKeyName = "PathToExe"
$sPath = RegRead($sRegFireFox, $sKeyName)
If FileExists($sPath) Then
;~ ConsoleWrite(StringReplace("Path: " & $sPath, "Firefox.exe", "") & @CRLF)
Return StringReplace($sPath, "Firefox.exe", "")
Else
Return ""
EndIf
EndFunc ;==>GetFireFoxPath
Func Free()
If $hSlot Then DllCall($h_NSS3, "NONE:CDECL", "PK11_FreeSlot", "ptr", $hSlot)
DllCall($h_NSS3, "NONE:CDECL", "NSS_Shutdown")
DllClose($h_NSS3)
If $h_msvcr Then _WinAPI_FreeLibrary($h_msvcr)
If $h_msvcp Then _WinAPI_FreeLibrary($h_msvcp)
If $h_mozglue Then _WinAPI_FreeLibrary($h_mozglue)
EndFunc ;==>Free
Func _LoadLibraries($sPath)
$h_msvcr = _WinAPI_LoadLibrary($sPath & "\" & $aLibraries[0]) ; \
$h_msvcp = _WinAPI_LoadLibrary($sPath & "\" & $aLibraries[1]) ; \
$h_mozglue = _WinAPI_LoadLibrary($sPath & "\" & $aLibraries[2]) ; \
If $h_msvcr And $h_msvcp And $h_mozglue Then
ConsoleWrite("Libaries Loaded1" & @CRLF)
Return True
Else
ConsoleWrite("Libaries failed to Load1" & @CRLF)
ConsoleWrite(_WinAPI_GetLastErrorMessage() & @CRLF)
ConsoleWrite(_WinAPI_GetLastError() & @CRLF)
Return False
EndIf
EndFunc ;==>_LoadLibraries
Func _iniNSS3($sPath, $sProfilePath)
Local $hResult = 0
$h_NSS3 = DllOpen($sPath & "\" & $aLibraries[3]) ; \
$hResult = DllCall($h_NSS3, "dword:CDECL", "NSS_Init", "str", $sProfilePath)
If $hResult[0] = 0 And $h_NSS3 Then
Return True
Else
ConsoleWrite("_iniNSS3 False" & @CRLF)
Return False
EndIf
EndFunc ;==>_iniNSS3
Func _ErrFunc()
Return
EndFunc