posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

dll中非导出函数的调用

Posted on 2011-08-10 07:08 RTY 阅读(1197) 评论(0)  编辑 收藏 引用 所属分类: 编程常识C/C++Windows
http://hi.baidu.com/51634780/blog/item/6e99de041d682689e850cd2a.html

dll中非导出函数的调用
这几天在学习pe,对输出表特别兴趣。程序对导出函数调用,最终是对导出
函数入口地址的调用,非导出函数的入口地址不在导出表里,所以其他程序

无法

调用非导出函数。
本人刚开始的想法是在内存里修改dll的导出表,使非导出函数变成导出函

数,

供自己的程序调用。后来想到可不可以直接调用非导出函数的入口地址呢?

感觉

应该可以,有了这个想法后就马上开始动手试验。

自己写了个简单的dll,其中有2个导出函数a1,b1,1个内部函数c1
先用call的方法调用导出函数:a1
invoke LoadLibrary,CTEXT('testdll.dll')
mov @var1,eax        ;模块句柄(也是模块的基址)存入@var1 
invoke GetProcAddress,@var1,CTEXT('a1')
mov @lpProc,eax ;导出函数的入口地址存入@lpProc
push 5      ;函数参数3
push 9      ;函数参数2
push hWnd      ;函数参数1
call @lpProc      ;函数调用
一切正常。

再调用非导出函数试试,在调用非导出函数c1前,必须找到c1的相对虚拟
地址,
先用程序装入dll
invoke LoadLibrary,CTEXT('testdll.dll')
mov @var1,eax    ;模块句柄,也是模块的基址
然后运行程序,用OD调试,找到c1的入口地址:1000100C
1000100C           55            push ebp
1000100D           8BEC          mov ebp,esp
1000100F           8B45 08       mov eax,dword ptr ss:[ebp+8]
10001012           0345 0C       add eax,dword ptr ss:[ebp+C]
10001015           C9            leave
10001016           C2 0800       retn 8

通过 @var1获得模块的基址是10000000
那末c1的相对虚拟地址就是:1000100C-10000000=100c
做好了这一步后,就可以在自己的程序里调用非导出函数了。
调用非导出函数:
invoke LoadLibrary,CTEXT('testdll.dll')
mov @var1,eax       ;模块句柄(也是模块的基址)存入@var1
add @var1,100ch    ;得到c1的入口地址
push 5      ;函数参数2
push 9      ;函数参数1
call @var1      ;函数调用
得到了想要的结果,一切ok!

用这种方法可以调用别人dll的非导出函数。



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理