内容介绍
最近在学习字节码相关知识,了解到通过ASM字节码改写技术来做破解一些软件破解,非常感兴趣,本文记录一下破解
Censum的过程(仅个人学习使用)。
之前也写过一篇暴力破解Censum的文章,采用的方式是将Censum的jar包解压出来之后直接用工具改写字节码,然后重新打包,
这种方式呢,非常暴力,而且修改麻烦。今天采用的是javaagent+asm的方式,以一种相对优雅的姿态来破解Censum。
附上之前写过的相关文章:
附上censum的jar包用于破解
https://download.csdn.net/download/fututadeyoushang/12100233
相关技术
Asm, Javaagent,Java字节码
相关工具
Arthas, Asm, ASM Bytecode Outline, jd-gui
Javaagent
Javaagent一般是一个jar文件,可以在java命令启动程序的时候通过参数-javaagent指定jar文件的位置,然后在class文件加载到JVM之前,javaagent的程序可以对指定的class或者指定的方法进行改写。
javaagent程序的有两种写法,一种是premain,这种方式会在class被加载到JVM之前就会修改字节码;另外一种方式是agentmain,是在要代理的程序启动之后通过JDK提供的attach api来远程代理,通信方式可能是信号或者Unix域套接字。
可以参考下这篇文章:
Asm
Asm一种非常流行的字节码改写技术,已经成为了字节码改写事实上的标准。
Arthas
Arthas是阿里巴巴开源的Java诊断工具。
我有过一篇使用Arthas的文章
https://mp.weixin.qq.com/s/Lo1YZagQU9kgIA0LM9R-XA
Censum
censum是一个用于查看JVM内存泄漏等问题的可视化工具。
破解
以下是相关的破解过程,包含asm代码编写,字节码查看等。
代码
完整工程代码链接:https://github.com/zhangxingr/CensumCrack
破解思路
看懂验证逻辑
要破解一个程序,首先我们要知道这个程序的验证逻辑,那么首先我们用jd-gui查看censum的jar包。
从一大堆反编译过的字节码中找到CensumStartupChecks.class这个文件
![](https://upload-images.jianshu.io/upload_images/19679566-f6c560cf166bf888.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
查看CensumStartupChecks的代码逻辑,会发现真正用于判断是否过期的逻辑在下面这个方法里面:
![](https://upload-images.jianshu.io/upload_images/19679566-3716f849fdc17dea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
实际上就是一个简单的日期判断,我们要破解该程序,就得改写这一部分的字节码,最简单就是直接在CanLoadState方法最前面插入一行代码
return CanLoadState.SUCCESS
改写字节码
通过ASM来改写字节码,核心代码如下:
![](https://upload-images.jianshu.io/upload_images/19679566-27fb8886b15d89dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19679566-e804f5e66e8675a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19679566-34542de850bf8ea4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上面的图片中,第二张和第三张都是套用的ASM使用的模板,只有第一张图片里面是涉及到真实修改的逻辑:
![](https://upload-images.jianshu.io/upload_images/19679566-a31bcebd9aff2e1a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
onMethodEnter中的逻辑翻译成java代码就是
return CanLoadState.SUCCESS;
何以见得呢?因为我是通过java代码反推回来的。先准备好我们想要的代码:
![](https://upload-images.jianshu.io/upload_images/19679566-abea6b0a7c3485c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/19679566-973a8a481b8bbf23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后ide可以下载一个插件ASM Bytecode Outline,该插件可以生成ASM代码
![](https://upload-images.jianshu.io/upload_images/19679566-e7bfcd0b2b354447.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
maven打包
mvn clean package
![](https://upload-images.jianshu.io/upload_images/19679566-088b0259bb0453e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
启动censum程序的同时指定代理
java -javaagent:censum-crack.jar -jar censum-full.jar
这样一整个过程下来之后,如果没有其他错,就完成了破解啦!!!
![](https://upload-images.jianshu.io/upload_images/19679566-60ef62c7f8f8979f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Arthas验证字节码被改写
之后可以通过arthas把CensumStartupChecks类给dump下来查看是否被改写啦。。。
关于arthas的使用可以参考我之前写过的文章
https://mp.weixin.qq.com/s/Lo1YZagQU9kgIA0LM9R-XA
参考资料
https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5c2ca222f265da611c271646
https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5c2ca217e51d4534402a493e
https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5c2ca1f051882543871d8d4a
https://juejin.im/book/5c25811a6fb9a049ec6b23ee/section/5c2ca2306fb9a04a0604faa8
书上说,天下没有不散的宴席。不要怕,书上还说了,人生何处不相逢。