超星的接口分析了很久,分析到这个接口的时候才想到写篇博客,之前的一些接口和分析就没写下来

先开俩坑在这里,等以后再填

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接口的更多相关文章

  1. 完全机器模拟浏览器操作自动刷网课!不怕被封!!-----python基于selenium实现超星学习通刷视频网课

    (使用过程中有小伙伴反映如果课程的第一章是空白的页面会报错,我当时做的时候是根据我自己的课程,没有第一节是空页面的现象,这个以后有时间我再改一下吧,或者小伙伴自己修改一下也可) 原谅我这个标题党,对叭 ...

  2. 如何写出安全的API接口?接口参数加密签名设计思路

    开发中经常用到接口,尤其是在面向服务的soa架构中,数据交互全是用的接口. 几年以前我认为,我写个接口,不向任何人告知我的接口地址,我的接口就是安全的,现在回想真是too young,too simp ...

  3. Spring 接口参数加密传输

    加密方式 AES spring jar 包 pom.xml配置(注意版本)         <dependency>             <groupId>org.spri ...

  4. 如何写出安全的 API 接口?接口参数加密签名设计思路

    原文链接:http://blog.csdn.net/ma_jiang/article/details/53636840

  5. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  6. iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...

  7. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)

    上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...

  8. Springboot使用自定义注解实现简单参数加密解密(注解+HandlerMethodArgumentResolver)

    前言 我黄汉三又回来了,快半年没更新博客了,这半年来的经历实属不易,疫情当头,本人实习的公司没有跟员工共患难, 直接辞掉了很多人.作为一个实习生,本人也被无情开除了.所以本人又得重新准备找工作了. 算 ...

  9. mybatis 多个接口参数的注解使用方式(@Param)

    目录 1 简介 1.1 单参数 1.2 多参数 2 多个接口参数的两种使用方式 2.1 Map 方法(不推荐) 2.1.1 创建接口方法 2.1.2 配置对应的SQL 2.1.3 调用 2.2 @Pa ...

  10. Vue 超快速学习

    Vue 超快速学习 基础知识: 1.vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeD ...

随机推荐

  1. 可视化图解算法:按之字形顺序打印二叉树( Z字形、锯齿形遍历)

    1. 题目 描述 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 数据范围:0≤n≤1500,树上每个节点的val满足 |val| <= 1500 ...

  2. 遇到的问题之“list的addAll()报空指针异常”

    一.错误图 java.lang.NullPointerException at java.util.ArrayList.addAll(ArrayList.java:581) at com.bessky ...

  3. 鸿蒙NEXT开发实战教程:仿抖音短视频

    今天的实战教程是简单模仿一下抖音短视频,主要是首页部分的内容,先看效果图:   下面为大家讲解这个项目的详细教程. tabbar Tabbar的难点在于中间有个发布按钮,思路是我们可以在tabbar里 ...

  4. 通过 Nuke 为 Dotnet Core 应用构建自动化流程

    为什么使用Nuke 最开始了解Nuke,是浏览github时,刷到了这个项目,看简介可以通过C# 来定义构建任务和流程,这一点很新颖,对我来讲,c# 显然更容易理解和维护. 再看给出的示例,确实比较清 ...

  5. 接口测试策略(一、概念&流程&范围)

    接口测试概要 接口测试概念 什么是接口测试? 维基百科对接口测试的定义如下: API testing is a type of software testing that involves testi ...

  6. 通过VS地址擦除系统定位缓冲区溢出问题

    VS2019增加了一个名为"地址擦除系统"的功能,默认是关闭的,可以在项目"属性"-"c/c++"-"常规"中开启.在开 ...

  7. React Native开发鸿蒙Next---灰度模式

    React Native开发鸿蒙Next---灰度模式 政企相关的App在开发过程中,往往需要制作一个灰度模式,用于应对注入国家公祭日等特殊日期情况.Harmony开发中,由于基于ArkTs,处理相对 ...

  8. qt获得当前窗口所在屏幕的大小

    假如这个窗口的指针为this 记得要加头文件哦 #include <QDesktopWidget> #include <QApplication> //获得当前屏幕是第几屏幕 ...

  9. Java 在文件末尾追加内容

    需求背景:多次向文件中依次写入内容, 需求分析:如何向文件中依次追加内容呢?而且不清空之前的内容. 今天就分享一下基于Java语言,如何在文件末尾追加内容. import java.io.*; pub ...

  10. 创建Spring Boot项目时,提示 Cannot download 'https://start.spring.io'

    问题提出 在使用IDEA创建Spring Boot项目时,提示无法连接https://start.spring.io,内容如下: Cannot download 'https://start.spri ...