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();
目前我只能想出這種低端的做法,文章有紕漏請及時指出謝謝! 或者大佬么用更好的方法,請在評論區回復。