日期:2014-05-17  浏览次数:20862 次

如何获得函数起始地址(使用函数名出错)???????
目的就是获得函数起始地址 和 终止地址 。
网上资料说 可以使用函数名和下一个函数名 作为起始和终止地址。
但是 将函数名 保存到一个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*/


不解 望大牛指点迷津
 

------解决方案--------------------
建议楼主发到相应的编程板块.
------解决方案--------------------
在调试的时候可以看看地址,不过汇编比较麻烦,没有好的调试器

------解决方案--------------------
楼主,你用函数指针都行啊。。不需要汇编这么麻烦。