Android逆向之分析基操 学习资源 Android逆向 原创

花儿谢了 3月前 1565

1,ndk开发函数名体现形式

extern "C" JNIEXPORT




extern "C" __attribute__ ((visibility ("hidden")))



JNIEXPORT



__attribute__ ((visibility ("hidden")))



总结:

__attribute__ ((visibility ("hidden"))) -->  函数名隐藏

JNIEXPORT -->  C++ 为了重载的 name mangling

extern "C" JNIEXPORT -->  按C语言进行编译,函数名不变


2,函数注册跟踪

so文件监控及静态注册

function find_function(){
    Java.perform(function (){
        // var func_name = "android_dlopen_ext";
        var func_name = "dlsym";
        var func_address;
        var modules = Process.enumerateModules();
        for(var i=0;i<modules.length;i++){
            var module = modules[i];
            var module_name = module.name;
            var exports = module.enumerateExports();
            for(var j=0;j<exports.length;j++){
                var export_name = exports[j].name;
                if(export_name.indexOf(func_name) > -1){
                    console.log("find function", module_name, export_name);
                    if (func_name == export_name){
                        func_address = exports[j].address;
                    }
                }
            }
        }
        if(func_address){
            console.log("fun_address", func_address);
            Interceptor.attach(func_address, {
                onEnter: function (args) {
                    if (func_name.indexOf("dlopen") > -1){
                        // dlopen
                        this.path = ptr(args[0]).readCString();
                    }else if (func_name.indexOf("dlsym") > -1){
                        // dlsym
                        this.func_name = ptr(args[1]).readCString();
                    }else{
                        console.log("please check your code");
                    }
                    console.log("find agrs", "arg[0] =", this.path, ", arg[1] =", this.func_name);
                },
                onLeave: function (retval){
                    if(Process.findModuleByAddress(retval)){
                        console.log("find target", Process.findModuleByAddress(retval).name, "-->", this.func_name);
                    }else{
                        console.log("find other", this.path, "-->", this.func_name);
                    }
                }
            });
        }
    });
}

hook dlopen:


hook dlsym:


动态注册

yang神的脚本地址:

https://github.com/lasting-yang/frida_hook_libart




3,trace剑客

  • jnitrace


  • frida-trace

hook strcat:



hook open:



hook dlsym:


  • hook_artmethod

yang神的脚本地址:

https://github.com/lasting-yang/frida_hook_libart


trace结果:


ndk开发代码:


看了这些trace再看凯神的unidbg是不是有点似曾相识的感觉和熟悉的点位


4,总结

肉丝姐的星球是个好东西



5,滴滴


欢迎关注我的公众号【妄为写代码】,一起交流学习




最新回复 (18)
  • 1月前
    0 19
    666
  • 七仔 1月前
    0 18
    这么好的文章,竟然这么少人看?
  • dabin 1月前
    0 17
    1
  • lumashi 1月前
    0 16
    666
  • 0 15
    666
  • cwxiang 2月前
    0 14
    111
  • zhangp 2月前
    0 13
    999
  • 0 12
    6666
  • 0 11
    666666
  • IceSpite 2月前
    0 10
    666666666666666
  • strive 2月前
    0 9
    666
  • 0 8
    666
  • syh9478 2月前
    0 7
    666
  • dawn 3月前
    0 6
    666
  • shihw 3月前
    0 5
    666
  • 0 4
    666
  • allen 3月前
    0 3
    666
  • xhyzwhh 3月前
    0 2
    666
返回