一、下载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文件的手机,但是它又增加了很多功能。