【问题标题】:What does "-~~--~-~~" mean in obfuscated C# code?混淆的 C# 代码中的“-~~---~-~~”是什么意思?
【发布时间】:2021-06-10 15:22:16
【问题描述】:

我正在寻找一些 C# 代码中的潜在逻辑炸弹,它被混淆了。

使用 JetBrains DotPeek、Visual Studio 和一些 search&replace,我能够在很大程度上重建一个可执行程序,可以进行一些动态分析。

问题:唯一不能编译的部分是下面的语句,或者不管它是什么

-~~--~-~~

示例:(取自代码中非常不同的地方

short num11 = (short)((int)Deobfuscate._0023_003Dzv2V9Fh_V8ugFUxzftdmW5kq_KcfL._0023_003DzRw6ZUmZ68LAF2yi85xpB68sAa34J() ^ (int)(short)-~~--~-~~-~(995664381 ^ num1 ^ num2));
if ((Deobfuscate._0023_003DzorSRCcTOYKrh3x9df3y4zTUV7xtN & (Deobfuscate._0023_003Dz277oJx4nAbXTNVLUpThNrwpfFcLe) - ~~-~-~-~(-1146824238 - num1 - num2)) == (Deobfuscate._0023_003Dz277oJx4nAbXTNVLUpThNrwpfFcLe)0)
                Deobfuscate._0023_003Dz2gVGGuaOv4QwjTSyzGr7X5yxc453 = (-995626251 ^ num1) + num2;

int[] numArray = new int[4]
  {
    0,
    0,
    0,
    ~-~--~~-~-1863408518
  };

  numArray[1] = -~~--~-~~105240205;
  numArray[2] = -~~--~~-~-~445034824;
  numArray[0] = ~--~~--~~-~-393837398;
  int f6EjAc8IXjjzuWiO4 = this._0023_003Dz14FRLF6EjAC8_iXJjzuWiO4_003D;
  int tUvT87zJtuOmYrdE = this._0023_003Dzwdghyzouofs_0024tUVT87zJtuOmYRdE;
  int num1 = -~-~-~~-~1640531528;
  int num2 = -~~--~-~~957401313;

以下面的反编译/混淆 C# 语句为例:int num2 = -~~--~-~~957401313;。这是什么意思? C# 不认为它是一个有效的语句,但它确实是反编译一些 IL 代码的结果。

【问题讨论】:

  • IL 中有效标识符的规则比 C# 中的规则更广泛——这些可能是无法转换回 C# 的有效 IL 标识符
  • 如果做了多个否定,应该有括号将它们分开,反编译器没有这样做有点糟糕:-~~-(-~-~~957401313)
  • 正如@HansKesting 所说,ILs 关于变量名的规则比 C# 灵活一点。鉴于代码包含Deobfuscate,它可能是故意这样做的,以使其难以进行逆向工程。
  • @phuzi Deobfuscate 令牌是我的。一旦发现有意义的东西,我就会手动重命名每个成员。 Deobfuscate 是我的任务的根/目标元素

标签: c# obfuscation decompiling


【解决方案1】:
  • - 只是否定
  • ~ 按位非。由于 C# 需要二进制补码整数表示,所以 ~x == -x - 1 表示所有 X。
  • -- 是自减运算符,但它仅对左值有效,而数字文字则无效。我认为这是反编译器中忘记分隔减号的错误。

因此,您最后一段代码的稍微去混淆的版本是:

numArray[1] = -105240204;
numArray[2] = -445034826;
numArray[0] = 393837396;
int f6EjAc8IXjjzuWiO4 = this._0023_003Dz14FRLF6EjAC8_iXJjzuWiO4_003D;
int tUvT87zJtuOmYrdE = this._0023_003Dzwdghyzouofs_0024tUVT87zJtuOmYRdE;
int num1 = -1640531527;
int num2 = -957401312;

【讨论】:

  • 您的意思可能是“反编译器中的错误”?
  • 在添加了几个括号之后,ReSharper 添加了一个快速提示“转换为常量值”,产生了结果-105240204
【解决方案2】:

我是这样分解的:

“~-~--~~-~-1863408518”(从左到右)

1111 1111 1111 1111 1111 1111 1111 1111 1001 0000 1110 1110 1010 0100 0111 1010 = -1863408518 
                                        0110 1111 0001 0001 0101 1011 1000 0101 (NOT)
1111 1111 1111 1111 1111 1111 1111 1111 1001 0000 1110 1110 1010 0100 0111 1011 (-)
                                        0110 1111 0001 0001 0101 1011 1000 0100 (NOT)
1111 1111 1111 1111 1111 1111 1111 1111 1001 0000 1110 1110 1010 0100 0111 1011 (NOT)
                                        0110 1111 0001 0001 0101 1011 1000 0101 (-)
1111 1111 1111 1111 1111 1111 1111 1111 1001 0000 1110 1110 1010 0100 0111 1011 (-)
                                        0110 1111 0001 0001 0101 1011 1000 0100 (NOT)
1111 1111 1111 1111 1111 1111 1111 1111 1001 0000 1110 1110 1010 0100 0111 1100 (-)
                                        0110 1111 0001 0001 0101 1011 1000 0011 (NOT)

110 1111 0001 0001 0101 1011 1000 0011 = 1,863,408,515

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2020-08-22
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多