aes简单混淆加模拟执行

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,看到有两个被混淆了名字的函数ll11l1l1llo0OoOOOO

我们先使用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进行模拟执行

后续补充