首页
社区
课程
招聘
dll中非导出函数的调用[原创]
发表于: 2006-3-13 15:41 7051

dll中非导出函数的调用[原创]

2006-3-13 15:41
7051
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的非导出函数。

以上是本人学习pe的一点心得,有谬误的地方请高手指教

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问:
    想调用一个DLL的导出函数,但不知道该函数的参数是什么,有没有办法知道导出函数的参数啊?
2006-3-13 16:10
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
无论是否导出的函数都可以用,不同的是如果没有导出则无法用api找到该函数的地址,除非你自己给程序指定一个地址.但是这样的话往往在不同的操作系统或者版本下地址会产生偏差,于是......
2006-3-14 00:33
0
游客
登录 | 注册 方可回帖
返回
//