加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:30:48 所属栏目:大数据 来源:网络整理
导读:当我编译一个Inno Setup项目时,[Code]部分也被编译(作为Pascal可执行文件或Pascal DLL)? 换句话说,如果有人解包Inno Setup项目,他可以将[Code]部分看作原始源代码(该死的!:))还是编译后的可执行文件/ DLL(难以拆解)? 我想在[Code]部分插入一些字符串(密码
当我编译一个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文件中看到这样的内容:

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;
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")

因此,尽管源代码中的凭据可读,但它们不会按字面存储到已编译的代码中:

enter image description here

但同样,这只是一种混淆.任何具有良好编程技能的人都可以对证书进行解组(解密).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读