安卓抓包、反编译小试 -- 某人学2022免登录使用

查看 79|回复 10
作者:kevinqqnj   
工具:
  • Charles 4.5.6
  • jadx 1.4.2
    APP:
  • Yuan人学2022,下载: http://download.python-spider.com/yuanrenxuem106.apk

    目标:
  • 免登录使用,查看app里所有题目
  • 声明:仅作学习交流使用!

    打开APP,会提示要注册才能使用。本着能免登录、能省事就省事的原则,想办法跳过这个界面。


    image.png (114.67 KB, 下载次数: 0)
    下载附件
    2022-7-22 19:39 上传

    分析:
  • 这个APP功能是做一些安卓逆向的题目。本身app内有这些题目,所以跳过登录页面,就能使用它的功能了,不需要从服务器处下载额外资源
  • jadx反编译,查看 AndriodManifest.xml,得知apk首屏是 "com.yuanrenxue.match2022.activity.SplashActivity"
  • 抓包,使用Charles,得知登录URL为:https://appmatch.yuanrenxue.com/login。



    image.png (60.21 KB, 下载次数: 0)
    下载附件
    2022-7-22 19:45 上传

    返回值格式是json: {"status_code": "0", "message": "Account does not exist"}
    4. jadx里,发现是混淆过了,但不影响分析。在jadx里查找 “/login”,通过“查找用例”,找到处理函数:
    package

    com
    .
    yuanrenxue
    .
    match2022
    .
    fragment
    .
    other
    ;
    public

    class

    LoginFragment

    extends

    OooO0o

    implements

    View
    .
    OnClickListener



    image.png (97.35 KB, 下载次数: 1)
    下载附件
    2022-7-22 19:49 上传

    5. 写过前端的都知道,一个HTTP request,肯定要处理返回,向上翻翻,找到处理返回的函数:


    image.png (283.66 KB, 下载次数: 1)
    下载附件
    2022-7-22 19:51 上传

    里面代码很明显,如果HTTP正常返回,则:
    [Java] 纯文本查看 复制代码    public void onSuccess(o00O000.OooO0o oooO0o) {
                if (oooO0o.OooO0OO().intValue() == 0) {  //判断返回json里某值如果为0,则显示“hint_username_not_exist_or_password_error”
                    OooOOO.OooO00o(R.string.hint_username_not_exist_or_password_error);
                    ((FragmentLoginBinding) LoginFragment.this.binding).f5350OooO0O0.setEnabled(true);
                    LoginFragment.this.f5563OooO0oO.dismiss();
                    return;
                }
                //判断返回json里某值如果非0 ,则取出用户昵称Nick_name、排名Rank。然后系统转到MainActivity
                OooO0OO.OooO0oO("NICK_NAME", oooO0o.OooO00o());
                OooO0OO.OooO0oO("RANK", oooO0o.OooO0O0());
                oooO0o.OooO0o0(oooO0o.OooO0Oo().replace("\n", ""));
                LoginFragment.this.OooOoO(oooO0o.OooO0Oo());
                ((FragmentLoginBinding) LoginFragment.this.binding).f5350OooO0O0.setEnabled(true);
                LoginFragment.this.f5563OooO0oO.dismiss();
            }
    6. 那服务器返回值要包含哪些字段呢?查一下onSuccess参数的类型(o00O000.OooO0o)即可:


    image.png (146.12 KB, 下载次数: 0)
    下载附件
    2022-7-22 19:58 上传

    这是经过gson 序列化过后的返回类型,可以看到包含了4个字段。
    手动模拟一个:{"status_code": "1", "message": "hahah", "rank": "123", "nick": "kevin", "token":"aaa"}
    7. 让Charles拦截app的特定请求,返回我们手动构建的返回值:
    Charles --> 工具 --> 重写,填入以下数据:


    image.png (40.43 KB, 下载次数: 0)
    下载附件
    2022-7-22 20:00 上传

    8. 再次在app里点击登录,OK,直接进入到主界面了!


    image.png (83.39 KB, 下载次数: 1)
    下载附件
    2022-7-22 20:03 上传

    但首页题目还是空白:


    image.png (55.67 KB, 下载次数: 0)
    下载附件
    2022-7-22 20:03 上传

    9. 查看Charles抓包,发现app又向服务器POST请求了这个URL:
    https://appmatch.yuanrenxue.com/list?token=aaa


    image.png (65.06 KB, 下载次数: 1)
    下载附件
    2022-7-22 20:05 上传

    如法泡制,在jadx里查到返回类型的定义,手工写一个json数据,让Charles拦截返回这个json:
    {"status_code": "1", "data": "hahah", "rank": "8", "count": "111",}
    10. app里切换几下页面,果然,题目出现了:


    image.png (160.67 KB, 下载次数: 0)
    下载附件
    2022-7-22 20:10 上传

    而且大部分题目都可以正常打开:
    每道题对应一个URL:https://appmatch.yuanrenxue.com/app2  // 2代表第二道题
    至此,免登录使用app的目的已经达到!

    下载次数, 下载附件

  • fuyuantao520   

    来学习下! 谢谢楼主分享~!
    vms   

    谢谢分享
    Michael_Yang   

    可以把开言英语先锋版也搞定就好了
    漁滒   

    大佬可以分析一下第十题吗?做不出来,也找不到教程
    李佑辰   

    小伙子你可真刑啊! 分析一下第十题吗?做不出来
    GuiXiaoQi   

    越来越刑
    warehouse   

    太有用了。。。。。。。。
    mercy520   

    感谢分享这么好的方法
    kevinqqnj
    OP
      


    Michael_Yang 发表于 2022-7-24 11:08
    可以把开言英语先锋版也搞定就好了

    你说的这类app,资源都从服务器下传下来的,本地破解无意义
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部