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的非导出函数。