查看: 338|回复: 0

[转载图文] frida-rpc 远程调用SO里面的加解密算法

[复制链接]
发表于 2020-10-14 11:44:36 | 显示全部楼层 |阅读模式
apk拖到jadx里面,找到我们需要调用的方法
1
2
3
4
5
6
7
8
9
10
11
12
public class JavaNdk {
    private static JavaNdk instance = new JavaNdk();
    private final String TAG = StringFog.decrypt("IgsFMwxSLh8G");

    private native byte[] decrypt(String str);

    private native byte[] encrypt(String str);

    public static native void init(Context context);

    private JavaNdk() {
    }

1
decrypt---解密 在native

1
encrypt----加密 在native

我们就不去分析他的so了  我们要使用的是frida-rpc远程调用接口
PS:请问一下大神们,我知道了他的so文件名,但是我解压apk里面,跟本找不到这个so文件,我又用Frida遍历加载的so也都没有这个so,这种情况下如何用可以分析的的SO呢??

看一下,这两个方法的具体代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private String encryptSrc(String msg) {
        if (msg != null) {
            byte[] result = encrypt(msg);
            if (result != null) {
                try {
                    return new String(result, StringFog.decrypt("PREKVA=="));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return null;
                }
            } else {
                throw new IllegalArgumentException(StringFog.decrypt("LQsPHhZQI08UDQ0kS0JC"));
            }
        } else {
            throw new IllegalArgumentException(StringFog.decrypt("JRYLTANFOU8XHhYnF0JCQQ=="));
        }
    }

    private String decryptSrc(String msg) {
        if (msg != null) {
            byte[] ret = decrypt(msg);
            if (ret != null) {
                return new String(ret);
            }
            throw new IllegalArgumentException(StringFog.decrypt("LAAPHhZQI08UDQ0kS0JC"));
        }
        throw new IllegalArgumentException(StringFog.decrypt("JRYLTANFOU8XHhYnF0JCQQ=="));
    }


传string参数  返回byte[]
直接调用encryptSrc 传string返回string
              decryptSrc 同理

上frida rpc代码
test.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var result;

function encrypt(str_url) {
        Java.perform(function fn() {
            console.log("begin");
            Java.choose("com.mingning179.networkapi.util.JavaNdk", {
                onMatch: function (x) {
                    console.log("find instance :" + x);
                    console.log("result of fun(string) encrypt:" + str_url);
                    result=x.encryptSrc(Java.use("java.lang.String").$new(str_url));
                },
                onComplete: function () {
                    console.log("end");
                }
            })
        });
        return result;
    }
function decrypt(str_data) {
        Java.perform(function fn() {
            console.log("begin");
            Java.choose("com.mingning179.networkapi.util.JavaNdk", {
                onMatch: function (x) {
                    console.log("find instance :" + x);
                    console.log("result of fun(string) decrypt:"+str_data);
                    result=x.decryptSrc(Java.use("java.lang.String").$new(str_data));
                },
                onComplete: function () {
                    console.log("end");
                }
            })
        });
        return result;
    }

rpc.exports = {
    decrypt: decrypt,
    encrypt: encrypt,
};

python 代码  我们要远程调用API接口,
我直接在GitHub下载的 别人代码改了一下,全POST接口方法传参数
flask框架
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/python3
# -*- coding: utf-8 -*-


import frida
import json
from flask import Flask, jsonify, request


def on_message(message, data):
    if message['type'] == 'send':
        print("
  • {0}".format(message['payload']))
        else:
            print(message)


    js = open('test.js', 'r', encoding='utf8').read()
    # session = frida.get_usb_device().attach('me.ele')
    session = frida.get_usb_device().attach('com.wjmt.app')
    script = session.create_script(js)
    script.on('message', on_message)
    script.load()

    app = Flask(__name__)


    @app.route('/decrypt', methods=['POST'])#data解密
    def decrypt_class():
        data = request.get_data()
        json_data = json.loads(data.decode("utf-8"))
        postdata = json_data.get("data")
        res = script.exports.decrypt(postdata)
        return res


    @app.route('/encrypt', methods=['POST'])#url加密
    def encrypt_class():
        data = request.get_data()
        json_data = json.loads(data.decode("utf-8"))
        postdata = json_data.get("data")
        print(postdata)
        res = script.exports.encrypt(postdata)
        return res


    if __name__ == '__main__':
        app.run()


  • 启动我们手机里面的frida-server 服务,我改名为fs  用后台启动
    看图

    frida-rpc 远程调用SO里面的加解密算法

    frida-rpc 远程调用SO里面的加解密算法
    检查,启动成功

    运行我们的flask框架

    frida-rpc 远程调用SO里面的加解密算法

    frida-rpc 远程调用SO里面的加解密算法

    调用一下加密,接迷的API接口看看

    frida-rpc 远程调用SO里面的加解密算法

    frida-rpc 远程调用SO里面的加解密算法

    frida-rpc 远程调用SO里面的加解密算法

    frida-rpc 远程调用SO里面的加解密算法

    实现成功

    我们可以开启本地IP转发,这样外网任意调用了,
    温馨提示:
    1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
    2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
    3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
    论坛交流群:672619046
    微信公众号
    快速回复 返回顶部 返回列表