前言
在保证App能够正常使用的前提下,我们可以通过抓包查看是否存在抓包检测。如果可以进行抓包,我们首先进行登录代码定位,并伪造请求进行登录,然后实现App中的某个功能。本文以某嘟牛app为例,抓包结果如下:
控件定位关键代码
由于现在app开发框架相对较多,因此需要确定这个app是什么框架下进行开发的。因为区分不从的开发方式,可以快速定位关键代码位置。通过Android Studio中uiautomatorviewer.bat工具来查看app的哪个框架进行开发的,其结果如下:
我们可以观察到,该app中按钮控件ID等信息,这个app为传统的Android框架开发。然而app中做了反截屏检测,此时则无法使用这个工具,相关代码如下:
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
常用的解决办法是使用Frida hook掉该函数或调用API函数清除截屏标志:
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
确认该App为传统Android框架开发后,我们查看其是否加固。在未加固的情况下,可以直接使用进行反编译:
在反编译完成以后,可以使用t工具查看登录按钮的id,然后在找到相关的代码:
在Jadx中搜索ID,查看代码引用结果:
显然这里就是代码的关键位置:
关键代码:
登录逻辑如下:
private void login(String userName, String pwd) {
// 初始化请求返回类型为RequestResult<User>类型
this.DEFAULT_TYPE = new TypeToken<RequestResult<User>>() {
// 类的匿名内部类
}.getType();
// 清空参数列表
this.para.clear();
// 将用户名和密码放入参数列表
this.para.put("username", userName);
this.para.put("userPwd", pwd);
// 如果设备ID为空,则获取设备ID并赋值
if (TextUtils.isEmpty(DodonewOnlineApplication.devId)) {
DodonewOnlineApplication.devId = Utils.getDevId(DodonewOnlineApplication.getAppContext());
}
// 将设备类型和登录设备ID放入参数列表
this.para.put("equtype", Config.equtype);
this.para.put("loginImei", "Android" + DodonewOnlineApplication.devId);
// 发起网络请求,请求登录接口,传递参数列表和返回类型
requestNetwork("user/login", this.para, this.DEFAULT_TYPE);
}
字符串定位关键代码
抓包以后,点击登录按钮发送的数据包如下:
搜素结果如下:
也可以搜索加密的参数Encyrpt,如下图所示:
在结果较多的情况下,可以加上引号过滤一些搜索结果:
此时优先查看app包名的类
找到两个函数后,需要使用Hook或动态调试方式查看哪个方法调用了函数。
总结
可以通过这两种方式定位关键代码,然而控件的方式在有些复杂的app当中,可能离着关键代码很远。针对字符串的方式会面临字符串加密,我们在搜索字符串搜不到相应的代码。