C语言简单普及
//整型
int a = 100;
//字符串
char *s = "yuanrenxue.com";
//浮点型
float = "3.14";
//双精度浮点型
double = "3.141592633764862";
//指针
int *a_add = &a;
//字符串常量 不能修改
const char *ss = "hello";
//数组
int num[5];
char name[5];
//1个字节(Byte) = 8位(Bit) 1K=1024B 1M = 1024K 1G = 1024M 1T = 1024G
int8_t //占8位 1个字节
int16_t //占16位 2个字节
什么是NDK开发
Android NDK:Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集
用来做Native开发.so文件
官方网站:https://developer.android.com/ndk
Java如何调用so库里的方法/函数
(1)什么是JNI : JNI是Java Native Interface的缩写,用Java调用so库就叫着JNI。如下
//在Java中申明一个Native方法
public static native String securityCheck(Context context, String str);
//用System.loadLibrary()加载so库 全称是 libnative-lib.so
static {
System.loadLibrary("native-lib");
}
注意这里的loadLibrary里的库名
(2) .so文件里对应的securityCheck函数名称是:
(3). .so文件里对应的函数名称不一致:(IDA静态调试后再讲)
这种情况叫着:手动注册native方法
函数对应的名称是在 JNI_ONLoad()函数里注册
(4)System.loadLibrary()加载so文件流程
先读取so文件的.init_array段(鼠标在主界面,按ctrl+s)
再执行JNI_OnLoad函数
JNI_ONLoad是.so文件的初始函数
然后调用具体的native方法
IDA静态调试
静态调试技巧:
-
面板左侧函数列表可以查看每个函数的偏移量(相较于.so文件头的偏移量)
-
分栏
-
F5键(windows fn+F5) 把汇编代码转成C代码
-
shift+F12 查看so文件中所有常量字符串的值 有的密码之类的可能就在这里面
-
ctrl + s 查看so文件段信息
-
JNI函数方法名还原 选中v3 按y键-作用(类型还原)
v3 + 676 前面是一个指针 比如 *(_DWORD *)v3 + 676 表示 v3 是JNIEnv *类型(形如 *(_DWORD *)vX + YYY 皆是),可选中v3 按y键进行类型替换,替换为JNIEnv *
-
选中后右键可改变量名
-
选中行然后按 / 可在IDA上做注释