怎样通过函数名得到程序包中函数的函数指针

怎样通过函数名得到程序包中函数的函数指针,第1张

c语言中, 函数名也称为函数的指针,所以c语言中函数名就是一个指针。1,例如: ShowMenu是一个函数名,可以看到他的值是一个地址。&ShowMenu是对函数取地址,指向和ShowMenu同样的地址。可以看出,ShowMenu是占用一个字节的,而作为指针&ShowMenu却占用四个字节。所以,函数名占用空间的。 2,函数指针 指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下: 类型说明符 (函数名)(参数) 其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。 指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。 例如: void (fptr)(); 把函数的地址赋值给函数指针,可以采用下面两种形式: fptr=&Function; fptr=Function; 取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数: x=(fptr)(); x=fptr(); 第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子: void (funcp)(); void FileFunc(),EditFunc(); main() { funcp=FileFunc; (funcp)(); funcp=EditFunc; (funcp)(); } void FileFunc() { printf("FileFunc\n"); } void EditFunc() { printf("EditFunc\n"); } 程序输出为: FileFunc EditFunc

C++中函数名就是地址

比如:

void a(){};

a就是地址

如果在类AA中

可以AA::a就是函数的地址

或者&a也表示a的地址,int a = (int)&a

C#中我所知道的就是把函数定义为委托就是把普通的函数定义时在前头加上delegate关键字,这之后就相对于C++里的指针用了

>

再学习函数指针的时候,见过这么一个例子:

int func(int x); / 声明一个函数 /

void (f) (int x); / 声明一个函数指针 /

f=func; / 将func函数的首地址赋给指针f /

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

所以 函数名代表函数的入口地址吧

函数名很简单,导出表里写的明明白白,随便一个dll查看工具都可以读出,比如CFF explorer。但是对于参数,就像楼上说的那样,不能看出它真实的数据类型(即在高级语言中的抽象数据类型)。因为都编译成汇编了,没有抽象的概念了,此时只能知道数据大小。

但是,不代表就没有办法了。有个一软件叫IDA,专门用于静态分析,它可以反编译汇编成C的伪代码,从而大致能知道传入、传出了啥。如果再知道函数的功能的话,只要不是太复杂,分析出参数类型问题不大。

IDA反编译大概效果就是这样:void __fastcall Function(__int64 a1, __int64 a2, int a3, _QWORD a4)。这里只复制了个声明,但也可以看出,比晦涩的汇编容易读多了。注意上面写的数据类型只能当作参考,因为这些数据类型也是软件根据代码行为推测的。

%p:打印裸指针(raw pointer)

%pF可打印函数指针的函数名和偏移地址

%pf只打印函数指针的函数名,不打印偏移地址。

printk("%pf",func[0]->action); 结果:

my_Set

%pM打印冒号分隔的MAC地址

%pm打印MAC地址的16进制无分隔

printk("%pM %pm\n", mac, mac) willprint:

2c:00:1d:00:1b:00 2c001d001b00

%I4打印无前导0的IPv4地址,%i4打印冒号分隔的IPv4地址

%I6打印无前导0的IPv6地址,%i6打印冒号分隔的IPv6地址

printk("%pI4 %pi4\n", ip, ip) will print:

127001 127:0:0:1

要知道main函数也是由其他的程序调用的。

我们编写的程序,最终是不存在所谓的函数名的,有的只有内存单元地址0xffeedd00

我们的程序执行时,程序加载到内存,比方说整个程序所占用的内存范围是0xffee0000 ~ 0xffeedd00,这么多。

假设程序有一个小函数fun(),那么它的范围可能是0xffee0000~0xffee00ff。

那么函数fun()的入口地址是多少? 0xffee0000。。

那么函数名fun实际上就是0xffee0000的别称。

你用一个指针指向这个函数,那么你把 指针 = 函数名,实际就是把0xffee0000这个内存单元的地址给指针p。

所以,结论是:

函数名 是 程序在执行时, 函数所占内存单元块的 首地址 的别称。

以上就是关于怎样通过函数名得到程序包中函数的函数指针全部的内容,包括:怎样通过函数名得到程序包中函数的函数指针、C#或VC++中怎么取一个函数地址、C语言中,函数名代表函数的入口地址吗!!!求大神!求解析!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9754335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存