![unidbg逆向工程:原理与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/51906074/b_51906074.jpg)
2.1 第一个NDK项目
接下来我们创建第一个NDK项目来完成案例的演示。
2.1.1 使用Android Studio创建NDK项目
首先打开Android Studio,在菜单栏中依次选择File→New→New Project...来打开新建项目向导,选择相应的项目模板创建NDK项目,如图2-1所示。
之后配置项目属性,如图2-2所示,单击Next按钮进入下一步。
在Activity界面选择默认配置即可,直接单击Finish按钮,如图2-3所示。
接下来耐心等待Gradle配置完成,界面如图2-4所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-16.jpg?sign=1738837643-cYz5sfQCaZGUwJXpnKUsNsBUi8hod0uN-0-fac9bbad6d95b5845d5c84d75b57e89a)
图2-1 Android Studio新建项目选择模板
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-17.jpg?sign=1738837643-FNGp4O9hAbFXlupKW6m9GJZlilgEap6U-0-c64895fe07913c1bdde23f9a3e75fb9f)
图2-2 Android Studio配置项目属性
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-18.jpg?sign=1738837643-AyeZHYp1mHyZqrSb9dRnSwTfZD7b9lb8-0-88e64f23fa046834310f90040421b787)
图2-3 Android Studio配置Activity界面
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-19.jpg?sign=1738837643-K4m0aT7CzEiLddR1Tc6qZzZHb6Rxzttq-0-fddf8962ddcf0a6b98e944b9ec0037ac)
图2-4 Android Studio NDK项目界面
2.1.2 编写自己的so业务代码
首先打开activity_main.xml,添加一个Button控件,如图2-5所示。
编写MainActivity.java代码,添加md5()方法并编写Button按钮的单击事件来调用该方法,如图2-6所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-20.jpg?sign=1738837643-np6uwtOC85872Yz0oHfshgnPS1bWnsxN-0-2f186cd72536b200883ce5423b9e34db)
图2-5 打开activity_main.xml,添加Button控件
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-21.jpg?sign=1738837643-9FerQMs5vp26kQxPbB9QMj4M4zrQbkBE-0-376f5a7d8494da5b4266b6c015cbe778)
图2-6 MainActivity.java代码
可以发现md5()方法名报红,这是因为编译器没有找到方法相应的实现。单击报红的函数名,然后使用组合键<Alt+Enter>选择Create JNI function for md5,如图2-7所示。
Android Studio会自动在native-lib.cpp中生成一个md5()方法的空实现,如图2-8所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-22.jpg?sign=1738837643-P08VI4ZPboXC9C8pgWFnROLoepp5AjYz-0-890a5ae1ecbf6ca89d57eb4a77203f68)
图2-7 自动创建JNI函数
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-23.jpg?sign=1738837643-JuW6lXo85mf9tJNg9VzQtelpzgaTwMz0-0-fe2eb06d6b5b07d2015ca4b570aec1d9)
图2-8 自动生成的md5()方法空实现
在GitHub上找一份md5()方法的相应实现,代码链接为https://github.com/pod32g/MD5,将代码粘贴到上述的空实现处,如图2-9所示。
连接模拟器或者真机并运行,APK会自动编译并安装到目标计算机上。单击MD5按钮,TextView的内容会改变,如图2-10所示。
经过CyberChef的验证,程序的计算结果是正确的。
接下来我们开始通过unidbg来模拟执行自己编写的so文件中的md5()方法。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-24.jpg?sign=1738837643-g2xAKtCzG1M1RVTwHzqjqsAHfc9QfYRl-0-7fad914b06173a1ceb12902cb792b0aa)
图2-9 native-lib.cpp代码
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-25.jpg?sign=1738837643-4xxA0h8656NMD6MTeEz1uFlBE5V8f1Uj-0-acc928290efe3c0620260b9860b29cd0)
图2-10 自编写App运行界面