调用未知DLL中及导出函数.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
调用未知DLL中及导出函数

不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数,所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过有哪些信誉好的足球投注网站引擎来找到它的使用方式(比如本文中的例子ipsearcher.dll),不过我们诚然不能希望自己总能交到这样的好运。所以在本文中,李马希望通过自己文理不甚通达的讲解能够给大家以授人以渔的效果。 不知道诸位看官是否有过这样的经历:在不经意之间发现一个DLL文件,它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数,所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过有哪些信誉好的足球投注网站引擎来找到它的使用方式(比如本文中的例子ipsearcher.dll),不过我们诚然不能希望自己总能交到这样的好运。所以在本文中,李马希望通过自己文理不甚通达的讲解能够给大家以授人以渔的效果。 先决条件 阅读本文,你需要具备以下先决条件: 初步了解汇编语言,虽然你并不一定需要去读懂DLL中导出函数的汇编代码,但是你至少应该了解诸如push、mov这些常用的汇编指令。 一个能够查看DLL中导出函数的工具,Visual Studio中自带的Dependency Walker就足够胜任了,当然你也可以选择eXeScope。 一个调试器。理论上讲VC也可以完成调试的工作,但它毕竟是更加针对于源代码一级调试的工具,所以你最好选择一个专用的汇编调试器。在本文中我用的是OllyDbg——我不会介绍有关这个调试工具的任何东西,而只是简要介绍我的调试过程。 准备好了吗?那么我们做一个热身运动吧先。 热身——函数调用约定 这里要详细介绍的是有关函数调用约定的内容,如果你已经了解了这方面的内容,可以跳过本节。 你可能在学习Windows程序设计的时候早已接触过“函数调用约定”这个词汇了,那个时候你所了解的内容可能是一个笼统的概念,内容大抵是说函数调用约定就是指的函数参数进栈顺序以及堆栈修正方式。譬如cdecl调用约定是函数参数自右而左进栈,由调用者修复堆栈;stdcall调用约定亦是函数参数自右而左进栈,但是由被调用者修复堆栈……噢不,这太晦涩了——在源代码上我们是无法看到这些东西的! 那么我们别无选择,只有深入到汇编一层了。考虑以下C++代码: #include?stdio.h int?__cdecl?max1(?int?a,?int?b?) { ????return?a??b???a?:?b; } int?__stdcall?max2(?int?a,?int?b?) { ????return?a??b???a?:?b; } int?main() { ????printf(?max(?1,?2?)?of?cdecl?version:?%d\n,?max1(?1,?2?)?); ????printf(?max(?1,?2?)?of?stdcall?version:?%d\n,?max2(?1,?2?)?); ????return?0; } 对应的汇编代码为: ; int __cdecl max1( int a, int b )MOV EAX,DWORD PTR SS:[ESP+4]MOV ECX,DWORD PTR SS:[ESP+8]CMP EAX,ECX 0040100A JG SHORT CppTest.0040100E 0040100C MOV EAX,ECX 0040100E RETN ; int __stdcall max2( int a, int b )MOV EAX,DWORD PTR SS:[ESP+4]MOV ECX,DWORD PTR SS:[ESP+8]CMP EAX,ECX 0040101A JG SHORT CppTest.0040101E 0040101C MOV EAX,ECX 0040101E RETN 8 ; 被调用者的堆栈修正 ; max1( 1, 2 )PUSH 2PUSH 1CALL CppTest00401039 ADD ESP,8 ; 调用者的堆栈修正 ; max2( 1, 2 ) 0040104A PUSH 2 0040104C PUSH 1 0040104E CALL CppTest 好了,我来简要介绍一下。函数参数传入函数体是借由堆栈段完成的,也就是将各个参数依某种次序推入SS中——在cdecl与stdcall约定中,这个次序都是自右而左的。另外,由于将参数推入了堆栈致使堆栈指针ES

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档