混淆C#代码中-~~--~-~~符号含义及编译报错问题咨询
符号本质
这些由~和-组成的连续序列并非自定义混淆符号,属于反编译器的输出缺陷:C#原生的**一元按位取反符~和一元负号-**连续出现时,反编译器没有在运算符之间、运算符和后续操作数(数值、括号表达式)之间插入空格,直接拼接导致语法无法被C#编译器识别。
两个运算符的原生规则:
~按位补运算符:对整数的每二进制位取反,32位有符号整数下等价于-x - 1-一元负号:对整数取相反数
解决方法
两种方案可按需选择:
方案1:快速修复编译(保留原始运算逻辑)
用正则全局替换即可批量处理所有报错片段:
匹配规则:(?<=[~-])(?=[~-0-9(]),在匹配到的位置插入空格。
比如你给出的示例语句插入空格后为:
int num2 = - ~ ~ - - ~ - ~ ~ 957401313;
该语句完全符合C#语法,可直接编译,运算逻辑和原始IL完全一致。
另外你代码片段中出现的(Deobfuscate._0023_003Dz277oJx4nAbXTNVLUpThNrwpfFcLe)0)也是同类问题,在类型和0之间补空格即可:(Deobfuscate._0023_003Dz277oJx4nAbXTNVLUpThNrwpfFcLe) 0)。
方案2:化简运算优化可读性
如果不需要保留原始混淆形态,可以利用运算性质直接化简,常量运算甚至可以直接替换为最终结果:
- 连续两个按位取反可抵消:
~~x == x - 连续两个一元负号可抵消:
-(-x) == x
如果操作数是常量,也可以直接在C# Interactive中计算出整个表达式的最终值,直接替换为常量即可。
内容的提问来源于stack exchange,提问作者usr-local-ΕΨΗΕΛΩΝ
相关产品推荐
相关产品推荐

