App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一)

2023-10-26

App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一)


提示:文章仅供参考,禁止用于非法途径;


前言

该文章使用了Frida、JDAX-GUI、Charles、夜神模拟器、WT-JS等工具;
主要编程语言:Python,部分涉及到:JavaScript、Java;


提示:以下是本篇文章正文内容,下面案例可供参考

一、资源推荐

Frida - App逆向 概念介绍:https://blog.csdn.net/EXIxiaozhou/article/details/128112421
安装抓包工具以及模拟器 App抓包:https://blog.csdn.net/EXIxiaozhou/article/details/127767808
JS逆向 Frida - 夜神模拟器安装配置 基本使用:https://blog.csdn.net/EXIxiaozhou/article/details/128035059
ApkScan-PKID 查壳工具下载:https://blog.csdn.net/EXIxiaozhou/article/details/127196615
Frida-Dexdump 脱壳工具下载使用:https://blog.csdn.net/EXIxiaozhou/article/details/128208068
JDAX-GUI 反编译工具下载:https://blog.csdn.net/EXIxiaozhou/article/details/127207762
JS逆向加密解密工具 下载使用:https://blog.csdn.net/EXIxiaozhou/article/details/128034062
X嘟牛Apk下载:https://pan.baidu.com/s/1HMxGZx9m8QZwAZSZPBiHwQ?pwd=m1qk
示例代码下载:https://pan.baidu.com/s/1rfFBzLeMQgKaajyUIhCb9Q?pwd=ad7i#list/path=%2F

二、App抓包分析

1、打开Charles、夜神模拟器,开始App抓包;
2、登录接口的url:http://api.dodovip.com/api/user/login
在这里插入图片描述
在这里插入图片描述

三、反编译逆向分析

提示:可以把反编译的Java代码,复制到IDEA分析运行,这样会提高逆向的效率;
加密参数的关键词:“Encrypt”,点击"转到"来到加密代码处
在这里插入图片描述
在这里插入图片描述
MD5加密生成sign参数,public static String paraMap(Map<String, String> addMap, String append, String sign)
在这里插入图片描述
DES加密生成encrypt,public static String encodeDesMap(String data, String desKey, String desIV)
在这里插入图片描述
在这里插入图片描述

四、还原JS加密

1.Hook示例代码

import frida
import sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)       
        
java_code = """
    Java.perform(function(){
        var hooksClass = Java.use("com.dodonew.online.http.RequestUtil");
        hooksClass.paraMap.overload('java.util.Map', 'java.lang.String', 'java.lang.String').implementation = function (addMap, append, sign) {
            console.log("MD5加密参数1为:"+addMap);
            console.log("MD5加密参数2为:"+append);
            console.log("MD5加密参数3为:"+sign);
            var result = this.paraMap(addMap, append, sign);
            console.log("sign加密结果:"+result);
            console.log("sign加密结果:"+result['equtype']);
            return result;
        }
    })
    Java.perform(function(){
        var hooksClass = Java.use("com.dodonew.online.http.RequestUtil");
        hooksClass.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, desKey, desIV) {
            console.log("DES加密参数1为:"+data);
            console.log("DES加密参数2为:"+desKey);
            console.log("DES加密参数3为:"+desIV);
            var result = this.encodeDesMap(data, desKey, desIV);
            console.log("encrypt加密结果:"+result);
            return result;
        }
    })
"""       

# get_usb_device改成get_remote_device方法,get_usb_device有的电脑会报错
process = frida.get_remote_device().attach(3179)  # 'App名称', 或 App应用的 Process Pid
script = process.create_script(java_code)  # 把js的hook脚本注入到进程里面
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()

2.JS还原

1、运行Hook代码
在这里插入图片描述
2、分析加密参数:
sign的加密参数:equtype=ANDROID&loginImei=Android354730613429558&timeStamp=1670240167016&userPwd=123456&username=15888888888&key=sdlkjsdljf0j2fsjk
sign的MD5加密结果:B5BC60EB36B54B683656B56B88714E00
3、WT-JS还原MD5
在这里插入图片描述
4、使用WT-JS生成MD5的加密代码
在这里插入图片描述
5、查看生成的代码
在这里插入图片描述
6、WT-JS还原DES
public static final String BASE_DES_IV = “32028092”;
public static final String BASE_DES_KEY = “65102933”;
这里有个小坑,分析apk源码可以发现,key先进行了MD5加密后才作为参数传入创建DES加密对象
在这里插入图片描述
这里先用WT-JS生成DES加密代码
在这里插入图片描述
7、查看WT-JS生成的DES加密代码
在这里插入图片描述

五、python登录实现代码

1.python示例代码

import time
import execjs
import urllib
import requests


class DuDuNiu(object):
    def __init__(self):
        with open(file="js_code.js", mode='r', encoding='utf-8') as fis:
            self.js_code = fis.read()
        self.js_obj = execjs.compile(source=self.js_code, cwd=r'D:\software_install\nodejs\node_modules')
        self.username = "15888888888"
        self.password = "123456"
        self.time_string = str(int(time.time() * 1000))
        self.headers = {
            'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 7.1.2; SM-G9810 Build/QP1A.190711.020)'
        }

    def get_login_params(self):
        items = {
            'equtype': 'ANDROID', 'loginImei': 'Android354730613429558', 'timeStamp': self.time_string,
            "userPwd": self.password, "username": self.username
        }
        content = ''
        for keys in items:
            content += f"{keys}={items[keys]}&"
        append = "sdlkjsdljf0j2fsjk"
        content += f"key={append}"
        print(content)
        sign = str(self.js_obj.call('MD5_Encrypt', content)).upper()
        print("sign参数:", sign)
        items['sign'] = sign
        content = str(items).replace(' ', '')
        print(content)
        encrypt_string = self.js_obj.call('DES_Encrypt', content)
        print("login参数:", encrypt_string)
        return encrypt_string

    def des_decrypt(self, content):
        result = self.js_obj.call('DES_Decrypt', content)
        return result

    def register(self):
        pass

    def login(self):
        login_url = 'http://api.dodovip.com/api/user/login'
        params = {"Encrypt": self.get_login_params()}
        login_response = requests.post(url=login_url, headers=self.headers, json=params)
        login_result = str(login_response.text)
        print("login响应:", login_result)
        login_result = self.des_decrypt(content=login_result)
        print(urllib.parse.unquote(login_result))

    def runs(self):
        self.login()


obj = DuDuNiu()
obj.runs()

2.python运行结果

在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了一个app的逆向案例,需要仔细观察一下加密的参数以及加密结果的变化,该示例用的加密参数都是同一种,希望对大家有所帮助;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一) 的相关文章

  • 遍历 globals() 字典

    我 尝试 使用globals 在我的程序中迭代所有全局变量 我就是这样做的 for k v in globals iteritems function k v 当然 这样做时 我只是创建了另外 2 个全局变量 k and v 所以我得到这个
  • 如何以编程方式使用 TestNG 运行 Selenium Java 测试?

    我使用 Selenium RC 和 Java 使用 TestNG 作为测试框架 我使用 Eclipse 作为 IDE 我想非常轻松地从我自己的程序中调用 TestNG 我怎样才能做到这一点 我的以下 Java 代码运行良好 Test pub
  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • 如何将 Jinja 与 Twisted 一起使用?

    我正在计划使用 Python 与 Twisted Storm 和 Jinja 一起开发一个讨论软件 问题是 Jinja 不是为 Twisted 或异步套接字库而设计的 并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因
  • 为 Keras 编写自定义数据生成器

    我将每个数据点存储在 npy 文件中 其中shape 1024 7 8 我想通过类似的方式将它们加载到 Keras 模型中ImageDataGenerator 所以我编写并尝试了不同的自定义生成器 但它们都不起作用 这是我改编的一个this
  • __subclasses__ 没有显示任何内容

    我正在实现一个从适当的子类返回对象的函数 如果我搬家SubClass from base py 没有出现子类 subclasses 它们必须在同一个文件中吗 也许我从来没有直接导入subclass py对Python隐藏子类 我能做些什么
  • 如何在应用程序级别管理只读数据库连接

    我们使用的是Java Spring Ibatis MySql 有没有办法利用这些技术在应用程序级别管理只读连接 我希望在只读 MySql 用户的基础上添加额外的保护层 如果 BasicDataSource 或 SqlMapClientTem
  • 可变和不可变类变量如何初始化?

    运行下面的示例代码 class S i 0 a def init self self i 1 self a append 1 s1 S print s1 i s1 a s2 S print s2 i s2 a 输出将是 1 1 1 1 1
  • 调试 python Web 服务

    我正在使用找到的说明here http www diveintopython net http web services user agent html 尝试检查发送到我的网络服务器的 HTTP 命令 但是 我没有看到按照教程中的建议在控制
  • captureWarnings 设置为 True 不会捕获警告

    我想记录所有警告 我以为这样的设定captureWarnings to True应该可以解决问题 但事实并非如此 代码 import logging import warnings from logging handlers import
  • pip:证书失败,但curl 有效

    我们在客户端安装了根证书 https 连接适用于curl 但如果我们尝试使用pip 它失败 Could not fetch URL https installserver 40443 pypi simple pep8 There was a
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • Tensorflow:提要字典错误:您必须为占位符张量提供值

    我有一个错误 我无法找出原因 这是代码 with tf Graph as default global step tf Variable 0 trainable False images tf placeholder tf float32
  • 使用 HttpClient 在 java 中进行连接池 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 HttpClient 创建连接池 我必须频繁连接到同一台服务器 值得创建这样一个池吗 是否可以保持 HTTP 连接处于活动状
  • SocketTimeoutException:插入 Google 云端硬盘时读取超时 - 是否可以重试?

    如同Java Google Drive SDK File insert execute 上的 SocketTimeoutException https stackoverflow com questions 17583630 java go
  • 如何在特定时间启动Tornado周期性回调?

    目前在我的 Tornado 应用程序中 我正在使用定期调用回调PeriodicCallback每隔一小时 像这样 import tornado ioloop from tornado ioloop import PeriodicCallba
  • Spring:在属性文件中定义@RequestMapping值

    是否可以定义a的值 RequestMapping在 Spring 中通过在属性文件中定义注释 实际上 我做了类似的事情 Controller RequestMapping xxx public class MyController 但我想存
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore
  • 为什么浮点数有符号零?

    为什么双打有 0也 0 其背景和意义是什么 0 通常 被视为0 当一个negative浮点数非常接近零 可以考虑0 要明确的是 我指的是算术下溢 http en wikipedia org wiki Arithmetic underflow
  • MongoDB 和 upsert 问题

    我有两个模型 1 资源假期 Id private String resourceID private List

随机推荐

  • 计算机组成原理实验四 微程序控制器实验报告

    我班算是几乎最后一个做实验的班级了 报告参考了一些朋友提供的数据加上一些自己的主观拙见 本人水平有限加之制作仓促难免有错误 望大家批评指正 4 1 微程序控制器实验 一 实验目的 1 掌握微程序控制器的组成原理 2 掌握微程序的编制 写入
  • 关于安装MinGw的问题

    前段时间电脑很卡 重装了系统 换了两条内存 电脑瞬间满血复活 不过重装各种东西就很麻烦了 安装个MinGW搞了我半天 所以今天记录一下怎么安装MinGW 1 哪下 MinGW w64GCC for Windows 64 32 bitshtt
  • Linux下配置java环境版本opencv

    安装gcc等编译环境 yum install gcc yum install python3 8 yum install cmake yum groupinstall Development Tools 去官方网站下载使用的压缩包4 5 0
  • nerf训练自己的数据,过程记录十分详细

    之前跑很多项目没有记录 后来再弄就不行了 这次特别记录一下 在梳理流程的同时希望给大家带来小小的帮助 我自己是在cuda11 2 windows环境下成功的 过程十分详细 有需要的朋友耐心看完 有问题可以评论区交流 首先 本文nerf是基于
  • Ubuntu 查看系统资源占用(CPU、内存、网络)

    系统监视器 CPU 内存 网络图 仅限当前桌面登录用户 gnome system monitor 查看内存占用 free h w 主要参数 b k m 分别以字节 KB MB 为单位显示内存使用情况 h 以合适的单位显示内存使用情况 最大为
  • SpringBoot+easypoi+vue导出word文档

    因为项目需求需要 临时写的有什么错误的地方望各位见谅 可以借鉴参考 easypoi依赖包
  • 在 Kylin 中实现异常值检测 UD(A)F

    本文讲解了时间序列数据异常值检测的基本概念和在 Kylin 中开发使用异常值检测 UDF 的方法 可以作为其他 UDF 开发的参考 通过在 Kylin 中移植 Hivemall 的 UDF 我们可以充分利用 Kylin 的优势 减少直接使用
  • TrafficMonitor安装报错

    由于找不到VCRUNTIME140 dll 无法继续执行代码 重新安装程序可能会解决次问题 解决方法 安装完 Visual Studio 2019后 就可以安装上了
  • STM32——一文完全读懂IIC通信

    文章目录 I2C基本概念 硬件线路 通信结构 I2C设备地址 I2C数据传输 I2C时钟速度和通信速度 I2C应答机制 I2C设备之间的冲突检测 I2C设备规格 主机读取数据 IIC通信过程 实际编程和应用 IO 口模拟 IIC 总线 常见
  • 服务器常用命令

    服务器常用命令 1 查看安装的软件 ps ef grep nginx 2 端口被占用 netstat anp grep 8801 2 2 通过程序名查询进程号 ps aux grep 程序名 2 3 通过进程号查询进程详细信息 ps ef
  • 【js】Object的常用方法

    Object assign target source 查看 Object entries 返回一个键值对数组查看 Object prototype toString call 查看
  • Redis的内存淘汰机制和删除策略

    Redis内存淘汰机制 Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除 内存的淘汰机制的初衷是为了更好地使用内存 配置 我们可以通过配置redis conf中的maxmemory这个值来开启内存淘汰功能 这个值
  • 【Python函数】——sort,sorted

    1 sorted和sort的常规使用 2 关于自定义比较函数 3 试验 from functools import cmp to key ll 2 3 10 1 2 3 5 6 7 2 5 10 2 4 10 根据一个维度进行排序 这里根据
  • sqli-labs Less-25、25a(sqli-labs闯关指南 25、25a)

    目录 Less 25 Less 25a Less 25 GET 基于错误 您所有的OR AND都属于我们 字符串单引号 源码 本关主要将 or and 进行了大小写的过滤 将其换成空 如何绕过 or 和 and 过滤 一般性提供以下几种思路
  • 国内第一篇讲解减少卡顿的代码级详细文章

    原文链接 原文链接 系统网站应用出现过卡顿 但却不知道如何优化 国内第一篇讲如何减少卡顿的代码级别详细文章 也是性能优化系列文章中的一篇 欢迎点赞 关注 也欢迎对其中的内容进行评论 经常听人说 不要阻塞主线程 或者 减少长耗时 该如何做呢
  • SQL Server 数据分页查询

    最近学习了一下SQL的分页查询 总结了以下几种方法 首先建立了一个表 随意插入的一些测试数据 表结构和数据如下图 现在假设我们要做的是每页5条数据 而现在我们要取第三页的数据 数据太少 就每页5条了 方法一 select top 5 fro
  • 火星数字

    火星人是以 13 进制计数的 地球人的 0 被火星人称为 tret 地球人数字 1 到 12 的火星文分别为 jan feb mar apr may jun jly aug sep oct nov dec 火星人将进位以后的 12 个高位数
  • attr 'explicit_paddings',tensorflow迁移到安卓报错不能载入模型

    attr explicit paddings tensorflow迁移到安卓报错不能载入模型 Android Stdio中报错 Caused by java io IOException Not a valid TensorFlow Gra
  • 第十章 网络工具--基于Linux3.10

    在测试io设备时 常常会用到iostat iotop工具 在查看内存时常常用到vmstat free slabtop工具 在查看调度器时 常常使用mpstat top以及ps工具 这里来说说网络相关的工具 有性能分析 网络管理 状态查看类工
  • App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一)

    App逆向案例 X嘟牛 Frida监听 WT JS工具还原 一 提示 文章仅供参考 禁止用于非法途径 文章目录 App逆向案例 X嘟牛 Frida监听 WT JS工具还原 一 前言 一 资源推荐 二 App抓包分析 三 反编译逆向分析 四