Frida Hook可變參數


Frida Hook可變參數

0x00 前言:

可變參數Hook原理可以參考下我的這篇文章:C++逆向 可變參數Hook

我在網上搜了好久,都沒找到有人寫過Frida Hook可變參數.........

0x01 Frida Hook可變參數

args

OK 回歸正題,Frida 如何Hook可變參數。

首先可變參數意味着,他的參數個數不確定,參數類型不確定。

在frida中,函數的參數都在args上。我看了官網資料,他說args是一個NativeObject的Array。

可是當我用JS去遍歷這個Array的時候,總是會報錯。。。。(如果有大神知道,請告訴我如何去遍歷。謝謝!)

image-20220421174825412

而且我就這樣直接輸出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代碼,然后根據判斷%來決定有多少個參數,並且截取%后面字符。

根據字符來進行不同類型的輸出,比如字符串、整形、指針數據等。

image-20220421180450266

自己處理格式控制符

/*
/*用來模仿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();

目前我只能想出這種低端的做法,文章有紕漏請及時指出謝謝! 或者大佬么用更好的方法,請在評論區回復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM