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_author
和get_author_desc
2、效果是点击之后,获取当前时间返回,获取当前主板信息返回。
得到so中的函数导出符号和地址
把APP解压,在lib中得到libstalker.so
导入ida中,so解析完成之后,导入Python脚本,打印函数地址和符号。
选择Script file
脚本的内容是:(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)[:-1] if hex(i).endswith('L') else hex(i)
print("{}, ".format(addr_str)),
print('')
for i in func_name:
print(""{}", ".format(i)),
选择脚本之后等待控制台输出地址和符号完成。
停止输出就表示获取完成了。
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"),
{
onEnter: function (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");
}
}
},
onLeave: function (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){
},
transform: function (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
对比ida中符号
能对上。从打印的调用顺序也能对上源码顺序。
apk样本在安全后厨星球获取
参考:https://bbs.kanxue.com/thread-278647.htm
原文始发于微信公众号(安全后厨):Android逆向技术53——frida stalker追踪jni函数调用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论