gpt4 book ai didi

inno-setup - 从 Inno Setup [代码] 中拆卸字符串

转载 作者:行者123 更新时间:2023-12-04 18:01:20 25 4
gpt4 key购买 nike

当我编译 Inno Setup 项目时,[Code]部分也被编译(作为 Pascal 可执行文件或 Pascal DLL)?

换句话说,如果有人解压一个 Inno Setup 项目,他能看到 [Code]部分作为原始源代码(该死!:))或作为编译的可执行文件/DLL(难以反汇编)?

我想插入[Code]部分字符串(密码和 key ),我不知道它们是否也可以轻松恢复,而对逆向工程知之甚少。

最佳答案

代码被编译成某种二进制表示(非常类似于 .NET CILJava bytecode )。
Inno Setup Unpacker (和其他),它可以从 .exe 中提取文件由 Inno Setup 生成。它可以将代码的二进制表示提取到CompiledCode.bin (如果您使用 -x -m 标志)。
然后你可以使用能够反编译/反汇编 CompiledCode.bin 的 Inno Setup Decompiler 项目。文件转换为(伪)Pascal Script 代码。但与 .NET 或 Java 的逆向工程一样,它不会为您提供准确的代码。反编译的代码甚至可能无法编译(至少我上次尝试时是这样),但足以看到代码的作用。他们现在似乎有付费版本,这可能比我前段时间尝试的免费版本更好。 (最新版本的 Inno Setup Decompiler 甚至可以直接从 .exe 中提取代码,但它还没有更新到最新版本的 Inno Setup [5.6.1],所以它对我不起作用。)
(Inno Setup Decompiler 站点已经消失,但它并没有改变在技术上可以反编译/反汇编已编译代码的事实)

即使在 CompiledCode.bin 中,也很容易看到代码中编译的文字字符串。 .
例如这些凭据:

Username := 'secretusername';
Password := 'mysupersecretpassword';
可以在 CompiledCode.bin 中看到这样的文件:
enter image description here
当然,你可以 obfuscate以某种方式字符串(至少对它们进行十六进制编码)。但正如你所希望的, 不管你做什么,一旦(甚至编译)代码在用户的机器上,你真的没有办法绝对保护它。
一个简单的支持代码来存储十六进制编码的字符串文字:
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;
Len: Integer;
begin
SetLength(Buffer, (Length(S) div 2) + 1);
Len := Length(S);
Size := Len div 2;
if (CryptStringToBinary(S, Len, 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 version of Inno Setup 上进行了测试。不过,它只能使用 ASCII 密码。)
借助上面的代码,您可以编写以下代码(这样您就可以在源代码中轻松编辑凭据):
Username := {#ObfuscateString("secretusername")};
Password := {#ObfuscateString("mysupersecretpassword")};
但是代码将被编译为:
Username := UnobfuscateString('736563726574757365726E616D65');
Password := UnobfuscateString('6D79737570657273656372657470617373776F7264');
您可以通过将其添加到 .iss 的末尾来验证这一点。脚本并检查生成的 Preprocessed.iss文件。
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
因此,尽管凭据在源代码中是可读的,但它们不会按字面意思存储到编译代码中:
enter image description here
但同样,这只是一种混淆。任何具有良好编程技能的人都能够对凭据进行混淆(解密)。

关于inno-setup - 从 Inno Setup [代码] 中拆卸字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49194957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com