github中的示例
在gtihub中有一个混淆示例,https://github.com/luck-apple/aesTool,把它clone
到本地
创建项目
新建一个native项目,语言选择Java
向MainActivity
中添加代码
java
/**
* AES加密, CBC, PKCS5Padding
*/
public static native String method01(String str);
/**
* AES解密, CBC, PKCS5Padding
*/
public static native String method02(String str);
在native-lib.cpp
里面添加函数的实现和头文件
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里添加加载的源文件
txt
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
aes.h
aes.c
hex_utils.h
hex_utils.c
tools.h
tools.cpp
aes_utils.h
aes_utils.c
native-lib.cpp)
然后修改MainActivity中的函数调用内容
java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// Example of a call to a native method
TextView 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
js
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;
}
})
})
主动调用
js
setImmediate(function(){
Java.perform(function(){
var MainActivity = Java.use("com.example.aestool.MainActivity");
console.log("My invoke :",MainActivity.method01("Bileton"));
})
})
Native层Hook
js
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;
}
}
})
})
主动调用
js
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进行模拟执行
后续补充