| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8506 人关注过本帖, 2 人收藏
标题:【疑问】使用GetProcAddress 获取到的函数地址是函数真正的入口地址吗?
取消只看楼主 加入收藏
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
结帖率:72.73%
收藏(2)
 问题点数:0 回复次数:4 
【疑问】使用GetProcAddress 获取到的函数地址是函数真正的入口地址吗?
疑问:在动态加载DLL,使用其中导出的函数时,我们常会用GetProcAddress获取DLL中函数的地址。我有个疑问,这里获取到的函数地址
      是函数真正的入口地址吗?如果不是这个地址是什么呢?
      
我做了一个测试,貌似可以证明这个地址不是真正的函数入口地址,那这个地址与真正的函数的入口地址有什么关系呢?

//在下面的实验中,我先获取到MessageBoxA的地址,然后修改这个地址指向内存处的前6个字节为:
//"jmp dword ptr[MessageBox的入口地址]"
//这样下MessageBox调用就陷入死循环中。
//在另一个程序中再次调用MessageBox函数,发现调用是正常的。说明上面的修改仅对当前进程有效。
#include <windows.h>
int main()
{
    HANDLE hDll=NULL;
    void * pAddr=NULL;
    unsigned int uiAddr=0;
    DWORD lpflOldProtect;
    hDll=LoadLibrary("user32.dll");
    pAddr=GetProcAddress(hDll,"MessageBoxA");
    uiAddr=(unsigned int)pAddr;
    if(VirtualProtect(pAddr,100,PAGE_EXECUTE_READWRITE,&lpflOldProtect))
    {
        //将MessageBox入口的6个字节修改为指令:
        //jmp dword ptr[MessageBoxA的入口地址]
        (unsigned char)*((unsigned char*)pAddr)=0xff;
        ((unsigned char*)pAddr)++;
        (unsigned char)*((unsigned char*)pAddr)=0x25;
        ((unsigned char*)pAddr)++;
        (unsigned int)*((unsigned int *)pAddr)=(unsigned int)&uiAddr;
        MessageBox(0,"test","test",MB_OK);
    }
    return 0;
}
搜索更多相关主题的帖子: 入口地址 函数地址 疑问 获取 int 
2008-08-03 18:03
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
补充:
反汇编,看到MessageBox如下:

20:           MessageBox(0,"test","test",MB_OK);
004010BA   mov         esi,esp
004010BC   push        0
004010BE   push        offset string "test" (0042201c)
004010C3   push        offset string "test" (0042201c)
004010C8   push        0
004010CA   call        dword ptr [__imp__MessageBoxA@16 (0042a2b4)]
这里的0x0042a2b4 是什么呢?
使用GetProcAddress  获取到的值是 :0x775d5058a  也是call 最终转向的地址

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-08-03 18:09
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
[bo][un]zklhp[/un] 在 2008-8-3 19:03 的发言:[/bo]



偶感觉 这种测试肯定只会影响当前进程  要是改了后 整个系统的MessageBox 全变了 那不天下大乱了

只是对映射到进程的进行了改动 不知道是不是和CopyOnWrite之类的有关

个人意见 偶是大菜鸟 呵呵



感谢 你的关注  你觉得 GetProcAddress获取到的函数地址是不是动态链接库内存映射中函数的入口地址呢?

我是想看看能不能通过修改这个地址指向的函数劫持这个 API, 类似于在核心态 (Ring 0)的挂钩 SSDT 表实现主动防御。

[[it] 本帖最后由 redice 于 2008-8-3 21:07 编辑 [/it]]

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-08-03 20:55
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
hDll=LoadLibrary("user32.dll");
 pAddr=GetProcAddress(hDll,"MessageBoxA");
 通俗一点说,我就是想问pAddr是不是 user32.dll映射到内存后MessageBoxA的入口地址?

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-08-03 21:03
redice
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:902
专家分:0
注 册:2006-12-11
收藏
得分:0 
回复 8# 你们都要疼我哦 的帖子
谢谢  

现在我知道了 就是使用 GetProcAddress 得到的函数地址是函数的实际地址

为什么修改了这个地址下对应的代码对其它程序没有影响呢?

“win32中是用的平坦内存模式,一个进程和它所需要的DLL是个整体,DLL属于调用它的进程,不会影响到其他同样调用该DLL的进程的.DLL物理上只存在一份, 采用映射加部分拷贝代码的形式提供给每个进程使用.互不影响.”

“映射加部分拷贝代码”,哪部分代码系统会采用直接映射,哪部分要用拷贝代码呢?

鲲鹏数据 - 专业Web数据采集服务提供者
http://www.
2008-08-03 21:27
快速回复:【疑问】使用GetProcAddress 获取到的函数地址是函数真正的入口地址吗 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027251 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved