首页
社区
课程
招聘
[原创]Java逆向_arthas反编译、dump class和动态修改静态变量的值
发表于: 13小时前 751

[原创]Java逆向_arthas反编译、dump class和动态修改静态变量的值

13小时前
751

简单描述

arthas是个Java诊断工具,可以在Jar程序运行的时候dump出真实的class文件,感觉这个功能对于逆向来说很有用。另外,arthas也支持反编译,但效果一般,并不比jadx-gui这些工具要好。想尝试用arthas动态调试来着,发现也不行,原生功能貌似不支持断点调试,不过可以支持ognl表达式,这是个很有潜力的特性,可以借此实现修改类静态变量的功能,但想要实现方便的断点调试,似乎还有些困难。

使用场景

有些Java壳在平时保护的好好的,静态反编译看不出源码,但是运行的时候会先解密,再加载到内存里,这种情况下就可以使用arthas来绕过保护,还原出真实的class文件。
需要说明的是,如果原始class先做了混淆,再做了加密,则dump出来的是解密了但依然有混淆的class。

环境介绍

demo.jar没有加壳,虽然加个加解密的壳可以更好的演示dump class的效果,但没有加壳。
demo类中有个静态变量a,值为123。main函数循环打印i和a的值。
图片描述
图片描述

jad反编译

jad可以反编译制定的class,但反编译效果并没有比其他工具更好,如果有壳保护会失败。

1
2
java -jar arthas-boot.jar
jad demo

图片描述
图片描述

dump真实的class文件

arthas可以dump出内存中真实的class文件。

1
dump demo

图片描述
dump出来的demo.class,可以用jadx查看效果。
图片描述

修改类静态变量的值

1
2
3
4
5
6
7
8
查看demo类有哪些静态变量
ognl '@demo@class.getDeclaredFields()'
 
查看demo类a的值
ognl '@demo@a'
 
修改demo类a的值
ognl '@demo@class.getDeclaredField("a").setInt(null, 666)'

图片描述

关于断点调试

从官方介绍来看,不支持断点调试是arthas的特性,不是缺点,因为在生产环境中调试是不可接受的事情。考虑基于arthas魔改一个版本,使支持断点调试?
图片描述

总结

本文主要介绍了arthas的3种用法,反编译、dump真实的class文件和使用ognl表达式修改类静态变量的值,其中dump真实的class文件在破解加解密壳方面比较有用。arthas是个很优秀的工具,还有更多功能值得探索。另外,是否可以魔改arthas使其支持断点调试,感觉也会是个比较有趣的问题。

参考资料

https://github.com/alibaba/arthas
https://arthas.aliyun.com/doc/
https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-basics
https://bbs.kanxue.com/thread-257207.htm

拓展阅读
jeb破解 | mc、redefine、重新编译、热patch、javaagent
https://bbs.kanxue.com/thread-257577.htm

Burpsuite破解原理 | trace、stack、watch
https://bbs.kanxue.com/thread-257231.htm
https://my.oschina.net/googlewell/blog/3156424
https://bbs.kanxue.com/thread-273274.htm

花絮补充

1.IDEA如何让编译出来的class不带符号?

Java Compiler的Javac命令行参数设置里加上-g:none参数,应用之后,随便修改个Java文件,加个换行或空格都行,然后重新编译导出即可。
图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 4小时前 被Jtian编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//