內容介紹
最近在學習字節碼相關知識,了解到通過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這個文件
查看CensumStartupChecks的代碼邏輯,會發現真正用於判斷是否過期的邏輯在下面這個方法里面:
實際上就是一個簡單的日期判斷,我們要破解該程序,就得改寫這一部分的字節碼,最簡單就是直接在CanLoadState方法最前面插入一行代碼
return CanLoadState.SUCCESS
改寫字節碼
通過ASM來改寫字節碼,核心代碼如下:
上面的圖片中,第二張和第三張都是套用的ASM使用的模板,只有第一張圖片里面是涉及到真實修改的邏輯:
onMethodEnter中的邏輯翻譯成java代碼就是
return CanLoadState.SUCCESS;
何以見得呢?因為我是通過java代碼反推回來的。先准備好我們想要的代碼:
然后ide可以下載一個插件ASM Bytecode Outline,該插件可以生成ASM代碼
maven打包
mvn clean package
啟動censum程序的同時指定代理
java -javaagent:censum-crack.jar -jar censum-full.jar
這樣一整個過程下來之后,如果沒有其他錯,就完成了破解啦!!!
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
