Frida Hook可變引數
0x00 前言:
可變引數Hook原理可以參考下我的這篇文章:C++逆向 可變引數Hook
我在網上搜了好久,都沒找到有人寫過Frida Hook可變引數.........
0x01 Frida Hook可變引數
args
OK 回歸正題,Frida 如何Hook可變引數,
首先可變引數意味著,他的引數個數不確定,引數型別不確定,
在frida中,函式的引數都在args上,我看了官網資料,他說args是一個NativeObject的Array,
可是當我用JS去遍歷這個Array的時候,總是會報錯,,,,(如果有大神知道,請告訴我如何去遍歷,謝謝!)

而且我就這樣直接輸出args,他也會報一個array index 無效的錯誤,
格式控制字串
我目前也只能做到那種格式控制字串可變引數的函式,比如像printf("%s,%d-%d-%d","hello",1,2,3)這樣的,
#include <stdio.h>
int main()
{
printf("Hello,World!");
printf("I love %s,test %d-%d-%d %f","C++",1,2,3,6.6);
}
我的思路是撰寫js代碼,然后根據判斷%來決定有多少個引數,并且截取%后面字符,
根據字符來進行不同型別的輸出,比如字串、整形、指標資料等,

自己處理格式控制符
/*
/*用來模仿C語言中的 vsprintf 格式化,可變引數輸出和函式
*/
function vspritf(format_str,args)
{
//沒有%,沒有必要去格式化他.
if (format_str.indexOf("%") === -1) {
console.log("字串:",format_str);
return;
}
console.log("format:",format_str);
//根據字串長度來回圈
var pos = 0;
var count = 0;
console.log("--引數內容:--")
for (let index = 0; index < format_str.length; index++) {
pos = format_str.indexOf("%",pos);
if(pos == -1)
break;
var format_ch = format_str.substr(pos+1, 1);
switch (format_ch) {
case "s":
var ret = Memory.readUtf8String(args[(count+1)])
console.log(ret);
count++;
break;
case "d":
//console.log("整型");
console.log(args[(count+1)]);
count++;
break;
case "p":
//console.log("指標型")
//var ret = Memory.readPointer(args[(count+2)])
console.log(hexdump(ret,0x30));
count++;
break;
case "f":
console.log(args[(count+1)]);
default:
//console.log("其他格式");
console.log(args[(count+1)]);
count++;
break;
}
pos+=index+2;
}
//console.log("一共出現%d次",count);
}
function hook_printf()
{
var baseAddress = Module.getBaseAddress("va_arg.exe");
var offset = 0x1410;
var funcAddress = baseAddress.add(offset);
console.log("BaseAddress = ",baseAddress);
console.log("Offset = ",offset);
console.log("Offset in Module Address = ",funcAddress);
//var argsp = null;
Interceptor.attach(funcAddress,
{
onEnter: function(args)
{
//argsp = ptr(args[0]);
console.log("")
console.log("====frida Hook===");
vspritf(args[0].readUtf8String(),args);
console.log("=================");
},
onLeave: function(retval)
{
//console.log("回傳字串:",argsp.readUtf8String());
}
});
}
hook_printf();
目前我只能想出這種低端的做法,文章有紕漏請及時指出謝謝! 或者大佬么用更好的方法,請在評論區回復,
本文來自博客園,作者:VxerLee,轉載請注明原文鏈接:https://www.cnblogs.com/VxerLee/p/16175492.html 專注逆向、網路安全 ——VxerLee
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460788.html
標籤:其他
上一篇:C++逆向 可變引數Hook
