APP逆向入门-某违规app分析
2023-11-30 10:28:0 Author: xz.aliyun.com(查看原文) 阅读量:3 收藏

  • 首先,他没有进行加固,这就好的多的多的多

安装

  • 打开安装后的应用,可以直接使用,我还以为要用vpn,这种是不是可以直接举报了。
  • 打开有广告界面,而且我以为会到了时间会直接跳到主界面,没想到一个过去接着是另一个广告,6~. 这里就不放图了,全得打码。
    • 通过分析AndroidManifest文件,发现启动activity是Splash0Activity ,还以为广告相关的代码也在这个activity(以往遇到的很多app的广告都是在Splash0Activity),但是看了一圈发现没有。于是请出MT管理器的activity记录器,发现是Splash0Activity (这个activity只有几秒的选择线路的画面)之后有个AdvertActivity,应该是广告的Activity。

  • 这里做的是将 **if** (position >= **this**.data.size()) 的判断取反。结果也是可以直接过掉这个广告的。
  • 修改上面跳过广告的代码后,重新编译安装会提示:请使用官方APP。应该是做了相关的检测。
  • 还是老方法,通过jadx找关键词。定位到MainActivity中的checkpackage函数,看函数名应该是没跑了。checkoutPackageName(activity) && activity.getString(R.string.app_signature).equals(getSignature(activity)); 看checkAPP的主要代码,用于检查当前包的签名和原始的是否一致,同时检查包名与原始的是否一致。

  • 这里饶过这个检测的方案也是对if进行取反,当然也可以找到什么时候调用了这个函数,直接不调用即可。

不调用checkPackage()就直接把上面这一句smali代码注释掉即可。

分析

  • 经过上面简单的分析,对整个项目也有了一定的了解。接下来分析一下登录注册,目的是找到网络请求的定义,找到服务器地址。
  • 先找登录的Activity,挺好找的,看名字就可以:LoginActivity
    • 登录需要验证码、手机号和密码。

  • 查看这个goLoginByPhone 函数。

  • @MethodInfo(name = "user/loginbyphone") 是一个自定义注解,它指定了该方法的元信息或元数据。在这种情况下,name = "user/loginbyphone" 表示该方法是用于通过手机号码进行登录的操作,其名称为 "user/loginbyphone"。

  • 然后找ApiServices,在ApiServices的定义中,看到了baseUrl的定义,就是这次分析login的目的。现在可以猜测这是所有网络请求的baseUrl。

  • 路径
    • 对路径进行爆破

PJ

  • 每次都需要登录,看看能不能修改一下,避免登录,通过对LoginActivity的调用分析,其实分析了好几个才发现华点。然后接着看goLoing的调用。如下下图,然后找几个看,发现每次调用goLoing都会用Util.isLogin() 进行判断,从函数名可以看出这是判断是否登录的函数。

  • isLogin() 判断用户信息是否为空,先试试把!=null改为null看看效果。

    public static boolean isLogin() {
           return APP.getInstance().getUserInfo() != null;
       }
    public static synchronized APP getInstance() {
           APP app2;
           synchronized (APP.class) {
               app2 = app;
           }
           return app2;
       }
    public void requestUserInfo(int uid) {
           Client.getInstance().getApiService().getUserInfo(new ReqUserInfo(uid)).subscribe(new SimpleObserver<BaseData<UserInfo>>() { // from class: com.re.ng.juu.APP.4
               @Override // com.re.ng.juu.http.SimpleObserver, io.reactivex.Observer
               public void onNext(BaseData<UserInfo> userInfoBaseData) {
                   UserInfo data = userInfoBaseData.getData();
                   if (APP.this.userInfo != null) {
                       data.setChess_url(APP.getInstance().userInfo.getChess_url());
                   }
                   APP.getInstance().userInfo = data;
                   Log.d(EventMessage.TAG, "EventBus post : " + data.getFrame());
                   EventBus.getDefault().post(new EventMessage(256, APP.this.userInfo));
                   APP.getInstance().userInfo.setPurchaseMode();
               }
           });
       }
  • 改了之后虽然可以躲过提示登录,但是很多功能都没反应。应该是有的功能需要获取你的身份,比如vip什么的。获取不到就会出问题。
  • 那就随便注册登录一下,切记不要泄露自己的隐私。测试也要在可控的环境内。
  • 会员功能破解
    • 登录后会返回UserInfo对象,网络请求的返回值就经过编码的,比较乱,这里也先不看怎么编码的了。下面四个函数就是关于vip主要的函数,把两个set都改为非0 。

  • 修改完上面的代码。可以安装,但是闪退

    • 下面是修改的使用的smali代码
    const-string v0, "1"
    iput-object v0, p0, Lcom/re/ng/juu/entity/bean/UserInfo;->vip_grade:Ljava/lang/String;
    • 后来发现是因为
    修改为:const-string v0, "1"
    iput-object v0, p0, Lcom/re/ng/juu/entity/bean/UserInfo;->vip_grade:Ljava/lang/String;
    保存后就变为了:
    const-string p0, "1"
    iput-object p0, p0, Lcom/re/ng/juu/entity/bean/UserInfo;->vip_grade:Ljava/lang/String;
    因为set函数会根据入参进行复制,所以这里要用参数寄存器p。
    所以要将上述代码修改为:
    const-string p1, "1"
    iput-object p1, p0, Lcom/re/ng/juu/entity/bean/UserInfo;->vip_grade:Ljava/lang/String;
    • 进行了上面的改正后,可以正常安装,或者修改判断是否是VIP的函数,一是改判断,而是改返回值。

由于app内容受限,app内的截图比较少,比较多的是代码分析,还请见谅!希望大家给予指导!

相关内容已经举报给有关部门


文章来源: https://xz.aliyun.com/t/13140
如有侵权请联系:admin#unsafe.sh