Jump to content

EncryptedRunAs


Ghost1987
 Share

Recommended Posts

This script replaces runasspc (free for private use only) software.

I express my gratitude to trancexx for his SHA1ForFile function and Matthew Robinson (SkinnyWhiteGuy) for his Blowfish related encryption functions.

Wouldn't have been able to finish this script without those functions.

#cs -------------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Authors:           EncryptedRunAs              - Serj (Ghost_1987)
                    _SHA1ForFile function       - trancexx
                    Blowfish related functions  - Matthew Robinson (SkinnyWhiteGuy)

 Script Function:
    EncryptedRunAs.

#ce -------------------------------------------------------------------------------

#NoTrayIcon
; #RequireAdmin
#include <Array.au3>
#include <ComboConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt("MustDeclareVars", 1)
Opt("TrayMenuMode", 1)

Local $aUserEnum = _NetUserEnum()
If @error Then
    MsgBox(0, "Error", _WinAPI_GetLastErrorMessage(), 30)
    Exit
EndIf
Local $sUserEnum = _ArrayToString($aUserEnum, "|", 1, $aUserEnum[0]+1)
Global $key = DriveGetSerial(@HomeDrive)
If @error Then
    MsgBox(0, "Error", "Crypt key error!", 30)
    Exit
EndIf
Global CONST $EncryptedStringSeparator = ";*x*;"

If $CmdLine[0] == 1 Then
    EncryptedRunAs($CmdLine[1])
ElseIf $CmdLine[0] == 0 Then
    GUI($sUserEnum)
Else
    Exit
EndIf

Func GUI($sUserEnum)
    Local $hWnd = GUICreate("EncryptedRunAs Options:", 420, 420, -1, -1, $WS_CAPTION + $WS_SYSMENU + $WS_MINIMIZEBOX)
        GUICtrlCreateGroup("Application", 10, 5, 400, 137)
            GUICtrlCreateLabel("Path:", 20, 25, 80, 20)
            Local $AppPath_Input = GUICtrlCreateInput("", 90, 22, 284, 20, $ES_AUTOHSCROLL + $ES_READONLY)
            Local $Browse_Button = GUICtrlCreateButton("...", 378, 21, 22, 22)
            GUICtrlCreateLabel("Parameters:", 20, 55, 80, 20)
            Local $AppParameters_Input = GUICtrlCreateInput("", 90, 52, 284, 20, $ES_AUTOHSCROLL)
            Local $CMDHelp_Button = GUICtrlCreateButton("?", 378, 51, 22, 22)
            GUICtrlCreateLabel("Execute in:", 20, 85, 80, 20)
            Local $WorkingDir_Combo = GUICtrlCreateCombo("", 90, 82, 284, 100, $CBS_AUTOHSCROLL + $GUI_SS_DEFAULT_COMBO + $CBS_SORT + $CBS_DISABLENOSCROLL)
            GUICtrlSetData($WorkingDir_Combo, StringTrimRight(@UserProfileDir, StringLen(@UserName) + 1) & "|" & @UserProfileDir & "|" & @TempDir & "|" & @ProgramFilesDir & "|" & @CommonFilesDir & "|" & @WindowsDir & "|" & @SystemDir)
            Local $WorkingDir_Button = GUICtrlCreateButton("»", 378, 81, 22, 22)
            Local $SHA1_CheckBox = GUICtrlCreateCheckbox("SHA1:", 20, 113, 50, 20)
            Local $SHA1_Input = GUICtrlCreateInput("SHA1_Enabled", 90, 112, 284, 20, $ES_AUTOHSCROLL + $ES_READONLY)
            GUICtrlSetFont($SHA1_Input, 8, 2)
            GUICtrlSetState($SHA1_CheckBox, $GUI_CHECKED)
            Local $SHA1Refresh_Button = GUICtrlCreateButton("»", 378, 111, 22, 22)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        GUICtrlCreateGroup("Authentication", 10, 145, 400, 109)
            GUICtrlCreateLabel("Login:", 20, 165, 50, 20)
            Local $Login_Combo = GUICtrlCreateCombo("", 90, 162, 284, 100)
            GUICtrlSetData($Login_Combo, $sUserEnum, @UserName)
            Local $LogonUserTest_Button = GUICtrlCreateButton("»", 378, 161, 22, 52)
            GUICtrlCreateLabel("Password:", 20, 195, 50, 20)
            Local $Password_Input = GUICtrlCreateInput("", 90, 192, 284, 20, $ES_PASSWORD + $ES_AUTOHSCROLL)
            GUICtrlCreateLabel("Logon:", 20, 225, 50, 20)
            Local $LogonFlag_Combo = GUICtrlCreateCombo("", 90, 222, 284, 100, $CBS_DROPDOWNLIST)
            GUICtrlSetData($LogonFlag_Combo, "Interactive logon with no profile.|Interactive logon with profile.", "Interactive logon with profile.")
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        GUICtrlCreateGroup("Output", 10, 257, 400, 119)
            Local $Output_Edit = GUICtrlCreateEdit("Please input all data before encryption.", 20, 272, 380, 72, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY)
            Local $Shortcut_CheckBox = GUICtrlCreateCheckbox("Create shortcut to generated Crypt.key file", 20, 350, 340, 20)
            GUICtrlSetFont($Output_Edit, 9, 2)
            GUICtrlSetState($Shortcut_CheckBox, $GUI_CHECKED)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        Local $Open_Button = GUICtrlCreateButton("Open", 10, 384, 85, 27)
        Local $QuickSave_Button = GUICtrlCreateButton("Save", 105, 384, 85, 27)
        Local $Save_Button = GUICtrlCreateButton("...", 190, 384, 30, 27)
        Local $Test_Button = GUICtrlCreateButton("Test", 230, 384, 85, 27)
        Local $Quit_Button = GUICtrlCreateButton("Quit", 325, 384, 85, 27)
        GUICtrlSetState($QuickSave_Button, $GUI_DEFBUTTON)
    GUISetState(@SW_SHOW)
    While 1
        Local $msg = GUIGetMsg(), $AppPath, $AppParameters, $WorkingDir, $UserName, $Password, $Logon_Combo_Flag, $SHA1_Flag, $AppSHA1, $CreateShortcut
        If $msg == $Browse_Button Then
            $SHA1_Flag = GUICtrlRead($SHA1_CheckBox)
            Local $BrowsePath = FileOpenDialog("Choose application to RunAs...", @WorkingDir & "\", "Programs (*.exe;*.com;*.cmd;*.bat)", 1 + 2, "", $hWnd)
            If @error Then
                GUICtrlSetData($Output_Edit, "No application was chosen!" & @CRLF)
            Else
                GUICtrlSetData($AppPath_Input, $BrowsePath)
                $WorkingDir = StripAppName($BrowsePath)
                GUICtrlSetData($WorkingDir_Combo, $WorkingDir, $WorkingDir)
                If $SHA1_Flag == 1 Then
                    GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF)
                    Local $aRetAppSHA1 = SHA1Wrapper($BrowsePath)
                    GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0])
                    GUICtrlSetData($Output_Edit, $aRetAppSHA1[1])
                Else
                    GUICtrlSetData($SHA1_Input, "SHA1_Disabled")
                    GUICtrlSetData($Output_Edit, "SHA1 hash disabled." & @CRLF)
                EndIf
            EndIf
        EndIf
        If $msg == $CMDHelp_Button Then
            $AppPath = GUICtrlRead($AppPath_Input)
            If FileExists($AppPath) == 1 Then Run(@ComSpec & " /k", @WorkingDir)
        EndIf
        If $msg == $WorkingDir_Button Then
            $AppPath = GUICtrlRead($AppPath_Input)
            $WorkingDir = StripAppName($AppPath)
            GUICtrlSetData($WorkingDir_Combo, $WorkingDir, $WorkingDir)
        EndIf
        If $msg == $SHA1_CheckBox Then
            $AppPath = GUICtrlRead($AppPath_Input)
            $SHA1_Flag = GUICtrlRead($SHA1_CheckBox)
            If $SHA1_Flag == 1 Then
                GUICtrlSetData($SHA1_Input, "SHA1_Enabled")
                GUICtrlSetData($Output_Edit, "SHA1 hash enabled." & @CRLF)
                If FileExists($AppPath) == 1 Then
                    GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF)
                    Local $aRetAppSHA1 = SHA1Wrapper($AppPath)
                    GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0])
                    GUICtrlSetData($Output_Edit, $aRetAppSHA1[1])
                EndIf
            Else
                GUICtrlSetData($SHA1_Input, "SHA1_Disabled")
                GUICtrlSetData($Output_Edit, "SHA1 hash disabled." & @CRLF)
            EndIf
        EndIf
        If $msg == $SHA1Refresh_Button Then
            $AppPath = GUICtrlRead($AppPath_Input)
            If FileExists($AppPath) == 1 Then
                GUICtrlSetData($Output_Edit, "Calculating SHA1 hash..." & @CRLF)
                Local $aRetAppSHA1 = SHA1Wrapper($AppPath)
                GUICtrlSetData($SHA1_Input, $aRetAppSHA1[0])
                GUICtrlSetData($Output_Edit, $aRetAppSHA1[1])
            EndIf
        EndIf
        If $msg == $LogonUserTest_Button Then
            $UserName = GUICtrlRead($Login_Combo)
            $Password = GUICtrlRead($Password_Input)
            Local $LogonUser = _LogonUser($UserName, $Password)
            If @error Then
                GUICtrlSetData($Output_Edit, "LogonUser WinAPI function error." & @CRLF & "Authentication check is impossible." & @CRLF)
            ElseIf $LogonUser == True Then
                GUICtrlSetData($Output_Edit, "Authentication successful." & @CRLF)
            ElseIf $LogonUser == False Then
                GUICtrlSetData($Output_Edit, "Authentication failed." & @CRLF)
            EndIf
        EndIf
        If $msg == $Open_Button Then
            Local $OpenCryptFilePath = FileOpenDialog("Open Crypt.key file for EncryptedRunAs...", @WorkingDir & "\", "Crypt file (*.key)", 1 + 2, "", $hWnd)
            If @error Then
                GUICtrlSetData($Output_Edit, "No Crypt.key file was chosen!" & @CRLF)
            Else
                EncryptedRunAs($OpenCryptFilePath)
            EndIf
        EndIf
        If $msg == $Save_Button Or $msg == $QuickSave_Button Or $msg == $Test_Button Then
            $AppPath = GUICtrlRead($AppPath_Input)
            $AppParameters = GUICtrlRead($AppParameters_Input)
            $WorkingDir = GUICtrlRead($WorkingDir_Combo)
            $UserName = GUICtrlRead($Login_Combo)
            $Password = GUICtrlRead($Password_Input)
            $Logon_Combo_Flag = GUICtrlRead($LogonFlag_Combo)
            $SHA1_Flag = GUICtrlRead($SHA1_CheckBox)
            $AppSHA1 = GUICtrlRead($SHA1_Input)
            $CreateShortcut = GUICtrlRead($Shortcut_CheckBox)
            If $Logon_Combo_Flag == "Interactive logon with no profile." Then
                Local $Logon_Flag = 0
            ElseIf $Logon_Combo_Flag == "Interactive logon with profile." Then
                Local $Logon_Flag = 1
            EndIf
            If FileExists($AppPath) == 1 And $AppSHA1 <> "SHA1_Failed" And FileExists($WorkingDir) == 1 Then
                Local $EncryptedString = StringToBinary(_Blowfish($key, $AppPath & $EncryptedStringSeparator & $AppParameters & $EncryptedStringSeparator & $WorkingDir & $EncryptedStringSeparator & $UserName & $EncryptedStringSeparator & $Password & $EncryptedStringSeparator & $Logon_Flag & $EncryptedStringSeparator & $AppSHA1, 0))
                If $msg == $Save_Button Then
                    Local $CryptFileSavePath = FileSaveDialog("Choose name and location for crypt file...", $AppPath, "Encrypted key (*.key)", 2 + 16, "crypt.key", $hWnd)
                    If @error <> 1 Then
                        Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, $CryptFileSavePath, $EncryptedString, $CreateShortcut, $hWnd)
                        GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet)
                    Else
                        GUICtrlSetData($Output_Edit, "Crypt file save cancelled." & @CRLF)
                    EndIf
                EndIf
                If $msg == $QuickSave_Button Then
                    Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, 0, $EncryptedString, $CreateShortcut, $hWnd)
                    GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet)
                EndIf
                If $msg == $Test_Button Then
                    $CreateShortcut = 0
                    Local $SaveCryptKeyFileRet = SaveCryptKeyFile($AppPath, @TempDir & '\crypt.key', $EncryptedString, $CreateShortcut, $hWnd)
                    GUICtrlSetData($Output_Edit, $SaveCryptKeyFileRet)
                    Local $EncryptedRunAsRet = EncryptedRunAs(@TempDir & '\crypt.key')
                    If $EncryptedRunAsRet == True Then
                        GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Test-run successful." & @CRLF)
                    Else
                        GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Test-run failed." & @CRLF)
                    EndIf
                    FileDelete(@TempDir & '\crypt.key')
                    WinActivate($hWnd)
                EndIf
            Else
                Local $errmsg = ""
                If FileExists($AppPath) == 0 Then $errmsg &= "Specified file does not exist." & @CRLF
                If FileExists($WorkingDir) == 0 Then $errmsg &= "Specified working directory does not exist." & @CRLF
                If $AppSHA1 == "SHA1_Failed" Then $errmsg &= "SHA1 hash computation failed." & @CRLF & "Please disable SHA1 hash computation!" & @CRLF
                GUICtrlSetData($Output_Edit, $errmsg)
            EndIf
            Local $LogonUser = _LogonUser($UserName, $Password)
            If @error Then
                GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "LogonUser WinAPI function error." & @CRLF & "Authentication check is impossible." & @CRLF)
            ElseIf $LogonUser == True Then
                GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Authentication successful." & @CRLF)
            ElseIf $LogonUser == False Then
                GUICtrlSetData($Output_Edit, GUICtrlRead($Output_Edit) & "Authentication failed." & @CRLF)
            EndIf
        EndIf
        If $msg == $Quit_Button Or $msg == $GUI_EVENT_CLOSE Then Exit
    WEnd
    GUIDelete()
EndFunc    ;GUI

Func SHA1Wrapper($AppPath)
    Local $hTimer = TimerInit()
    Local $AppSHA1 = _SHA1ForFile($AppPath)
    Local $aRet[2]
    If @error Then
        $aRet[0] = "SHA1_Failed"
        $aRet[1] = "SHA1 hash computation failed." & @CRLF
        SetError(1)
        Return $aRet
    Else
        Local $iTimer = TimerDiff($hTimer)
        $aRet[0] = $AppSHA1
        $aRet[1] = "SHA1 hash computation completed successfully." & @CRLF & "SHA1 took " & $iTimer & " ms" & @CRLF
        SetError(0)
        Return $aRet
    EndIf
EndFunc    ;SHA1Wrapper

Func StripAppName($AppPath)
    Dim $szDrive, $szDir, $szFName, $szExt
    Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt)
    If FileExists($aPathRet[2]) == 0 Then
        Return @TempDir
    Else
        Return $aPathRet[1] & $aPathRet[2]
    EndIf
EndFunc    ;StripAppName

Func GetAppName($AppPath)
    Dim $szDrive, $szDir, $szFName, $szExt
    Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt)
    If IsArray($aPathRet) Then
        Return $aPathRet[3]
    Else
        Return "AppName"
    EndIf
EndFunc    ;GetAppName

Func GetAppExtension($AppPath)
    Dim $szDrive, $szDir, $szFName, $szExt
    Local $aPathRet = _PathSplit($AppPath, $szDrive, $szDir, $szFName, $szExt)
    If IsArray($aPathRet) Then
        Return $aPathRet[4]
    Else
        Return ""
    EndIf
EndFunc    ;GetAppExtension

Func SaveCryptKeyFile($AppPath, $CryptFileSavePath, $EncryptedString, $CreateShortcut, $hWnd)
    Local $sRet
    If $CryptFileSavePath == 0 Then
        $CryptFileSavePath = StripAppName($AppPath) & 'crypt.key'
    Endif
    Local $CryptFileOpenTest = FileOpen($CryptFileSavePath, 16 + 2)
    If $CryptFileOpenTest = -1 Then
        $sRet &= "Unable to create crypt file." & @CRLF
    Else
        FileWrite($CryptFileOpenTest, $EncryptedString)
        If @error Then
            $sRet &= "File cannot be written to." & @CRLF
        EndIf
        FileClose($CryptFileOpenTest)
        If $CreateShortcut == 1 Then
            Local $AppExtension = GetAppExtension($AppPath)
            If $AppExtension == ".exe" Then
                Local $IconPath = $AppPath
                Local $IconIndex = 0
            Else
                Local $IconPath = @SystemDir & "\shell32.dll"
                Local $IconIndex = 2
            EndIf
            Local $ShortcutSavePath = FileSaveDialog("Choose name and location for shortcut...", @DesktopDir, "Shortcut (*.lnk)", 2 + 16, GetAppName($AppPath) & ".lnk", $hWnd)
            If @error Then
                $sRet &= "Shortcut creation canceled." & @CRLF
            Else
                If @Compiled == 0 Then
                    Local $ShortcutArgs = '"' & @ScriptFullPath & '" "' & $CryptFileSavePath & '"'
                ElseIf @Compiled == 1 Then
                    Local $ShortcutArgs = '"' & $CryptFileSavePath & '"'
                EndIf
                FileCreateShortcut(@AutoItExe, $ShortcutSavePath, @ScriptDir, $ShortcutArgs, "", $IconPath, "", $IconIndex, @SW_SHOWNORMAL)
                If @error Then
                    $sRet &= "Shortcut creation failed." & @CRLF
                EndIf
                If FileExists($ShortcutSavePath) == 1 Then $sRet &= "Shortcut created successfully." & @CRLF
            EndIf
        EndIf
    EndIf
    If FileExists($CryptFileSavePath) == 1 Then $sRet &= "Crypt file created successfully." & @CRLF
    Return $sRet
EndFunc    ;SaveCryptKeyFile

Func EncryptedRunAs($CryptFilePath)
    Local $CryptFileOpenTest = FileOpen($CryptFilePath, 16)
    If $CryptFileOpenTest = -1 Then
        MsgBox(0, "Error", "Unable to open crypt file.", 30)
        Return False
        Exit
    Else
        Local $EncryptedString = FileRead($CryptFileOpenTest)
        If @error Then
            MsgBox(0, "Error", "File cannot be opened in read mode.", 30)
            Return False
            Exit
        EndIf
        FileClose($CryptFileOpenTest)
        Local $DecryptedString = _Blowfish($key, BinaryToString($EncryptedString), 1)
        Local $DecryptedArray = StringSplit($DecryptedString, $EncryptedStringSeparator, 1)
        If $DecryptedArray[0] == 7 Then
            Local $AppPath = $DecryptedArray[1]
            Local $AppParameters = $DecryptedArray[2]
            Local $WorkingDir = $DecryptedArray[3]
            Local $UserName = $DecryptedArray[4]
            Local $Password = $DecryptedArray[5]
            Local $Logon_Flag = $DecryptedArray[6]
            Local $AppSHA1Str = $DecryptedArray[7]
            If $AppParameters == "" Then
                Local $AppPathANDParameters = $AppPath
            Else
                Local $AppPathANDParameters = $AppPath & " " & $AppParameters
            EndIf
            If $AppSHA1Str == "SHA1_Disabled" Then
                RunAs($UserName, @ComputerName, $Password, $Logon_Flag, $AppPathANDParameters, $WorkingDir)
                If @error Then
                    MsgBox(0, "Error", "RunAs failed:" & @CRLF & @TAB & _WinAPI_GetLastErrorMessage(), 30)
                    Return False
                    Exit
                EndIf
            Else
                Local $AppSHA1Gen = _SHA1ForFile($AppPath)
                If @error Then
                    MsgBox(0, "Error", "SHA1 hash computation failed.", 30)
                    Return False
                    Exit
                EndIf
                If $AppSHA1Str == $AppSHA1Gen Then
                    RunAs($UserName, @ComputerName, $Password, $Logon_Flag, $AppPathANDParameters, $WorkingDir)
                    If @error Then
                        MsgBox(0, "Error", "RunAs failed:" & @CRLF & @TAB & _WinAPI_GetLastErrorMessage(), 30)
                        Return False
                        Exit
                    EndIf
                Else
                    MsgBox(0, "Error", "File integrity check failed." & @CRLF & "SHA1 file hash is diffrent from encoded in crypt file.", 30)
                    Return False
                    Exit
                EndIf
            EndIf
        Else
            MsgBox(0, "Error", "Decryption failed. Error in crypt file integrity.", 30)
            Return False
            Exit
        EndIf
    EndIf
    Return True
EndFunc    ;EncryptedRunAs

Func _NetUserEnum($sServer = "") ; array[0] contains number of elements
    Local $tBufPtr = DllStructCreate("ptr")
    Local $tEntriesRead = DllStructCreate("dword")
    Local $tTotalEntries = DllStructCreate("dword")
    Local $aRet = DllCall("Netapi32.dll", "int", "NetUserEnum", "wstr", $sServer, "dword", 1, "dword", 2, "ptr", DllStructGetPtr($tBufPtr), "dword", -1, "ptr", DllStructGetPtr($tEntriesRead), "ptr", DllStructGetPtr($tTotalEntries), "ptr", 0 )
    If $aRet[0] Then Return SetError(1, $aRet[0], False)
    Local Const $UF_ACCOUNTDISABLE = 0x2
    Local $iEntriesRead = DllStructGetData($tEntriesRead,1)
    Local $pBuf = DllStructGetData($tBufPtr,1)
    Local $aUserEnum[1] = [0]
    Local $sUserInfo1 = "ptr;ptr;dword;dword;ptr;ptr;dword;ptr"
    Local $tUserInfo1 = DllStructCreate ($sUserInfo1)
    Local $zUserInfo1 = DllStructGetSize($tUserInfo1)
    For $i=1 To $iEntriesRead
        $tUserInfo1 = DllStructCreate($sUserInfo1, $pBuf+($i-1)*$zUserInfo1)
        Local $tName = DllStructCreate("wchar[256]", DllStructGetData($tUserInfo1,1))
        Local $tFlag = DllStructGetData($tUserInfo1,7)
        If BitAnd($tFlag, $UF_ACCOUNTDISABLE)=0 Then
            $aUserEnum[0] += 1
            ReDim $aUserEnum[$aUserEnum[0]+1]
            $aUserEnum[$aUserEnum[0]] = DllStructGetData($tName,1)
        EndIf
    Next
    DllCall("Netapi32.dll", "int", "NetApiBufferFree", "ptr", $pBuf)
    Return $aUserEnum
EndFunc    ;_NetUserEnum

Func _LogonUser($sUsername, $sPassword, $sServer = '.') ; Returns True if user exists
    Local $stToken = DllStructCreate("int")
    Local $aRet = DllCall("advapi32.dll", "int", "LogonUser", _
            "str", $sUsername, "str", $sServer, "str", $sPassword, "dword", 3, "dword", 0, "ptr", DllStructGetPtr($stToken))
    ; Local $hToken = DllStructGetData($stToken, 1)
    If @error Then
        Local $ErrorMsg = _WinAPI_GetLastErrorMessage()
        Return SetError(1, @error, $ErrorMsg)
    ElseIf $aRet[0] <> 0 Then
        Return True
    ElseIf $aRet[0] == 0 Then
        Return False
    EndIf
EndFunc    ;_LogonUser

Func _Blowfish($key, $message, $decrypt)
    Local $i, $m, $len
    Local $xl, $xr, $result, $fill
    If IsDeclared("P") <> 1 Or IsDeclared("S") <> 1 Or IsDeclared("Gkey") <> 1 Then
        Global $P[18]
        Global $S[4][256]
        Global $Gkey = $key
        _BlowFish_Init($P, $S, $Gkey)
    ElseIf Not ($Gkey == $key) Then
        Global $P[18]
        Global $S[4][256]
        Global $Gkey = $key
        _BlowFish_Init($P, $S, $Gkey)
    EndIf
    If $decrypt == 0 Then
        $fill = 8
        If Mod(StringLen($message), 8) <> 0 Then
            $fill = 8 - Mod(StringLen($message), 8)
        EndIf
        For $i = 1 To $fill
            $message &= Chr($fill)
        Next
    EndIf
    $len = StringLen($message)
    While $m < $len
        $xl = StringMid($message, $m + 1, 4)
        $xr = StringMid($message, $m + 5, 4)
        $m += 8
        $xl = BitOR(BitShift(Asc(StringMid($xl, 1, 1)), -24), BitShift(Asc(StringMid($xl, 2, 1)), -16), BitShift(Asc(StringMid($xl, 3, 1)), -8), Asc(StringMid($xl, 4, 1)))
        $xr = BitOR(BitShift(Asc(StringMid($xr, 1, 1)), -24), BitShift(Asc(StringMid($xr, 2, 1)), -16), BitShift(Asc(StringMid($xr, 3, 1)), -8), Asc(StringMid($xr, 4, 1)))
        If $decrypt == 0 Then
            _BlowFish_Save($P, $S, $xl, $xr)
        Else
            _BlowFish_Decrypt($P, $S, $xl, $xr)
        EndIf
        $result &= Chr(BitAND(BitShift($xl, 24), 0xFF))
        $result &= Chr(BitAND(BitShift($xl, 16), 0xFF))
        $result &= Chr(BitAND(BitShift($xl, 8), 0xFF))
        $result &= Chr(BitAND($xl, 0xFF))
        $result &= Chr(BitAND(BitShift($xr, 24), 0xFF))
        $result &= Chr(BitAND(BitShift($xr, 16), 0xFF))
        $result &= Chr(BitAND(BitShift($xr, 8), 0xFF))
        $result &= Chr(BitAND($xr, 0xFF))
    WEnd
    ; Strip Null Bytes from end of string (Are present if decrypting)
    If $decrypt == 1 Then
        $fill = Asc(StringRight($result, 1))
        $result = StringTrimRight($result, $fill)
    EndIf
    Return $result
EndFunc    ;_Blowfish

Func _BlowFish_Init(ByRef $P, ByRef $S, $key)
    Local $ORIG_P[18] = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b]
    Local $ORIG_S0[256] = [0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, _
            0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, _
            0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, _
            0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, _
            0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, _
            0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]
    Local $ORIG_S1[256] = [0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, _
            0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, _
            0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, _
            0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, _
            0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, _
            0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]
    Local $ORIG_S2[256] = [0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, _
            0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, _
            0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, _
            0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, _
            0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, _
            0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]
    Local $ORIG_S3[256] = [0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, _
            0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, _
            0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, _
            0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, _
            0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, _
            0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]
    Local $data, $datal, $datar
    Local $i, $j, $k, $keyLen = StringLen($key)
    For $j = 0 To 255
        $S[0][$j] = $ORIG_S0[$j]
    Next
    For $j = 0 To 255
        $S[1][$j] = $ORIG_S1[$j]
    Next
    For $j = 0 To 255
        $S[2][$j] = $ORIG_S2[$j]
    Next
    For $j = 0 To 255
        $S[3][$j] = $ORIG_S3[$j]
    Next
    $j = 0
    For $i = 0 To 17
        $data = 0x00000000
        For $k = 0 To 3
            $data = BitOR(BitShift($data, -8), Asc(StringMid($key, $j + 1, 1)))
            $j += 1
            If $j >= $keyLen Then
                $j = 0
            EndIf
        Next
        $P[$i] = BitXOR($ORIG_P[$i], $data)
    Next
    $datal = 0x00000000
    $datar = 0x00000000
    For $i = 0 To 17 Step 2
        _BlowFish_Save($P, $S, $datal, $datar)
        $P[$i] = $datal
        $P[$i + 1] = $datar
    Next
    For $i = 0 To 3
        For $j = 0 To 255 Step 2
            _BlowFish_Save($P, $S, $datal, $datar)
            $S[$i][$j] = $datal
            $S[$i][$j + 1] = $datar
        Next
    Next
    Return 0
EndFunc    ;_BlowFish_Init

Func _BlowFish_Save(ByRef $P, ByRef $S, ByRef $xl, ByRef $xr)
    ; Encode Each 64 Bit part of Message seperately
    Local $datal, $datar, $temp, $i
    $datal = $xl
    $datar = $xr
    For $i = 0 To 15
        $datal = BitXOR($datal, $P[$i])
        $datar = BitXOR($datar, F($S, $datal))

        $temp = $datal
        $datal = $datar
        $datar = $temp
    Next
    $temp = $datal
    $datal = $datar
    $datar = $temp
    $datar = BitXOR($datar, $P[16])
    $datal = BitXOR($datal, $P[17])
    $xl = $datal
    $xr = $datar
EndFunc    ;_BlowFish_Save

Func _BlowFish_Decrypt(ByRef $P, ByRef $S, ByRef $xl, ByRef $xr)
    ; Decode Each 64 Bit part of Message seperately
    Local $datal, $datar, $temp, $i
    $datal = $xl
    $datar = $xr
    For $i = 17 To 2 Step - 1
        $datal = BitXOR($datal, $P[$i])
        $datar = BitXOR($datar, F($S, $datal))
        $temp = $datal
        $datal = $datar
        $datar = $temp
    Next
    $temp = $datal
    $datal = $datar
    $datar = $temp
    $datar = BitXOR($datar, $P[1])
    $datal = BitXOR($datal, $P[0])
    $xl = $datal
    $xr = $datar
EndFunc    ;_BlowFish_Decrypt

Func F($S, $x)
    Local $a, $b, $c, $d, $y
    $d = BitAND($x, 0xFF)
    $x = BitShift($x, 8)
    $c = BitAND($x, 0xFF)
    $x = BitShift($x, 8)
    $b = BitAND($x, 0xFF)
    $x = BitShift($x, 8)
    $a = BitAND($x, 0xFF)
    $y = $S[0][$a] + $S[1][$b]
    $y = BitXOR($y, $S[2][$c])
    $y += $S[3][$d]
    Return $y
EndFunc    ;_F

Func _SHA1ForFile($sFile)
    Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", "wstr", $sFile, "dword", 0x80000000, "dword", 3, "ptr", 0, "dword", 3, "dword", 0, "ptr", 0)
    If @error Or $a_hCall[0] = -1 Then
        Return SetError(1, 0, "")
    EndIf
    Local $hFile = $a_hCall[0]
    $a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", "hwnd", $hFile, "dword", 0, "dword", 2, "dword", 0, "dword", 0, "ptr", 0)
    If @error Or Not $a_hCall[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        Return SetError(2, 0, "")
    EndIf
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
    Local $hFileMappingObject = $a_hCall[0]
    $a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", "hwnd", $hFileMappingObject, "dword", 4, "dword", 0, "dword", 0, "dword", 0)
    If @error Or Not $a_hCall[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(3, 0, "")
    EndIf
    Local $pFile = $a_hCall[0]
    Local $iBufferSize = FileGetSize($sFile)
    Local $a_iCall = DllCall("advapi32.dll", "int", "CryptAcquireContext", "ptr*", 0, "ptr", 0, "ptr", 0, "dword", 1, "dword", 0xF0000000)
    If @error Or Not $a_iCall[0] Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(4, 0, "")
    EndIf
    Local $hContext = $a_iCall[1]
    $a_iCall = DllCall("advapi32.dll", "int", "CryptCreateHash", "ptr", $hContext, "dword", 0x00008004, "ptr", 0, "dword", 0, "ptr*", 0)
    If @error Or Not $a_iCall[0] Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0)
        Return SetError(5, 0, "")
    EndIf
    Local $hHashSHA1 = $a_iCall[5]
    $a_iCall = DllCall("advapi32.dll", "int", "CryptHashData", "ptr", $hHashSHA1, "ptr", $pFile, "dword", $iBufferSize, "dword", 0)
    If @error Or Not $a_iCall[0] Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1)
        DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0)
        Return SetError(6, 0, "")
    EndIf
    Local $tOutSHA1 = DllStructCreate("byte[20]")
    $a_iCall = DllCall("advapi32.dll", "int", "CryptGetHashParam", "ptr", $hHashSHA1, "dword", 2, "ptr", DllStructGetPtr($tOutSHA1), "dword*", 20, "dword", 0)
    If @error Or Not $a_iCall[0] Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1)
        DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0)
        Return SetError(7, 0, "")
    EndIf
    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
    DllCall("advapi32.dll", "int", "CryptDestroyHash", "ptr", $hHashSHA1)
    Local $sSHA1 = Hex(DllStructGetData($tOutSHA1, 1))
    DllCall("advapi32.dll", "int", "CryptReleaseContext", "ptr", $hContext, "dword", 0)
    Return SetError(0, 0, $sSHA1)
EndFunc    ;_SHA1ForFile

Any comments or suggestions for improvement are welcomed.

Tested on Windows 2000 SP4, Windows XP SP3, Windows Vista SP1 (UAC - Disabled).

Edited by Ghost1987
Link to comment
Share on other sites

Link to comment
Share on other sites

  • 1 year later...

Great script!! Really want to use it on our netowrk!

But are you saying that this is a free alternative to runasspc? :>

Or that you've re-wrote runasspc in AutoIT, so your script abides by runaspc's license and is only "free for private use"? :unsure:

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...