-
-
[原创]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直播授课