type
status
date
slug
summary
tags
category
icon
password
部分内容来自:龙哥星球中Coffee的Unidbg学习笔记
一、初始化项目
二、创建context类
三、字符串类型如何构造,字节数组如何构造,对象数组如何构造,参数2的实例对象怎么传?
传入Native的JAVA参数,除了八个基本类型外(byte、char、short、int、long、float、double、boolean),都必须vm.addLocalObject添加到局部引用中去。其他的对象类型一律要手动 addLocalObject。
四、如何判断是Thumb还是ARM
ARM模式指令总是4字节长度,Thumb指令长度多数为2字节,少部分指令是4字节。 1、找准一行汇编,Alt+G快捷键。Thumb模式是1,ARM模式是0。
代码是Thumb模式,调用的时候别忘了+1,Thumb的+1只在运行和Hook时需要考虑,打Patch和下断点不用
五、patch修改指令
第一种方法
第二种方法
六、Unidbg Hook使用
hookZz
Inline hook
Unidbg
七、Unidbg Console Debugger
八、loadLibrary
如果在加载so到虚拟内存的步骤中,参数二设为false(即不执行init相关函数),会出现乱码。其实其中的道理并不复杂,甚至可以说很简单——SO样本做了字符串的混淆或加密,以此来对抗分析人员,但字符串总是要解密的,不然怎么用呢?这个解密一般发生在Init array节或者JNI OnLoad中,又或者是该字符串使用前的任何一个时机。
九、各种补环境
补Context
补一个空类
补具体类名
补文件路径
检测是否有调试
使用Unidbg的API返回PID
判断map是否为空
补map.get
补SignedQuery类的init,也就是初始化一个SignedQuery对象
补签名
初始化异常类
十、文件重定向/文件访问
当样本做文件访问时,Unidbg重定向到本机的某个位置,进入 src/main/java/com/github/unidbg/file/BaseFileSystem.java 在构造函数第三行加上 System.out.print("virtual path:" + rootDir); 打印虚拟路径,接下来我们按照要求,在报错提示目录下新建对应文件夹,并把我们的apk复制进去,改名成报错提示需要的apk。
创建模拟器实例的时候,加上setRootDir(new File("target/rootfs"),运行代码的时候会自动创建生成target/rootfs目录
除此之外,也可以通过代码的方式进行操作
我们的类实现文件重定向的接口即可,只需要三个步骤,如下:
补文件
十一、打印地址所指向的内存,其效果类似于frida中hexdump,push保存,在后面再pop取出
十二、如何主动调用一个Native函数
十三、unidbg下断点
命令
十四、unidbg traceCode
十五、开启所有的日志
十六、注册libAndroid.so虚拟模块
Tips:
getPackageCodePath
返回android 安装包的完整路径,这个包是一个zip的压缩文件,它包括应用程序的代码和assets文件。
方法:getFilesDir 释义:返回通过Context.openFileOutput()创建和存储的文件系统的绝对路径,应用程序文件,这些文件会在程序被卸载的时候全部删掉。
方法:getCacheDir 释义:返回应用程序指定的缓存目录,这些文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有任何保障的,可能会随时丢掉。
方法:getDir 释义:这是一个可以存放你自己应用程序自定义的文件,你可以通过该方法返回的File实例来创建或者访问这个目录,注意该目录下的文件只有你自己的程序可以访问。
方法:getExternalCacheDir 释义:使用这个方法需要写外部存储的权限“<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />”,调用该方法会返回应用程序的外部文件系统(Environment.getExternalStorageDirectory())目录的绝对路径,它是用来存放应用的缓存文件,它和getCacheDir目录一样,目录下的文件都会在程序被卸载的时候被清除掉。
方法:getExternalFilesDir 释义:使用这个方法需要写外部存储的权限“<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />”,这个目录是与应用程序相关的外部文件系统,它和getExternalCacheDir不一样的是只要应用程序存在它就会一直存在,这些文件只属于你的应用,不能被其它人访问。同样,这个目录下的文件在程序被卸载时也会被一同删除。
方法:getDatabasePath 释义:保存通过Context.openOrCreateDatabase 创建的数据库文件
方法:getPackageCodePath 释义:返回android 安装包的完整路径,这个包是一个zip的压缩文件,它包括应用程序的代码和assets文件。
方法:getPackageResourcePath 释义:返回android 安装包的完整路径,这个包是一个ZIP的要锁文件,它包括应用程序的私有资源。
方法:getObbDir 释义:返回应用程序的OBB文件目录(如果有的话),注意如果该应用程序没有任何OBB文件,这个目录是不存在的。
- 作者:404False
- 链接:https://blog.404nofoundx.top//article/956cb616-809b-4222-8aee-418bde32b6eb
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。