设备要求
已root的Android手机
软件要求
反编译工具
jeb、APK改之理(APK IDE)
hook工具
frida、xposed。
布局分析工具
Android Device Monitor
操作过程
脱壳
该app使用了360加固,脱壳过程和前一篇【获取某车源平台所有卖家联系方式】相同。
反编译
因为获取的dex文件不完整,使用jadx反编译会卡死,但是这不影响分析功能,所以也不去做过多的修复,可以用其他的反编译工具,只要能看到大概的代码就行了。
这里我使用了jeb和改之理,jeb用来查看java代码,改之理用来全局搜索。
首先将得到的4个dex打包成zip文件,如果直接替换apk中dex,用jeb反编译会虽然不会卡死,但是得不到代码,
然后用jeb反编译,
因为如果直接反编译dex文件,jeb每次只能反编译一个dex,而且jeb只能开一个,要想在多个dex中查找代码就要不断的关闭当前的dex再反编译其他的dex,
将他们打包成一个zip文件后,就能一次将所有dex反编译了。
改之理可以直接反编译替换dex后的apk,但是反编译出来的是smali,而自带的jd-gui反编译出来的java代码也不大友好,因此就只用来搜搜变量。
查找关键代码
首先打开app到主页,能够看到现在是没有会员的。
先随便找一个需要会员的地方,
在第一栏的机考页面,点击马上测试,然后右下角有一个全真测试,这个功能是需要会员的。
这里我们知道,点击全真测试按钮后,就会先验证是否是会员,不是会员则弹出开通会员的对话框,所以定位到该按钮的响应代码即可。
首先通过分析Android Device Monitor分析该界面的布局,找到该按钮的id,过程如下:
1.先用mprop修改手机的属性,执行以下两条命令
./mprop ro.secure 0 ./mprop ro.debuggable 1
这两条命令可能一次不能成功,就需要多执行几次,知道出现类似如下内容,
2.打开View Server,执行以下命令
service call window 1 i32 4939
得到对应的输出
3.启动App,进入需要分析的界面
4.打开Android Device Monitor,在Hierarchy Viewer窗口对布局进行查看,找到对应的控件
由上图可知,该按钮的id为start_complex_test,所以在改之理对该字符串进行全局搜索。
由搜索结果可知,除了xml和R文件,中start_complex_test就只在NewPreviewTestActivity中出现过,该类是在第二个dex文件中(如果这里不能在代码中直接找到,就需要将xml中该id对应的十六进制数字转换成十进制数字,然后进行全局搜索),
在jeb中打开classes2.dex,找到NewPreviewTestActivity类中设置响应代码的地方,
可以看到,响应点击的类是NewPreviewTestActivity$$Lambda$5,但是直接双击它没有跳转,所以该类应该在其他dex中,直接在改之理中去搜索NewPreviewTestActivity$$Lambda$5
根据搜索结果,可知NewPreviewTestActivity$$Lambda$5在classes.dex中,在jeb中打开classes.dex,找到NewPreviewTestActivity$$Lambda$5
由onClick方法可知,处理方法为NewPreviewTestActivity的lambda$initEvent$5$NewPreviewTestActivity,所以又需要回到classes2.dex中查找lambda$initEvent$5$NewPreviewTestActivity
由代码可知,当PointManager.isProUser返回true则表示该用户是会员,返回false则弹出购买会员的对话框。
所以只需hook该方法,使其永远返回true即可。
编写hook插件
hook代码如下:
public class Main implements IXposedHookLoadPackage { @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) { if (loadPackageParam.packageName.equals("com.huahua.testing")) { XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { //com.huahua.utils.PointManager.isProUser XposedHelpers.findAndHookMethod("com.huahua.utils.PointManager", loadPackageParam.classLoader, "isProUser", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult(true); } }); } }); } } }
安装重启后,打开该app,发现主页购买会员的提示已经变成会员专享资料下载了,
点击之前的全真测试,也不会弹出购买对话框了,而是直接进入测试