24授人以鱼不如授人以渔●CALL参数需求.docVIP

24授人以鱼不如授人以渔●CALL参数需求.doc

  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文档。上传文档
查看更多
24授人以鱼不如授人以渔●CALL参数需求

24授人以鱼不如授人以渔●CALL的参数需求 给一个CALL传入适当的参数,是要看CALL内部调用了什么参数,而不是看CALL前面压入了什么.CALL前面压入的只是一个参考. ? 图中便是F8的喊话模拟器.很多初学者朋友都不是很清楚,为啥只要写一个CALL就可以调用喊话. 我们都知道最后那个CALL是调用喊话的核心CALL.我在文章前面说过,要给一个CALL传入适当的参数是要看CALL内部调用了那些参数.我们进入到CALL内部看看 ? 这里是喊话CALL内部的头部部分.这里我们可以看出CALL的内部调用了4个参数.([EBP+*]或者[ESP+*]是指向参数部分具体请看之前的文章) 我们分别来看看这里的4个参数到底读取了什么. ? 按照顺序来看,首先是 [EBP+14] 喊话内容 [EBP+10] 喊话方式 [EBP+C] 喊话对象 [EBP+8]喊话基址. 从这个CALL的内部我们可以看出 CALL只需要4个参数. ? 断在程序调用CALL的地方,我们从堆栈里可以看到这里压入了4个参数跟CALL内部是对应的.所以我们这里只需要压入4个参数即可.不需要写上面的那几个CALL 例2 ? 图中是游戏CALL实例ONE中的吃血的CALL 写成代码就是 ? 从图中可以看出这里只赋值给一个EDX,为何要把EAX也赋值呢?我们来看看CALL的内部 ? 如何看CALL需要的寄存器?这里首先我们看看CALL调用了哪些寄存器. 首先是PUSH EBP? 然后是PUSH EBX? 还有一个 MOV EBX,EAX? MOV [ESP-4],EDX? 这 里的PUSH EBP 和PUSH EBX 其实是 环境保护.因为下面的代码需要用到EBP 和EBX这2个寄存器,但如果直接赋值就会丢失原有的数据?所以为了不丢失原有的数据,只好将他放在某个地方等EBP用完以后再弄回去.而下面的2句 POP ECX 相当于变相的内部堆栈平衡,平衡头部开辟出来的2个堆栈空间 这个代码就是将寄存器保存在 堆栈里.用完后取出.? 所以看是不是环境保护的寄存器可以看结尾是否有对应的POP 指令 这 里EBP EBX就可以排除了. 下面是 MOV [ESP-4],EDX? 结尾没有这个指令,所以这个PUSH EBX 是供给下面那个CALL使用的.? 还有一个就是MOV EBX,EAX? 在上面并没有给EAX赋值,? 而寄存器中的值本身就是空的或者是上个CALL遗留下来的残留数据.这个时候如果被传入了残留数据,那么就会导致指针读取不可读的内存区域导致程序出错.

文档评论(0)

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

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

1亿VIP精品文档

相关文档