Что нового

Firefox Шифрование учетных данных по алгоритму браузера (nss3.dll)

ramslader

Новичок
Сообщения
6
Репутация
0
Здравствуйте уважаемые.
Собственно проблема имеется код для расшифровки логинов и паролей 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
 

kurand

Новичок
Сообщения
1
Репутация
0
Ув. ramslader, у вас получилось реализовать PK11SDR_Encrypt на autoit, у меня аналогичная задача стоит
 
Верх