github中的示例
在gtihub中有一个混淆示例,https://github.com/luck-apple/aesTool,把它clone
到本地
创建项目
新建一个native项目,语言选择Java
向MainActivity
中添加代码
/*** AES加密, CBC, PKCS5Padding*/public static native String method01(String str);/*** AES解密, CBC, PKCS5Padding*/public static native String method02(String str);
在native-lib.cpp
里面添加函数的实现和头文件
#include "aes_utils.h"
#include "tools.h"
#include "junk.h"extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_aestool_MainActivity_method01(JNIEnv *env, jclass clazz, jstring str_) {// TODO: implement method01()const char *str = env->GetStringUTFChars(str_, JNI_FALSE);char *result = AES_128_CBC_PKCS5_Encrypt(str);env->ReleaseStringUTFChars(str_, str);jstring jResult = getJString(env, result);free(result);return jResult;
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_aestool_MainActivity_method02(JNIEnv *env, jclass clazz, jstring str_) {// TODO: implement method02()const char *str = env->GetStringUTFChars(str_, JNI_FALSE);char *result = AES_128_CBC_PKCS5_Decrypt(str);env->ReleaseStringUTFChars(str_, str);jstring jResult = getJString(env, result);free(result);return jResult;
}
向cpp目录里面添加文件,把aesTool里的cpp里的下图中选中的文件,copy到项目里
向cMakeLists.txt里添加加载的源文件
add_library(${CMAKE_PROJECT_NAME} SHARED# List C/C++ source files with relative paths to this CMakeLists.txt.aes.haes.chex_utils.hhex_utils.ctools.htools.cppaes_utils.haes_utils.cnative-lib.cpp)
然后修改MainActivity中的函数调用内容
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(method01("Bileton"));Toast.makeText(this,method02(method01("Bileton")),Toast.LENGTH_SHORT).show();}
运行结果如下
反编译apk,反编译so
使用jadx打开apk,可以得到如下一部分信息,可以看到method01和method02的实现是在so层的
反编译libaestool.so文件,在导出函数表里找到method01,看到有两个被混淆了名字的函数ll11l1l1ll
和o0OoOOOO
我们先使用Frida对method01
这个函数进行Hook
Java层hook
在Java层Hook,使用spawn方式进行hook
setImmediate(function(){Java.perform(function(){var MainActivity = Java.use("com.example.aestool.MainActivity");MainActivity.method01.implementation = function(str){console.log("arg:",str);var result = this.method01(str);console.log("result:",result);return result;}})
})
主动调用
setImmediate(function(){Java.perform(function(){var MainActivity = Java.use("com.example.aestool.MainActivity");console.log("My invoke :",MainActivity.method01("Bileton"));})
})
Native层Hook
setImmediate(function(){var android_dlopen_ext = Module.findExportByName(null,"android_dlopen_ext");console.log("fun_android_dlopen_ext",android_dlopen_ext);var islibaestool = false;Interceptor.attach(android_dlopen_ext,{onEnter:function(args){var pathptr = args[0];if(pathptr!=null && pathptr != undefined){var path = ptr(pathptr).readCString();if (path.indexOf("libaestool")!=-1){console.log("android_dlopen_ext:",path);islibaestool = true;}}},onLeave:function(retval){if (islibaestool){var method01 = Module.findExportByName("libaestool.so","Java_com_example_aestool_MainActivity_method01");console.log("addr of method01",method01);Interceptor.attach(method01,{onEnter:function(args){ var env = Java.vm.getEnv();var jstring = args[2];var cstring = env.getStringUtfChars(jstring,null).readCString();console.log("args[2]:",cstring);},onLeave:function(retval){var env = Java.vm.getEnv();var jstring = retval;var cstring = env.getStringUtfChars(jstring,null).readCString();console.log("result:",cstring);}})islibaestool = false;}}})
})
主动调用
setImmediate(function(){var method01_addr = Module.findExportByName("libaestool.so","Java_com_example_aestool_MainActivity_method01");console.log("address of method01 is:",method01_addr);Java.perform(function(){var jstring = Java.vm.getEnv().newStringUtf("Bileton");var method01 = new NativeFunction(method01_addr,"pointer",["pointer","pointer","pointer"]);var result = method01(Java.vm.getEnv(),jstring,jstring);console.log("result:",Java.vm.getEnv().getStringUtfChars(result,null).readCString())})
})
使用unidbg进行模拟执行
后续补充