IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 安卓逆向——Unidbg的初步使用 -> 正文阅读

[开发工具]安卓逆向——Unidbg的初步使用

环境 :

  • JAVA 1.8??
  • IDEA

1.? 安装??

?github 地址? :?https://github.com/zhkl0228/unidbg

?把项目下载下来,使用 IDEA 打开项目,等待加载完

(注意看看java的版本吧,加载失败可以重新加载试试)

2.? 实践Code

首先 看到?unidbg-android/src/test/java/com/sun.jna 里面的 文件,这里是 32 和 64 的案例

可以模仿这 案例来学习?

?这里的案例也是网上百度,模仿写的,能运行打包,出结果就可以

?代码 案例,自己可以换一个 so 文件 测试?

public class JniDispatch128 extends AbstractJni {

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


    // 创建模拟器实例,要模拟32位或者64位,在这里区分  for32Bit
    private static AndroidEmulator createARMEmulator() {
//        return new AndroidARMEmulator("com.sun.jna"); // "com.sun.jna"
        return AndroidEmulatorBuilder.for32Bit()
                .setProcessName("com.sun.jna")
                .addBackendFactory(new HypervisorFactory(true))
                .build();
    }

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

    private final DvmClass Native;


    private JniDispatch128() throws IOException {



        // 插件模拟器 实例
        emulator = createARMEmulator();
        // 获取模拟器的内存
        final Memory memory = emulator.getMemory();
        // 内存设置 sdk版本 23
        memory.setLibraryResolver(createLibraryResolver());

        //创建DalvikVM,可以载入apk,也可以为null
        vm = emulator.createDalvikVM((File) null);
        vm.setJni(this);
        vm.setVerbose(true);  // 是否打印日志

        // 自行修改文件路径  // 载入要执行的 so
        DalvikModule dm = vm.loadLibrary(new File(getPath() + "/vwolf/libcms.so"), false);
//        DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/dylib/libcms.so"), false);

        //JNI_OnLoad 加载 so 文件
        dm.callJNI_OnLoad(emulator);
        // 获取 所有的  方法
        module = dm.getModule();

        // Jni调用的类
        Native = vm.resolveClass("com/ss/sys/ces/a");
    }

    private String getPath() {
            //获取当前文件所在的路径
//            String localPath = this.getClass().getResource("").getPath();
            String localPath = System.getProperty("user.dir");
            System.out.println("localPath = " + localPath);
//            File directory = new File("");//设定为当前文件夹
//            try{
//                System.out.println(directory.getCanonicalPath());//获取标准的路径
//                System.out.println(directory.getAbsolutePath());//获取绝对路径
//            }catch(IOException e){}
            //localPath = /C:/work/idea-WorkSpace/my-demo/demo-file/target/classes/com/zgd/demo/file/path/
            return localPath;
    }

    // 销毁 模拟器
    private void destroy() throws IOException {
        emulator.close();
        System.out.println("destroy");
    }

    // 主 方法 ,入口函数
    public static void main(String[] args) throws Exception {

        String str = args[0];
        System.out.println("str -->> "+str);

        // 实例化 对象
        JniDispatch128 test = new JniDispatch128();
        // 调用 test 方法,执行
        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);
    }
}

能运行就谢天谢地了

?运行后,就是想办法,打包成 jar?

3. 打包 jar?

? ? ?IDEA 找到 File → Project Structure …? 然后选择 Artifacts, 点加号 Add?

?注意 俩个勾选的地方? include tests 和 include in project build 编译?

最后 点击运行 或 小绿锤子 ,会在输出文件夹出现很多 jar 文件?

使用 命令运行,完成没毛病

?想给启动程序传入参数,这时在 idea编译设置个参数

?首先 点击菜单 Run->Edit Configurations?

然后 在主类的Configuration -> Program arguments中输入你的参数,多个参数以空格分隔

什么都配置好了,用Py执行jar获取返回值,运行完成,OK?

后面在想怎么部署到服务器吧,可以参考下面的文章

参考 :

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:18:53  更:2021-08-26 12:21:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/22 19:43:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码