混淆的class文件怎么进行反编译

混淆的class文件怎么进行反编译,第1张

一般情况下Java应用的猜仔好开发者为了保护代码不被别人抄袭,在生成class文件的时候都java文件进行了混淆,这种class文件用反戚数编译工具得到的结果很难看懂,并且不能进行编译。

从研究的角度,浅析如何读懂这种反编译过来的文件。

例子一:赋值

反编译过来的代码如下:

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

这样的代码别人即使反编译了,也是很难看懂其毕郑枣中的逻辑关系的


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8148931.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存