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

    找到特征。

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

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

    接着按F7跟入test函数。

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

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

    0x03 printf Hook实战

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

    Pwn菜鸡学习小分队

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


    __EOF__

  • 本文作者: VxerLee
  • 本文链接: https://www.cnblogs.com/VxerLee/p/16174029.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Es6数组
    死锁的发生原因和怎么避免
    『忘了再学』Shell基础 — 31、字符处理相关命令
    java计算机毕业设计基于ssm的农业信息管理系统(源代码+数据库+Lw文档)
    机器学习笔记 - 用于动作识别的网络TSN/TSM/SlowFast/R(2+1)D/3D MobileNetV2
    nodejs+vue大学生招聘网站应聘系统设计与实现5b14b
    计算机毕业设计hadoop++hive微博舆情预测 微博舆情分析 微博推荐系统 微博预警系统 微博数据分析可视化大屏 微博情感分析 微博爬虫 知识图谱
    Selenium之css怎么实现元素定位?
    Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了
    Rust编程-I/O
  • 原文地址:https://www.cnblogs.com/VxerLee/p/16174029.html