温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何调用so文件生成xgorgon

发布时间:2022-01-06 15:39:03 来源:亿速云 阅读:227 作者:柒染 栏目:大数据

如何调用so文件生成xgorgon,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

目前很多 App 的加密签名算法都在so文件中,强行逆向so的话可能会消耗大量时间和资源。<br>之前用 xposed 采用 hook 的方法从程序计算签名,但是需要模拟器或者真机运行这个应用,使用效率不高。<br>也用过 jtype 启动JVM,然后通过 native 对so文件进行调用,因为每次都需要启动JVM,所以效率也不高。<br>unidbg 他不需要运行 app,也无需逆向 so 文件,通过在 app 中找到对应的 JNI 接口,然后用 unicorn 引擎直接调用 so 文件,所以效率相对要高不少。

unidbg特点

  • 模拟JNI调用API,可以调用JNI_OnLoad

  • 支持JavaVM,JNIEnv

  • 模拟系统调用

  • 支持ARM32和ARM64

  • 内联钩子(Inline Hook)

  • Android import hook

  • iOS 的一些hook工具 fishhook and substrate and whale hook

  • 支持简单的控制台调试器,gdb存根,实验性IDA android调试器服务器,指令跟踪,内存读/写跟踪

  • 支持iOS objc和Swift


unidbg环境配置

unidbg下载链接: https://github.com/zhkl0228/unidbg<br>IntelliJ IDEA可用于编辑unidbg源<br>如何调用so文件生成xgorgon<br>下载完成之后示导入到 IDEA 中,当然你需要准备好java环境(jdk、maven)<br>如何调用so文件生成xgorgon<br>选择Maven<br>如何调用so文件生成xgorgon<br>等待加载完成之后,运行src/…/encrypt 中的TTEncrypt测试用例<br>如何调用so文件生成xgorgon<br>如果控制台打印相关调用信息,说明已经导入成功。<br>如何调用so文件生成xgorgon


加载libcms.so

<br>下面准备调用libcms.so文件中的 leviathan 函数<br>首先在 src/test/resources 目录下新建文件夹dylib,放入libcms.so文件<br>libcms.so 下载地址: https://download.csdn.net/download/weixin_43582101/12713664<br>如何调用so文件生成xgorgon<br>然后我在 /unidbg/unidbg-android/src/test/java/com/sun/jna/ 目录下新建了 JniDispatch228.java文件<br>如何调用so文件生成xgorgon<br>JniDispatch228.java文件内容如下:


备注
“com/ss/sys/ces/a”需要调用函数所在的Java类完整路径,比如 a/b/c/d 等等,注意需要用/代替.
“leviathan(II[B)[B”需要调用的函数名,名字是smali语法,可通过jadx等工具查看
“vm.loadLibrary(new File)”so文件的路径,需要自行修改,最好为绝对路径
package com.sun.jna;

import com.github.unidbg.*;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.memory.MemoryBlock;
import com.github.unidbg.linux.android.dvm.array.ByteArray;



import java.io.File;
import java.io.IOException;

public class JniDispatch228 extends AbstractJni {

    private static LibraryResolver createLibraryResolver() {
        return new AndroidResolver(23);
    }

    private static AndroidEmulator createARMEmulator() {
        return new AndroidARMEmulator("com.sun.jna");
    }

    private final AndroidEmulator emulator;
    private final Module module;
    private final VM vm;

    private final DvmClass Native;

    private JniDispatch228() {
        emulator = createARMEmulator();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(createLibraryResolver());

        vm = emulator.createDalvikVM(null);
        vm.setJni(this);
        vm.setVerbose(true);

		// 自行修改文件路径
        DalvikModule dm = vm.loadLibrary(new File("/Users/Desktop/unidbg/unidbg-android/src/test/resources/dylib/libcms.so"), false);
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();

        Native = vm.resolveClass("com/ss/sys/ces/a");
   }

    private void destroy() throws IOException {
        emulator.close();
        System.out.println("destroy");
    }

    public static void main(String[] args) throws Exception {

        JniDispatch228 test = new JniDispatch228();

        test.test();

        test.destroy();
    }

    public static String xuzi1(byte[] bArr) {
        if (bArr == null) {
            return null;
        }
        char[] charArray = "0123456789abcdef".toCharArray();
        char[] cArr = new char[(bArr.length * 2)];
        for (int i = 0; i < bArr.length; i++) {
            int b2 = bArr[i] & 255;
            int i2 = i * 2;
            cArr[i2] = charArray[b2 >>> 4];
            cArr[i2 + 1] = charArray[b2 & 15];
        }
        return new String(cArr);
    }


    private void test() {
        String methodSign = "leviathan(II[B)[B";


        byte[] data = "暂时随便写的,这里是url经过处理后的data".getBytes();
        int time = (int) (System.currentTimeMillis() / 1000);

        Native.callStaticJniMethod(emulator, methodSign, -1,time,new ByteArray(vm,data));

        Object ret = Native.callStaticJniMethodObject(emulator, methodSign, -1,time,new ByteArray(vm,data));

        System.out.println("callObject执行结果:"+((DvmObject) ret).getValue());

        byte[] tt = (byte[]) ((DvmObject) ret).getValue();
        System.out.println(new String(tt));
        String s = xuzi1(tt);
        System.out.println(s);
    }
}

运行main方法即可查看生成出来的xgorgon了如何调用so文件生成xgorgon

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI