调用未知dll中的导出函数

调用未知dll中的导出函数

ID:12006296

大小:50.00 KB

页数:7页

时间:2018-07-15

调用未知dll中的导出函数_第1页
调用未知dll中的导出函数_第2页
调用未知dll中的导出函数_第3页
调用未知dll中的导出函数_第4页
调用未知dll中的导出函数_第5页
资源描述:

《调用未知dll中的导出函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数,所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过搜索引擎来找到它的使用方式(比如本文中的例子ipsearcher.dll),不过我们诚然不能希望自己总能交到这样的好运。所以在本文中,李马希望通过自己文理不甚通达的讲解能够给大家以授人以渔的效果。不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数,所以只能

2、大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过搜索引擎来找到它的使用方式(比如本文中的例子ipsearcher.dll),不过我们诚然不能希望自己总能交到这样的好运。所以在本文中,李马希望通过自己文理不甚通达的讲解能够给大家以授人以渔的效果。先决条件阅读本文,你需要具备以下先决条件:·初步了解汇编语言,虽然你并不一定需要去读懂DLL中导出函数的汇编代码,但是你至少应该了解诸如push、mov这些常用的汇编指令。·一个能够查看DLL中导出函数的工具,VisualStudio中自带的DependencyWalker就

3、足够胜任了,当然你也可以选择eXeScope。·一个调试器。理论上讲VC也可以完成调试的工作,但它毕竟是更加针对于源代码一级调试的工具,所以你最好选择一个专用的汇编调试器。在本文中我用的是OllyDbg——我不会介绍有关这个调试工具的任何东西,而只是简要介绍我的调试过程。准备好了吗?那么我们做一个热身运动吧先。热身——函数调用约定这里要详细介绍的是有关函数调用约定的内容,如果你已经了解了这方面的内容,可以跳过本节。你可能在学习Windows程序设计的时候早已接触过“函数调用约定”这个词汇了,那个时候你所了解的内容可能是一个

4、笼统的概念,内容大抵是说函数调用约定就是指的函数参数进栈顺序以及堆栈修正方式。譬如cdecl调用约定是函数参数自右而左进栈,由调用者修复堆栈;stdcall调用约定亦是函数参数自右而左进栈,但是由被调用者修复堆栈……噢不,这太晦涩了——在源代码上我们是无法看到这些东西的!那么我们别无选择,只有深入到汇编一层了。考虑以下C++代码:#include int __cdecl max1( int a, int b ){    return a > b ? a : b;}int __stdcall max2( i

5、nt a, int b ){    return a > b ? a : b;}int main(){    printf( "max( 1, 2 ) of cdecl version: %d", max1( 1, 2 ) );    printf( "max( 1, 2 ) of stdcall version: %d", max2( 1, 2 ) );    return 0;}对应的汇编代码为:;int__cdeclmax1(inta,intb)00401000MOVEAX,DWORDPTRSS:[ESP+4

6、]00401004MOVECX,DWORDPTRSS:[ESP+8]00401008CMPEAX,ECX0040100AJGSHORTCppTest.0040100E0040100CMOVEAX,ECX0040100ERETN;int__stdcallmax2(inta,intb)00401010MOVEAX,DWORDPTRSS:[ESP+4]00401014MOVECX,DWORDPTRSS:[ESP+8]00401018CMPEAX,ECX0040101AJGSHORTCppTest.0040101E0040101C

7、MOVEAX,ECX0040101ERETN8;被调用者的堆栈修正;max1(1,2)00401030PUSH200401032PUSH100401034CALLCppTest.0040100000401039ADDESP,8;调用者的堆栈修正;max2(1,2)0040104APUSH20040104CPUSH10040104ECALLCppTest.00401010好了,我来简要介绍一下。函数参数传入函数体是借由堆栈段完成的,也就是将各个参数依某种次序推入SS中——在cdecl与stdcall约定中,这个次序都是自右而

8、左的。另外,由于将参数推入了堆栈致使堆栈指针ESP发生了变化,所以要在函数结束的时候重新修正ESP。从上边的汇编代码中你也可以很清楚地看到,cdecl约定是在调用max1之后修正的ESP,而stdcall约定则是在max2返回时借由RETN8完成了这个修正工作。另外,从上边的汇编代码中还可以看到,函数的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。