大杀器Unidbg真正的威力

VSole2021-10-08 16:15:38

论2021如何处理 arm vmp?

在apk安全如今的时代,一切安全措施已经可以比肩pe级别的防护,加壳,ollvm混淆,vmp

似乎各大厂商都在不惜用用户的流畅体验度,来换取更安全的防护力度,也是2021了,谁还没有台晓龙855。CPU性能严重溢出,可能就是这些厂商的想法吧,反正不用白不用,这些算力也不是自己的。

但是碰到这么强的加固混淆,逆向人员应该如何是好呢?


有图有真相 Unidbg的杀手锏 CPU指令级别Trace

ps:Unidbg跟010Editor更配哦!

今天就来带大家以自身使用的经验去了解一下Unidbg!

上面那张图片呢,用的就是小弟魔改的UnidbgTraceCode出来的文件,通过Trace方法可以快速定位某个函数在指令级别的作用,帮助逆向人员更快的分析出想要的算法。

当然Unidbg能做的远远不止这些,本文并不是一篇科普文,所以本文假定读者都是有一定基础的同学。

callFunction:

如果你仔细观摩过Uniidbg源码的话,你会发现所有callJniMethodObject最终都会并入一个叫callFunction的函数。

那么我们在分析So的过程中,发现了一个非JNI函数能不能主动调用呢?答案是必须能。

这种好处的体现在于,逆向人员不必使用Jni函数去分析大量的无用代码,而是能精确的定位一个小的Func的具体作用以及算法逻辑。

通过该函数我们能得到这个小函数在内部到底做了什么操作,并且能Trace出更精确的指令文件。

public final Number[] callFunction(Emulator emulator, String symbolName, Object... args) {    Symbol symbol = findSymbolByName(symbolName, false);    if (symbol == null) {        throw new IllegalStateException("find symbol failed: " + symbolName);    }    if (symbol.isUndef()) {        throw new IllegalStateException(symbolName + " is NOT defined");    }     return symbol.call(emulator, args);}

该函数的第一个参数毋庸置疑是当前的模拟器:

  emulator = createARMEmulator();

第二个参数可以是导出函数名,或者是指定地址偏移,后面的参数就是个变长的参数列表,由逆向人员分析得到。

当然如果你是进行so内部函数调用的话,你大概率会填充一个指针,这里在给大家分享一段自己填充char* 类型的函数源码,别的类型参数同理,不再赘述。

private static void CallVMPFunc(Module module,AndroidEmulator emulator){    try {         Symbol malloc = module.findSymbolByName("malloc");        Symbol free = module.findSymbolByName("free");        MemoryBlock block = MemoryAllocBlock.malloc(emulator,malloc,free,0x1000);        MemoryBlock namebyte = MemoryAllocBlock.malloc(emulator,malloc,free,0x1000);        UnidbgPointer blockpoint = block.getPointer();        UnidbgPointer namepoint = namebyte.getPointer();         String name = "magicillusion";        String data = "hello worid";         namepoint.write(name.getBytes());        blockpoint.write(data.getBytes());      Number[] ret = module.callFunction(emulator,0x13B30+1,namepoint,blockpoint,2);      UnidbgPointer ret1 = new UnidbgPointer(emulator,ret[0].intValue(),4);        String string = ret1.getString(0);    System.out.println("Number => " +  (string));      } finally {     }  }

大杀器内置的HOOK框架

当然Unidbg还内置了多种HOOK框架,今天讲一个分析So比较实用的一款HookZz

// 1. 获取HookZz对象IHookZz hookZz = HookZz.getInstance(emulator); // 加载HookZz,支持inline hook,文档看https://github.com/jmpews/HookZz// 2. enable hookhookZz.enable_arm_arm64_b_branch(); // 测试enable_arm_arm64_b_branch,可有可无index = 0; hookZz.replace(module.findSymbolByName("lrand48"), new ReplaceCallback() {    @Override    public void postCall(Emulator emulator, HookContext context) {             ((EditableArm32RegisterContext)context).setR0(0x12345678);         int ptrace_args0 = context.getIntArg(0);        System.out.println("lrand48=" + ptrace_args0);     }  },true);  //aesdecode hookhookZz.wrap((module.base)+0x39634+1, new WrapCallback() { // inline wrap导出函数    UnidbgPointer addr = null;     @Override    // 4. 方法执行前    public void preCall(Emulator emulator, RegisterContext ctx, HookEntryInfo info) {        addr= ctx.getPointerArg(0);        UnidbgPointer pointerArg = ctx.getPointerArg(1);        UnidbgPointer pointer = pointerArg.getPointer(12);        int anInt = pointerArg.getInt(8);        byte[] byteArray = pointer.getByteArray(0, anInt);        String s =xuzi1(byteArray);        System.out.println("aes aesdecode= " + s);     }     @Override    // 5. 方法执行后    public void postCall(Emulator emulator, RegisterContext ctx, HookEntryInfo info) {         byte[] aaaa = addr.getPointer(0).getPointer(12).getByteArray(0,0x30);        String s =xuzi1(aaaa);        System.out.println("aes aesdecode1= " + s);    } });

同理,此框架也支持导出函数HOOK以及InlineHOOK 有了这个方法,在你分析一些函数的时候,可以充当Log的效果或者强行改变一些函数的返回值让你更容易的分析,比如本例中笔者改变了Lrand48的返回值,让函数每次都强行返回0x12345678,这样在逆向分析的时候能让一些不确定性变成可控性。

本作品采用《CC 协议》,转载必须注明作者和本文链接
CPU性能严重溢出,可能就是这些厂商想法吧,反正不用白不用,这些算力也不是自己。?有图有真相 Unidbg杀手锏 CPU指令级别Traceps:Unidbg跟010Editor更配哦!今天就来带大家以自身使用经验去了解一下Unidbg!?当然Unidbg能做远远不止这些,本文并不是一篇科普文,所以本文假定读者都是有一定基础同学。
逆向某平台分析过程指导
首先使用jadx对apk进行逆向。?搜索关键字 QDSign,可以直接找到对应类,可以看到参数经过加密得到。??进一步跟踪,发现了c类中有如下三个so方法,还有3个loadlibrary,分别进行了hook,发现c-lib动态注册了sign,sos动态注册了s,没有发现crypto有动态注册。
无意中看到ch1ng师傅文章觉得很有趣,不得不感叹师傅太厉害了,但我一看那长篇函数总觉得会有更骚东西,所幸还真的有,借此机会就发出来一探究竟,同时也不得不感慨下RFC文档妙处,当然本文针对技术也仅仅只是在流量层面上waf绕过。Pre很神奇对吧,当然这不是终点,接下来我们就来一探究竟。前置这里简单说一下师傅思路部署与处理上传warservlet是?
HW总结模板与实例
2022-08-05 06:25:34
安排专人进行对接,随时与防守团队保持联络,通过电话会议每日协商,汇总当日所发生安全事件,针对安全事件进行应急响应和处置。编制X份防守成果报告,经演戏指挥部确认,得分XX分。截止目前,已完成所有问题整改、漏洞修复。
2022HVV总结模板与实例
2022-08-04 10:12:41
安排专人进行对接,随时与防守团队保持联络,通过电话会议每日协商,汇总当日所发生安全事件,针对安全事件进行应急响应和处置。编制X份防守成果报告,经演戏指挥部确认,得分XX分。截止目前,已完成所有问题整改、漏洞修复。
0x01 简介本次测试为实战测试,测试环境是授权项目中一部分,敏感信息内容已做打码处理,仅供讨论学习。由于本人在内网方面掌握也是属于新手阶段,运用到一些msf攻击手法也很基础,请各位表哥多多指教。
BurpSutie渗透插件推荐
2021-11-13 05:10:22
本文只适合渗透测试岗位和安服岗位人士,其中本文不会放任何工具链接,但会给出关键词,GitHub可以搜索使用,请勿测试非授权项目目标,本号不负任何责任,此篇文章只作为学习知识使用。
10月16日,“天府杯”2021国际网络安全大赛暨天府国际网络安全高峰论坛在成都开幕。
红队之信息收集
2021-09-22 12:30:38
企业信息收集拿到一个目标,不考虑钓鱼情况下。如果正常从web入手,至少需要收集以下信息。一般经过上面收集以后,我们能够获取到一系列ip,域名信息。此时需要针对这些进行排除。碰到过一次有个队伍打供应链下载源码审计这种属于非常态暂不讨论。用户级别主要是涉及拿到一些用户用户名等。便于进行暴力破解。利用app查询公司域名。是在于跑一下子域名。先不要急着跑子域名。
VSole
网络安全专家