猿人学APP第一题

news2025/1/23 12:56:12

抓包分析

  • copy CURL 转 requests代码
def app1():
    import requests
    headers = {
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; Nexus 6P Build/OPM1.171019.011) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
        "Host": "www.python-spider.com",
        "Cache-Control": "no-cache"
    }
    url = "https://www.python-spider.com/api/app1"
    data = {
        "page": "1",  # 页码
        "sign": "538f6c31cc41a5154d549b1026b6c7cf",
        "t": "1670468702882" # 时间戳
    }
    response = requests.post(url, headers=headers, data=data)

    print(response.text)
    print(response)
响应
{"status": "1", "state": "success", "data": [{"value": "8080\r"}, {"value": "4988\r"}, {"value": "3842\r"}, {"value": "3520\r"}, {"value": "1500\r"}, {"value": "1237\r"}, {"value": "9936\r"}, {"value": "6209\r"}, {"value": "4303\r"}, {"value": "5807\r"}]}
  • 逆向目标:sign生成

jadx搜索

搜索代码:"sign 搜到类似代码片段,有参数page,t,sign应该就是我们要找的
在这里插入图片描述

右键跳转声明位置(代码位置是一个接口)

sign= new C5334Oooo000().OooO(sb.toString().getBytes(StandardCharsets.UTF_8));

完整加密代码:

public String OooO(byte[] bArr) {
        ArrayList<Integer> OooO0oO2 = OooO0oO(bArr);
        int i = 1732584193;
        int i2 = -271733879;
        int i3 = -1732584194;
        int i4 = 271733878;
        for (int i5 = 0; i5 < OooO0oO2.size() / 64; i5++) {
            int[] iArr = new int[16];
            for (int i6 = 0; i6 < 16; i6++) {
                int i7 = (i5 * 64) + (i6 * 4);
                iArr[i6] = (OooO0oO2.get(i7 + 3).intValue() << 24) | OooO0oO2.get(i7).intValue() | (OooO0oO2.get(i7 + 1).intValue() << 8) | (OooO0oO2.get(i7 + 2).intValue() << 16);
            }
            int[] iArr2 = {0, 4, 8, 12};
            int i8 = i;
            int i9 = i2;
            int i10 = i3;
            int i11 = i4;
            int i12 = 0;
            while (i12 < 4) {
                int i13 = iArr2[i12];
                i8 = OooO0O0(i8, i9, i10, i11, iArr[i13], 3);
                int OooO0O02 = OooO0O0(i11, i8, i9, i10, iArr[i13 + 1], 7);
                i10 = OooO0O0(i10, OooO0O02, i8, i9, iArr[i13 + 2], 11);
                i9 = OooO0O0(i9, i10, OooO0O02, i8, iArr[i13 + 3], 19);
                i12++;
                i11 = OooO0O02;
            }
            int[] iArr3 = {0, 1, 2, 3};
            int i14 = i8;
            int i15 = i11;
            for (int i16 = 0; i16 < 4; i16++) {
                int i17 = iArr3[i16];
                i14 = OooO0Oo(i14, i9, i10, i15, iArr[i17], 3);
                i15 = OooO0Oo(i15, i14, i9, i10, iArr[i17 + 4], 5);
                i10 = OooO0Oo(i10, i15, i14, i9, iArr[i17 + 8], 9);
                i9 = OooO0Oo(i9, i10, i15, i14, iArr[i17 + 12], 13);
            }
            int[] iArr4 = {0, 2, 1, 3};
            int i18 = i14;
            int i19 = 0;
            while (i19 < 4) {
                int i20 = iArr4[i19];
                int OooO0o2 = OooO0o(i18, i9, i10, i15, iArr[i20], 3);
                i15 = OooO0o(i15, OooO0o2, i9, i10, iArr[i20 + 8], 9);
                i10 = OooO0o(i10, i15, OooO0o2, i9, iArr[i20 + 4], 11);
                i9 = OooO0o(i9, i10, i15, OooO0o2, iArr[i20 + 12], 15);
                i19++;
                i18 = OooO0o2;
            }
            i += i18;
            i2 += i9;
            i3 += i10;
            i4 += i15;
        }
        return String.format("%02x%02x%02x%02x", Integer.valueOf(i), Integer.valueOf(i2), Integer.valueOf(i3), Integer.valueOf(i4));
    }
  • 加密逻辑不长,感兴趣的也可直接翻译成python代码
  • 我就不翻译了,直接上frida Hook测试一下

FridaHook

Java.perform(function () {
    console.log('perform seccuss')
    let Oooo000 = Java.use("o00oO00o.Oooo000");
    Oooo000.OooO.implementation = function(s){
        let arr = Java.use("java.util.Arrays")
        let JavaString = Java.use("java.lang.String")
        console.log("args Bytes:",arr.toString(s))
        console.log("args String:", JavaString.$new(s))
        let res = this.OooO(s)
        console.log('res String:',JavaString.$new(res))
        return res
    }
});

启动app,注入测试

attach seccuss
perform seccuss
load seccuss
args Bytes: [112, 97, 103, 101, 61, 49, 49, 54, 55, 48, 57, 56, 55, 57, 52, 57, 49, 49, 55]
args String: page=11670987949117
res String: 67e0adb2756e899f36f6184316562da6
args Bytes: [112, 97, 103, 101, 61, 50, 49, 54, 55, 48, 57, 56, 55, 57, 53, 52, 52, 54, 48]
args String: page=21670987954460
res String: 9eea998e3017f9e244f700a5cd1a0e62
  • 入参为"page=" + 页码 + 时间戳

Frida主动调用

  • 以参数page=11670987949117测试
  • Java.use("o00oO00o.Oooo000").OooO(bArr)直接调用会报错:
    • Error: OooO: cannot call instance method without an instance
  • Java.choose()的方式从内存中搂个实例用,注入时需要进入指定页面触发指定函数,保证内存中已经加载了我们需要的类。

完整代码

Java.perform(function () {
    function stringToBytes(str) {  
        var ch, st, re = []; 
        for (var i = 0; i < str.length; i++ ) { 
            ch = str.charCodeAt(i);  
            st = [];                 
           do {  
                st.push( ch & 0xFF );  
                ch = ch >> 8;          
            }    
            while ( ch );  
            re = re.concat( st.reverse() ); 
        }  
        return re;  
    }
    console.log('perform seccuss')
    let JavaString = Java.use("java.lang.String")
    Java.choose("o00oO00o.Oooo000",{
        onMatch:function(instance){
            console.log('choose seccuss')
            let str1 = "page=11670987949117"
            let intArr = stringToBytes(str1)
            let bArr = Java.array('byte',intArr)
            let res = instance.OooO(bArr)
            console.log('res String:',JavaString.$new(res))        
        },
        onComplete(){}
    });
});

测试结果:

attach seccuss
perform seccuss
choose seccuss
res String: 67e0adb2756e899f36f6184316562da6
load seccuss
  • 和我们上面抓包的结果匹配

FridaRPC

  • 目标函数接收的参数类型为 bytes[]
  • 我们准备的函数为str类型
  • 需要将参数进行String to BytesArray 的转换
    js代码
function app1_sign_func(page, t) {
  var res;
  Java.perform(function () {
    function stringToBytes(str) {
      var ch,
        st,
        re = [];
      for (var i = 0; i < str.length; i++) {
        ch = str.charCodeAt(i);
        st = [];
        do {
          st.push(ch & 0xff);
          ch = ch >> 8;
        } while (ch);
        re = re.concat(st.reverse());
      }
      return re;
    }
    console.log("perform seccuss");
    Java.choose("o00oO00o.Oooo000", {
      onMatch: function(instance){
        console.log("choose seccuss");
        let str1 = "page=" + page + t;
        console.log("str1 =>",str1)
        let intArr = stringToBytes(str1);
        let bArr = Java.array("byte", intArr);
        res = instance.OooO(bArr);
        console.log('res =>',res)
      },
      onComplete:function(){},
    });
  });
  return res;
}

rpc.exports = {
  getsign: app1_sign_func,
};

注入的python代码:

import frida
import sys
import time
import requests

f = open('./js_code.js','r',encoding='utf-8')
jscode = f.read()
f.close()

process = frida.get_usb_device(-1).attach('猿人学APP')
print('attach seccuss')
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
print('load seccuss')
api = script.exports
# sys.stdin.read()
 

def app1(page):
    headers = {
        "Accept-Language": "zh-CN,zh;q=0.8",
        "User-Agent": "Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; Nexus 6P Build/OPM1.171019.011) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
        "Host": "www.python-spider.com",
        "Cache-Control": "no-cache"
    }
    url = "https://www.python-spider.com/api/app1"
    t = str(int(time.time()*1000))
    sign = api.getsign(str(page),t)
    data = {
        "page": page,
        "sign": sign,
        "t": t
    }
    print(data)
    response = requests.post(url, headers=headers, data=data)

    print(response.text)
    print(response)

app1(1)

调用结果:

attach seccuss
load seccuss
perform seccuss
choose seccuss
str1 => page=11670997598567
res => 7e8154f39058fa6e585afa2ec48013bf
choose seccuss
str1 => page=11670997598567
res => 7e8154f39058fa6e585afa2ec48013bf
{'page': 1, 'sign': '7e8154f39058fa6e585afa2ec48013bf', 't': '1670997598567'}
{"status": "1", "state": "success", "data": [{"value": "9198\r"}, {"value": "2463\r"}, {"value": "6344\r"}, {"value": "5559\r"}, {"value": "6558\r"}, {"value": "2162\r"}, {"value": "1289\r"}, {"value": "6426\r"}, {"value": "1735\r"}, {"value": "8974\r"}]}
<Response [200]>

结束

  • Frida三板斧完事,收工。

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

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

相关文章

KT6368A蓝牙芯片的MTU的说明以及如何加快BLE传输速率

目录 一、蓝牙MTU的简介 二、详细的方法说明以及测试 三、KT6368A提升ble传输速率方法 BLE传输带宽主要跟两个要素有关&#xff1a; 通信周期和每个通信点可传输的数据量。 1.通信周期&#xff1a; 安卓手机一般可支持到10ms&#xff0c;苹果一般可支持到15ms 2.每个通信点…

[附源码]Node.js计算机毕业设计高校实习管理平台系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

菁染料CY3-聚乙二醇-二苯并环辛炔 CY3-PEG-DBCO

产品名称&#xff1a;菁染料CY3-聚乙二醇-二苯并环辛炔 英文名称&#xff1a; CY3-PEG-DBCO 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k&#xff08;可按需定制&#xff09; 质量控制&#xff1a;95% 原料分散系…

SSM校园疫情防控

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 管理员功能&#xff1a; 教职工管理&#xff08;管理已注册的教职工&#xff09; 出入管理&#xff08;出入日期、人员姓…

若依缓存使用浅析

配置 这块主要涉及两个类 FastJson2JsonRedisSerializer : 继承 RedisSerializer 接口自定义使用 fastjson 进行序列化和反序列化RedisConfig&#xff1a;配置使用 StringRedisSerializer 来进行key的序列化与反序列&#xff0c;使用刚才我们 FastJson2JsonRedisSerializer 来…

通过WSL2运行GUI程序

上次我写过一篇VGPU和WSL2&#xff0c;这回我打算写一篇关于《通过WSL2运行GUI程序》的笔记。 起因 总所周知&#xff0c;KVM in Linux支持GPU passthrough(GPU直通)功能的&#xff0c;就是配置稍稍多了一点。最初想试试如何在Hyper-V中尝试安装VM&#xff0c;但是vgpu的文档…

2022-12-14 jedis

jedis 简介 编程语言与redis java语言连接redis服务 jedis SpringDataRedis Lettuce HelloWorld 客户端连接redis maven下载安装 配置maven环境变量 库的种类和彼此的关系 maven标准目录结构 核心代码部分配置文件部分测试代码部分测试配置文件 maven常用的命令 mvn…

nodejs+vue083新生报到服务管理系统

目 录 摘 要 I 目 录 III 第一章 概述 1 1.1研究背景 1 1.2 开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5 论文结构 2 第二章 开发技术介绍 1 2.5 B/S架构 2 第三章 系统分析 1 3.1 可行性分析 1 3.1.1技术可行性 1 3.1.2操作可…

python绘制圣诞树、烟花、爱心及节日倒计时

说明&#xff1a; 该博客主要完成以下几个方面的功能: 1.元旦节日倒计时代码的实现 2.使用python源码“绘制圣诞树” 3.使用python绘制“跨年烟花” 4.使用python 绘制“爱心” 呈现方式&#xff1a;代码和截图 1.元旦倒计时代码&#xff1a; 输入相应的节日时间&#…

Seata - @GlobalTransactional源码解析

脑图 核心 Seata三大角色 TC &#xff1a;事务协调者&#xff0c;netty server(服务器)TM &#xff1a;事务管理器&#xff0c;netty client(客户端)RM&#xff1a; 资源管理器&#xff0c;netty client(客户端) GlobalTransactional(name "fsp-create-order" ro…

【静脉检测】手指静脉图像检测【含Matlab源码 1654期】

⛄一、简介 手指静脉识别系统的性能非常依赖于采集图像的质量,但是采集设备在成像和传输时产生的各类噪声,以及开放式使用场景下设备镜面上存在脏污、用户手指存在蜕皮情况等因素都会对图像质量造成极大的影响,增大后续特征提取的难度,最终影响整个系统的识别性能。针对目前现…

Zabbix 6.2 监控 PostgreSQL13 数据库

Zabbix 6.2 监控 PostgreSQL13 数据库 文章目录Zabbix 6.2 监控 PostgreSQL13 数据库官方模版地址1.pgsql新建监控用户2. 编辑 pg_hba.conf 文件并重启3.拷贝监控脚本到var/lib/zabbix下4.zabbix监控导入模版5.主机配置模版6.验证监控数据官方模版地址 https://git.zabbix.com…

一文带你读懂何为 macOS App 公证,以及如何自动化实现

前言 在上篇文章「macOS App 自动化分发 App Store 探索与实践」中讲解了如何通过 Shell 脚本实现 macOS App 自动化分发 App Store。相信&#xff0c;看过的同学都或多或少对 macOS App 构建、分发 App Store 相关的知识都具备了一定的认知。 而对于开发者来说&#xff0c;我…

RCE(远程代码/命令执行漏洞)原理及靶场练习

目录 PHP-RCE涉及函数 基础命令符 靶场练习 PHP-RCE涉及函数 代码注入 eval() 把字符串 code 作为PHP代码执行 assert() 检查一个断言是否为 false preg_replace() 执行一个正则表达式的搜索和替换 create_function() 创建一个匿名函数并且返回函数名创 call_user_func()/ca…

Android进程启动流程

一.Android 系统架构图 ​虽然 Android 系统非常庞大且错综复杂&#xff0c;但整体架构设计清晰。Android 底层内核空间以 Linux Kernel 作为基石&#xff0c;上层用户空间由 Native系统库、虚拟机运行环境、框架层组成&#xff0c;通过系统调用(Syscall)连通系统的内核空间 与…

浅谈hudi 的callback回调机制

浅谈hudi 的callback回调机制 关于hudi的write operations,hudi有4种类型,分别为upsert/insert/bulk_insert/delete[软删除/硬删除]。 了解hudi的都知道,hudi有一个核心的机制就是timeline,hudi的instantDTO包含action(动作),ts(时间),state(状态)。 action主要包括: commits…

Linux常用命令总结(建议收藏)

文章目录一、文件管理1、cat&#xff1a;查看文件内容案例1&#xff1a;输出内容行数2、chmod&#xff1a;是控制用户对文件的权限的命令案例1&#xff1a;&#xff1a;将user文件修改成用户、组、其他用户都可以读写可执行的权限3、diff&#xff1a;用于比较文件的差异4、find…

ELK (一)部署ELK+Filebeat日志收集分析系统

说明&#xff1a;此安装流程只适用于8.0.0以下的版本 1. ElasticSearch 部署 1.1 下载ElasticSearch的wget指令&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz1.2 解压安装包到指定目录 指定解压缩到 …

【指纹识别】指纹识别【含GUI Matlab源码 586期】

⛄一、指纹识别简介 1 指纹识别的引入和原理 1.1 指纹的基本知识 指纹&#xff0c;由于其具有终身不变性、唯一性和方便性&#xff0c;已几乎成为生物特征识别的代名词。指纹是指人的手指末端正面皮肤上凸凹不平产生的纹线。纹线有规律的排列形成不同的纹型。纹线的起点、终点…

SpringBoot+Vue实现前后端分离的旅游网站

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…