超星学习通逆向接口参数加密分析 - 课程页面切换tab接口
超星的接口分析了很久,分析到这个接口的时候才想到写篇博客,之前的一些接口和分析就没写下来
先开俩坑在这里,等以后再填
1.如何抓安卓APP上HTTPS的包(需ROOT)
2.如何逆向安卓APP
本次分析的接口是这个
http://data.xxt.aichaoxing.com/analysis/course/tab
参数 u=224217004&sign=task&description=%E4%BB%BB%E5%8A%A1&enc=E783557848978DAFBC36732F63E554E9&personid=243104286&classid=49650050&courseid=220816469

接口大致分析
这个接口在课程页面点击tab切换时会被调用一次

先看参数
| 参数名 | 值 |
|---|---|
| u | 224217004 |
| sign | task |
| description | 任务 |
| enc | E783557848978DAFBC36732F63E554E9 |
| personid | 243104286 |
| classid | 49650050 |
| courseid | 220816469 |
根据之前抓包的内容可以得到除了enc以外的内容,再看enc长度是32位,可以猜一手MD5
反编译
反编译看下代码
反编译用了MT管理器
脱壳用了Arm Pro
都是要付费的,怎么操作就省略,相信你们都会
用MT管理器搜索接口关键字analysis/course/tab,只搜索到一个结果,好的开头是成功的一半

点进去看下,反编译成,java代码很明显代码被混淆了,
包名都变成了单个的英文字母,先不管,试试继续分析下去
看到方法上的注解,返回参数还用了泛型,很明显是Retrofit2框架了,enc参数在这里

手机上截图有点小,把代码粘出来
@f(value="analysis/course/tab")
public b<String> a(
@t(value="u") String var1,
@t(value="sign") String var2,
@t(value="description") String var3,
@t(value="enc") String var4,
@t(value="personid") String var5,
@t(value="classid") String var6,
@t(value="courseid") String var7
);
已经找到源头,那看看哪里会调用这个接口就行了
搜索调用这个类的代码,看这个类的包名和类名方法名分别是e.g.u.h2.b、d和a

有好几个同名的重载方法,先不管,搜索smali调用的代码e/g/u/h2/b;->a
找到了20多个结果,不好办
看一下这个方法有7个String类型的参数,超过4个参数smali里面就会用invoke-interface/range调用
用正则来搜索一下代码invoke-interface/range.*?e/g/u/h2/b/d;->a
结果没减少多少,还是有21个

不过我们知道参数有7个,看哪里有调用7个参数的方法好了,range后面大括号里的就是参数,v1-v6就是6个参数,快速找一下
还是没法找出来,不过还有别的方法,搜一下字符串任务 完全匹配,这个是抓包抓到的参数
运气不错只搜索到2个结果,看了下第一个没看出啥,看第二个,很明显对应的是课程界面的tab,里面还有接口的域名

public void run() throws Throwable {
String string;
String string2;
if (Objects.equals("任务", this.a)) {
string2 = "task";
string = "任务";
} else if (Objects.equals("章节", this.a)) {
string2 = "chapters";
string = "章节";
} else if (Objects.equals("更多", this.a)) {
string2 = "more";
string = "更多";
} else {
string2 = "";
string = "";
}
if (g.b((CharSequence)string)) {
return;
}
String string3 = URLEncoder.encode(string, "utf-8");
string3 = b.a((b)this.f, (String)this.b, (String)string2, (String)string3, (String)this.c, (String)this.d, (String)this.e);
((d)s.a((String)"http://data.xxt.aichaoxing.com/").a(d.class)).a(this.b, string2, string, string3, this.c, this.d, this.e).a((o.d)new a(this));
}
前面的代码就是接口参数里的sign和description,string2就对应参数里的sign了,string对应参数里的description
先看这两行
String string3 = URLEncoder.encode(string, "utf-8");
string3 = b.a(
(b)this.f,
(String)this.b,
(String)string2,
(String)string3,
(String)this.c,
(String)this.d,
(String)this.e
);
看前面代码可以知道这里string是tab的名字,就是任务、章节、更多这三个其中一个
随后对string进行了一次url编码
最后调用了b.a方法,传入了7个参数,上下文并不存在名称为b的对象,因此可以断定b是一个类名
查看import,定位到了e.g.k.e.b这个类
点进去查看一下
public static String a(b b2, String string, String string2, String string3, String string4, String string5, String string6) {
return b2.a(string, string2, string3, string4, string5, string6);
}
private String a(String string, String string2, String string3, String string4, String string5, String string6) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(string5);
stringBuilder.append(string6);
stringBuilder.append(string3);
stringBuilder.append(string4);
stringBuilder.append(string2);
stringBuilder.append(string);
stringBuilder.append("qK`b3XjC");
return m.a((String)stringBuilder.toString()).toUpperCase();
}
调用了b2.a方法,b2的类型是b,其实就是自身了,传递了6个参数,也就是调用了下面的a方法
可以看到就是按 5 6 3 4 2 1的顺序将参数进行拼接,最后拼上一个盐,最后调用一个m.a方法
m.a其实就是一个md5的方法
根据参数顺序,最后可以分析出 string3 = md5(this.e + this.d + string3 + this.c + string2 + this.b + salt),其中salt是一个字符串qK`b3XjC
查看代码发现下面调用了接口
((d)s.a((String)"http://data.xxt.aichaoxing.com/").a(d.class)).a(this.b, string2, string, string3, this.c, this.d, this.e).a((o.d)new a(this));
根据接口定义的参数顺序就可以得到这样一个参数对应表
| 变量名 | 接口参数名 |
|---|---|
| this.b | u |
| string2 | sign |
| string | description |
| string3 | enc |
| this.c | personid |
| this.d | classid |
| this.e | courseid |
那么可以得到伪代码enc = md5(classid + courseid + URLEncoder.encode(description) + personid + sign + u + salt).toUpperCase()
最后根据以上的分析,编写出对应的代码,验证分析结果

和抓包时得到的参数一致。
超星学习通逆向接口参数加密分析 - 课程页面切换tab接口的更多相关文章
- 完全机器模拟浏览器操作自动刷网课!不怕被封!!-----python基于selenium实现超星学习通刷视频网课
(使用过程中有小伙伴反映如果课程的第一章是空白的页面会报错,我当时做的时候是根据我自己的课程,没有第一节是空页面的现象,这个以后有时间我再改一下吧,或者小伙伴自己修改一下也可) 原谅我这个标题党,对叭 ...
- 如何写出安全的API接口?接口参数加密签名设计思路
开发中经常用到接口,尤其是在面向服务的soa架构中,数据交互全是用的接口. 几年以前我认为,我写个接口,不向任何人告知我的接口地址,我的接口就是安全的,现在回想真是too young,too simp ...
- Spring 接口参数加密传输
加密方式 AES spring jar 包 pom.xml配置(注意版本) <dependency> <groupId>org.spri ...
- 如何写出安全的 API 接口?接口参数加密签名设计思路
原文链接:http://blog.csdn.net/ma_jiang/article/details/53636840
- [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...
- iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...
- Springboot使用自定义注解实现简单参数加密解密(注解+HandlerMethodArgumentResolver)
前言 我黄汉三又回来了,快半年没更新博客了,这半年来的经历实属不易,疫情当头,本人实习的公司没有跟员工共患难, 直接辞掉了很多人.作为一个实习生,本人也被无情开除了.所以本人又得重新准备找工作了. 算 ...
- mybatis 多个接口参数的注解使用方式(@Param)
目录 1 简介 1.1 单参数 1.2 多参数 2 多个接口参数的两种使用方式 2.1 Map 方法(不推荐) 2.1.1 创建接口方法 2.1.2 配置对应的SQL 2.1.3 调用 2.2 @Pa ...
- Vue 超快速学习
Vue 超快速学习 基础知识: 1.vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeD ...
随机推荐
- 获取IP地址避免XFF攻击(使用nginx)
//以下代码可以获取到客户端IP,但是可能会有XFF攻击,伪造IP地址 request.getHeader("x-forwarded-for"); 解决办法 //从Nginx中X- ...
- Spring Ioc源码引入:什么是IoC,IoC解决了什么问题
Spring Ioc源码引入:什么是IoC,IoC解决了什么问题 什么是IoC 用一个故事举例: 小陈想开一家咖啡店,于是独自创业.找咖啡豆供应商.买咖啡机.招员工,样样都要自己来.开店成本很高.后来 ...
- 掌握DevEco Studio模拟器这些“隐藏功能”,让鸿蒙应用调试效率事半功倍
在鸿蒙应用开发过程中,调试环节常常直接影响开发效率与体验.为提升开发者调试的便捷性与效率,华为在DevEco Studio上提供了模拟器功能,它不仅能模拟鸿蒙手机.折叠屏.平板等真实设备的基本功能,还 ...
- 基于Java Swing开发好看的皮肤
先介绍几款开源及商业的皮肤. Weblaf:非常赞的套件,界面现代.简约.依赖包较少. 有开源也有商业协议,个人最喜欢的皮肤.https://github.com/mgarin/weblaf PgsL ...
- 【HUST】网络攻防实践|5_二进制文件补丁技术|实验三 热补丁
文章目录 实验要求 实验过程 1. 64位Ubuntu下先安装32位库 2. 利用Preload Hook实现热补丁修补 3. 利用系统调用`ptrace`对运行状态的程序进行hook 3.1 编写补 ...
- P6375 「StOI-1」小Z的旅行 题解
题意:P6375 「StOI-1」小 Z 的旅行 给定一座山,每座山有一个高度,只能向更低的山走或者向高度相同的山走,要求不能向高度相同的山连续走两次,不能原地不动. 每次走的权值都是两座山之间的坐标 ...
- codeup之【字符串】回文串
题目描述 读入一串字符,判断是否是回文串."回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串. 输入 ...
- VS Code + Cline + 魔搭MCP Server 实现抓取网页内容。
MCP的诞生,可以说是为AI带来一波新的活力. MCP(Model Context Protocol)是由Anthropic公司在2024年11月推出的一种开放标准协议,旨在为大型语言模型(LLM ...
- 题解:P4586 [FJOI2015] 最小覆盖双圆问题
写了这么久终于过了,发篇题解记录一下. 第一次写黑题题解,写的不好请见谅. 目录 本题思路 三点定圆 最小圆覆盖 关于最小圆覆盖时间复杂度 回到本题 二分法划分点集 总时间复杂度 最小覆盖双圆问题代码 ...
- .NET AI 生态关键拼图:全面解读 AI Extensions 和 Vector Extensions 如何重塑.NET开发生态
引言 关注.NET AI和.NET Vector原生开发已有半年之久了,其核心组件在历经这半年预发布期的持续迭代后,终于于5月16日和5月20日逐步发布了..在此之前,基于预发布版本撰写的文章和调试工 ...