这篇文章已经介绍了破解的缘由,本文就重点介绍一下破解的方法。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”首发