C++逆向 可變參數Hook


C++逆向 可變參數Hook

0x00 前言:

我們在做逆向分析的時候,經常會需要去Hook一個程序的日志輸出函數。

而這種日志輸出函數一般參數都不確定,這就會引起一個問題。我們如何知道參數個數?如何知道他有哪些參數呢?

0x01 C++可變參數:

可變參數簡介

在C++中,可變參數的函數定義可以寫成如下格式。用...來聲明可變參數。

void test(int a,int b,...)
{
    //Code...
}

在調用可變參數的函數時,可以在后面不斷添加參數,例如。

test(1,2,3,4,5,"hello","test",6);

可變參數代碼實戰

那么回歸正題,test函數里如何知道它傳進來的后面所有參數個數呢?

這就需要用到stdarg.h頭文件中的幾個關鍵字了va_listva_startva_end

#include <stdio.h>
#include <stdarg.h>
void test(int a,int b,...)
{
	va_list      arg_ptr;//定義可變參數指針
	va_start(arg_ptr,b); //b為最后一個固定參數
    printf("Address = %p",arg_ptr);//將arg_ptr的地址進行輸出。
	va_end(arg_ptr);     //清空可變參數指針
}
int main(int argc,char *argv[])
{
    test(1,2,3,4,5,"hello","test,6");
}
  1. 首先va_list定義了一個可變參數的指針。
  2. va_start函數傳入,可變參數指針和最后一個固定參數,傳出引用可變參數指針。
  3. 輸出可變參數指針地址。
  4. 清空可變參數指針內存空間。

0x02 逆向分析C++可變參數原理

將上面的代碼用VC6編譯出來后進行調試分析。

image-20220421135733283

找到特征。

image-20220421135827066

在匯編代碼中,定位到main函數。

image-20220421135910019

接着在匯編處call va_arg.401005處下一個斷點。可以看到他將參數一個個push到了堆棧中。

image-20220421140216455

接着按F7跟入test函數。

通過對匯編代碼的分析,我大概知道了va_start函數()為什么要將最后一個固定參數傳入。因為他需要用最后一個固定參數在堆棧中進行偏移的計算,計算出可變參數的地址。

遍歷該堆棧,當遍歷到的值是入口點,說明可變參數已經遍歷完成。

image-20220421142455669

image-20220421142401651

0x03 printf Hook實戰

這里我隨便選了一個系統的可變參數函數,printf可以將格式化后的字符串進行輸出,符合我們可變參數函數的要求。

image-20220421143230764

Pwn菜雞學習小分隊

歡迎加入探討 逆向知識和PWN

img


免責聲明!

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



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