爬虫 APP 逆向 ---> 粉笔考研

环境:

  • 粉笔考研 v6.3.15:https://www.wandoujia.com/apps/1220941/history_v6031500
  • 雷电9 模拟器:https://www.ldmnq.com/
  • 安装 magisk:https://blog.csdn.net/Ruaki/article/details/135580772
  • 安装 Dia 插件 (作用:禁用弹窗):https://github.com/Xposed-Modules-Repo/dialog.box

Dia 插件 功能

  • 取消弹窗。(取消 app 的强制升级。例如:得物app、粉笔考研app)
  • 禁用退出(退出+完成)(可以与键控制组合)
  • 按关键字禁用弹出框(悬停窗口+对话框)(可与按键控制结合使用)
  • 版本自定义(版本号+版本名称)
  • 伪装系统时间(系统时间+ GPS时间+本地访问服务器时间)
  • 此模块的反检测,Xposed,Root
  • 启动时禁用网络(可设置禁用时间)
  • 强制结束当前活动(Activity)(通过组合键控制)
  • 反禁用Xposed(简单禁用)

直接搜索关键字 "major/school_score"

major/major_score

分析后发现是 rsa 加密方式,rsa 是非对称加密,需要一个公钥、一个私钥。

通过 hook 验证,发现 函数a 就是用来解密的。

  • 方法 1:逆向算法,直接 python 实现
  • 方法 2:用 java 实现,然后打包成 jar 包,python 调用 jar 包
  • 方法 3:通过 rpc 方式

下面 通过 rpc 方式实现。

模拟器中执行 frida-server,并设置端口转发。

rcp 方式调用

import time
import frida
import uvicorn
from pathlib import Path
from fastapi import FastAPI, Requestjs_code = """
console.log("Script loaded successfully ");
function callDecryptFunc(mi_str) { //定义导出函数let local_result;Java.perform(function x() {console.log("hook 成功");console.log(mi_str);let li9 = Java.use("li9");let result = li9.a(mi_str);console.log(`result ---> ${result}`);local_result = resultreturn result;});return local_result;
}
rpc.exports = {// 导出名不可以有大写字母或者下划线calldecrypyfunc: callDecryptFunc 
};
"""def my_message_handler(message, payload):print(message)print(payload)def get_session():device = frida.get_usb_device()time.sleep(2)  # 睡眠2秒, 防止程序运行过快从而导致附加不上session = device.attach("粉笔考研")return sessiong_session = get_session()
script = g_session.create_script(js_code)
script.on("message", my_message_handler)
script.load()app = FastAPI()@app.get("/decrypt_data")
@app.post("/decrypt_data")
async def root(request: Request):data_dict = await request.json()encrypt_data = data_dict['encrypt_data']global scriptdecrypt_data = script.exports_sync.calldecrypyfunc(encrypt_data)ret_val = {'encrypt_data': encrypt_data,'decrypt_data': decrypt_data}return ret_valif __name__ == '__main__':uvicorn.run(f'{Path(__file__).stem}:app', host="0.0.0.0", port=6666)pass

执行结果

测试脚本。"Cookie": "换成自己的cookies"

import json
import requestsrequests.packages.urllib3.disable_warnings()headers = {"User-Agent": "fenbi-android","Host": "schoolapi.fenbi.com","Cookie": "换成自己的cookies"
}def get_decrypt_data(data_dict=None):url = "http://127.0.0.1:6666/decrypt_data"resp_2 = requests.post(url, json=data_dict, verify=False)ret_val = {'name': data_dict['name'],'decrypt_data': resp_2.json()['decrypt_data'],}return ret_valdef main():url_1 = "https://schoolapi.fenbi.com/kaoyan/android/kyzz/major/school_score"url_2 = "https://schoolapi.fenbi.com/kaoyan/android/kyzz/major/major_score"college_info = [{"dm": "10001", "name": "北京大学"},{"dm": "10003", "name": "清华大学"},]for item in college_info:dm = item['dm']name = item['name']querystring_1 = {# "school": "10007", "type": "01", "year": "0","school": dm, "type": "01", "year": "0",# "client_context_id": "2F3B0BCDA482C2DE2D23",# "version": "6.3.15", "vendor": "Huawei",# "app": "kaoyan", "av": "69", "kav": "27", "hav": "4",# "deviceId": "AKJWMHTPfy/pM1yprG3inw==",# "quizId": "0", "imei": "", "oaid": "",}querystring_2 = {"school": dm, "type": "01", "year": "0", "department": "",# "client_context_id": "A28D05AA5A8943BF6D8F",# "version": "6.3.15", "vendor": "Huawei",# "app": "kaoyan", "av": "69", "kav": "27", "hav": "4",# "deviceId": "AKJWMHTPfy/pM1yprG3inw==",# "quizId": "0", "imei": "", "oaid": "",}resp = requests.get(url_1, headers=headers, params=querystring_1, verify=False)resp_json = resp.json()post_data = {'name': name,'encrypt_data': resp_json['data']}data_1 = get_decrypt_data(post_data)resp = requests.get(url_2, headers=headers, params=querystring_2, verify=False)resp_json = resp.json()post_data = {'name': name,'encrypt_data': resp_json['data']}data_2 = get_decrypt_data(post_data)data = {'name': name,'school_score': data_1['decrypt_data'],'major_score': data_2['decrypt_data']}print(data)if __name__ == '__main__':main()pass

执行结果

app 显示结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread debug 卡死在Stm32_putc问题分析解决

问题和解决方法 找了块开发板玩RT-Thread,一顿骚操作之后,发现debug就卡死在Stm32_putc(不稳定,反复重新上下电,重来有时候卡死有时候不卡死),卡死情况如下图: 先最后的解决方法:取消调默认的内…

Qt学习--对象树的概念

文章目录 QPushButton 按钮Qt中对象树的概念封装自定义控件 QPushButton 按钮 学习对象树之前,我们得先学习基本控件的创建。创建一个按钮 创建一个按钮:第一种方法 // 创建一个按钮QPushButton *btn new QPushButton;// 设置控件的父对象btn->setP…

文本解码原理--MindNLP

前言 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 Greedy search 在每个时间步𝑡都简单地选择概率最高的词作为当前输出词: 𝑤𝑡𝑎𝑟𝑔𝑚&am…

CSS 基础知识

CSS(级联样式表)是设置 Web 内容样式的代码。CSS 基础知识将介绍入门所需的内容。我们将回答以下问题:如何将文本设置为红色?如何使内容显示在(网页)布局中的某个位置?如何用背景图片和颜色装饰我的网页? 什么是CSS? 像HTML一样,CSS不是一种编程语言。它也不是一种标…

前端了解到框架-网络复习

前端 HTML 超文本标记语言 画页面 各种各样的标签组成页面进行展示 桌面创建文本修改后缀即可 <!DOCTYPE html>: 声明文档类型和HTML版本。<html>: 根标签&#xff0c;所有其他标签都包含在内。<head>: 包含了文档的元数据&#xff0c;如字符编码、网页标…

58 高级IO

本章重点 理解五种io模型的基本概念&#xff0c;重点是io的多路转接 掌握select模型&#xff0c;实现select版本的tcp服务器 掌握poll模型&#xff0c;实现poll版本的tcp服务器 掌握epoll模型&#xff0c;实现epoll版本的tcp服务器 理解epoll的LT模型和ET模式 理解select和epo…

关于数据存储位置的一点知识

关于数据存储位置的一点知识

[算法]插入排序和希尔排序

这里简单的介绍一下插入排序和希尔排序的算法实现&#xff0c;为简单起见&#xff0c;排序为升序且排序的数组是整形数组。 一、插入排序 &#xff08;一&#xff09;、算法思路 把数组里的第一个元素视为有序的&#xff0c;然后取第二个元素与前面的元素作比较&#xff0c;如…

【秋招笔试题】小Q的树

解析&#xff1a;分析易得走过的路中至多存在一个分叉&#xff0c;则维护每个结点接下来的路的最大值与次大值然后相加即可。 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define int long long const int MAXN 1…

ESD防护之电容妙用

谈到ESD防护&#xff0c;应用最广泛的是ESD/TVS管&#xff0c;对于正负4KV的pin脚不上电ESD测试&#xff0c;也可以仅仅依靠nf级电容完成ESD防护。下面以一篇实际案例进行说明。 实验要求&#xff1a;正负4KV对产品connector的Pin脚进行ESD测试&#xff0c;connector中的地脚接…

栈和队列<数据结构 C版>

目录 栈&#xff08;Stack&#xff09; 栈的结构体 初始化 销毁 入栈 判空 出栈 取栈顶元素 获取栈个数 测试&#xff1a; 队列&#xff08;Queue&#xff09; 队列的结构体 单个结点 队列 初始化 销毁 入队列&#xff0c;队尾 判空 出队列&#xff0c;队头 …

Spring Cloud微服务项目统一封装数据响应体

在微服务架构下&#xff0c;处理服务之间的通信和数据一致性是一个重要的挑战。为了提高开发效率、保证数据的一致性及简化前端开发&#xff0c;统一封装数据响应体是一种非常有效的实践。本文博主将介绍如何在 Spring Cloud 微服务项目中统一封装数据响应体&#xff0c;并分享…

二市在度低开,连续11个交易日低开,后市如何走?

今天的A股&#xff0c;让人愣住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市再度低开&#xff0c;连续11个交易日低开&#xff0c;让很多人愣住了。别慌&#xff01;汽车、军工板块大涨&#x…

MYSQL存储引擎InnoDB, MyISAM简介

MYSQL存储引擎 在开始谈到mysql存储引擎之前&#xff0c;我们应该知道或者了解存储引擎是什么&#xff0c;存储引擎是为了解决什么样的问题的。 在mysql中&#xff0c;存储引擎是处理不同表类型SQL操作的MySQL组件&#xff0c;同时MySQL服务器采用可插拔的存储引擎架构&#x…

XLua 原理分析 三

前面已经介绍了Lua与C#的基础通信原理&#xff0c;和Wrap中间文件的作用。有了前面2篇的基础&#xff0c;大概已经能搞清这块的原理。 为了加深对这块的印象&#xff0c;这里开始正式分析Xlua中的Lua和C#的通信。 一、Lua如何调用CS的过程 lua的初始化代码&#xff1a; pri…

乌班图下的vscode粘贴代码后一直在输入CTRLV命令

最近在VMware中使用vscode开发c程序中&#xff0c;拷贝一段代码后&#xff0c;代码界面一直输入CTRLV命令&#xff0c;导致乌班图桌面死掉&#xff0c;无法操作、 解决方法&#xff1a; 1、强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。 2、使用命令行界面。同时…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

python count返回什么

描述 count() 方法用于统计字符串中某个子字符串出现的次数&#xff0c;可选参数为开始搜索与结束搜索的位置索引。 语法 count() 方法语法&#xff1a; S.count(sub[,start0[,endlen(S)]]) 参数 sub -- 搜索的子字符串。 S -- 父字符串。 start -- 可选参数&#xff0c;…

【数据结构】哈希表的模拟实现

文章目录 1. 哈希的概念2. 哈希表与哈希函数2.1 哈希冲突2.2 哈希函数2.3 哈希冲突的解决2.3.1 闭散列&#xff08;线性探测&#xff09;2.3.2 闭散列的实现2.3.3 开散列(哈希桶)2.3.4 开散列的实现 2.4 开散列与闭散列比较 1. 哈希的概念 在我们之前所接触到的所有的数据结构…