unidbg工具使用

一、下载IntelliJ IDEA
在此处不过多赘述了,去官方网站下载IDEA就可以了。当然此处有社区版和专业版,那么这里就看个人需求了。安装教程网上还是很多的,在此处也不多说了。

二、IDEA相关配置
在使用之前需要配置好Maven以及修改默认Repository,接下来就说一下此方面。

1.配置Maven环境
(1) .下载apache-maven文件,选择自己需要的版本,这里下载3.6的就可以,地址:http://maven.apache.org/

(2) 解压1所下载文件,本人解压到:D:\apache_maven\apache-maven-3.6.3

(3) 配置Maven环境变量

a. MAVEN_HOME : D:\server\maven\apache-maven-3.5.0

b.PATH : %MAVEN_HOME%\bin;

c. MAVEN_OPTS : -Xms128m -Xmx512m -Duser.language=zh -Dfile.encoding=UTF-8

(4) 在CMD中输入mvn -v,如出现下列信息,表示配置成功。

其中会显示Java 配置环境以及Maven配置环境

在这里插入图片描述

2.修改Maven仓库路径
(1).在D盘新建如下目录:
在这里插入图片描述

(2) .配置上图中的 setting.xml文件,填写如下信息:

<settings xmlns=“http://maven.apache.org/SETTINGS/1.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd”>

D:/apache_maven/repository

<mirror>

    <id>alimaven</id>

    <mirrorOf>central</mirrorOf>

    <name>aliyun maven</name>

    <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>

</mirror>

<mirror>

    <id>alimaven</id>

    <name>aliyun maven</name>

    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

    <mirrorOf>central</mirrorOf>

</mirror>

<mirror>

    <id>central</id>

    <name>Maven Repository Switchboard</name>

    <url>http://repo1.maven.org/maven2/</url>

    <mirrorOf>central</mirrorOf>

</mirror>

<mirror>

    <id>repo2</id>

    <mirrorOf>central</mirrorOf>

    <name>Human Readable Name for this Mirror.</name>

    <url>http://repo2.maven.org/maven2/</url>

</mirror>

<mirror>

    <id>ibiblio</id>

    <mirrorOf>central</mirrorOf>

    <name>Human Readable Name for this Mirror.</name>

    <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>

</mirror>

<mirror>

    <id>jboss-public-repository-group</id>

    <mirrorOf>central</mirrorOf>

    <name>JBoss Public Repository Group</name>

    <url>http://repository.jboss.org/nexus/content/groups/public</url>

</mirror>

<mirror>

    <id>google-maven-central</id>

    <name>Google Maven Central</name>

    <url>https://maven-central.storage.googleapis.com

    </url>

    <mirrorOf>central</mirrorOf>

</mirror>



<mirror>

    <id>maven.net.cn</id>

    <name>oneof the central mirrors in china</name>

    <url>http://maven.net.cn/content/groups/public/</url>

    <mirrorOf>central</mirrorOf>

</mirror>
3.IDEA中配置Maven IDEA自带了apache maven,默认使用的是内置maven,所以我们可以配置全局setting,来调整一下配置,比如远程仓库地址,本地编译环境变量等。

打开Settings,在输入框输入maven,然后配置成如图环境:

在这里插入图片描述

三、unidbg使用姿势
1.下载unidbg项目。
2.导入到IDEA中。这里也不赘述了,直接导入就可以,高版本的会自动识别是 Maven项目的。之后等环境都准备好就可以了。
3.测试unidbg
我们就以此项目的例子作为示例,如下图:

在这里插入图片描述

那么此示例就是对如下目录中的so进行操作。

unidbg-android/src/test/resources/example_binaries/libttEncrypt.so

查找so中的sbox0、sbox1导出符号,并打印其内存数据。

Hook一些函数,使用多个框架。

调用so中的 ttEncrypt 静态注册函数。

运行结果如下图所示:

在这里插入图片描述

4.运行自己的so文件
下面我们执行 libnative-lib.so中的stringFromJNI函数。

在unidbg-android/src/test/java/com下新建test文件夹,然后新建个java类MainActivity。

在这里插入图片描述

代码如下:

public class MainActivity {

public static void main(String[] args) {

MainActivity mainActivity = new MainActivity();

mainActivity.stringFromJNI();

}

private final AndroidEmulator emulator;

private final VM vm;

private DvmClass cNative;

private MainActivity() {

emulator = new AndroidARMEmulator();

Memory memory = emulator.getMemory();

// 设置 sdk版本 23

LibraryResolver resolver = new AndroidResolver(23);

memory.setLibraryResolver(resolver);



//创建DalvikVM,可以载入apk,也可以为null

vm = emulator.createDalvikVM(null);

// 是否打印日志

vm.setVerbose(false);



// System.out.println(getPath());

// 载入要执行的 so

DalvikModule dm = vm.loadLibrary(new File(getPath() + "/fenfei/libnative-lib.so"), false);

dm.callJNI_OnLoad(emulator);

}

private void stringFromJNI() {

// Jni调用的类

cNative = vm.resolveClass("com/fenfei/myndk/MainActivity");

DvmObject<?> strRc = cNative.callStaticJniMethodObject(emulator,"stringFromJNI()Ljava/lang/String;");



System.out.println("call stringFromJNI rc = " + strRc.getValue());

}

public String getPath()

{

String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

if(System.getProperty("os.name").contains("dows"))

{

    path = path.substring(1,path.length());

}

if(path.contains("jar"))

{

    // System.out.println("jar = " + path);

    path = path.substring(0,path.lastIndexOf("."));

    return path.substring(0,path.lastIndexOf("/"));

}



// System.out.println(path);

// path.replace("target/classes/", "");

return path.replace("/target/test-classes/", "");

}}

输出如下:

call stringFromJNI rc = Hello from C++

四. 总结
本节课探讨了unidb调用so库函数的功能、inlinehook功能。那么它还能断点调试so文件、导入到IDA中进行动态调试。简单来说,你可以把它当做一台能够运行so文件的手机,但是它又增加了很多功能。


版权声明:本文为YJJYXM原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。