如何实现C语言的逆向可变参数Hook机制?

2026-05-19 15:411阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计827个文字,预计阅读时间需要4分钟。

如何实现C语言的逆向可变参数Hook机制?

目录+ C++ 逆向 + 可变参数 Hook + 0x00 + 前言: + 0x01 + C++ 可变参数: + 可变参数简介 + 可变参数代码实战 + 0x02 + 逆向分析C++ 可变参数: + 逆向分析C++ 可变参数原理 + 0x03 + printf Hook 实战 + Pwn菜鸟学习小组 + C++ 逆向 + 可变参数 Hook + 0x00 + 前言:

如何实现C语言的逆向可变参数Hook机制?

目录
  • C++逆向 可变参数Hook
    • 0x00 前言:
    • 0x01 C++可变参数:
      • 可变参数简介
      • 可变参数代码实战
    • 0x02 逆向分析C++可变参数原理
    • 0x03 printf Hook实战
    • Pwn菜鸡学习小分队

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编译出来后进行调试分析。

找到特征。

在汇编代码中,定位到main函数。

接着在汇编处call va_arg.401005处下一个断点。可以看到他将参数一个个push到了堆栈中。

接着按F7跟入test函数。

通过对汇编代码的分析,我大概知道了va_start函数()为什么要将最后一个固定参数传入。因为他需要用最后一个固定参数在堆栈中进行偏移的计算,计算出可变参数的地址。

遍历该堆栈,当遍历到的值是入口点,说明可变参数已经遍历完成。

0x03 printf Hook实战

这里我随便选了一个系统的可变参数函数,printf可以将格式化后的字符串进行输出,符合我们可变参数函数的要求。

Pwn菜鸡学习小分队

欢迎加入探讨 逆向知识和PWN

本文共计827个文字,预计阅读时间需要4分钟。

如何实现C语言的逆向可变参数Hook机制?

目录+ C++ 逆向 + 可变参数 Hook + 0x00 + 前言: + 0x01 + C++ 可变参数: + 可变参数简介 + 可变参数代码实战 + 0x02 + 逆向分析C++ 可变参数: + 逆向分析C++ 可变参数原理 + 0x03 + printf Hook 实战 + Pwn菜鸟学习小组 + C++ 逆向 + 可变参数 Hook + 0x00 + 前言:

如何实现C语言的逆向可变参数Hook机制?

目录
  • C++逆向 可变参数Hook
    • 0x00 前言:
    • 0x01 C++可变参数:
      • 可变参数简介
      • 可变参数代码实战
    • 0x02 逆向分析C++可变参数原理
    • 0x03 printf Hook实战
    • Pwn菜鸡学习小分队

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编译出来后进行调试分析。

找到特征。

在汇编代码中,定位到main函数。

接着在汇编处call va_arg.401005处下一个断点。可以看到他将参数一个个push到了堆栈中。

接着按F7跟入test函数。

通过对汇编代码的分析,我大概知道了va_start函数()为什么要将最后一个固定参数传入。因为他需要用最后一个固定参数在堆栈中进行偏移的计算,计算出可变参数的地址。

遍历该堆栈,当遍历到的值是入口点,说明可变参数已经遍历完成。

0x03 printf Hook实战

这里我随便选了一个系统的可变参数函数,printf可以将格式化后的字符串进行输出,符合我们可变参数函数的要求。

Pwn菜鸡学习小分队

欢迎加入探讨 逆向知识和PWN