【发布时间】:2011-09-29 08:21:15
【问题描述】:
在代码中隐藏文字值的主要现有方法是什么,以便仅使用 hexdumper 或反编译器就不容易追踪它们?
例如,而不是这样编码:
static final int MY_VALUE = 100;
我们可以:
static final int MY_VALUE = myFunction1();
private int myFunction1(){
int i = 23;
i += 8 << 4;
for(int j = 0; j < 3; j++){
i-= (j<<1);
}
return myFunction2(i);
}
private int myFunction2(int i){
return i + 19;
}
这只是我们尝试做的一个例子。 (是的,我知道,编译器可能会对其进行优化并预先计算常量)。
免责声明:我知道这根本不会提供任何额外的安全性,但它会使逆向工程的代码更加晦涩(或有趣)。这样做的目的只是迫使攻击者调试程序,并在上面浪费时间。请记住,我们这样做只是为了好玩。
【问题讨论】:
-
您的示例足以隐藏实际值。解决方案的另一半是剥离可执行文件以删除符号,从而更难进行逆向工程(但也更难调试),或者至少使用不显示您试图隐藏某些内容的函数名称。
-
您的示例代码很复杂但无条件。在(显然)外部因素上添加条件可能是一种有用的附加混淆技术。就像在一些初始化代码中将全局设置为零,然后检查它是否是偶数,如果不是,对
i进行不同的(无用的,从未达到过的)计算。
标签: literals security-by-obscurity hard-coding