反编译apk
反编译apk
如果抓包发现一些参数是动态,明显看不出来是什么意思?那就需要反编译得到Java代码,然后再java代码中寻找算法。
例如:车智赢登录

常见的反编译工具:jadx(推荐)、jeb、GDA
反编译工具均依赖 JRE(Java运行环境),安装JDK(包含jre)。
下载jadx并解压至任意目录。
jdk
需要在你的电脑上安装Java开发工具包JDK,JDK中包含JRE。
https://www.oracle.com/java/technologies/downloads/
# 请务必安装 JDK8==JDK1.8(后期工具需要)



jadx
版本推荐:jadx-1.2.0
官网: https://github.com/skylot/jadx/releases
这是一个压缩包,下载好之后,解压缩即可。解压后看到的是可执行文件,直接点击运行即可。
打开jadx之后,可以把apk文件直接拖到左边空白处即可打开。
在反编译得到的java中,根据抓包得到的关键字,去java代码中寻找指定算法的生成位置。
注意:这个过程需要掌握Java和安卓开发。
常见的可以:
搜索URL网址。
或者搜索 参数关键字,比如pwd 或 "pwd"或 &pwd。
也可以搜索其他的关键字。
还可以通过hook搜索:找内存TreeMap,把代码中put换成我的put方法,这样的话代码中但凡走put函数,就可以走我们的代码, + 调用栈。
搜索网址: /tradercloud/sealed/login/login.ashx
hook验证
基于frida对代码进行验证,是否当前请求会执行此方法。
Python系解释器
请在系统解释器中安装Python3.7.9
https://www.python.org/downloads/release/python-379/然后再用Python3.7.9 创建一个虚拟环境 + 项目,后续逆向课程都在此项目中进行。
如果你现在电脑上只安装了python3.9,也可以再安装一个python3.8,Python支持多版本共存。

frida==16.0.1【电脑端】
pip install frida==16.0.1
pip install frida-tools==12.0.1正常情况下,就可以安装成功:

如果你在安装过程中,遇到以下错误,就需要:
- 
下载egg文件并放在指定目录 
- 
再次安装 frida和frida-tools 

下载egg
https://pypi.doubanio.com/simple/frida/

再次安装
pip install frida==16.0.1
pip install frida-tools==12.0.1frida-server【手机端】
手机CPU架构
用ADB与手机连接,然后再电脑中终端运行如下命令:
adb shell getprop ro.product.cpu.abi
下载frida-server
https://github.com/frida/frida/releases

解压&上传到手机
将下载来的压缩包解压得到的 文件 上传到手机的 /data/local/tmp/目录。
注意:一定是解压后的文件,不是文件夹。
上传
>>>adb push C:\soft\frida-server-16.0.1-arm64    /data/local/tmp/赋予可执行权限
>>>adb shell
>>>su
>>>cd /data/local/tmp/
>>>chmod 755 frida-server-16.0.1-android-arm64
>>>adb shell
>>>su
>>>cd /data/local/tmp
>>>./frida-server-16.0.1-android-arm64【电脑端】Hook
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
import subprocess
subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")# 枚举手机上的所有进程 & 前台进程
import frida
# 获取设备信息
rdev = frida.get_remote_device()
# 枚举所有的进程
processes = rdev.enumerate_processes()
for process in processes:
    print(process)
# 获取在前台运行的APP
front_app = rdev.get_frontmost_application()
print(front_app)import frida
import sys
# 连接手机设备
rdev = frida.get_remote_device()
session = rdev.attach("车智赢+")
scr = """
Java.perform(function () {
    // 包.类
    var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel");
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    UserModel.loginByPassword.implementation = function(str,str2,str3,responseCallback){
        console.log(str2,str3);
        var res = this.loginByPassword(str,str2,str3,responseCallback);
        return res;
    };
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
    }
});
"""
script = session.create_script(scr)
def on_message(message, data):
    print(message, data)
script.on("message", on_message)
script.load()
sys.stdin.read()Hook方式
1.Python脚本
attach:手动运行app,打开APP后,再运行Hook脚本。
import frida
import sys
# 连接手机设备
rdev = frida.get_remote_device()
session = rdev.attach("车智赢+")
scr = """
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
    }
});
"""
script = session.create_script(scr)
def on_message(message, data):
    print(message, data)
script.on("message", on_message)
script.load()
sys.stdin.read()spawn,脚本自动重启APP并进行Hook
import frida
import sys
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.che168.autotradercloud"])
session = rdev.attach(pid)
scr = """
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
    }
});
"""
script = session.create_script(scr)
def on_message(message, data):
    print(message, data)
script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()创建一个js文件,例如:demo.js
Java.perform(function () {
    // 包.类
    var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
    SecurityUtil.encodeMD5.implementation = function(str){
        console.log("明文:",str);
        var res = this.encodeMD5(str);
        console.log("md5加密结果=",res);
        return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
    }
});
>>>frida -UF -l demo.js  spwan,脚本自动重启APP并进行Hook
>>>frida -U -f com.che168.autotradercloud -l demo.js
注意:输入q + 再点击回车则退出将算法逆向出来之后,就要根据Java中的实现,用Python代码实现。
import hashlib
obj = hashlib.md5()
obj.update('密码'.encode('utf-8'))
hex_string = obj.hexdigest()
print(hex_string)
import random
import string
import base64
def base64_encrypt(data_string):
    data_bytes = bytearray(data_string.encode('utf-8'))
    data_bytes[0] = data_bytes[0] ^ (len(data_bytes) & 0xFF)
    for i in range(1, len(data_bytes)):
        data_bytes[i] = (data_bytes[i - 1] ^ data_bytes[i]) & 0xFF
    res = base64.encodebytes(bytes(data_bytes))
    return res.strip().strip(b"==").decode('utf-8')
 
                    
                     
                    
                 
                    
                
















 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号