目的就是获得函数起始地址 和 终止地址 。
网上资料说 可以使用函数名和下一个函数名 作为起始和终止地址。
但是 将函数名 保存到一个DWORD类型的变量后 数据发生改变 !!!!
就是 在赋值之后 变量的数据和函数名代表的地址值 不一样
如何获得一个函数的精确地址 并将其保存到 DWORD 类型的变量中 ??
编译器如何处理函数名的赋值?
即使c++中嵌入汇编
_asm
{
mov eax , funname
mov dwdata , eax
}
funname 为一个函数名
dwdata 为一个DWORD 类型变量
程序当执行完第一步( mov eax , funname)时 eax寄存器的值 跟 funname 的真实函数地址 就不一样了
程序如下
#include <stdio.h>
#include <windows.h>
//目的是活的Add函数的起始地址和终止地址
int Add (int a , int b)
{
return (a+b) ;
}
void End ()
{
}
void main()
{
DWORD dwStart ;
dwStart = (DWORD)Add ;
DWORD dwEnd ;
dwEnd = (DWORD)End ;
printf("dwStart = 0x%x\n" , dwStart);
printf("dwEnd = 0x%x\n" , dwEnd);
/*输出结果
dwStart = 0x401005 但是调试查看得到的真实地址是 0x00401030
dwEnd = 0x40100a 调试查看得到的真实地址是 0x00401060*/
}
在调试的时候可以看看地址,不过汇编比较麻烦,没有好的调试器
用函数指针都行啊。。不需要汇编这么麻烦