inno-setup – 从Inno Setup中拆解字符串[代码]
当我编译一个Inno Setup项目时,[Code]部分也被编译(作为Pascal可执行文件或Pascal DLL)?
换句话说,如果有人解包Inno Setup项目,他可以将[Code]部分看作原始源代码(该死的!:))还是编译后的可执行文件/ DLL(难以拆解)? 我想在[Code]部分插入一些字符串(密码和密钥),我不知道它们是否很容易恢复,而且对逆向工程知之甚少. 解决方法
代码被编译成某种二进制表示(非常类似于
.NET CIL或
Java bytecode).
有Inno Setup Unpacker(以及其他),可以从Inno Setup生成的.exe中提取文件.它可以将代码的二进制表示提取到CompiledCode.bin(如果使用-x -m标志). 然后,您可以使用能够将CompiledCode.bin文件反编译/反汇编为(伪)Pascal脚本代码的Inno Setup Decompiler项目.但是,与.NET或Java的逆向工程一样,它不会为您提供准确的代码.反编译的代码甚至可能都不会编译(至少它是我最后一次尝试的时候),但它足以看到代码的功能.他们现在似乎有一个付费版本,这可能比我前一段时间试过的免费版本要好. (Inno Setup Decompiler的最新版本甚至可以直接从.exe中提取代码,但它还没有更新到最新版本的Inno Setup [5.6.1],所以它对我不起作用.) 即使在CompiledCode.bin中,也很容易看到代码中编译的文字字符串. 例如这些凭证: Username := 'secretusername'; Password := 'mysupersecretpassword'; 可以在CompiledCode.bin文件中看到这样的内容: 当然,你可以以某种方式对字符串进行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; 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) 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") 因此,尽管源代码中的凭据可读,但它们不会按字面存储到已编译的代码中: 但同样,这只是一种混淆.任何具有良好编程技能的人都可以对证书进行解组(解密). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |