手上有一個專案是java寫的,但是被用xjar(關於xjar是什麼可以開啟github瞭解一下)加密了,class被加密了,並且做了md5和sha1的校驗,無法替換class。專案啟動的時候有一個驗證過程,會通過將機器碼通過http請求傳送到服務端校驗是否合法,然後通過了才能啟動專案。最開始的破解思路是自己寫一個服務端,模擬返回資料,但是發現請求是https的,本地請求沒辦法通過根證照的校驗無法通過,於是開始了破解專案,尋求其他方法。
通過檢視xjar專案的原始碼發現,專案使用對稱加密演算法加密class位元組碼,專案通過一個go寫的啟動器,將祕鑰通過標準輸入流寫到jvm中,然後通過jvm的classloader動態解密位元組碼,所以是純jvm記憶體的解密。
破解思路是獲取加解密祕鑰,然後修改啟動器重新編譯,去掉md5校驗那塊,這樣就可以愉快的替換class模組,達到破解的目的了。
通過xjar.go發現啟動器只校驗了是否包含-jar,和jar的md5,所以可以寫一個簡單的php專案把標準輸入流列印出來就知道是什麼了。
首先新建 a.php
:
<?php
var_dump(file_get_contents('php://stdin'));
啟動器為xjar.exe,執行
$ xjar.exe php a.php -jar file.jar
即可在控制檯檢視到輸出的祕鑰了。
拿到祕鑰就簡單了,通過替換xjar.go中的祕鑰,然後修改xjar.go中校驗md5和sha1的邏輯,然後重新編譯啟動器。剩下的就簡單了,啟動器已經可以不校驗jar的md5值了,這時候可以解壓jar,替換其中的部分class,就可以達到破解的目的了。
結語
在除錯過程中也學會了使用 hsdb、jvisualvm等工具,使用jvisualvm也可以在堆中看到對應XjarClassLoader中對應的祕鑰,但是顯然上面通過一個php指令碼的方式更簡單。瞭解了jvm的啟動邏輯,雖然xjar在安全性上沒辦法起到很大的保障,但是在技術層面還是很牛逼的,很多地方值得學習,通過原始碼也可以學習很多。
本作品採用《CC 協議》,轉載必須註明作者和本文連結