Что нового

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Т.е вшить в саму иконку? как?

Да поймите же вы, в этом нет никакого смысла. Если я могу декомпилировать скрипт, то у меня автоматически будет ваш алгоритм считывания пароля из иконки, и я могу без проблем достать его, используя ваш же алгоритм. Для скрытия пароля необходимо именно исключать или сильно затруднять сам процесс декомпиляции.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Извиняюсь, что вмешиваюсь в дискуссию таких гуру, но свои 5 пожалуй вставлю... Все сводится к тому что любое шифрование или срытые пароля легко преодолевается посредством декомпиляции и анализа кода... Значит нужно искать способы невозможности декомпиляции... Как вариант, возможно уже в скомпилированом скрипте добавить через HEX несколько битых байт, которые не должны влиять на функционал скрипта, но на которые обязательно наткнется декомпилятор и будет выплёвывать ошибки или декомпилировать неправильно... Думаю нужно копать в этом направлении
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Да поймите же вы, в этом нет никакого смысла. Если я могу декомпилировать скрипт, то у меня автоматически будет ваш алгоритм считывания пароля из иконки, и я могу без проблем достать его, используя ваш же алгоритм.
Понимаем, но это ты, не каждый сможет это проделать, а мне нужна не сложная защита, не от тебя, а от новичков которым попался в руки декомпилятор.

beliy [?]
Думаю нужно копать в этом направлении
В этом направление уже копают давно, однако безуспешно, последняя “удачная” попытка закончилась тем, что автор того самого могучего декомпилятора (чьё имя нелзя произносить в слух... прям как в Гарри Потерре, “Вола́н-де-Мо...”) обнаружил утечку и исправил её в новой версий.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
А алгоритм дешифровки известен? Если да то выложите - вместе подумаем... Как вариант допускаю что возможно дешифратор определяет версию автоит, для теста можно глянуть как себя поведет если заставить его определить как другую не совместимую с нынешней или несуществующей версией аутоит...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Как вариант, написать простенькую утилиту на каком-нибудь другом языке (компиляторе), например на том же Pure Basic'е, которая будет вынимать пароль из тела самого скрипта и передовать его обратно, скажем с помощью WM_COPYDATA в определенное окно. А сам пароль в зашифрованном виде будет дописываться в конец .exe файла скрипта вместе с небольшим количеством мусора. Например, каждый четвертый байт с конца .exe файла есть очередной символ пароля. Естественно, этот алгоритм будет известен только pb-программе, но это уже не интерпритатор, а компилятор, и разобраться в ней сможет только человек, знающий дизассемблер и владеющий языками низкого уровня.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Я то-же хотел насчет другого ЯП предложить.
В другой теме я это предлагал. Уж, по крайней мере -
только дизассемблинг на ASM-e будут исследовать,
а не декомпиляцию.
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
а еще лучше 1-на часть пароля хранится в ехе pure basic а другая в ехе автоита :laugh:
 

Yashied

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

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
ну это тоже самое что прятать бомбу на подводной лодке. вроде спрятал, а она в любом случае на лодке :scratch:
вот надо попробовать изменить обфусцированный код, авось что выйдет... завтра попробую....

OffTopic:
PS Yashied: даешь народу ассоциации :whistle:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Спрятоть пароль в ресурсах не получится,я открыл Crypt.exe в редакторе ресурсов,зашёл в папку строковая таблица,нажал на Английский(США),нашёл значение 6000 и посмотрел что в нем написанно,там стояли 1234567890,изходя из этого вот вам пароль...
Код:
MsgBox(0, "Password", _STRINGENCRYPT(0, "33D400FCA7D098BE478A65F13D42", 1234567890))
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Нужно не пароль скрывать, а алгоритм его получения в AutoIt скрипте.
Папанова вспомнил - "Достаточно одной таблэтки".
Алгоритм вычислить = трудновато = написать КейГен (большая работа мозга)
Этап проверки кода вычислить (там где проверка на правильность введенного пароля) = очень легко = патч. Т.е. после патчинга вводим любой пароль, а результат всегда Истина.
Ведь так?


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

Вижу, много дебатов насчет самой защиты и обхода защиты.
Тема, конечно, интересная. Вот еще бы практики в эту тему.
А именно - Раздел - CrackMe (взломай меня, если сможешь). Это полезно - как кроссворд на досуге.
Сначала парочка CrackMe с пояснительной статьей "Почему так не надо защищать программу".
Затем остальные CrackMe от пользовтелей.
Исключение - только AutoIt.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Защита пароля

Всем привет, у меня получился пример защиты пароля где сам пароль хранится в самом скрипте и меняется при каждом запуске,может не идеал,но всё же,пароль не знаю даже я....

Код:
#include <String.au3>

$hForm = GUICreate("Varies password",200,200)
GUISetState()

$sData1 = _StringEncrypt(1,WinGetHandle($hForm,""),WinGetHandle($hForm,""),3)
$sData2 = _StringEncrypt(0,$sData1,WinGetHandle($hForm,""),3)

If WinGetHandle($hForm,"") = $sData2 Then
	MsgBox(0,"Password",$sData2)
	Exit
Else
    Exit	
EndIf
 

sss

Продвинутый
Сообщения
332
Репутация
96
Я недавно тоже пытался защитить свою программу от декомпилирования и методом научного тыка обнаружил 3 упаковщика exe файлов, файл после которых не поддавался декомпиляции стандартным методом - это FSG, Mew11 и ASPack. Первые 2 вроде бесплатны, ASPack - условно-бесплатный. При использовании FSG и ASPack декомпилятор не находит сигнатуры AutoIt-файла, при использовании Mew деколпилятор показывает многозначительный код:
Код:
MZ
К тому же некоторые из них сильнее сжимают файл, нежели UPX. Вот таблица:
______________________________________________________
|Начальный размер \/ ASPack \/ FSG \/ Mew | UPX |
| 646 791 | 301 056 | 339 033 | 280 496| 303 239 |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Размер в байтах.
Это, конечно, не спасет от мастера взлома, но от "умников", скачавших декомпилятор, спасает.
 

Dragon

Новичок
Сообщения
13
Репутация
2
Mew11 делает не рабочим скрипт и поэтому не декомпилится. ASPack спокойно декомпилится
 

sss

Продвинутый
Сообщения
332
Репутация
96
Может, разная версия ASPack (у меня 2.24) или ты не ставил галки про защиту? А про Mew - до декомпиляции он работает (у меня), как декомпилировал - перестал работать. Вывод - буду пользоваться FSG )
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
CreatoR
Т.е вшить в саму иконку? как?
Пароль конечно же должен быть в зашифрованном "контейнере", а вот пароль к контейнеру наверно будет правильно сгененрировать на основе данных, например икноки, и размер пароля например в несколько килобайт.
Так как нескомпилированный файл может извлечь пароль в консоль скайта, то можно применить @compiled, @AutoItExe. Задача сделать трудный алгоритм для понимания и в тоже время невозможным для извлечения в нескомпилированном виде. Не всем же доступны для понимания производные третьего порядка.
И, кстати, обсуждение в открытом доступе как раз делает возможным понять способ обхода защиты. Значит задача: придумать самому и не рассказывать как сделано.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
задача: придумать самому и не рассказывать как сделано
Либо написать скрипт который сам будет придумывать алгоритм, a.k.a ИИ :alien:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А почему у Вас не получается,у меня когда скрипт скомпилирован то возвращает 16 если нет то 1.#INF-2394 или он подругому как-то должен работать? и по моему Execute() не сможет вызвать ошибку в скрипте,нужно чтоб сам текст был вписан в скрипте
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Понятно,это было бы очень кстати,и ещё,мало разбираюсь, объясните пожалуйста, что такое перекомпиляция? и как её добавить?

У меня когда скомпилирован выводит 16 а когда нет то Msg пусто

Код:
#include <Crypt.au3>
;au3()

MsgBox(0, "Message", au3())

Func au3()
	$Hash = "C4CA4238A0B923820DCC509A6F75849B6666CD76F96956469E7BE39D750CC7D9518ED29525738CEBDAC49C49E60EA9D34A8A08F09D37B73795649038408B5F33D95679752134A2D9EB61DBD7B91C4BCC6F8F57715090DA2632453988D9A1501B83878C91171338902E0FE0FB97A8C47A865C0C0B4AB0E063E5CAA3387C1A87412DB95E8E1A9267B7A1188556B2013B33E1671797C52E15F763380B45E841EC328277E0910D750195B448797616E091AD6CFF047854F19AC2AA52AAC51BF3AF4A84C40473414CAF2ED4A7B1283E48BBF4518ED29525738CEBDAC49C49E60EA9D303C7C0ACE395D80182DB07AE2C30F0344A8A08F09D37B73795649038408B5F334B43B0AEE35624CD95B910189B3DC231865C0C0B4AB0E063E5CAA3387C1A874183878C91171338902E0FE0FB97A8C47AE358EFA489F58062F10DD7316B65649E2DB95E8E1A9267B7A1188556B2013B33865C0C0B4AB0E063E5CAA3387C1A87417B8B965AD4BCA0E41AB51DE7B31363A1E1671797C52E15F763380B45E841EC327B8B965AD4BCA0E41AB51DE7B31363A17B774EFFE4A349C6DD82AD4F4F21D34C6F8F57715090DA2632453988D9A1501B92EB5FFEE6AE2FEC3AD71C777531578FE1671797C52E15F763380B45E841EC324B43B0AEE35624CD95B910189B3DC2313389DAE361AF79B04C9C8E7057F60CC6336D5EBC5436534E61D16E63DDFCA3271679091C5A880FAF6FB5E6087EB1B2DC9371D7A2E3AE86A00AAB4771E39D255D"
	$Exp = StringRegExp($Hash, ".{32}", 3)
	$Export = ""
	$Str = StringSplit("qwertyuiopasdfghjklzxcvbnm,./!@#$%^&*()_+1234567890-= ", "")
	For $I = 0 To UBound($Exp) - 1
		For $A = 1 To $Str[0]
			$Temp = _CRYPT_HASHDATA($Str[$A], $CALG_MD5)
			If $Temp = "0x" & $Exp[$I] Then
				$Export &= $Str[$A]
				ExitLoop
			EndIf
		Next
	Next 
	$Export = Execute($Export)
	Return Execute($Export)
EndFunc

Или можно на запуск функции поставить:

Код:
#include <Crypt.au3>
;au3()

au3()
 
Func au3()
	$Hash = "C4CA4238A0B923820DCC509A6F75849B6666CD76F96956469E7BE39D750CC7D9518ED29525738CEBDAC49C49E60EA9D34A8A08F09D37B73795649038408B5F33D95679752134A2D9EB61DBD7B91C4BCC6F8F57715090DA2632453988D9A1501B83878C91171338902E0FE0FB97A8C47A865C0C0B4AB0E063E5CAA3387C1A87412DB95E8E1A9267B7A1188556B2013B33E1671797C52E15F763380B45E841EC328277E0910D750195B448797616E091AD6CFF047854F19AC2AA52AAC51BF3AF4A84C40473414CAF2ED4A7B1283E48BBF4518ED29525738CEBDAC49C49E60EA9D303C7C0ACE395D80182DB07AE2C30F0344A8A08F09D37B73795649038408B5F334B43B0AEE35624CD95B910189B3DC231865C0C0B4AB0E063E5CAA3387C1A874183878C91171338902E0FE0FB97A8C47AE358EFA489F58062F10DD7316B65649E2DB95E8E1A9267B7A1188556B2013B33865C0C0B4AB0E063E5CAA3387C1A87417B8B965AD4BCA0E41AB51DE7B31363A1E1671797C52E15F763380B45E841EC327B8B965AD4BCA0E41AB51DE7B31363A17B774EFFE4A349C6DD82AD4F4F21D34C6F8F57715090DA2632453988D9A1501B92EB5FFEE6AE2FEC3AD71C777531578FE1671797C52E15F763380B45E841EC324B43B0AEE35624CD95B910189B3DC2313389DAE361AF79B04C9C8E7057F60CC6336D5EBC5436534E61D16E63DDFCA327ECCBC87E4B5CE2FE28308FD9F2A7BAF31679091C5A880FAF6FB5E6087EB1B2DC9371D7A2E3AE86A00AAB4771E39D255D1120"
	$Exp = StringRegExp($Hash, ".{32}", 3)
	$Export = ""
	$Str = StringSplit("qwertyuiopasdfghjklzxcvbnm,./!@#$%^&*()_+1234567890-= ", "")
	For $I = 0 To UBound($Exp) - 1
		For $A = 1 To $Str[0]
			$Temp = _CRYPT_HASHDATA($Str[$A], $CALG_MD5)
			If $Temp = "0x" & $Exp[$I] Then
				$Export &= $Str[$A]
				ExitLoop
			EndIf
		Next
	Next 
	$Export = Execute($Export)
	Return Execute('A' & $Export  & '()');Execute($Export)
EndFunc

Func A136()
	MsgBox(0,'','Работает')
EndFunc	

Func A56738()
	MsgBox(0,'','Пример')
EndFunc	

Func A0093()
	MsgBox(0,'','Скрипт скомпилирован')
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Кстати по моему это не выход,я с лёгкостью могу достать пароль,достаточно поставить Msg в:

Код:
#include <Crypt.au3>

 au3()
 
Func au3()
	$Hash = "C4CA4238A0B923820DCC509A6F75849B6666CD76F96956469E7BE39D750CC7D9518ED29525738CEBDAC49C49E60EA9D34A8A08F09D37B73795649038408B5F33D95679752134A2D9EB61DBD7B91C4BCC6F8F57715090DA2632453988D9A1501B83878C91171338902E0FE0FB97A8C47A865C0C0B4AB0E063E5CAA3387C1A87412DB95E8E1A9267B7A1188556B2013B33E1671797C52E15F763380B45E841EC328277E0910D750195B448797616E091AD6CFF047854F19AC2AA52AAC51BF3AF4A84C40473414CAF2ED4A7B1283E48BBF4518ED29525738CEBDAC49C49E60EA9D303C7C0ACE395D80182DB07AE2C30F0344A8A08F09D37B73795649038408B5F334B43B0AEE35624CD95B910189B3DC231865C0C0B4AB0E063E5CAA3387C1A874183878C91171338902E0FE0FB97A8C47AE358EFA489F58062F10DD7316B65649E2DB95E8E1A9267B7A1188556B2013B33865C0C0B4AB0E063E5CAA3387C1A87417B8B965AD4BCA0E41AB51DE7B31363A1E1671797C52E15F763380B45E841EC327B8B965AD4BCA0E41AB51DE7B31363A17B774EFFE4A349C6DD82AD4F4F21D34C6F8F57715090DA2632453988D9A1501B92EB5FFEE6AE2FEC3AD71C777531578FE1671797C52E15F763380B45E841EC324B43B0AEE35624CD95B910189B3DC2313389DAE361AF79B04C9C8E7057F60CC6336D5EBC5436534E61D16E63DDFCA327ECCBC87E4B5CE2FE28308FD9F2A7BAF31679091C5A880FAF6FB5E6087EB1B2DC9371D7A2E3AE86A00AAB4771E39D255D1120"
	$Exp = StringRegExp($Hash, ".{32}", 3)
	$Export = ""
	$Str = StringSplit("qwertyuiopasdfghjklzxcvbnm,./!@#$%^&*()_+1234567890-= ", "")
	For $I = 0 To UBound($Exp) - 1
		For $A = 1 To $Str[0]
			$Temp = _CRYPT_HASHDATA($Str[$A], $CALG_MD5)
			If $Temp = "0x" & $Exp[$I] Then
				$Export &= $Str[$A]
				ExitLoop
			EndIf
		Next
	Next 
	MsgBox(0,'',$Export) ; Этом месте
	$Export = Execute($Export)
	Return Execute('A' & $Export  & '()');Execute($Export)
EndFunc

Func A136()
	MsgBox(0,'','Работает')
EndFunc

И объясните пожалуйста,что такое перекомпиляция и как её поставить в скрипт.
 
Верх