安卓 java hook调用so_Android开发 Unidbg模拟执行so使用指南

本文介绍了如何利用Unidbg模拟执行Android的so库,包括解决编译问题、配置Maven、加载so库并执行特定函数,最终将程序打包成jar包,方便独立运行。
摘要由CSDN通过智能技术生成

一、目标

除了AndroidNativeEmu我们还有一个选择 Unidbg 来实现模拟执行so,

GitHub链接

https://github.com/zhkl0228/unidbg

特色

模拟JNI调用API,以便可以调用JNI_OnLoad。

支持JavaVM,JNIEnv。

模拟syscalls调用。

支持ARM32和ARM64。

基于HookZz实现的inline hook。

基于xHook实现的import hook。

支持 iOS fishhook 、 substrate 、 whale hook。

支持简单的控制台调试器,gdb,IDA android调试器服务器,指令跟踪,内存读/写跟踪。

支持iOS objc和Swift运行时。

好吧,看上去很强大的样子,我们来跑个Demo

二、步骤

先把IDEA配置好(java大佬忽略这一步)

奋飞不会java开发,所以装好IDEA就开始迫不及待的导入unidbg工程开始编译:

Tip:

IDEA导入unidbg工程参见 https://code.newban.cn/151.html

报错 Error:(5, 24) java: 程序包io.kaitai.struct不存在

好吧,装一个 brew install kaitai-struct-compiler

继续报错 Error:(3, 34) java: 程序包org.apache.commons.logging不存在

行吧,下载一个 commons-logging-1.2.jar

3. 还报错? 不对劲,大神不可能这么难为凡人,一定是哪出了问题??

google之,原来是Maven没有配置好。搞他

Tip:

Maven配置参见 https://zhuanlan.zhihu.com/p/28133184

搞定Maven之后如果还报错,那是因为依赖包没有下载下来,需要 reload 一下,静静的等依赖包下载完,反正奋飞是花了十多分钟。

e8a5cc71710aa79e7ab45143f3441ff5.png

好了,这次完美编译过去了

执行so中的stringFromJNI函数

在unidbg-android目录下新建fenfei文件夹,把libnative-lib.so文件放进去

4971c2c7babeb1b1e9487006ca94040e.png

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

158152174468ba28e6c5f439c793947b.png

开始写代码了

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++

慢着!李老板又出场了,

奋飞呀,调用so你得给我一个可执行程序呀,总不能让我老板的机器上也装个IDEA来陪你玩吧?

打包成jar包

File → Project Structure …​ 然后选择 Artifacts, 点加号 Add

bf93b29caababef6dc29424f4a7f6f5e.png

jar → From modules with dependencies…​ 然后如下配置, 别忘了勾上 Include tests

b1aa13995309b0ca07941d29b4a9ca2a.png

OK了,Build → Build Artifacts 编译成功之后就在

unidbg-0.9.0/out/artifacts/unidbg_parent_jar

目录下生成了一堆依赖jar包和unidbg-parent.jar 我们把要载入的 fenfei/libnative-lib.so 放到和

unidbg-parent.jar同级目录

0f983b9e82af818d0b9cf75c2c101eb8.png

泡一下,成功输出,手工。 (努力的字都不会打了)

fenfeideMacBook-Pro:unidbg_parent_jar fenfei$ java -jar unidbg-parent.jar

call stringFromJNI rc = Hello from C++

三、总结

学好java,走遍天下都不怕

╮(‵▽′)╭ 时间就应该浪费在美好的代码上

本文地址:https://blog.csdn.net/fenfei331/article/details/110246985

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值