“-~~--~-~~”在混淆的 C# 代码中是什么意思?

What does "-~~--~-~~" mean in obfuscated C# code?

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

使用 JetBrains DotPeek、Visual Studio 和一些搜索和替换,我基本上能够重建一个可以进行动态分析的可执行程序。

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

-~~--~-~~

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

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;

以下面的 decompiled/obfuscated C# 语句为例:int num2 = -~~--~-~~957401313;。这是什么意思? C# 不将其识别为有效语句,但确实是反编译某些 IL 代码的结果。

  • -只是否定
  • ~ 是按位非。由于 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;

我是这样分解的:

"~-~--~~-~-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