好久没有去做安卓的东西了,技术日新月异,貌似自己有点脱节了。其实之前也尝试过安装frida,好几次都比较蛋疼的卡在了安装的地方。同样,这一次又开在了安装的地方,仔细看了下没有找到wheel,取消之后可以先装wheel,然后再次安装,如果使用国外的源太慢,可以尝试切换到国内的源,个人比较倾向于清华大学的python源,地址自己去我的友链表复制。
如果不想永久的修改源,可以通过-i参数来切换源。
安装之后许还需要安装frida-server,猛击此处下载!我没有使用真机,用的安卓模拟器。把模拟器的路径添加到系统环境变量,然后即可以直接运行adb命令了。
执行adb push frida-server /data/local/tmp/ 将frida-server push到设备上,添加执行权限,然后服务即可。
执行adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043 进行端口转发。
然后就可以通过frida进行链接控制了。
以某app为例,数据进行了加密,不单接口加密,包括返回的图片也进行了加密。在没有解密的情况下是无法正常显示的,数据内容如下:
代码里虽然能看到解密用的key 和iv, 但是在实际解密的时候并不是这个数值:
public static final String decodeImgIv()
{
return CipherCore.get("f3d9434408e52778164db2214e3a0a22");
}
public static final String decodeImgKey()
{
return CipherCore.get("a527dfef2540e04977c7893c21dbb0f9");
}
最终调用的aes函数为:com.ilulutv.fulao2.other.g.b。
那么要获取解密的key和iv只需要hook这个函数即可:
Java.perform(function () {
// Function to hook is defined here
var base64 = Java.use('android.util.Base64');
var aes = Java.use('com.ilulutv.fulao2.other.g.b');
// 图片加密处理
aes.b.overload("[B", "[B", "java.lang.String").implementation = function(k, iv, source_string){
send("Image_key:"+k);
send(base64.encodeToString(k, 0))
send("Image_iv:"+iv);
send(base64.encodeToString(iv, 0))
return this.b(k, iv, source_string);
};
});
不过由于解密之后的byte是不可见字符,于是用base64重新加密之后发送出来,真实的加密的key为:b’\xb2\xf3\x84(f\xf9X=\x1e\xcea\xc4\xe0U\xc2U’
使用获取的key和iv解密图片就可以正常显示了:
图片为浅色部分:
完整的代码:
# -*- coding: utf-8 -*-
"""
@author: obaby
@license: (C) Copyright 2013-2020, obaby@mars.
@contact: root@obaby.org.cn
@link: http://www.obaby.org.cn
http://www.h4ck.org.cn
http://www.findu.co
@file: f_test.py
@time: 2020/6/29 13:35
@desc:
"""
import frida
import sys
rdev = frida.get_remote_device()
session = rdev.attach('com.ilulutv.fulao2')
src = """
Java.perform(function () {
// Function to hook is defined here
var base64 = Java.use('android.util.Base64');
var aes = Java.use('com.ilulutv.fulao2.other.g.b');
//图片加密处理
aes.b.overload("[B", "[B", "java.lang.String").implementation = function(k, iv, source_string){
send("Image_key:"+k);
send(base64.encodeToString(k, 0))
send("Image_iv:"+iv);
send(base64.encodeToString(iv, 0))
return this.b(k, iv, source_string);
};
});
"""
script = session.create_script(src)
def on_message(message, data):
print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()
apk下载:https://obaby.lanzous.com/iime7e5924j