接下来我们创建第一个NDK项目来完成案例的演示。
首先打开Android Studio,在菜单栏中依次选择File→New→New Project...来打开新建项目向导,选择相应的项目模板创建NDK项目,如图2—1所示。
之后配置项目属性,如图2—2所示,单击Next按钮进入下一步。
在Activity界面选择默认配置即可,直接单击Finish按钮,如图2—3所示。
接下来耐心等待Gradle配置完成,界面如图2—4所示。
图2—1 Android Studio新建项目选择模板
图2—2 Android Studio配置项目属性
图2—3 Android Studio配置Activity界面
图2—4 Android Studio NDK项目界面
首先打开activity_main.xml,添加一个Button控件,如图2—5所示。
编写MainActivity.java代码,添加md5()方法并编写Button按钮的单击事件来调用该方法,如图2—6所示。
图2—5 打开activity_main.xml,添加Button控件
图2—6 MainActivity.java代码
可以发现md5()方法名报红,这是因为编译器没有找到方法相应的实现。单击报红的函数名,然后使用组合键<Alt+Enter>选择Create JNI function for md5,如图2—7所示。
Android Studio会自动在native-lib.cpp中生成一个md5()方法的空实现,如图2—8所示。
图2—7 自动创建JNI函数
图2—8 自动生成的md5()方法空实现
在GitHub上找一份md5()方法的相应实现,代码链接为https://github.com/pod32g/MD5,将代码粘贴到上述的空实现处,如图2—9所示。
连接模拟器或者真机并运行,APK会自动编译并安装到目标计算机上。单击MD5按钮,TextView的内容会改变,如图2—10所示。
经过CyberChef的验证,程序的计算结果是正确的。
接下来我们开始通过unidbg来模拟执行自己编写的so文件中的md5()方法。
图2—9 native-lib.cpp代码
图2—10 自编写App运行界面