当前位置: 首页 > news >正文

通过硬编码函数地址并转换为函数指针来调用函数

你上传的这段 C 语言代码展示了一个更深入的用法:通过硬编码函数地址并转换为函数指针来调用函数(如 printf。下面我们进行详细分析。


📄 代码内容解析

#include <stdio.h>int main()
{int (*myshow)(const char *, ...);  // 声明可变参数的函数指针printf("the printf is %p\n", printf);  // 打印 printf 的地址myshow = (int (*)(const char *, ...)) 0x08048320;  // 硬编码地址转为函数指针myshow("============\n");  // 通过地址调用函数return 0;
}

🔍 关键要点解析

1. %p 打印函数地址

printf("the printf is %p\n", printf);
  • %p 是格式控制符,输出指针(地址);

  • 这里打印出 printf 函数的地址(如 0x08048320);

  • 如果你在程序中观察到了该地址,可以手动将其硬编码。


2. 手动转函数地址为函数指针

myshow = (int (*)(const char *, ...)) 0x08048320;

这行代码是关键:

  • 你将一个硬编码地址强制转换为函数指针;

  • 然后将该地址赋值给 myshow,模拟调用 printf

这在 C 语言中是合法的,但:

⚠️ 非常危险,如果地址错误,程序将直接崩溃(Segmentation Fault)或出现未定义行为。


3. 函数调用

myshow("============\n");

如果地址正确,效果和 printf("============\n"); 完全一样。


⚠️ 安全性与用途

项目说明
✅ 用途操作系统、裸机开发、动态加载函数、反射模拟、逆向工程
⚠️ 风险一旦地址错误或在不同平台上编译运行,程序就会崩溃或行为异常
🚫 不建议在用户态普通应用程序中不要硬编码函数地址

✅ 运行前建议

  1. 确保地址来自 printf 函数真实地址

  2. 使用 objdump -d ./buildnm ./build 查看 printf 的地址;

  3. 保证编译环境、链接方式与地址一致,否则结果不可靠。


如果你是在学习低层机制(如裸机编程、逆向分析、跳板调用),这个技巧是非常实用的。我也可以进一步介绍如何在 ELF 文件中查找函数地址,或在汇编层面跟踪函数调用。需要我展开这方面内容吗?

http://www.dtcms.com/a/301317.html

相关文章:

  • Java#包管理器来时的路
  • Leetcode-3427变长子数组求和
  • Mitk教程案例项目编译
  • 嵌入式——单片机的独立按键
  • 【3DsMax+Zbrush+SP】风格化低多边形模型制作教程——以制作杯子为例——03在Substance Painter中制作材质
  • PyTorch深度学习入门记录3
  • 两数之和 II - 输入有序数组-leetcode
  • 【深度学习系列82】joyagent上手体验
  • 五、搭建springCloudAlibaba2021.1版本分布式微服务-gateway网关
  • 基于大模型的预训练、量化、微调等完整流程解析
  • 【思维链(CoT)技术深度解析】从理论到实践的革命性推理方法
  • pytest中的参数化
  • Python-初学openCV——图像预处理(三)
  • 相对路径遍历(CWE-22)
  • 【杂谈】-被引用即被看见:生成式AI如何改写内容规则
  • vscode找不到python解释器的解决方案
  • 8. 若依框架的AjaxResult
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现PCB上二维码检测识别(C#代码UI界面版)
  • 欢乐的周末 - 华为OD统一考试(JavaScript 题解)
  • RAG(检索增强生成)
  • Vue 四个map的使用方法
  • MySQL读写分离部署
  • 【YOLO系列】YOLOv1详解:模型结构、损失函数、训练方法及代码实现
  • 前端面试专栏-前沿技术:31.Serverless与云原生开发
  • Spring AI 项目实战(二十一):Spring Boot + AI +DeepSeek驱动的智能题库系统(附完整源码)
  • Linux-文件与文本管理
  • 【语义分割】记录2:yolo系列
  • Java面试实战:安全框架与大数据技术深度解析
  • 代码随想录算法训练营二十八天|动态规划part01
  • C语言自定义数据类型详解(四)——联合体