這篇文章已經介紹了破解的緣由,本文就重點介紹一下破解的方法。java
在動手破解一款app以前最好作一下校驗,看下須要破解的功能是否在服務端作了校驗,若是是服務端作校驗了,那就不必動手破解了,不然,就是破解成功,最後卻發現是白費力氣了。git
驗證服務端是否作了校驗,最好的方法就是抓包,修改接口的返回值,驗證是否能夠達到本身想要的效果,若是能達到想要的效果,這時就能夠動手來破解app了。github
我用的抓包工具是Charles
,關於怎麼抓包這裏就不說了,有疑問的話,能夠經過文末的方式聯繫我,這裏就直接看抓包的結果,如圖json
code
是用來判斷狀態的,而
message
是用來顯示提示信息的,從這個接口中能夠發現提示信息是「流量不足」,
code
則是「10109」,看下其餘接口的返回值,發現
code
的值是0,因而就把這個接口的
code
的返回值修改成「0」,看下可否繼續加速,結果並無使人失望,修改後人仍能繼續加速。到這裏,就能知道破解的點是什麼了,只要將代碼中獲取
code
的結果改成0便可。
用jadx-gui
工具來查看apk的代碼,直接搜索接口名稱,結果以下圖api
public static Response a(String str, long j) {
try {
return d.newCall(new Request.Builder().url("https://api.enfi.vip/api/consumeTraffic").addHeader("Authorization", str).post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), a(str, j, true, SystemClock.currentThreadTimeMillis()))).build()).execute();
} catch (Exception unused) {
return null;
}
}
複製代碼
能夠發現上面的代碼只是接口請求,咱們須要的是哪裏使用了這個接口的返回值便是哪裏調用了這個接口。查看的方法是:利用apktool直接反編譯apk,而後將smali代碼導入AndroidStudio,找到上面的代碼,按下Alt(Option)+F7查看哪裏調用了這個方法。搜索到的結果以下app
隨便進入一個文件,查看相應的代碼,這裏進入EnfiActivity
中查看,相關代碼以下
invoke-static {v4}, Lcom/enficloud/mobile/a/c;->a(Ljava/lang/String;)Lokhttp3/Response;
move-result-object v0
if-eqz v0, :cond_1
.line 682
invoke-virtual {v0}, Lokhttp3/Response;->isSuccessful()Z
move-result v12
if-eqz v12, :cond_1
.line 686
:try_start_0
invoke-virtual {v0}, Lokhttp3/Response;->body()Lokhttp3/ResponseBody;
move-result-object v0
invoke-virtual {v0}, Lokhttp3/ResponseBody;->string()Ljava/lang/String;
move-result-object v0
.line 688
new-instance v12, Lorg/json/JSONObject;
invoke-direct {v12, v0}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V
const-string v0, "code"
.line 689
invoke-virtual {v12, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
複製代碼
因爲方法太長,只複製了部分重要的代碼,重點看下這句代碼工具
.line 689
const-string v0, "code"
invoke-virtual {v12, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
複製代碼
這句代碼的含義就是經過JsonObject來獲取返回的json中code
的值的,咱們要修改的就是這個code
的值,怎麼作呢?我這裏採用的是代碼注入的方法,直接拿我本身寫的代碼的返回值。我寫的代碼以下post
public class RegisterGetLong {
//這部分代碼是修改用戶剩餘流量的
public static long getLong(String value) {
return 1024000000000l;
}
//這裏的代碼是修改code的返回值的
public static int getInt(String value) {
return 0;
}
}
複製代碼
還須要寫一份調用的代碼,代用的代碼以下學習
public class Test {
public static void main(String[] args) {
RegisterGetLong.getLong("quantity");
RegisterGetLong.getInt("code");
}
}
複製代碼
上面的是Java代碼,須要轉換成Smali的語法,能夠經過AndroidStudio安裝Code2Smali插件來轉換,因爲轉換成Smali語法後代碼不少,因此這裏只看Test
類轉換後的代碼,以下ui
.class public Lsmali/com/enficloud/mobile/activity/Test;
.super Ljava/lang/Object;
.source "Test.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 5
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void .end method
.method public static main([Ljava/lang/String;)V
.registers 2
.param p0, "args" # [Ljava/lang/String;
.prologue
.line 7
const-string v0, "quantity"
invoke-static {v0}, Lsmali/com/enficloud/mobile/RegisterGetLong;->getLong(Ljava/lang/String;)J
.line 8
const-string v0, "code"
invoke-static {v0}, Lsmali/com/enficloud/mobile/RegisterGetLong;->getInt(Ljava/lang/String;)I
.line 9
return-void .end method
複製代碼
這裏只須要這句
invoke-static {v0}, Lsmali/com/enficloud/mobile/RegisterGetLong;->getInt(Ljava/lang/String;)I
複製代碼
代碼,將上面的經過JsonObject來獲取返回的json中code
的值的代碼換成這句便可,這樣獲取到的code
的值就一直爲0了。而後就是回編譯,簽名,安裝及驗證了。
這裏只拿修改code
的值來舉例,固然,還能夠修改用戶剩餘流量的值,文中已有部分代碼,修改的原理都同樣。最後看下破解的成果
本文的目的但願你們經過文中的方法來提高本身的逆向能力,若是實在水平有限,想體驗一下破解後的軟件,本文開始的一篇文章中有獲取的方法。
聲明:破解軟件只爲交流學習使用,不會涉及任何商業用途。如誰用於商業用途,後果自負。
這裏有一羣志趣相投相投的人,掃碼,備註「逆向」,拉你進逆向交流羣
本文已由公衆號「AndroidShared」首發