指针可以和整数互相转换

函数指针可以指向一个函数,它本身不过是一个整数,所以也可以用整数存储函数地址,然后强转成函数指针去调用。

void func(void);//有一个函数
int address = (int)func;//用整数保存其地址
((void(*)())address)();//通过地址调用func

函数指针调用数组中的代码

函数指针还可以帮我们调用数据区中的代码,假设我有一个 int Add(int,int) 函数用于将两个整数相加,我编译后把它的字节码取出来,存到一个数组里,然后用函数指针指向这个数组,就可以调用这个函数做加法了。

#include <Windows.h>
#include <stdio.h>// 加法函数的字节码
unsigned char code[] =
{0x55,0x8B,0xEC,0x83,0xEC,0x40,0x53,0x56,0x57,0x8D,0x7D,0xC0,0xB9,0x10,0x00,0x00,0x00,0xB8,0xCC,0xCC,0xCC,0xCC,0xF3,0xAB,0x8B,0x45,0x08,0x03,0x45,0x0C,0x5F,0x5E,0x5B,0x8B,0xE5,0x5D,0xC3
};int main(int argc, char *argv[])
{// 修改数组内存权限为可执行DWORD dwOldProtect = NULL;BOOL bRet = VirtualProtectEx(GetCurrentProcess(), (LPVOID)code, 0x1000,PAGE_EXECUTE_READWRITE, &dwOldProtect);if (!bRet){printf("修改内存属性失败,错误码: %d\n", GetLastError());return 1;}typedef int(__cdecl *PFNADD)(int, int);printf("%d\n", ((PFNADD)&code)(4, 7));return 0;
}

函数指针和shellcode相关推荐

  1. C语言_函数指针高级用法

    什么是函数指针? 函数是计算机程序中一段可执行代码的封装,当程序运行时函数会被加载到内存布局中的代码段位置,这段代码会有一段内存空间,有内存空间就会有地址,这段内存空间的首地址,就是函数的地址 每当我 ...

  2. c/c++中的函数指针和指针函数

    定义 1.指针函数,本质是函数,返回值为指针,形如,int *pfun(int, int),由于"*"的优先级低于"()"的优先级,所以等同于int *(pfu ...

  3. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  4. 0709 C语言常见误区----------函数指针问题

    1.函数指针的定义 对于函数 void test(int a, int b){ // } 其函数指针类型是void (* ) (int , int), 注意这里第一个括号不能少, 定义一个函数指针,v ...

  5. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  6. 函数指针(就做个笔记)

    1,函数的地址 #include <stdio.h> int main(){int i=0;printf("main=%p\n",main);printf(" ...

  7. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

  8. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  9. C++中函数指针的使用

    A function pointer is a variable that stores the address of a function that can later be called thro ...

最新文章

  1. java 中的reader_java-无限循环中的ItemReader reader()
  2. 数据分析索引总结(中)Pandas多级索引
  3. css3中transition属性详解
  4. stm32核心板可以点亮灯吗_STM32库函数点亮LED
  5. 测试下微信公众号新功能
  6. mysql实例怎么复制_Mysql实例MySQL数据库复制概论
  7. SharePoint自动化系列——通过Coded UI录制脚本自动化创建SharePoint Designer Reusable Workflow...
  8. Mixgo CE初体验
  9. SpringMVC+Vue实现前后端分离的宠物管理系统
  10. python爬取别人qq空间相册_Python网络爬虫5 - 爬取QQ空间相册
  11. 最全面的免费可商用素材网站合集
  12. 谷歌浏览器chrome翻译插件完美解决开发者模式插件问题
  13. Android刷新UI导致崩溃的探究——Only the original thread
  14. Java Grammar(二):运算符
  15. java物流系统_java 物流管理系统
  16. 【EMNLP 2021】SimCSE:句子嵌入的简单对比学习 【CVPR 2021】理解对比学习损失函数及温度系数
  17. 给力回馈!亲~时间有限哦!
  18. 第十三章 失业、通货膨胀和经济周期
  19. 大数据培训出来好就业吗
  20. 心态-《自卑与超越》书中的精髓:我们为什么会感到自卑,以及如何做才能克服自卑情绪。

热门文章

  1. JAVA项目实训struts2_Java Web项目搭建过程记录(struts2)
  2. openresty完全开发指南_送给你,PBA商业分析指南(全书下载)
  3. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
  4. .net core使用数据库
  5. YARN中的失败分析
  6. Windows 10 不能安装更新 (0x8024402f)
  7. 阿里菜鸟知识储备之二——git工具学习
  8. Java自带的多线程监控分析工具(VisualVM)
  9. 21IC上关于stm32 option bytes的操作帖子记录
  10. 设计模式总结之Builder Pattern(建造者模式)