前言:之前看安卓软件安全与逆向分析这书,看到ndk开发这节,发现自己连so文件都没编译操作过233,所以就直接上手试试,
感觉挺好玩的,把关键的加密流程都放进so中去实现,这周先写个demo试试,感觉出题还是得和安卓的运行机制结合,然后
再一个点到一个点来玩,比较有条理,之后放到github上,之后作为招新赛的题目来搞
直接切入主题了,就不放图了,要看图的直接看我放的链接吧,里面图文并茂,这里主要是我的个人记录
1.androidstudio直接新建一个项目,往下划,然后选择c++
2.然后这里先去配置好ndk的路径,因为编译的工具都在ndk中,这里我是mac,所以找ndk的路径一开始有点懵逼
然后百度了一波,才找到,
然后自己查看自己的ndk路径在哪,点进去,相应路径输入好就行了,不知道为啥,我ndk默认配好了,233,不过配置文件local.properties里面没加,所以我又加了这句话
## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file should *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. sdk.dir=/Users/mac/Library/Android/sdk ndk.dir=/Users/mac/Library/Android/sdk/ndk/21.3.6528147
3.新建一个Myjni.java文件,然后javac和javah,然后把后缀.h文件拖到cpp文件夹下面,全程终端操作,这里还是看我放的那个链接去搞,我懒得放图了。。。
4.然后在cpp文件夹下面新建main.c文件,里面内容就是实现之前定义到Myjni.java文件中的native方法,
// // Created by mac on 2020/9/29. // #include "com_example_firstso_Myjni.h" #include "../../../../../../Library/Android/sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/jni.h" #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_firstso_Myjni_sayHello(JNIEnv * env, jclass jobj) { // TODO: implement sayHello() return (*env)->NewStringUTF(env,"hello world"); }
5.然后synow以下,build一波,已经在对应目录app/build/merged_native_libs/debug/out/lib下生成了不同平台架构的so文件了,我感觉蛮骚的,直接四个平台都生成了,是我没想到的,
当然还是得切换一个project的视角,用安卓是看不到这玩意的。
6.然后把lib的整个目录,复制到src/main下,记得把lib名字改成jniLIB,就可以正常运行了
整篇写的贼水,mac的截图键实在鸡肋,服了)
参考链接:
https://www.jianshu.com/p/25008b219fa6