首页
社区
课程
招聘
[原创]frida-rpc 远程调用SO里面的加解密算法
发表于: 2020-10-11 12:25 13371

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

2020-10-11 12:25
13371

注册看雪多年,小弟第一次发贴,请大神们多多指点


直入主题

apk拖到jadx里面,找到我们需要调用的方法

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() {
    }
decrypt---解密 在native层
encrypt----加密 在native层

我们就不去分析他的so了  我们要使用的是frida-rpc远程调用接口 

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


看一下,这两个方法的具体代码:

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


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框架

#!/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  用后台启动

看图

检查,启动成功 


运行我们的flask框架


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


实现成功


我们可以开启本地IP转发,这样外网任意调用了,

【我还有一个想法,那就是把代码部署到手机里面去,这样手机来当服务器,这样是不是更加简便呢,】

【欢迎爱好算法分析的朋友一起交流,交流Q群:70673850】



[课程]FART 脱壳王!加量不加价!FART作者讲授!

最后于 2020-10-11 12:27 被小明同学编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (6)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
我也这样搞的,APP动不动就奔溃,有啥解决方案吗
2020-10-12 11:29
0
雪    币: 114
活跃值: (591)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Everou 我也这样搞的,APP动不动就奔溃,有啥解决方案吗
我运行比较正常!
2020-10-13 12:52
0
雪    币: 482
活跃值: (1007)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
说明so文件没有内置,会不会是从网络接口下载的?
2020-11-11 15:51
0
雪    币: 614
活跃值: (853)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
先赞一个!
2020-11-12 09:49
0
雪    币: 80
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
赞,收藏了
2020-11-15 16:06
0
雪    币: 0
活跃值: (265)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

test

最后于 2021-5-6 14:47 被modianor编辑 ,原因:
2020-11-18 23:56
0
游客
登录 | 注册 方可回帖
返回
//