Syn*_*ech 3 c c++ ternary-operator deobfuscation
在nanodns的源代码中,有一个非典型的三元运算符用于尝试减小代码的大小:
/* If the incoming packet has an AR record (such as in an EDNS request),
* mark the reply as "NOT IMPLEMENTED"; using a?b:c form to save one byte*/
q[11]?q[3]|=4:1;
Run Code Online (Sandbox Code Playgroud)
这条线的作用并不明显.乍一看,它看起来像是为两个数组元素之一赋值,但事实并非如此.相反,它似乎是或者是一个数组元素,或者什么都不做(运行"命令" 1
).
看起来它应该是这行代码的替代品(确实长一个字节):
if(q[11])q[3]|=4;
Run Code Online (Sandbox Code Playgroud)
字面上的等价物是这样的:
if (q[11])
q[3]|=4;
else
1;
Run Code Online (Sandbox Code Playgroud)
三元运算符通常用作表达式的一部分,因此将其用作独立命令似乎很奇怪.加上看似不合适的地方1
,这条线几乎可以作为混淆代码.
我做了一个快速测试,并能够编译和运行一个C(++)程序,数据常量为"命令",如void main() {0; 'a'; "foobar"; false;}
.它似乎是 一种nop命令,但我找不到任何关于这种用法的信息 - 谷歌 不太适合 这种 类型的 搜索 查询).
任何人都可以解释它究竟是什么以及它是如何工作的?
在C和C++中,任何表达式都可以通过放在;
最后来表达.
另一个例子是表达式x = 5
可以成为一个语句:x = 5;
.希望你同意这是一个好主意.
它会不必要地使语言复杂化,试图"禁止"某些表达式子集;
来自它们之后.此代码不是很有用,但它是合法的.