C++逆向 可变参数Hook
2022-04-21 14:35
1251 查看
[toc]
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_list、
va_start、
va_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"); }
- 首先va_list定义了一个可变参数的指针。
- va_start函数传入,可变参数指针和最后一个固定参数,传出引用可变参数指针。
- 输出可变参数指针地址。
- 清空可变参数指针内存空间。
0x02 逆向分析C++可变参数原理
将上面的代码用VC6编译出来后进行调试分析。
找到特征。
在汇编代码中,定位到main函数。
接着在汇编处
call va_arg.401005处下一个断点。可以看到他将参数一个个push到了堆栈中。
接着按
F7跟入
test函数。
通过对汇编代码的分析,我大概知道了
va_start函数()为什么要将最后一个固定参数传入。因为他需要用最后一个固定参数在堆栈中进行偏移的计算,计算出可变参数的地址。
遍历该堆栈,当遍历到的值是入口点,说明可变参数已经遍历完成。
0x03 printf Hook实战
这里我随便选了一个系统的可变参数函数,
printf可以将格式化后的字符串进行输出,符合我们可变参数函数的要求。
Pwn菜鸡学习小分队
欢迎加入探讨 逆向知识和PWN
相关文章推荐
- C/C++可变参数,“## __VA_ARGS__”宏的介绍和使用
- C++ 编码军规(001):不要使用包含可变参数列表的函数
- 浅析C/C++中的可变参数与默认参数
- C++ - 可变参数函数模板(Variadic Function Template) 详解 及 代码
- 可变参数的使用(C++和C#实现)
- C,C++中使用可变参数
- [C++]遍历可变参数 (va_list)
- C++可变模板参数中&&和&的使用
- C++ 可变参数的函数
- [C/C++]函数参数的入栈顺序与可变参数的实现
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
- C++ 11 可变参数宏结合可变参数模板使用!
- C++可变参数的另一种实现
- c/c++支持可变参数的函数,即函数的参数是不确定的。
- C/C++中可变参数的原理
- C/C++ 可变参数函数
- C/C++中使用可变参数
- C/C++中可变参数的用法详细解析
- C++ - 可变参数函数模板(Variadic Function Template) 详解 及 代码
- C/C++函数参数的入栈顺序,计算顺序和可变参数的实现