【发布时间】: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