破解某小说App(一)

这个步骤可以用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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

Android核心知识点

面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验。

下面这份PDF是我翻阅了差不多3个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点,全部都是精华中的精华,我能面试到现在2-2资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值