从研究的角度,浅析如何读懂这种反编译过来的文件。
例子一:赋值
反编译过来的代码如下:
Node node
Node node1 = _$3.getChildNodes().item(0)
node1
node1
JVM INSTR swap
node
getChildNodes()
0
item()
getChildNodes()
0
item()
getNodeValue()
String s
s
原始语句:
Node node
Node node1 = currDocument.getChildNodes().item(0)
node = node1
String s = node.getChildNodes().item(0).getChildNodes().item(0).getNodeValue()
注解:
JVM INSTR swap //赋值语句
练习:
String s1
String s8 = node.getChildNodes().item(1).getChildNodes().item(0).getNodeValue()
s8
s8
JVM INSTR swap
s1
10
Integer.parseInt()
int i
i
例子二:不带参穗铅数创建对象
反编译过来的代码如下:
JVM INSTR new #244
JVM INSTR dup
JVM INSTR swap
CrossTable()
CrossTable crosstable
crosstable
原始语句:
CrossTable crosstable = new CrossTable()
注解:
练习:
JVM INSTR new #246
JVM INSTR dup
JVM INSTR swap
Database()
Object obj
obj
例子三:带参数创建对象
反编译过来的代码如下:
JVM INSTR new #262
JVM INSTR dup
JVM INSTR swap
String.valueOf(s2)
StringBuffer()
s.substring(j, i)
append()
s6
append()
toString()
s2
原始语句:
s2 = (new StringBuffer(String.valueOf(s2))).append(s.substring(j, i)).append(s6).toString()
注解:
此语句实际上是:s2 += s.substring(j, i) + s6
练习:
例子四:for循环
反编译过来的代码如下:
int k = 0
goto _L4
_L8:
...
k++
_L4:
if(k <as.length) goto _L8else goto _L7
原始语句:
for(int k=0k <as.lengthk++)
{
...
}
注解:
例子五:while循环
反编译过来的代码如下:
String s1 = ""
goto _L1
_L3:
JVM INSTR new #262
JVM INSTR dup
JVM INSTR swap
String.valueOf(s1)
StringBuffer()
_$2(resultset, s, l)
append()
toString()
s1
_L1:
if(resultset.next()) goto _L3else goto _L2
原始语句:
String s1 = ""
while(resultset.next())
{
s1 = s1 + resultSetToString(resultset, s, l)
}
可以使用代码混淆是对Class文件进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能(语义)。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义。从理论上来说,如果有足够的时间,被混淆的代码仍然可能被破解,甚至目前有些人正在研制反混淆的工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还李银好是能够很好地防止反编译。
app开发完后,最好做一下扫描和加固,应用扫描可以通过静态哪铅代码分析、动态数据跟踪,定位出风险代码,同时监控敏感数据的异常行为。
加固可以在一定程度上保护自己核心代码算法,提高破搏睁解/盗版/二次打包的难度,缓解代码注入/动态调试/内存注入攻击等。
目前市面上有很多第三方加固的平台, 如果新应用发布前需要扫描或者加固的话,可以先试试免费的,例如腾讯御安全,建议自己先去扫描测试下。
混淆的作用并不是使手拆class文件不能被反编译混淆的作用是使反编译的代码更难让人阅读,比如一些计算金钱的敏感逻辑里有如下的代码(新金额=旧金丛桥额*某个倍率):
double newMoney=oldMoney*rate
如果这样的代码直接编译成class文件,别人反编译这个class文件就能很清楚的看到金钱的计算关系,混淆后代码可能就变成这样的了:
double a=b*c
这样的代码别人即使反编译了,也是很难看懂其毕郑枣中的逻辑关系的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)