Разборка строк из Inno Setup [Код]
Когда я компилирую проект установки Inno, [Code]
раздел также скомпилирован (как исполняемый Pascal или Pascal DLL)?
Другими словами, если кто-то распакует проект Inno Setup, сможет ли он увидеть [Code]
раздел как оригинальный исходный код (блин!:)) или как скомпилированный исполняемый файл /DLL (сложно разобрать)?
Я хотел бы вставить в [Code]
раздел некоторых строк (пароль и ключи), и я не знаю, можно ли их легко восстановить, даже с небольшим знанием обратного инжиниринга.
1 ответ
Код скомпилирован в какое-то двоичное представление (очень похоже на .NET CIL или Java bytecode).
Есть Inno Setup Unpacker (и другие), которые могут извлекать файлы из .exe
сгенерированный установкой Inno. Он может извлечь двоичное представление кода в CompiledCode.bin
(если вы используете -x -m
флаги).
Затем вы можете использовать проект Inno Setup Decompiler, который может декомпилировать / разбирать CompiledCode.bin
файл в (псевдо) код Pascal Script. Но, как и в случае с реверс-инжинирингом.NET или Java, он не даст точного кода. Декомпилированный код, возможно, даже не будет компилироваться (по крайней мере, так было в прошлый раз, когда я пытался), но он достаточно хорош, чтобы увидеть, что делает код. Кажется, сейчас у них платная версия, которая может быть лучше, чем бесплатная, которую я пробовал некоторое время назад. (Последняя версия Inno Setup Decompiler может даже напрямую извлекать код из .exe
, но он еще не был обновлен до последней версии Inno Setup [5.6.1], поэтому у меня он не работал /)
Довольно просто увидеть буквенные строки, скомпилированные в коде, даже в CompiledCode.bin
,
Например, эти учетные данные:
Username := 'secretusername';
Password := 'mysupersecretpassword';
можно увидеть, как это в CompiledCode.bin
файл:
Конечно, вы можете как-то запутать строки (как минимум, закодировать их в шестнадцатеричном формате). Но, как мы надеемся, вы знаете, что независимо от того, что вы делаете, когда (даже скомпилированный) код находится на компьютере пользователя, вы не сможете защитить его абсолютно.
Простой вспомогательный код для хранения строкового литерала в шестнадцатеричном виде:
function CryptStringToBinary(
sz: string; cch: LongWord; flags: LongWord; binary: AnsiString; var size: LongWord;
skip: LongWord; flagsused: LongWord): Integer;
external 'CryptStringToBinaryW@crypt32.dll stdcall';
const
CRYPT_STRING_HEX = $04;
function UnobfuscateString(S: string): string;
var
Size: LongWord;
Buffer: AnsiString;
begin
SetLength(Buffer, (Length(S) div 2) + 1);
Size := Length(S) div 2;
if (CryptStringToBinary(S, Length(S), CRYPT_STRING_HEX, Buffer, Size, 0, 0) = 0) or
(Size <> Length(S) div 2) then
begin
RaiseException('Error unobfuscating string');
end;
Result := Buffer;
end;
#define ObfuscateString(str S) \
Local[0] = AddBackslash(GetEnv("TEMP")) + "ObfuscatedString.pas", \
Local[1] = \
"-ExecutionPolicy Bypass -Command """ + \
"$bytes = [Text.Encoding]::ASCII.GetBytes('" + S + "'); " + \
"$s = '''' + (($bytes | foreach { $_.ToString('X2') }) -join '') + ''''; " + \
"Set-Content -Path '" + Local[0] + "' -Value $s;" + \
"""", \
Exec("powershell.exe", Local[1], SourcePath, , SW_HIDE), \
Local[2] = FileOpen(Local[0]), \
Local[3] = FileRead(Local[2]), \
FileClose(Local[2]), \
DeleteFileNow(Local[0]), \
"UnobfuscateString(" + Local[3] + ")"
(Код был протестирован на Unicode-версии Inno Setup. Однако он может работать только с паролями ASCII.)
С помощью приведенного выше кода вы можете написать это (чтобы у вас были учетные данные, легко редактируемые в исходном коде):
Username := {#ObfuscateString("secretusername")};
Password := {#ObfuscateString("mysupersecretpassword")};
Но код будет скомпилирован как:
Username := UnobfuscateString('736563726574757365726E616D65');
Password := UnobfuscateString('6D79737570657273656372657470617373776F7264');
Вы можете убедиться в этом, добавив это в конец вашего .iss
скрипт и проверка сгенерированного Preprocessed.iss
файл.
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
Поэтому, несмотря на то, что учетные данные читаются в исходном коде, они не будут сохранены буквально в скомпилированном коде:
Но опять же, это только запутывание. Любой, кто имеет хорошие навыки программирования, сможет разблокировать (расшифровать) учетные данные.