Что нового

[Криптография] Хранение пароля в скомпилированном скрипте

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
dwerf как то привёл интересный пример хранения зашифрованного пароля в теле скрипта:
Код:
#include <String.au3>

;Получаем зашифрованный пароль
;~ ClipPut(_StringEncrypt(1, "qwerty", "qwerty", 2))

$sCryptedPass = 'E3A867A30EFC51508A2B2290A4CBDC754A63F613FB9C7BC5'

$sPassInput = InputBox('Password', 'Enter your password (qwerty):', '', '*')
If @error Then Exit

If _StringEncrypt(0, $sCryptedPass, $sPassInput, 2) = $sPassInput Then
    MsgBox(64, 'OK', '"' & $sPassInput & '" accepted.')
Else
    MsgBox(48, 'Failed', '"' & $sPassInput & '" denied.')
EndIf

Однако данный метод требует ввода пользователя, без этого хранить пароль нет смысла, т.к после декомпиляций его сможет получить любой(?) желающий.
Я по наивности думал, что метод приведённый выше, позволяет хранить пароль в скрипте, даже для такой задачи как отправка письма по почте. Вот так я думал оно будет работать:

Код:
#include <String.au3>
#include <File.au3>

Global $aCOMError[2], $oCOMError = ObjEvent("AutoIt.Error", "__COMErrFunc")

If MsgBox(52, 'Mail Sender', 'Send mail?') = 6 Then
	$s_SmtpServer = "smtp.gmail.com"
	$s_FromName = "Tester"
	$s_FromAddress = "[email protected]"
	$s_ToAddress = "[email protected]"
	$s_Subject = "Test mail"
	$s_Body = "Hello from test"
	$s_AttachFiles = ""
	$s_CcAddress = ""
	$s_BccAddress = ""
	$s_Username = "mymail"
	$s_Password = _StringEncrypt(0, "E3A867A30EFC51508A2B2290A4CBDC754A63F613FB9C7BC5", $sPassInput, 2) ;qwerty
	$IPPort = 465
	$ssl = 1
	
	_INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, _
		$s_Subject, $s_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password, $IPPort, $ssl)
	
	MsgBox(64, 'Mail Sender', 'Mail sent.', 5)
EndIf

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
	Local $objEmail = ObjCreate("CDO.Message")
	If Not IsObj($objEmail) Then Return SetError(1, 0, 0)
	
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    
	Local $i_Error = 0
    Local $i_Error_desciption = ""
    
	If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    
	$objEmail.Subject = $s_Subject
   
	If StringInStr($s_Body, "<") And StringInStr($s_Body, ">") Then
        $objEmail.HTMLBody = $s_Body
    Else
        $objEmail.Textbody = $s_Body & @CRLF
    EndIf
    
	If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
            If FileExists($S_Files2Attach[$x]) Then
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                $i_Error_desciption = $i_Error_desciption & @LF & 'File not found to attach: ' & $S_Files2Attach[$x]
                Return SetError(1, 0, 0)
            EndIf
        Next
    EndIf
    
	$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
   
   If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
   
	If $ssl Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
   
	$objEmail.Configuration.Fields.Update
    $objEmail.Send
    
	If @error Then Return SetError(2, 0, $aCOMError[1])
EndFunc

Func __COMErrFunc()
	$HexNumber = Hex($oCOMError.number, 8)
	$aCOMError[0] = $HexNumber
	$aCOMError[1] = StringStripWS($oCOMError.description, 3)
	ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oCOMError.scriptline & "   Description:" & $aCOMError[1] & @LF)
	SetError(1)
EndFunc


но естественно для этого требуется $sPassInput, которого у нас нет без ввода пользователя :(

Т.ч разыскивается метод хранения пароля внутри скрипта :beer:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Ну, хранение пароля в скрипте не предполагает декомпиляцию.

;)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Если кто-то декомпилировал скрипт, то, имея определенные знания в AutoIt, без труда может вынуть пароль по алгоритму его считывания. Хоть в оверлее .exe его спрячь, но алгоритм ведь остался...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Я пробовал задавать ключ прямо в скрипте русскими буквами. При декомпиляции должны возникнуть определенные трудности. У меня возникли, а у Вас?
test.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR [?]
разыскивается метод хранения пароля внутри скрипта
Совсем без ввода пользователя?

Надёжного способа в ближайшем будущем не предвидится.
Как вариант можно использовать флэшку с файлом в котором записан пароль или что-нибудь в этом духе.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Yashied [?]
Если кто-то декомпилировал скрипт, то, имея определенные знания в AutoIt, без труда может вынуть пароль по алгоритму его считывания
А как же обфускация?

madmasles [?]
Я пробовал задавать ключ прямо в скрипте русскими буквами. При декомпиляции должны возникнуть определенные трудности.
Но мы же не можем все пароли хранить кириллицей, а что если это пароль от эл. почты?


dwerf [?]
Надёжного способа в ближайшем будущем не предвидится.
Ну хотябы полунадёжный :scratch:, хотябы от тех умников, которые считают себя хакерами после того как нашли в сети декомпилятор AutoIt скриптов :-X.

Как вариант можно использовать флэшку с файлом в котором записан пароль или что-нибудь в этом духе.
Это не вариант, это тоже ограничение что и с вводом пользователя.

Нужен метод без посторонних вмешательств.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
CreatoR [?]
Но мы же не можем все пароли хранить кириллицей, а что если это пароль от эл. почты?
Пароль задан латинскими буквами, только ключ кириллицей. Вы мой test посмотрите.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
madmasles [?]
Вы мой test посмотрите.
Ну так там UTF-8, раскодировать труда не составит... чтобы далеко не ходить, в SciTE ставим «File -> Encoding -> UTF8» ;).
Да и ещё, какая разница какой ключ, у нас есть переменная $sKey, её подсовываем _StringEncrypt, и получаем на выходе расшифрованный пароль.

OffTopic:
P.S
Согласен с ключём :whistle:

Я так понял Вы все мне это всю жизнь будете помнить? :'(
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
madmasles
Файл test.7z я удалил, ему там не место, не загружайте туда пожалуйста подобные файлы, для этого есть локальное файловое хранилище (и test'ом файл лучше не обзывать, там уже может содержаться такой файл, при одинаковых именах старый заменяется последним... кстати надо бы это исправить...).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319

asdf8

Скриптер
Сообщения
564
Репутация
152
Как вариант - можно шифровать пароль в скрипте используя ID компа, на другом компьютере декомпиляция не поможет.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Такие мысли:
Предположим мы храним хитро шифрованный и спрятанный пароль внутри кода программы. При декомпиляции пароль окажется в полученном au3 файле. Если в этом au3 файле в функции _INetSmtpMailCom дописать ConsoleWrite($s_Password) любое хитрое шифрование пойдёт на смарку, поскольку пароль в этом месте должен быть найден и расшифрован.

Вывод: пароль лучше хранить в ресурсах exe-файла. Пароль там зашифровать, алгоритм чтения и дешифровки обфусцировать.
После декомпиляции пароля в au3 файле не окажется, фокус с перехватом расшифрованного пароля не сработает. Поскольку алгоритм чтения обфусцирован, не сразу ясно что пароль находится в ресурсах.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
dwerf [?]
Если в этом au3 файле в функции _INetSmtpMailCom дописать ConsoleWrite($s_Password) любое хитрое шифрование пойдёт на смарку, поскольку пароль в этом месте должен быть найден и расшифрован.
А если шифровать внутри функций? мы также можем обфусцировать саму функцию.

пароль лучше хранить в ресурсах exe-файла
Можно пример?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR [?]
А если шифровать внутри функций?
Код:
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password

В этом месте пароль должен быть расшифрован, значит его можно будет перехватить.
CreatoR [?]
мы также можем обфусцировать саму функцию.
А можем и деобфусцировать.
Если пароль будет в скрипте, то он станет доступен сразу после деобфускации. Найти строчку где его можно перехватить вышеупомянутым способом проще простого. Достаточно забить в поиск слово password.

Если пароль (или пароль от пароля, пусть не расслабляются) будет в ресурсах, его сначала нужно будет оттуда вынуть.
Способ с перехватом так сразу не прокатит - в декомпилированом скрипте нечего будет перехватывать.

Зы
У меня одного нет декомпилятора?


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

Пример, без обфускации:
crypted.exe

Пароль как бы есть только в скомпилированом скрипте, при декомпиляции он "теряется".
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
dwerf [?]
Пароль как бы есть только в скомпилированом скрипте, при декомпиляции он "теряется".
Хм, а как этот пароль (точнее ключ к нему) вшивается в Exe?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
dwerf [?]
при декомпиляции он "теряется"
Сначала мы получаем эту строку:
Код:
;...
_WinAPI_LoadString(_WinAPI_GetModuleHandle(0), 6000)
;...
А потом тем же ResHacker`ом смотрим ресурсы.

CreatoR [?]
Хм, а как этот пароль (точнее ключ к нему) вшивается в Exe?
Наверное, так, как здесь Строки.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
madmasles [?]
Сначала мы получаем эту строку...
3 дополнительных действия:
- отследить что пароль берётся из этой строки
- узнать что эта строка означает
- залезть в ресурсы

На первых двух "умники" нашедшие в сети декомпилятор могут застрять.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
dwerf
Мы опять возвращаемся к тому, что тот, кто умеет и кому надо, выдернет этот пароль каким-нибудь способом, а от "умников" это более или менее защита. ИМХО, нет не только 100%-ой, но и 50%-ой защиты. :(
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Верх