作坊模块写CALL的经验.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
作坊模块写CALL的经验

用作坊模块写CALL的经验之谈 大家在使用模块写CALL时,对于参数方面很容易搞错了,这里我给大家简单讲解一下要注意的事项与经验. uXK$5 4N[bRCn 正确的汇编代码是 ( 8H mov eax,0xA3EE20 Z$6W)~;, mov eax,[eax] sA}=o.\j: mov ecx,[eax+0x178] #?8Z/1 ) mov edx,[ecx] mufF_e) push 0x0 ^Z\1z!{R push 0x3 *-` /A push 0x7 l|5ss{llR call [edx+0x1d0] L(AY)gB h9SS o0]F 从上面的意思,我们大概可以看出此CALL所传递的参数,有三个是通过入栈的,两个是分别通过ECX与EDX的, syBYH5 基于__fastcall调用约定的正是会涉及ECX与EDX两寄存器,一般其它寄存器很少会参与参数的传递作用 njvmf*A?S 上述代码分成两部份来看,一部份是针对寄存器的,一部份是入栈的. dHd{9ftyF 第一部份 寄存器操作 u3c e\ 第一二句代码的意思是 eax=[0xA3EE20] 是把内存0xA3EE20处的4字节值放进EAX寄存器里. +| Cvv]Tx1 第三句 ECX=[eax+0x178] 就是把之前读来的值+0x178做为内存地址,再次读取4字节数据放在ECX里 [Zgy,j\ \ 第四句 edx=[ecx] 把ecx的值作为内存地址,再读取4字节放在EDX寄存器里. [(UQQa=+ oX!s u 理解了上述的汇编代码后再看看这位会员与编写的代码,前三句的内存_读整数型()与三次的CPU寄存器赋值,是完全正确的. 3$WK%%T 1 5rE|m^ 若要把意思写得更接近那个汇编代码可以如此 TC J\@|yw h`Y t4-Y 内存_读整数型(进程句柄CPU.EAX) 0xA3EE20 aD0w82s]J 内存_读整数型(进程句柄,CPU.EAX+376,CPU.ECX) 0x178 yh lZdF 内存_读整数型(进程句柄,CPU.ECX,CPU.EDX) +h*r ~T !tX14O~B- 内存_读整数型(进程句柄,CPU.EDX+464,CALL地址) 0x1D0 X9zTz2 Fy m,]Tl;f 通过前三句,就完成了ECX与EDX的值的设置,第四句取出来了要CALL的地址.大家可能会想问,为什么我上面的读内存时地址与+偏移不是用 十六到十( ) 进行转换,而是直接填写数字?因为转换来转换去,是消耗CPU的,其实这些值我们可以用计算器转一下,在编写代码时填写十进制的值,同时为了方便记忆呢,在代码后把十六进制的值做为注释就行了.当然这样会给写代码带来些麻烦.. ^3AJYu GTJ\APrH 再看第二部份的PUSH入栈参数问题. .{)b^gE )pJ}oJ 我们可以看到此会员写的代码是照抄汇编代码的. eGS~-DVK push 0x0 参数[1]=0 213D{#2 push 0x3 参数[2]=3 $30w push 0x7 参数[3]=7 G{ F=z(l 明明照抄的结果,却CALL起来无效.问题呢就是出在这时在. uA\A4 原因是汇编代码是从上往下一句一句运行,那三句PUSH是先0再3最后7压进了栈里 f{^n\Jh 而正常的软件编程里对于参数是先把右边向左的参数依次入栈,就是先压参数3,再压参数2,最后是参数1.意思就是与汇编里的刚好反过来的顺序. ,gD30Pylz |oO0%#1H 所以正确的写法应该是 =oiY}%(i 2Uu,Vv push 0x0 参数[1]=7 ?55(+{l push 0x3 参数[2]=3 _FAwWS4B push 0x7 参数[3]=0 w )DOZ7 oD/ku 或许大家对我的讲解不太理解,但要记住这个决窍就行了, tRgEH@ 从你看到的汇编里CALL的那个开始,往上看所有的PUSH,在最接近CALL这句的为参数[1]就是了.再上面的PUSH就是参数[2],再就是参数[3],如此推即是. .%~ L SHz o[u 另外还有一个问题就是汇编里是三个PUSH,此会员定义的参数数组成员数却是4个,这里也是错误的,应该改成3个. I+u=H2][2 ?eCbVc4 最终所有的代码应该是 |.S~HLTQ MQ,$Y5~H 内存_读整数型(进程句柄CPU.EAX) 0xA3EE20 6jF~zI^ 内存_读整数型(进程句柄,CPU.EAX+376,CPU.ECX) 0x178 )t)tk=R9N 内存_读整数

文档评论(0)

kakaxi + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档