大家好,我是王老实 一个乙方安全公司搬砖的菜鸡 今天分享的是frida 堆栈打印
1.java层堆栈打印
java层堆栈打印的例子网上资料比较全,但是在实际应用的时候,因为frida版本的区别,会发现一些不便
所以这里我针对网上的两个例子做了一些改良。
网上的两个例子如下
1.1 java堆栈打印 例子1
function showStacks1()
{
send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
}
在新版frida 1405版本环境下做测试
效果图如下
1.2 java堆栈打印 例子2
function printStack(name)
{
Java.perform(function ()
{
var Exception = Java.use("java.lang.Exception");
var ins = Exception.$new("Exception");
var straces = ins.getStackTrace();
if (straces != undefined && straces != null)
{
var strace = straces.toString();
var replaceStr = strace.replace(/,/g, "\n");
console.log("=============================" + name + " Stack strat=======================");
console.log(replaceStr);
console.log("=============================" + name + " Stack end=======================rn");
Exception.$dispose();
}
});
}
在新版frida 1405版本环境下做测试
效果图如下
1.3 java堆栈打印 例子3 改良版
在用了网上两个在新版frida不能换行的例子后 我这里做了改良 代码如下
function showStacks3(str_tag)
{
var Exception= Java.use("java.lang.Exception");
var ins = Exception.$new("Exception");
var straces = ins.getStackTrace();
if (undefined == straces || null == straces)
{
return;
}
console.log("=============================" + str_tag + " Stack strat=======================");
console.log("");
for (var i = 0; i < straces.length; i++)
{
var str = " " + straces[i].toString();
console.log(str);
}
console.log("");
console.log("=============================" + str_tag + " Stack end=======================rn");
Exception.$dispose();
);
在新版frida 1289 1405版本环境下做测试
效果图如下
2.c层堆栈打印
c层堆栈打印比较简单 网上的代码用起来效果还可以
2.1网上打印c层堆栈的代码
Interceptor.attach(f, {
onEnter: function (args) {
console.log('RegisterNatives called from:n' +
Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join('n') + 'n');
}
});
2.2真正有用的一行
上面写了那么多 其实真正起作用的是这一行代码
Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join('n') + 'n');
2.3 封装后的代码
//context 这里传入this.context
//str_arg 这里传入堆栈显示时展示的标签
function print_c_stack(context, str_tag)
{
console.log('');
console.log("=============================" + str_tag + " Stack strat=======================");
console.log(Thread.backtrace(context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('n'));
console.log("=============================" + str_tag + " Stack end =======================");
}
2.4 例子代码
Java.perform(function ()
{
console.log("hook c start");
var str_name_so = "libc.so";
var str_name_func = "fgets";
//********************************hook native*********************************//
//hook export function
var func_ptr = Module.findExportByName(str_name_so , str_name_func);
if (null == func_ptr)
{
console.log(str_name_func + " point is null");
return;
}
Interceptor.attach(func_ptr,
{
onEnter: function(args) {
print_c_stack(this.context, str_name_func);
},
onLeave:function(retval){
}
});
});
function print_c_stack(context, str_tag)
{
console.log('');
console.log("=============================" + str_tag + " Stack strat=======================");
console.log(Thread.backtrace(context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('n'));
console.log("=============================" + str_tag + " Stack end =======================");
}
效果如下
代码资料:公众号回复 f2 获取下载链接
本文始发于微信公众号(移动安全王铁头):frida 打印堆栈 java层和c层
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论