unidbg学习模拟m团mtgsig

模拟结果:

代码:

package com.test;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.file.FileResult;
import com.github.unidbg.file.IOResolver;
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.ArrayObject;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;
import com.github.unidbg.memory.Memory;

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

public class MtGsigTest extends AbstractJni implements IOResolver {
    private final AndroidEmulator emulator;
    private final Module module;
    private final VM vm;
    private final DvmClass NBridge;

    public String apkPath = "xxxxx.apk";
    public String soPath = "xxxxx.so";

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

    private static AndroidEmulator createARMEmulator() {
        return AndroidEmulatorBuilder
                .for32Bit()
                .build();
    }

    MtGsigTest() {
        emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.xxxx").build();
        final Memory memory = emulator.getMemory();
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM(new File(apkPath));
        vm.setVerbose(true);

        DalvikModule dm = vm.loadLibrary(new File(soPath), true);

        emulator.getSyscallHandler().addIOResolver(this);
        vm.setJni(this);


        module = dm.getModule();

        NBridge = vm.resolveClass("com/meituan/android/common/mtguard/NBridge");
        dm.callJNI_OnLoad(emulator);
    }

    public static void main(String[] args) throws IOException {
        MtGsigTest mtGsig = new MtGsigTest();

        mtGsig.callMain111();
        mtGsig.callMain203();

        mtGsig.destroy();

    }



    private void destroy() throws IOException {
        emulator.close();
    }

    public void callMain111() {
        DvmObject<?> strRc = NBridge.callStaticJniMethodObject(
                emulator, "main(I[Ljava/lang/Object;)[Ljava/lang/Object;",
                111,
                new ArrayObject(vm.resolveClass("java/lang/object").newObject(1))
        );

        System.out.println("callMain111: " + strRc);
    }

    public DvmObject<?> callMain203() {
        DvmObject<?> strRcstrRc = NBridge.callStaticJniMethodObject(
                emulator, "main(I[Ljava/lang/Object;)[Ljava/lang/Object;",
                203,
                new ArrayObject(
                        new StringObject(vm, "9b69f861-e054-4bc4-9daf-d36ae205ed3e"),
                        new ByteArray(vm, "xxxxxx".getBytes()),
                        DvmInteger.valueOf(vm, 2)
                )
        );

        System.out.println("mtgsig: " + ((DvmObject<?>[]) ((ArrayObject) strRcstrRc).getValue())[0]);
        return strRcstrRc;
    }


    @Override
    public int getStaticIntField(BaseVM vm, DvmClass dvmClass, String signature) {
        switch (signature){
            case "android/content/pm/PackageManager->GET_SIGNATURES:I":{
                return 64;
            }
        }
        return super.getStaticIntField(vm, dvmClass, signature);
    }

    @Override
    public FileResult resolve(Emulator emulator, String pathname, int oflags) {
        return null;
    }


    @Override
    public int callStaticIntMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature){
            case "com/meituan/android/common/mtguard/NBridge->getMtgVC()I":{
                return 4204;
            }
        };
        return super.callStaticIntMethodV(vm, dvmClass, signature, vaList);
    }

    @Override
    public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature) {
            case "com/meituan/android/common/mtguard/NBridge->getPicName()Ljava/lang/String;":{
                return new StringObject(vm, "ms_com.sankuai.meituan");
            }
            case "com/meituan/android/common/mtguard/NBridge->getSecName()Ljava/lang/String;":{
                return new StringObject(vm, "ppd_com.sankuai.meituan.xbt");
            }
            case "com/meituan/android/common/mtguard/NBridge->getAppContext()Landroid/content/Context;":{
                return vm.resolveClass("android/content/Context").newObject(null);
            }
            case "com/meituan/android/common/mtguard/NBridge->getMtgVN()Ljava/lang/String;": {
                return new StringObject(vm, "4.2.0.4");
            }
        }
        return super.callStaticObjectMethodV(vm, dvmClass, signature,vaList);
    }

    @Override
    public DvmObject<?> newObjectV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature) {
            case "java/lang/Integer-><init>(I)V":{
                return vm.resolveClass("java/lang/Integer").newObject(new Integer(0));
            }
        }
        return super.newObjectV(vm,dvmClass,signature,vaList);
    }
}
测试结果:

2.3版本:

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
unidbg是一个针对Android系统的动态二进制分析工具,它能够模拟和分析Android应用程序的执行过程。该工具利用了QEMU和Unicorn模拟器的特性,通过对虚拟机进行操控,实现对Android应用程序的脱壳、动态调试、动态修改等功能。 与传统的静态分析工具相比,unidbg具有很多优势。首先,unidbg采用动态分析的方式进行分析,能够绕过代码的混淆和加密,对于那些使用加密算法进行保护的应用程序也能有效地进行分析。其次,unidbg不需要对应用程序进行重新编译,能够直接加载原始二进制文件进行执行,节省了分析时间和资源。此外,unidbg可以模拟各种硬件平台和系统版本,方便进行兼容性和兼容性测试。 而xhs指的是小红书应用,是一款流行的社交媒体应用程序,用户可以在其中分享生活中的照片、美食、旅行等内容,并与其他用户进行互动和交流。 结合上述两个概念,如果要使用unidbg分析小红书应用(xhs),可以通过以下步骤进行: 1. 在模拟器或真机环境中安装unidbg工具,并准备好相应的系统库和插件。 2. 将小红书应用程序的安装包导入到模拟器或真机环境中。 3. 使用unidbg命令行工具或API,加载小红书应用程序的二进制文件,并开始动态分析。 4. 在动态分析过程中,可以对小红书应用程序进行脱壳、hook函数、修改数据等操作,以获取目标应用程序的内部逻辑和敏感数据。 5. 通过观察和分析unidbg的执行日志,可以获取关键信息,如函数调用堆栈、内存读写等,进一步研究和理解小红书应用程序的工作原理。 综上所述,unidbg工具可以作为一种有效的动态分析工具,用于分析小红书应用程序和其他Android应用程序的执行过程,帮助开发者进行bug修复、反编译分析、代码优化和安全评估等工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值