每日一技——Java 利用 unicode 编码执行代码

首先来看看下面的代码,简单到 main 方法中只有一行注释。

1
2
3
public static void main(String[] args) {
// \u000d System.out.println("Hello world!");
}

然而,这段代码在运行后会输出:

1
Hello world!

那么这究竟是怎么回事呢?

其实原理就在于大家熟悉的 unicode 编码,上面的 \u000d 就是一个 unicode 转义字符,它所表示的是一个换行符。而 java 中的编译器,不仅会编译代码,还会解析 unicode 编码将它替换成对应的字符。所以说,上面的代码解析完后实际是这样的:

1
2
3
4
public static void main(String[] args) {
//
System.out.println("Hello world!");
}

这样,就能解释为什么能够执行注释中的语句了。

当然,你也可以把代码写成以下这个样子:

1
2
3
4
5
public static void main(String[] args) {
int a=1;
// \u000d \u0061\u002b\u002b\u003b
System.out.println(a);
}

执行结果会打印 2,同理,因为后面的unicode 编码的转义后表示的是a++;


你这么写的话客户如果懂点代码,看一下就穿帮了啊,但是你如果写成下面这样,大部分估计都以为这是一段乱码:

1
//\u000d\u0054\u0068\u0072\u0065\u0061\u0064\u002e\u0073\u006c\u0065\u0065\u0070\u0028\u0032\u0030\u0030\u0030\u0029\u003b

这个代码没个几十年的功力真看不出来这里执行的是sleep,简直完美。


每日一技——Java 利用 unicode 编码执行代码
https://zuanshifengling.github.io/2023/编程/Java/每日一技——Java利用unicode编码执行代码/
作者
UUUP-Zh
发布于
2023年7月27日
许可协议