当前位置: 首页 > news >正文

爬虫 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 显示结果

相关文章:

爬虫 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 插件 (作用:禁…...

2024河南萌新联赛第(三)场 河南大学

B. 正则表达式 题目&#xff1a; https://ac.nowcoder.com/acm/contest/87865/B 给出n个地址&#xff0c;每个地址的形式为x.x.x.x&#xff0c;找四个x都满足x>0&&x<255的个数 思路&#xff1a; 首先定义四个数组和一个字符&#xff0c;然后按题目所给的形式…...

回溯法---分割回文串

题目&#xff1a;给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s 所有可能的分割方案。 思路&#xff1a; 第一步&#xff1a;确定参数与返回值。参数为字符串s&#xff0c;分割起始下标startIndex&#xff0c;无返回值 第二…...

DDR等长,到底长度差多少叫等长?

DDR4看这一篇就够了 - 知乎 (zhihu.com) 【全网首发】DDR4 PCB设计规范&设计要点PCB资源PCB联盟网 - Powered by Discuz! (pcbbar.com) 终于看到较为权威的DDR4等长要求了: !!!! 依据这个要求&#xff0c;H616项目的等长线不合格&#xff1a;...

程序员面试题------N皇后问题算法实现

N皇后问题是一个著名的计算机科学问题&#xff0c;它要求在NN的棋盘上放置N个皇后&#xff0c;使得它们之间不能相互攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题&#xff0c;通过逐步尝试不同的放置位置&#xf…...

【C++学习】6、继承

1、什么是继承&#xff1f; 继承描述的是类与类之间的关系&#xff0c;A类继承B类&#xff0c;A类就拥有B类的数据和方法。 继承的方式&#xff1a; 公有继承&#xff08;public&#xff09; 保护继承&#xff08;protected&#xff09; 私有继承&#xff08;private&…...

从零开始的MicroPython(三) 按键与外部中断

上一篇&#xff1a;从零开始的MicroPython(二) GPIO及点灯代码 文章目录 前言硬件原理软件原理注意代码编写轮询外部中断其他 前言 点灯是嵌入式GPIO输出的典型&#xff0c;按键则是输入的典型。 硬件原理 按键对角接通。 软件原理 如果是一端接高电平&#xff0c;一端接单…...

Windows下编译安装Kratos

Kratos是一款开源跨平台的多物理场有限元框架。本文记录在Windows下编译Kratos的流程。 Ref. from Kratos KRATOS Multiphysics ("Kratos") is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, a…...

汽车-腾讯2023笔试(codefun2000)

题目链接 汽车-腾讯2023笔试(codefun2000) 题目内容 现在塔子哥有 n 个汽车&#xff0c;所有的汽车都在数轴上&#xff0c;每个汽车有1.位置 pos 2.速度 v &#xff0c;它们都以在数轴上以向右为正方向作匀速直线运动。 塔子哥可以进行任意次以下操作&#xff1a;选择两个汽车…...

软测面试二十问(最新面试)

1.软件测试的流程是什么 参加需求评审会&#xff0c;解决需求疑问---写测试用例---对测试用例进行评审---评审后开始执行测试---提交bug---追踪bug---关闭bug---回归测试---交叉测试---编写测试报告---冒烟测试 2.什么是黑盒测试和白盒测试&#xff1f;它们有何区别 黑盒测试…...

风吸杀虫灯采用新型技术 无公害诱虫捕虫

TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源&#xff08;如紫外光、蓝光&#xff09;的敏感性&#xff0c;通过光波引诱害虫成虫扑灯。同时&#xff0c;内置的风扇产生强烈的气流&#xff0c;形成负压区&#xff0c;将害虫迅速吸入到收集器中。害虫在收集器内被风干…...

随手记录第十二话 -- JDK8-21版本的新增特性记录(Lambda,var,switch,instanceof,record,virtual虚拟线程等)

本文主要用于记录jdk8以来的新增特性及使用方法! 1.Java8 Lambda表达式(8) 1.1 方法引用 List<String> list List.of("1", "2", "3");list.forEach(i -> System.out.println(i));//方法引用list.forEach(System.out::println);1.2 接…...

SpringCloud网关 SpringBoot服务 HTTP/HTTPS路由/监听双支持

背景 一般来说SpringCloud Gateway到后面服务的路由属于内网交互&#xff0c;因此路由方式是否是Https就显得不是那么重要了。事实上也确实如此&#xff0c;大多数的应用开发时基本都是直接Http就过去了&#xff0c;不会一开始就是直接上Https。然而随着时间的推移&#xff0c…...

JavaScript做网页是否过期的处理

通过路由上的参数生成唯一md5和路由上token做验证_md5 token-CSDN博客 前言&#xff1a;基于这篇文章我们做网页是否超时&#xff0c;网页是否过期的处理。打开一个网页允许他在一定时间内可以访问&#xff0c;过了这个时间就不可以访问了&#xff0c;encrypt是h5加密方法&…...

python coding时遇到的问题

Q&#xff1a;只有cpu的时候加载模型 A&#xff1a;checkpoint torch.load(model_path, map_locationtorch.device(‘cpu’)) Q&#xff1a;vscode的文件路径和spyder的不一样 A&#xff1a;在vscode中&#xff0c;右键要用的文件&#xff0c;选择“文件相对路径”...

攻防演练号角吹响,聚铭铭察高级威胁检测系统助您零失分打赢重保攻坚战

在数字化浪潮中&#xff0c;攻防演练成为了衡量网络安全防御力的核心标尺&#xff0c;其重要性与日俱增。这项由政府、行业监管或企业内部主导的安全活动&#xff0c;随着互联网普及而兴起&#xff0c;现已发展成为全球公认的检验网络安全体系效能的标准。它不仅关乎技术实力的…...

个人量化交易兴起!有什么好用的量化软件推荐?迅投QMT量化平台简介!

QMT是专门为机构、活跃投资者、高净值客户等专业投资者研发的智能量化交易终端&#xff0c;拥有高速行情、极速交易、策略交易、多维度风控等专业功能&#xff0c;满足专业投资者的特殊交易需求。覆盖业务范围广:沪深A股、港股通、两融、期权、期货。 适合用QMT的投资者&#x…...

SQL labs-SQL注入(七,sqlmap对于post传参方式的注入,2)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。参考&#xff1a;SQL注入之Header注入_sqlmap header注入-CSDN博客 序言&#xff1a; 本文主要讲解基于SQL labs靶场&#xff0c;sqlmap工具进行的post传参方式的SQL注入&#xff0c…...

SAM 2: Segment Anything in Images and Videos

Introduction 提出的目的&#xff1a; 1.现有的应用像自动驾驶&#xff0c;AR等来说都是需要temporal localization beyond image-level segmentation&#xff08;时序定位而不仅是图片分割&#xff09; 2. 一个好的分割模型不应该仅仅局限于图片领域&#xff0c;而是图视频两…...

软件测试面试,如何自我介绍?

又是一年金九银十&#xff0c;相信不少小伙伴都在准备跳槽面试&#xff0c;而面试中一个必不可少的环节就是自我介绍&#xff0c;所以&#xff0c;今天我们就来聊一聊软件测试面试中如何自我介绍。 为什么要自我介绍 在讨论如何自我介绍之前&#xff0c;我们先来讨论一下为…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...