CALL的概念篇(已修改).doc_第1页
CALL的概念篇(已修改).doc_第2页
CALL的概念篇(已修改).doc_第3页
CALL的概念篇(已修改).doc_第4页
CALL的概念篇(已修改).doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CALL的概念篇:堆栈的平衡(一)作者:重楼 |9ig_k 日期:2009-09-05 6!L*q *堆栈平衡 是一个很重要的东西,其实说白了也没有什么,只要自己反汇编看看执行过程中的变化 便能了解的一清二楚. lkJ#$Ik& Vy*Zk * 这章需要知道一些简单的汇编知识 ,比如说 EIP的作用 ESP的概念 这些我就不详细多说了,想要学习的请看 王爽老师的 汇编语言 非常经典的一本书 +? g,&NE TVh7hEg 此次例子以武易打坐CALL为例 . Qvg5_26v =开始分析=I%WK*AORM attachment=42598 l0P*(I , F4 0这个就是打坐CALL的原型 和 代码 当然了 这个寄存器的值是动态的,因为是做堆栈平衡的所以我们没有找基址,可能跟你的值会不一样. b:&$x (| wLSYzz attachment=42599 &fj?hYAj 16k5wrIA 这里是 打坐CALL的内部 7y7y)I5 Oei2,3l,? 我们来用 加了堆栈平衡 和没加堆栈平衡的 CALL分别调用看看 他们的堆栈 和寄存器的变化 zFAW8q %TM(z attachment=42600 dfcG+RU qZ XjL 1ouTZc? 这里是CALL内部中 头部 和尾部的 变化, 我们发现并没有任何的不同,看来 堆栈平衡跟CALL内部无关 5almi KJfyh=AD( PBv43uIL mY( _- W attachment=42601 AFMY? 而没有处理过堆栈平衡的 则跳转到了 9EC8950 这里 m!.% WXL.D_=+ 我们来看看这个正确指向代码地址的值是从哪里来的 elN3B916r b4wJnmC8 attachment=42602 0NZx8qG Yq_zlxd%F 图中9EC8818 是我们代码中PUSH进去的值 .u?-xcbJ ujixcR 80f000a 则是 跳出这个CALL返回时候 所跳转的代码地址 当执行retn的时候 EIP指向这里 oKac_KL zSOf 7C80B729 则是 跳出去以后 执行retn 时候 所指向的 代码地址. i469A b8hfR# 如果 我们把 第一个堆栈 80f000a 换成 7c80b729 会如何? 9&tV#=s 2g$Wv :E3 attachment=42603 (Gc5l MiX3 ?|33Np) 呵呵 调用成功 也没有出错, 这是因为 在最后 执行retn的时候 我们帮他指向了 正确的 地址,当然了 也不是所有游戏都可以这样弄的,有些游戏压入的数值不是随意便可以CALL成功的. J L3A/ bQ)r8o! 好了 从上面的例子 可以看出 堆栈平衡其实就是 帮助 EIP 指向 正确的 地址, 如果你压入一个0 而不做堆栈平衡处理 那么 执行完后 EIP便会 执行 0 这个代码地址.说白了,堆栈平衡处理就是把压入的数值的空间去删去.因为ESP永远指向栈顶,RETN永远执行跳转到 栈顶的地址. CALL的概念篇:CALL出错分析作者:重楼 JnCY OQj 日期:2009-09-05 +S M $# 在刚开始找CALL的时候,绝大部分的时间都是在重新打开游戏和出错中度过,这个可能绝大部分朋友都有这个感受CALL为何会出错?今天我们就来分析下出错的原因 s)yEVh 9AJ*OU 目标:F8找CALL02 ;:xJFx| 目的:分析各种CALL的错误 Kv+E2d n,?#K S?hM 这里就是F8 CALL 02的 喊话功能CALL的地方 E8 Y,;fTD %Nf, attachment=42605 K* cJ cY+ N1$ioC# 这是运行到CALL时候 堆栈中的值. -RjnbTIy X:8=jHkz 这里很多朋友都不明白为何只要写一个CALL就可以实现喊话,我之前说过,我们只需要给CALL他想要的参数. * +A!12s z_JZx*/ 这里的堆栈分别压入了 基址 喊话内容 喊话模式 喊话对象 ( Y/ DMQ 这个就是参数而且也没做什么处理,所以我们只要给他 想要的参数 按照顺序就可以了. q;kM eE* PJk Mn这里正确的写法 我就不说了,我们主要来调试下错误的信息. wQ.ild .V/TVz!b attachment=42606 5r zB L ULr)&9这里其实需要处理堆栈平衡,我们先不写,来分析下堆栈不平衡为何会出错,好了 这里没有加上 堆栈平衡,图中是出错的信息.我们在CALL内部第一行下断 7;|6g8= #exE fy- attachment=42607 (x.K% QC) Atfon& 运行代码注入器调用CALL后就会断下来,. Hk6Dwey Lq uOC1 *这里为何会断在这里而不断在 CALL地址呢?因为,我们写一个CALL * 其实就是 从*这个地址开始运行的,却不是从游戏调用这个CALL的代码开始. 这里弄多了你就会明白,你写一个CALL其实在模拟 游戏调用CALL的那部分. L:u9$w Q3oVlq attachment=42608 AeUwih. 4 ?J4IvL/我们来按 F8 一直执行.一直到图中的位置才出错.出错信息跟刚刚是一样的 IS=%qhC sKHUf1 attachment=42609 6Ajiz_U |5!ko# *45d000 一般是 程序的代码段开始部分,而图中 参数的存放是 ebp-8 已经超过了代码段的范围了,所以我们这里就会出现无法读内存的错误. =/XIM. M8 解决方法:这里 我们把存放内容的地址 弄后面一点便可以了 WJJ!No P S!g&RDx attachment=42610 TE$H, p HCt%5 !|r 我们来看看 用模拟器自身的喊话,这里 是如何一个过程 CQ13fu +|6 6B|IbQ attachment=42614 n802!d+Tn 0qgvw 图中对比了 使用自身 喊话 和 代码注入器 的调用情况 .如果这个时候 我们把ECX改成8呢? e|xRK?aVBu %0=|WnF- eX $u attachment=42615 z l X0q *a7DuVw 好了,这里已经解决了第二个问题, 又出现第三个问题 . JtvAi52$ /Q*p?这个时候我们发现 错误信息中 有出错代码的地址.我们跳过去看看 ocGqX Dg3 ,Q2Nf attachment=42616 lP7=9rhx op/|&H这里又有一处 内存无法读出 , 这里的值是 指向 270这个地址 (前面部分处理按照上面的来) .O*n#K h2vs2 错误找到了 我们重新 再来一次 这次停到 错误代码地址前面 (第二个错误依旧按照上面的处理来) 68W&qzw.r 5fDVJE 9 ENr+% attachment=42617 zUqA1r )zf &T我们来看看 正常情况下的寄存器值 D/5 ah_; 4&YkNF attachment=42618 ! c4pFQB 1%vZE2这里 我们用模拟器 能成功的读取到地址. 07xW*K(Y attachment=42621 lqdil l nD#QC= 463cc4 就是 EBX的基址. tAPn? d5 dZMf5=tb 我们把代码注入器的代码 改一下 /c v8M= k9Pwfm|( attachment=42622 bn*SLWWQ.3 zvEofK attachment=42623 Xg4i H5!E 5 S(iL 好了 运行到原来出错的地方 发现现在已经能正常读取内存地址了,又解决一个错误(到第二步的地方仍然需要手动解决) mG$W#+j #;b+ T 我们继续运行,发现卡在了下面那个CALL那里 按运行 或点 程序都没反应, 这个时候我们只要在调用一次CALL就可以了. _-+xzdGvX 我们继续运行 到上面这里然后按F8 ,发现又一个错误. *r90ISA$2 C-4*qOaa2 attachment=42624 :w,#RcW T1*%6&V| 这里的代码段是从45d000 开始的 而 图中却是 4030a7 这里我们也没办法跳过去调试了. Y#N-X|kA p!Xn iY 好了 今天我们的调试错误信息就到这里了,虽然最终没有解决这个问题,但也获得不少收获CALL的概念篇:寄存器值的跟踪作者:重楼 Dc-K08c 日期:2009-09-04 OLb s VA =前言= E0 64Xob87_ =CE搜索=_ lFv这个方法在我找CALL入门篇一中就有说过而且,很多篇章中都用过这种方法,例子:模拟器 游戏找CALL练习实例ONE CJ5:ak pRobx IEy$2fNs #Zm*s 这里我们找的是EAX的值,EAX的值 是不同电脑他的值也是不同的。这个我在找CALL篇一中说过。 :4Vk uy3. 9!n:hhJM qB$-H j:;绿色的就是基址了, 如果搜出来没有绿色如何?可以用找血基址的方法找偏移,然后跟踪出他的基址。 %Y ZC dS m=6?% H =代码分析= 7-B|B %h ;oi/pe 从汇编代码中顺藤摸瓜摸出基址,这个也是比较常用的方法。例子:CALL入门篇一 IMD(k 2 武易打坐 |2m CL.r c:K/0zY例子: Bdh*SuE %:hQ2; 9 q?knMt 15waR6从上面我们要找EAX的值,才能得到CALL的地址,EAX是如何来的呢?这要往上寻找了 *=8tfa86 KLNj(uz! lg-zV3公式 4fa818+0 (读了2次基址) e#5WX gmq.Y#Ge 7202N?a 如果你寻找某个寄存器的值,苦苦追了3层还追不到,那么你就要注意了,其实这个值可能就在你原来CALL的附近。 b7xOmX,N d?Zaehe 详细的请看 CALL提升篇一:剑侠3的喊话CALL分析后部分 ZK1z| jMWTNZ =子程序参数的跟踪=+ o XI BHcRou +IU8v-从代码上可以很清楚的找到 EBX的值 是 EBP+8 中传入的,而EBP 确实从ESP传入,大家都知道ESP是堆栈指针的寄存器,是不断变化的,但如何取到这个值呢? |Pse=_i (yeN x_首先,我们要明白EBP+* 这种偏移的含义, 其实我前面也讲到过 这个就是 参数的值 RCGpZyl :rmi8!o 0?g&rj/ x 代码中 ebp+8 其实就等于 数据 值, 而ebp+c就是 包头的参数值(如果是ebp-*)这种类型 就是 临时变量 !:dhK 1b3 ? 从这里我们可以看出,EBX的值 并不是系统里的,而是我们自己应该写入的参数堆栈值,固也无法跟踪了(因为这个值是需要你自己写入的) )0&pEObm oMZ|)(7C 这里有朋友可能要问了 如果我要写这个CALL 而不写上面那一层的CALL这里改如何写呢? 其实直接赋值就可以了, 比如说 PUSH ebx 这里如果需要传入40这个值 那么直接 PUSH 40便可, (我在前面几篇中强调过,CALL只要传入适当的参数,便可以调用)这里适当的参数就是这层CALL所需要的参数数据,而不是傻傻的跟上去找原值。 IuF0$w=dj C%* k 这里 具体的可以看看 提升篇一 文章中后期 对寄存器值的跟踪过程 CALL概念篇:CALL返回值的应用作者:重楼 L#_ 日期:2009-09-07 P#XID 2; *CALL返回值首先考虑的是 EAX:EDX,在这里我就不班门弄斧了.详情请问百度,或者参考一些相关的书籍如 看雪出版的 加密与解密第三版等等. XLRsg z2QP)150 *其实CALL返回值的应用在,CALL提升篇中找剑侠3喊话CALL的时候就应用到过. .3Z1v, |,!IZ- th 目标:剑侠3血值基址的寻找 !WpBfdv.I 目的:找到血值基址的产生,来达到理解CALL返回值的应用. .JYj(p viMzR(JU.P MZX%*v XSfst5-H打怪去掉一点血,我们来搜索减少的血值 _cJ2M +tE-F D?8rO ;Mpy#yIU. 好了 这里第一个就是我们要找的值,不过现在是动态的我们要找他的基址 f aVV! .%Ta!0 J1r5 V4 r.4查找写入的值,然后打怪去掉一点血.监视窗口便会出现 一条写入信息 EAX+184 便是血的地址我们要找EAX的值 0;:.B j NN EL;u )?f DmSmpjE6& 我们来搜下 EAX的值,发现搜出3W多个来,没办法只好用OD来找,先把CE在加载游戏一次,因为刚刚监视血值的时候注入了CE的DLL所以,不在加载一次卸载的话 OD是无法注入的 UFuU-C 8&3V#sn ?kZT I (重新加载一次 eJ+JM9q&PEc h|hu 图中EDX=135 是血的16进制.而EAX则是我们要找的地址 GFTh F8uNL)gKj)如何找EAX的值呢?我们先来看看他啥时候开始变化的,我们断了几次发现EAX的值并没有发生改变 )LwW VH(S=G5Yb mS o1?a 我们现在头部下段,去打怪让血发生变化,然后断下来了 TP7 u| 3T e Yq|这里有个对比EAX,如果不为0则跳转. r)1ePI c= x,ijY N,f4*PQ好了,我们开始来找EAX的值,我们先记下EAX的值(这里跟你的不同) EAX=FBB0C8 0eHS + qBQ4s Pf$pt 在头部下段后,去打个怪 去血 然后断在头部了, 这个时候我们发现EAX的值并不=FBB0C8 UDe |Sb +dP LR v$)q($p我们按F8 一直运行一直这里 运行这个CALL后 EAX发生了改变.变成了FBB0C8 e *0ghKI qTB$f|$ 然后加上偏移 184 便是我们要找的血偏移 ycJg%F*5 gURdq首先来看所有的调用规范都遵循的规定:返回值存储在EAX:EDX中,如果EAX放不下会放到EDX里 ;D.h 65rr %y|o_wO W:( _mK!_ 这里堆栈只有一个所以我们只需要写一个就可以了 l+y4 k=/ push ecx nhocGH* call 4265b0 =C f(Bu -Y:ROoFOZ 二,堆栈中寄存器值的处理 y_SK6 0+b 0 这里ECX的值往上找是 eax 赋给他的.而EAX的值则是读取了51f1b8 这个基址 QfQa%cc mov eax,51f1b8 zAcs mov ecx,eax D22Lu ;E push ecx 5Eyr$ call 4265b0 Z,WW Y,$ nd+?O7( 三,寄存器的处理 X&o% y .yVnwgu 图中 灰色的寄存器是 寄存器环境的保护.对应下面的POP. BDpF *KrVu 6s 其实这里也是调用约定的范畴.(注1) ,deUsc *?8RXer红色的是需要传入的值,而ESI则是 由ECX传入.所以我们只需要给ECX传值就可以了 lOaor c *Y OS(R这里只有一条 lea ecx, dword ptr eax+4DB0 EAX 的值 已经赋值了 IT1P Pm mov eax,51f1b8 6wpU6NU mov ecx,eax Za!w#j%h push ecx ZT9IMihV lea ecx,eax+4db0 xJCnZj call 4265b0 9,QR) hb! ln7 四,内存指针地址的处理 p1 4d ,4W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论