![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=1739632383-ZVgRfYzWE8Tz95KKJ3xcOWYOAppql7Zy-0-1c6d8e077364f5bc7b61d20706402c5d)
图2-1 Android Studio新建项目选择模板
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-17.jpg?sign=1739632383-RrWpopfXEOORLa9IrpVdylxO5TMGOVZe-0-99694834159b98a8f1d6963fd0600831)
图2-2 Android Studio配置项目属性
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-18.jpg?sign=1739632383-iya12hQVRvMpO2ieyyK8pNk7tbdc5BV4-0-df884a9cea8785c32ef5e98e8b929b82)
图2-3 Android Studio配置Activity界面
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-19.jpg?sign=1739632383-a1D2VzkPza37muZXIl0udTwnEtxY2U2f-0-845f22e4e7ed7fd82d6544619bd790ef)
图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=1739632383-5kV2ftMwr2xxeuajJc8jwz9ojndhmgZd-0-0fdb4ca7a9ad182e613e8dcb9f93997a)
图2-5 打开activity_main.xml,添加Button控件
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-21.jpg?sign=1739632383-5cEOENlbnpIgYaFTcrtJIK9yotRN0hM6-0-30d2823f7a211989e11ec87616e7295d)
图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=1739632383-dMUuRbiidAWS2vQWyNGY3WqfDfbjl7j6-0-40a7fad355433fed679b92481de99cf0)
图2-7 自动创建JNI函数
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-23.jpg?sign=1739632383-VtWI9VaUPXVLzi5wpQmxODJzVS0SJJl1-0-bc23cf68ad3e3fc5e55d1cf04a2eb232)
图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=1739632383-hPiZuZjYoW1JBnvNjtymwmlJEcLqpwNP-0-716b10cc649bc358d80c06462f5e5143)
图2-9 native-lib.cpp代码
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-25.jpg?sign=1739632383-VhKxSxymFgwVBkRCU50KQVGmmOZQwgeV-0-7a58afee83f39e3f69617fe7a0d72bbc)
图2-10 自编写App运行界面