Chr_小屋

安卓Native逆向笔记(一)

前言

本文仅供学习探讨之用,如果侵犯您的权益请联系本站删除。

1. 抓包

如图,每个请求会附加一个hkey,hkey是个时间相关的token,我想要得到这个hkey的计算方法

1. APP分析

使用非常好用的国产分析软件 GDA:链接

虽然GUI比较杀马特,但是又不是不能用

直接把APP丢进GDA,然后搜索字符串"hkey"

第一处:
这个是旧版本APP使用的计算方式,就是时间戳取MD5,然后把MD5结果里的"a"和"0"替换成"app",然后再取一次MD5,很弱智的加密

第二处:
这是新版本APP使用的计算方式,看导入名,使用了NDKTools包里的encode函数,v2是API的URL取路径,v1_1是时间戳

使用Jadx,反混淆类名以后,定位到NDKTools类,看起来encode函数是个Native方法

上吧,Frida

Frida是个通用HOOK框架,支持各种平台,可以动态插桩,比XPosed不知道高到哪里去了(?)
首先下载最新版的Frida Server:链接,下载安卓arm或者安卓arm64就行
安装Python3依赖库:pip3 install frida

Frida是这样的,手机或者电脑端运行的是Server端,用来接收指令,开发机是客户端

使用ADB连上手机,上传Frida Server

adb usb
adb push /sbin/frida [解压出来的Frida-server文件路径]

在ADB Shell里运行Frida-Server,我的设备已经ROOT了,没有ROOT没法动态HOOK

adb shell
$ su
# frida

在电脑上新建一个Python3工程
HOOK模板:

import sys
import frida
from typing import BinaryIO
js_file_name = 'Hook.js'
process_name = 'com.max.xiaoheihe'
# 自定义回调函数
def on_message(message, data):
        print(message)
        print(data)
def get_js_code():
    js_file = open(js_file_name)  # type: BinaryIO
    return js_file.read()
if __name__ == '__main__':
    rdev=frida.get_remote_device()
    # 附加到进程并得到进程对象
    process = rdev.attach(process_name)
    # 指定JavaScript脚本
    script = process.create_script(get_js_code())
    # 加载JavaScript脚本
    script.on('message', on_message)
    script.load()
    # 读取返回输入
    sys.stdin.read()

在同级目录新建Hook.js

console.log("脚本载入成功");
Interceptor.attach(Module.findExportByName("libnative-lib.so", "encode"), {
    onEnter: function (args) {
        send("encode(" + Memory.readCString(args[0]) + "," + args[1]+"," + args[2] + ")");
    },
    onLeave: function (retval) {
    }
});

在手机上打开APP,然后运行
如果输出"脚本载入成功"就说明HOOK没有错误,至于HOOK上了没有得操作一下APP:

可以看到输出调用encode传入的3个参数,因为后两个是字符串,获取到的内容是个字符串地址,第一个参数貌似是个Java类

未完待续

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »