Android逆向技术53——frida stalker追踪jni函数调用

admin 2024年5月19日02:56:06评论18 views字数 3931阅读13分6秒阅读模式

Android逆向技术53——frida stalker追踪jni函数调用

背景

frida stalker简单实用。使用这个工具来追踪jin函数的调用。

环境

macOS(win也可以)

Ida7.0,其他版本应该也可以。

Android12,root。

frida 16.0.9

Python2.7(3也可以)

测试APP编写

由于第一次使用,使用自己编写的APP来跟踪,自己编写的情况下知道逻辑,在验证的时候也方便。

std::string get_author() {
    // 获取当前时间
    time_t now = time(0);
    tm *ltm = localtime(&now);
    // 格式化时间
    std::stringstream ss;
    ss << ltm->tm_year + 1900 << "-" << ltm->tm_mon + 1 << "-" << ltm->tm_mday;
    std::string formattedDate = ss.str();
    formattedDate += ", cat";
    return formattedDate;
}

std::string get_author_desc() {
    char value[PROP_VALUE_MAX];
    __system_property_get("ro.hardware", value);
    std::string hardware = value;
    return hardware;
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_cat_stalker_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */)
 
{
    std::string hello = "Hello from C++n author: ";
    // 获取作者信息
    hello += get_author();
    // 描述信息
    hello += "ndesc: ";
    hello += get_author_desc();
    return env->NewStringUTF(hello.c_str());
}

以上就是APP的逻辑。

1、点击按钮调用stringFromJNI,这个方法调用了2个函数,get_authorget_author_desc

2、效果是点击之后,获取当前时间返回,获取当前主板信息返回。

Android逆向技术53——frida stalker追踪jni函数调用
Android逆向技术53——frida stalker追踪jni函数调用

得到so中的函数导出符号和地址

把APP解压,在lib中得到libstalker.so导入ida中,so解析完成之后,导入Python脚本,打印函数地址和符号。

Android逆向技术53——frida stalker追踪jni函数调用

选择Script file

Android逆向技术53——frida stalker追踪jni函数调用

脚本的内容是:(Python2脚本)

import idautils
import idc
 
func_addr = []
func_name = []
for i in idautils.Functions():
    func_addr.append(i)
    func_name.append(idc.get_func_name(i))

for i in func_addr:
    addr_str = hex(i)[:-1if hex(i).endswith('L'else hex(i)
    print("{}, ".format(addr_str)),
print('')
for i in func_name:
    print(""{}", ".format(i)),

选择脚本之后等待控制台输出地址和符号完成。

Android逆向技术53——frida stalker追踪jni函数调用

停止输出就表示获取完成了。

frida stalker跟踪so中的函数调用

untitled.js

// 把上面符号和地址放数组中,so名字根据自己情况来写
var func_addr = []
var func_name = []
// so名字
var so_name = "libstalker.so"
function hook_dlopen(soName = ''{
    Interceptor.attach(Module.findExportByName(null"android_dlopen_ext"),
        {
            onEnterfunction (args{
                var pathptr = args[0];
                if (pathptr !== undefined && pathptr != null) {
                    var path = ptr(pathptr).readCString();
                    if (path.indexOf(soName) >= 0) {
                        this.is_can_hook = true;
                        console.log("android_dlopen_ext");
                    }
                }
            },
            onLeavefunction (retval{
                if (this.is_can_hook) {
                    var times = 1;
                    var module = Process.getModuleByName(so_name);
                    this.pid = Process.getCurrentThreadId();
                    console.log("start Stalker!");
                    Stalker.follow(this.pid,{
                        events:{
                            call:false,
                            ret:false,
                            exec:false,
                            block:false,
                            compile:false
                        },
                        onReceive:function(events){
                        },
                        transformfunction (iterator{
                            var instruction = iterator.next();
                            do{
                                if (func_addr.indexOf(instruction.address - module.base) != -1){
                                    console.log("call" + times+ ":" + func_name[func_addr.indexOf(instruction.address - module.base)])
                                    times=times+1
                                }
                                iterator.keep();
                            } while ((instruction = iterator.next()) !== null);
                        },
 
                        onCallSummary:function(summary){
 
                        }
                    });
                    console.log("Stalker end!");
                }
            }
        }
    );
}
setImmediate(hook_dlopen, so_name)

frida启动脚本

frida -U -f com.cat.stalker -l untitled.js
Android逆向技术53——frida stalker追踪jni函数调用
Android逆向技术53——frida stalker追踪jni函数调用
Android逆向技术53——frida stalker追踪jni函数调用

对比ida中符号

Android逆向技术53——frida stalker追踪jni函数调用

能对上。从打印的调用顺序也能对上源码顺序。

apk样本在安全后厨星球获取

Android逆向技术53——frida stalker追踪jni函数调用

参考:https://bbs.kanxue.com/thread-278647.htm

原文始发于微信公众号(安全后厨):Android逆向技术53——frida stalker追踪jni函数调用

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月19日02:56:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android逆向技术53——frida stalker追踪jni函数调用http://cn-sec.com/archives/2026467.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息