unidbg-最右之白龙分析

这篇具有很好参考价值的文章主要介绍了unidbg-最右之白龙分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

frida:

function printApplication(){
    Java.perform(function (){
        var BaseApplication = Java.use("com/izuiyou/common/base/BaseApplication");
        var application = BaseApplication.getAppContext();
        console.log(application);
    })
}

unidbg:文章来源地址https://www.toymoban.com/news/detail-528977.html

package com.jniunidbg.part5;

import com.github.unidbg.Emulator;
import com.github.unidbg.arm.context.RegisterContext;
import com.github.unidbg.debugger.BreakPointCallback;
import com.github.unidbg.hook.hookzz.*;
import com.github.unidbg.linux.android.dvm.AbstractJni;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import com.github.unidbg.memory.MemoryBlock;
import com.github.unidbg.pointer.UnidbgPointer;
import com.github.unidbg.utils.Inspector;
import com.sun.jna.Pointer;

import java.io.File;
import java.nio.charset.StandardCharsets;


public class zuiyou extends AbstractJni{
    private final AndroidEmulator emulator;
    private final VM vm;
    private final Module module;
    private final DvmClass NativeClass;

    zuiyou() {
        emulator = AndroidEmulatorBuilder.for32Bit().build(); // 创建模拟器实例
        final Memory memory = emulator.getMemory(); // 模拟器的内存操作接口
        memory.setLibraryResolver(new AndroidResolver(23)); // 设置系统类库解析
        vm = emulator.createDalvikVM(new File("unidbg-android/src/test/resources/lession2/part5/zuiyou/right573.apk")); // 创建Android虚拟机
        DalvikModule dm = vm.loadLibrary("net_crypto", true); // 加载so到虚拟内存
        module = dm.getModule(); //获取本SO模块的句柄

        vm.setJni(this);
        vm.setVerbose(true);
        dm.callJNI_OnLoad(emulator);

        NativeClass = vm.resolveClass("com/izuiyou/network/NetCrypto");

//        emulator.traceRead(0x40358000,0x40358000+7);
        emulator.traceRead(0xbffff54cL,0xbffff54cL+0x7L);
        emulator.traceRead(0xbffff63cL,0xbffff63cL+0x7L);
    };


    public void callInit(){
        String methodSign = "native_init()V";
        NativeClass.callStaticJniMethodObject(emulator, methodSign);
    }

    private void callSign(){
        String methodSign = "sign(Ljava/lang/String;[B)Ljava/lang/String;";
        StringObject ret = NativeClass.callStaticJniMethodObject(emulator, methodSign, "12345", "lilac".getBytes(StandardCharsets.UTF_8));
        System.out.println(ret);
    };

    public static void main(String[] args) throws Exception {
        zuiyou test = new zuiyou();
        test.hookMemcpy();
        test.HookMemcmp();
        test.callInit();
        test.callSign();
    }

    public void hookMemcpy(){
//        void *memcpy(void *str1, const void *str2, size_t n)
//        str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
//        str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
//        n -- 要被复制的字节数。
        emulator.attach().addBreakPoint(module.findSymbolByName("memcpy").getAddress(), new BreakPointCallback() {
            // onEnter
            @Override
            public boolean onHit(Emulator<?> emulator, long address) {
                RegisterContext registerContext = emulator.getContext();
                UnidbgPointer str1 = registerContext.getPointerArg(0);
                UnidbgPointer str2 = registerContext.getPointerArg(1);
                int length = registerContext.getIntArg(2);
                Inspector.inspect(str2.getByteArray(0, length), "要复制的数据源");
                System.out.println("复制到的地方:"+str1.toString());
                return true;
            }
        });
    }

    // hook C 库函数
    // int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
    public void HookMemcmp(){
        emulator.attach().addBreakPoint(module.findSymbolByName("memcmp").getAddress(), new BreakPointCallback() {
            @Override
            public boolean onHit(Emulator<?> emulator, long address) {
                System.out.println("call memcmp 作比较");
                RegisterContext registerContext = emulator.getContext();
                UnidbgPointer arg1 = registerContext.getPointerArg(0);
                UnidbgPointer arg2 = registerContext.getPointerArg(1);
                int size = registerContext.getIntArg(2);
                Inspector.inspect(arg1.getByteArray(0, size), "arg1");
                Inspector.inspect(arg2.getByteArray(0, size), "arg2");

                if(arg1.getString(0).equals("Context")){
                    emulator.attach().debug();
                }
                return true;
            }
        });
    }

    @Override
    public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature) {
            // cn.xiaochuankeji.tieba.AppController@1793a3b
            case "com/izuiyou/common/base/BaseApplication->getAppContext()Landroid/content/Context;":{
                return vm.resolveClass("android/content/Context").newObject(null);
            }
        }
        return super.callStaticObjectMethodV(vm, dvmClass, signature, vaList);
    }

    @Override
    public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
        switch (signature){
            case "android/content/Context->getClass()Ljava/lang/Class;":{
                return dvmObject.getObjectType();
            }
            // OK
            case "java/lang/Class->getSimpleName()Ljava/lang/String;":{
                return new StringObject(vm, "Context");
            }
            case "android/content/Context->getFilesDir()Ljava/io/File;":{
                return vm.resolveClass("java/io/File").newObject(signature);
            }
            case "java/io/File->getAbsolutePath()Ljava/lang/String;":{
                String tag = dvmObject.getValue().toString();
                if(tag.equals("android/content/Context->getFilesDir()Ljava/io/File;")){
                    return new StringObject(vm, "/data/data/"+vm.getPackageName()+"/files");
                }
            }
        }
        return super.callObjectMethodV(vm, dvmObject, signature, vaList);
    }

    @Override
    public boolean callStaticBooleanMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature){
            case "android/os/Debug->isDebuggerConnected()Z":{
                return false;
            }
        }
        return super.callStaticBooleanMethodV(vm, dvmClass, signature, vaList);
    }



    @Override
    public int callStaticIntMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature){
            case "android/os/Process->myPid()I":{
                return emulator.getPid();
            }
        }
        return super.callStaticIntMethodV(vm, dvmClass, signature, vaList);
    }
}

到了这里,关于unidbg-最右之白龙分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT强化学习大杀器——近端策略优化(PPO)

    近端策略优化 ( P roximal P olicy O ptimization)来自 Proximal Policy Optimization Algorithms (Schulman et. al., 2017)这篇论文,是当前最先进的强化学习 (RL) 算法。这种优雅的算法可以用于各种任务,并且已经在很多项目中得到了应用,最近火爆的ChatGPT就采用了该算法。 网上讲解ChatGPT算法

    2024年01月21日
    浏览(52)
  • 【工具篇】情侣大杀器,使用postman的代理,抓取手机流量

    目录 1. postman的版本 2. 代理的原理 3. 设置postman代理 4. 查看本机ip地址 5. 手机端设置 6. postman火力全开吧 在postman没有开启代理之前,手机访问直接访问互联网上的服务器,postman开启了代理,则手机对网站服务器发送的请求,会先经过postman,再由postman转发到服务器,同样,服

    2024年02月09日
    浏览(38)
  • unidbg或者java层解密方法IDEA中打包成jar包供python调用方法

    (1)配置jar包参数 (2)创建生成jar包 成功生成!

    2024年02月16日
    浏览(43)
  • AI模型大杀器----Amazon SageMaker 实现高精度猫狗分类

    前言: Hello大家好,我是Dream。 最近受邀参与了 亚马逊云科技【云上探索实验室】 活动,基于他们的sagemaker实现了机器学习中一个非常经典的案例: 猫狗分类 。最让我惊喜的是的模型训速度比想象中 效果要好得多,而且速度十分迅速,而且总体感觉下来整个过程十分便利

    2023年04月09日
    浏览(41)
  • 【腾讯云TDSQL-C Serverless 产品体验】新时代数据库大杀器

    近年来,随着互联网行业的高速发展,关系型数据库也面临着前所未有的挑战。云原生数据库成为解决这些挑战的重要方案之一。腾讯云推出的 TDSQL-C Serverless 版正是云原生数据库领域的佼佼者之一。 我在CSDN “学习” 的过程中发现腾讯云联合CSDN推出了 “腾讯云TDSQL-C产品测

    2024年02月07日
    浏览(46)
  • unidbg 简介、基本使用、调用so中方法、unidbg-web

    爬虫工程师的unidbg入门教程:https://www.cnblogs.com/xbjss/p/12110083.html 日常逆向分析的app:https://github.com/zhaoboy9692/dailyanalysis 分析unidbg(unidbgMutil)多线程机制:https://bbs.kanxue.com/thread-266999.htm 逆向调试时还是 IDA 的图形化界面更方便,一般首选 IDA 调试分析,后期要在生产线上生成

    2024年02月13日
    浏览(44)
  • Stable Diffusion的结构要被淘汰了吗?详细解读谷歌最新大杀器VideoPoet

    Diffusion Models视频生成-博客汇总 前言: 视频生成领域长期被Stable Diffusion统治,大部分的方式都是在预训练的图片Stable Diffusion的基础上加入时间层,学习动态信息。虽然有CoDi《【NeurIPS 2023】多模态联合视频生成大模型CoDi》等模型尝试过突破这一结构的局限,但是都没有对业

    2024年02月04日
    浏览(46)
  • unidbg-补文件环境(二)

    通过signature标识来确定文件标识; 补环境sd卡及根目录

    2024年02月12日
    浏览(39)
  • unidbg-点评补设备环境

    2024年02月12日
    浏览(42)
  • Unidbg初步学习记录

    抓包商品详情页,要模拟的是sign参数 报错补代码 报错补代码  运行出了结果,证明打包的没问题  成功跑出结果 这个案例网上有很多,适合入门哈哈

    2023年04月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包