-
-
安卓抓包、反编译小试 -- 某人学2022免登录使用
-
发表于:
2022-7-22 20:27
4543
-
安卓抓包、反编译小试 -- 某人学2022免登录使用
工具:
Charles 4.5.6
jadx 1.4.2
APP:
Yuan人学2022,下载: 8feK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3c8G2N6$3&6D9L8$3q4V1i4K6u0W2M7s2W2@1K9r3!0F1i4K6u0V1M7%4m8A6k6r3g2J5i4K6u0W2j5$3!0E0i4K6u0r3P5i4g2S2L8Y4u0W2L8Y4S2#2k6h3@1I4x3o6k6Q4x3X3g2S2M7r3D9`.
目标:
免登录使用,查看app里所有题目
声明:仅作学习交流使用!
打开APP,会提示要注册才能使用。本着能免登录、能省事就省事的原则,想办法跳过这个界面。
分析:
这个APP功能是做一些安卓逆向的题目。本身app内有这些题目,所以跳过登录页面,就能使用它的功能了,不需要从服务器处下载额外资源
jadx反编译,查看 AndriodManifest.xml,得知apk首屏是 "com.yuanrenxue.match2022.activity.SplashActivity"
抓包,使用Charles,得知登录URL为:461K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2m8E0j5i4c8U0K9q4)9J5k6i4W2#2j5h3&6J5k6h3&6^5N6h3g2Q4x3X3g2U0L8$3#2Q4x3V1k6D9L8$3N6A6L8W2!0q4x3#2)9^5x3q4)9^5x3R3`.`.

返回值格式是json: {"status_code": "0", "message": "Account does not exist"}
jadx里,发现是混淆过了,但不影响分析。在jadx里查找 “/login”,通过“查找用例”,找到处理函数:
package com.yuanrenxue.match2022.fragment.other;public class LoginFragment extends OooO0o implements View.OnClickListener

写过前端的都知道,一个HTTP request,肯定要处理返回,向上翻翻,找到处理返回的函数:
里面代码很明显,如果HTTP正常返回,则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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();
}
|
- 那服务器返回值要包含哪些字段呢?查一下onSuccess参数的类型(o00O000.OooO0o)即可:
这是经过gson 序列化过后的返回类型,可以看到包含了4个字段。
手动模拟一个:{"status_code": "1", "message": "hahah", "rank": "123", "nick": "kevin", "token":"aaa"}
但首页题目还是空白:

- 查看Charles抓包,发现app又向服务器POST请求了这个URL:
695K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2m8E0j5i4c8U0K9q4)9J5k6i4W2#2j5h3&6J5k6h3&6^5N6h3g2Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9i4y4@1i4K6y4r3N6r3!0C8k6h3&6Q4x3@1c8S2j5h3p5`.
因为我们用的是假token,所以服务器未返回!
如法泡制,在jadx里查到返回类型的定义,手工写一个json数据,让Charles拦截返回这个json:
{"status_code": "1", "data": "hahah", "rank": "8", "count": "111",}
- app里切换几下页面,果然,题目出现了:

而且大部分题目都可以正常打开:
每道题对应一个URL:037K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2m8E0j5i4c8U0K9q4)9J5k6i4W2#2j5h3&6J5k6h3&6^5N6h3g2Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7s2l9J5 // 2代表第二道题
至此,免登录使用app的目的已经达到!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课