这个步骤可以用Android Crack Tool上执行,执行成功之后,使用jdgui打开 搜索关键字Xml4Android_relevantPage
,获取详情页
刷新详情页发现Logcat中有日志
日志中有contetn 原文
进行搜索,发现token和参数加密都是native实现的RSA加密,
public T a(Object paramObject, String paramString1, UserInfoDto paramUserInfoDto, String paramString2, b paramb)
{
try
{
paramString1 = paramString1.split(“\?”);
String str2 = paramString1[1];
String str1 = a(paramString1[0]);
paramString1 = new java/lang/StringBuilder;
paramString1.();
paramString1.append(str1);
paramString1.append(“?appversion=”);
paramString1.append(AppUtils.getAppversion());
paramString1.append(“&Type=Android”);
paramString1 = paramString1.toString();
str1 = paramString1;
if (!TextUtils.isEmpty(paramString1))
{
str1 = paramString1;
if (paramString1.contains(“http://client4ip”)) {
str1 = paramString1.replace(“http://client4ip”, “https://client4ip”);
}
}
if (!TextUtils.isEmpty(paramString2))
{
paramString1 = paramb.d(paramString2);
}
else
{
if (!TextUtils.isEmpty(paramUserInfoDto.getUsername())) {
paramUserInfoDto.setUsername(paramUserInfoDto.getUsername().toLowerCase());
}
if (!TextUtils.isEmpty(paramUserInfoDto.getPassword())) {
paramUserInfoDto.setPassword(paramUserInfoDto.getPassword().toLowerCase());
}
if (!TextUtils.isEmpty(paramUserInfoDto.getVerifyCode())) {
paramUserInfoDto.setVerifyCode(paramUserInfoDto.getVerifyCode().toLowerCase());
}
if (!TextUtils.isEmpty(paramUserInfoDto.getUsername()))
{
paramString2 = paramb.a(paramUserInfoDto);
paramString1 = paramb.d(paramString2);
}
else
{
paramString1 = new java/lang/StringBuilder;
paramString1.();
paramString1.append(System.currentTimeMillis());
paramString1.append(“”);
paramString2 = MD5.MD5(paramString1.toString());
paramString1 = paramb.d(paramString2);
}
}
paramUserInfoDto = m.a().b(“SP_UID”);
if (!TextUtils.isEmpty(m.a().b(“username”))) {
paramUserInfoDto = m.a().b(“username”);
}
Object localObject = paramUserInfoDto;
if (TextUtils.isEmpty(paramUserInfoDto))
{
localObject = j.a();
m.a().a(“SP_UID”, (String)localObject);
}
paramUserInfoDto = new java/lang/StringBuilder;
paramUserInfoDto.();
paramUserInfoDto.append(str2);
paramUserInfoDto.append(“&uuid=”);
paramUserInfoDto.append((String)localObject);
localObject = paramUserInfoDto.toString();
paramUserInfoDto = (UserInfoDto)localObject;
if (!TextUtils.isEmpty((CharSequence)localObject))
{
paramUserInfoDto = (UserInfoDto)localObject;
if (!((String)localObject).contains(“time=”))
{
paramUserInfoDto = new java/lang/StringBuilder;
paramUserInfoDto.();
paramUserInfoDto.append((String)localObject);
paramUserInfoDto.append(“&time=”);
paramUserInfoDto.append(URLEncoder.encode(TimeUtils.getNowString(), “gb2312”));
paramUserInfoDto = paramUserInfoDto.toString();
}
}
localObject = paramUserInfoDto;
if (!TextUtils.isEmpty(paramUserInfoDto))
{
localObject = paramUserInfoDto;
if (!paramUserInfoDto.contains(“appversion=”))
{
localObject = new java/lang/StringBuilder;
((StringBuilder)localObject).();
((StringBuilder)localObject).append(paramUserInfoDto);
((StringBuilder)localObject).append(“&appversion=”);
((StringBuilder)localObject).append(AppUtils.getAppversion());
((StringBuilder)localObject).append(“&Type=Android”);
localObject = ((StringBuilder)localObject).toString();
}
}
paramUserInfoDto = new java/lang/StringBuilder;
paramUserInfoDto.();
paramUserInfoDto.append(“content 原文 “);
paramUserInfoDto.append((String)localObject);
g.a(new Object[] { paramUserInfoDto.toString() });
paramUserInfoDto = paramb.a((String)localObject, paramString2);
paramString2 = new com/lzy/okgo/model/HttpParams;
paramString2.();
paramString2.put(””, paramUserInfoDto, new boolean[0]);
paramObject = ((PostRequest)((PostRequest)((PostRequest)((PostRequest)((PostRequest)com.lzy.okgo.a.b(str1).tag(paramObject)).headers(“token”, paramString1)).headers(“mobileType”, “Android”)).headers(“appversion”, AppUtils.getAppversion())).params(paramString2)).execute();
if (paramObject == null) {
return null;
}
if (((Response)paramObject).isSuccessful())
{
paramUserInfoDto = ((Response)paramObject).body().byteStream();
paramObject = new java/io/BufferedReader;
paramString1 = new java/io/InputStreamReader;
paramString1.(paramUserInfoDto, “gb2312”);
((BufferedReader)paramObject).(paramString1);
paramUserInfoDto = new java/lang/StringBuffer;
paramUserInfoDto.();
for (;😉
{
paramString1 = ((BufferedReader)paramObject).readLine();
if (paramString1 == null) {
break;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/8862c5e99eba5ef767e8583d868b84c3.jpeg)
Android核心知识点
面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验。
下面这份PDF是我翻阅了差不多3个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点,全部都是精华中的精华,我能面试到现在2-2资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。
不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。