反编译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(后期工具需要)

注意:装在你知道的目录(不要有中文、不要用有空格)。

安装好之后需要配置下环境变量。

关于mac系统,自带JDK:

/Library/Java/JavaVirtualMachines 

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/

根据:frida版本 + Python版本 + 操作系统 来选择下载响应的egg文件。

放入指定目录

在错误提示中有指定egg放置的目录。

再次安装

pip install frida==16.0.1
pip install frida-tools==12.0.1

frida-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

 

进入手机后如果无法执行 su 命令,或者报错 ,原因基本是由于手机没有root造成的。

输入 su 命令,要在手机上点击同意。如果点了拒绝或者其他原因失败,可以尝试进入面具,如下所示:让shell获取权限即可

 

启动和Hook

【手机端】frida-server

在手机上运行 /data/local/tmp 目录下的 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)

第三步:Hook脚本

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()

2.JavaScript + 命令行

创建一个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";
    }
});

attach,先启动app,然后再在终端执行:

>>>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')

 

posted @ 2023-08-26 19:38  屠魔的少年  阅读(39)  评论(0)    收藏  举报