前段時間項目上線,單機游戲,想着肯定是會被破解的,但沒想到,分分鍾就被破了,游戲數據也是相當的差,於是閑暇時,也自己研究下安卓的破解。
個人觀點(裝一下X):所謂反編譯和破解付費等都只應用於學習交流,發布出去,就有點太不尊重他人勞動成果了。
使用工具:(當然首先得配好java環境,這是廢話)
apktool : 資源文件獲取,可以提取出圖片文件和布局文件
dex2jar : 得到java源碼(將classes.dex 轉化為jar 文件)
jd-gui : 查看轉化得到的jar文件的源碼
一、 解包,打包
命令行,輸入 java -jar apktool.jar d -f test.apk (此處我用的apktool為最新版本)
此時可以看到解包出的文件,smali 就是java代碼了,當然里這里是smali代碼,類似於匯編,但需要修改原本的代碼的話,還得去改它。
改好后,只需要 java -jar apktool.jar -b test
其中test 為我們剛剛解包的文件夾名,就可以得到重新打包的apk了,位於dist文件夾下。
當然此時的apk是不帶簽名的。需要安裝得自己再對apk進行簽名,相關工具也挺多的。
二、得到java源碼
自行解壓原apk文件,得到其中的classes.dex 文件
運行命令 d2j-dex2jar.bat classes.dex (這里我用的是最新版的dex2jar-2.0版本,以前版本bat可能名字有點不一樣)
將在 d2j-dex2jar.bat 目錄下得到 classes-dex2jar.jar 文件
然后再用jd_gui工具打開這個jar文件就可以看到java源代碼了,但可以很多apk進行混淆以后,代碼后變得很難閱讀。
很多沒有做過多防護的游戲,很可能就這樣就可以簡單看到代碼了。這樣豈不是所有人都在裸奔了,事實當然不可能這樣子。通過加密,可以做到讓你得不到所有的smali和java源碼。可以參考下面這篇文章對app加密
參考:http://blog.csdn.net/chengyingzhilian/article/details/38372601
但個人認為,網絡游戲本身肯定是不會有什么問題,但單機游戲,短代支付這種,付費文件都是在本地,沒有二次驗證的付費,即使所有地方都加密了,替掉計費文件不就一樣算是破解了嗎?
以下為smali的基礎語法
.field private isFlag:z 定義變量
.method 方法
.parameter 方法參數
.prologue 方法開始
.line 12 此方法位於第12行
invoke-super 調用父函數
const/high16 v0, 0x7fo3 把0x7fo3賦值給v0
invoke-direct 調用函數
return-void 函數返回void
.end method 函數結束
new-instance 創建實例
iput-object 對象賦值
iget-object 調用對象
invoke-static 調用靜態函數
條件跳轉分支:
"if-eq vA, vB, :cond_**" 如果vA等於vB則跳轉到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等於vB則跳轉到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小於vB則跳轉到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大於等於vB則跳轉到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大於vB則跳轉到:cond_**
"if-le vA, vB, :cond_**" 如果vA小於等於vB則跳轉到:cond_**
"if-eqz vA, :cond_**" 如果vA等於0則跳轉到:cond_**
"if-nez vA, :cond_**" 如果vA不等於0則跳轉到:cond_**
"if-ltz vA, :cond_**" 如果vA小於0則跳轉到:cond_**
"if-gez vA, :cond_**" 如果vA大於等於0則跳轉到:cond_**
"if-gtz vA, :cond_**" 如果vA大於0則跳轉到:cond_**
"if-lez vA, :cond_**" 如果vA小於等於0則跳轉到:cond_**