这篇“Android怎么对so进行简单hook”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android怎么对so进行简单hook”文章吧。
1、什么是Hook
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
2、对App的so进行Hook的一种思路
我们知道现在JNI在Android开发中是特别重要的,使用JNI有什么好处呢?
Preference,C/C++在运行性能上面甩Java几条GAI
Security,更多的加密解密还是放在Native上。
优点不止这两点,比如在Native里面开辟空间并不受JVM管理,JVM怎么使用native memory。这里不再赘述。
本文提供一种对Android上so库进行Hook的一种思路,不涉及ELF的查看修改,不改动对方的调用方式。 思路就是一招偷梁换柱,用自己的so替换App的so,让对象调用自己的so的时候调用我们自己写的so,我们再调用原来的so,这样就可以获得对方so方法的输入输出。
可以应用在想获取对方App的数据传递格式或者无法破解对方的加解密,但是可以通过hook获取对方的数据格式再调用对方的加解密方法得到自己想要的结果。
3、一个最基本的JNI sample程序代表目标宿主Apk
这里我们自己准备一个宿主Apk,直接用AndroidStudio新建一个支持JNI的工程,勾选Include C++ support,默认生成一个Android工程。
默认的MainActivity.java和native-lib.cpp分别长这样子:
//MainActivity public class MainActivity extends Activity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } public native String stringFromJNI(String param); } //native-lib.cpp #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_hook_yocn_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
我们为了逻辑清晰稍微做一点修改,逻辑是希望传入一个字符串,然后在C++里面对字符串的每个字符都+1操作,也就是 java -> kbwb。改完之后代码长这个样子:
//MainActivity.java public class MainActivity extends Activity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI("java")); } public native String stringFromJNI(String param); } //native-lib.cpp #include <jni.h> #include <string> #include <android/log.h> #define LOG_TAG "hook" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) extern "C" JNIEXPORT jstring JNICALL Java_com_hook_yocn_MainActivity_stringFromJNI(JNIEnv *env, jobject obj, jstring param) { int length = (env)->GetStringLength(param); const char *nativeString = (env)->GetStringUTFChars(param, 0); char *resultChars = new char[length + 1]; for (int i = 0; i < length; ++i) { resultChars[i] = nativeString[i] + 1; } resultChars[length] = '