找call图文教程2.docx
- 文档编号:23360761
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:19
- 大小:455.15KB
找call图文教程2.docx
《找call图文教程2.docx》由会员分享,可在线阅读,更多相关《找call图文教程2.docx(19页珍藏版)》请在冰豆网上搜索。
找call图文教程2
例ONE
目标:
游戏找CALL练习实例ONE
记:
看这篇找CALL文章,并不是说要学会它的操作步骤,而是学会找步骤的原理,只有懂得原理,才算真正会了.不要因为模拟器的简单而忽略这篇文章,也不要因为曾经写过这个模拟器的挂而忽略这篇文章.希望这篇文章能给你带来帮助.
这是一位大牛做的模拟器器,今天就来找这个模拟器的CALL
用OD加载模拟器
然后按F9运行
下bpsend断点
P:
为什么要下send断点?
*send是微软提供的一个API函数,可以用来发送数据包.绝大部分游戏都是用这个函数来发包的,其他还有WSASendsendtoWSASendto==send对应的收包函数是recvWSASend对应的收包函数是WSARecv
下段后这里按ALT+B会显示已经下段的地址
*当你暂时不想断下来而又不想删掉就可以按空格来禁止.
断下来后,我们点下模拟器的加血按钮OD立马就断了下来
*标题显示模块-ws2_32表明我们还在系统领空
*游戏发送数据包是调用send函数发送的,掉用以后程序告诉系统我要发包了,然后系统就开发发送封包,这个时候断下来后我们就在系统发送完封包后.
按CTRL+F9返回
P:
为什么要用CTRL+F9返回?
而不是前进?
*程序是一层套着一层的,就像一个箱子里面包含一个箱子,而里面的箱子里又有一个箱子.而我们断的send就是在最里面的箱子,所以我们需要返回到我们所需要的代码层.
我们来看下堆栈窗口
这里第一行是CALL
第二行到第五行是CALL的参数
写成函数就是send(soket,data,datasize,flags)
这个就是系统send所需要的参数
DATA这里存放着send发送的封包内容
DATASIZE表示封包的大小
从MSDN查看一下函数的参数我们会发现他的参数跟我们刚刚反汇编的一样.
*按照__cdecl调用约定参数是从右边开始压入堆栈
继续返回
这里我们已经到了程序领空了(标题显示模拟器,而没有显示ws2_32)
在这里OD已经给我们标明了.这是调用send的汇编代码
因为这个模拟器并没有写接收返回封包的代码所以我们调用这个send函数程序也是没有反应的
继续返回
这里有一个CALL如果我们第一次找,我们并不能确认这个是否是我们要找的
P:
如何确认这个是否是我们需要的CALL呢?
我们先断下来再说
继续返回
这里上面有一个retn
*retn表示一段程序的结束.
这里从JMP00403814开始到下面的retn代表这个是连续的一段代码
继续返回
这里我们又发现一个CALL
先断下来再说
在返回一层
这里也有一个CALL也断下来
好了我们现在已经返回了6层找到了3个CALL
到底哪个是我们需要找的呢我们先来测试下我们找的
把send断点删了暂时没用了
按下加血我们发现所有断点都会断,这个时候我们发现第二个CALL附近有"血"这种文本
当然一般的除了喊话CALL以外不会有很明确的数值当做依据这个时候就要靠你的经验去猜了.
我们在点下吃蓝发现只断下第一个.好了,第一个先不要管了.为啥?
猜的...
好了我们来看看第二个CALL
movedx,00453028
call00452E98
retn
*要写一个CALL,我们就要模拟出他所需要的寄存器,还有堆栈的环境
P:
如果看一个CALL所需要的寄存器?
我们进入call00452E98的内部
选中call00452E98那行按回车就会跳到下面
00452E98/$55pushebp
00452E99|.8BECmovebp,esp
00452E9B|.83C4F8addesp,-8
00452E9E|.53pushebx
00452E9F|.8955FCmovdwordptr[ebp-4],edx
00452EA2|.8BD8movebx,eax
00452EA4|.8B45FCmoveax,dwordptr[ebp-4]
00452EA7|.E81414FBFFcall004042C0
00452EAC|.33C0xoreax,eax
00452EAE|.55pushebp
00452EAF|.687E2F4500push00452F7E
00452EB4|.64:
FF30pushdwordptrfs:
[eax]
00452EB7|.64:
8920movdwordptrfs:
[eax],esp
00452EBA|.8B45FCmoveax,dwordptr[ebp-4]
00452EBD|.BA942F4500movedx,00452F94
00452EC2|.E85513FBFFcall0040421C
00452E98/$55pushebp
00452E99|.8BECmovebp,esp
00452E9B|.83C4F8addesp,-8
00452E9E|.53pushebx
这里是保存堆栈环境我们先不管他
00452E9F|.8955FCmovdwordptr[ebp-4],edx
将EDX保存到[EBP-4]
我们来找下EDX的值
这段汇编代码前面没有给EDX赋值我们返回上一层按小键盘-
上一层
movedx,00453028
这句代码的意思是将453028赋值给EDX
也就是说EDX=00453028
找到EDX的值后继续往下面找
00452EA2|.8BD8movebx,eax
这里需要EAX的值,但是我们找了这一层和上一层并没有发现有给EAX赋值的代码
我们这里先直接给EAX赋值
其他没有了
好了我们现在可以确认了这个CALL调用了EDX和EAX的寄存器的值
这个CALL的写法就是
movedx,00453028
moveax,00991FA8
call00452E98
我们来测试下
CALL成功了
但是,我们拿到另外一台电脑发现居然不能用了?
调试了下发现EAX的值跟刚刚的不一样~
P:
如何取到EAX的固定值呢?
答案很简单用CE搜
看到那个绿色的值了么那个就是EAX的基址,无论EAX的值怎么变都可以在这个地址读取到真正的值
代码如下
movedx,00453028
moveax,456d68
moveax,[eax]
call00452E98
好了现在可以再任意一台电脑上运行了
=======================================================
好了先不管这个CALL
我们现在来找下EAX的值。
在call00452E98下断按下加血OD断下来了
然后我们按CTRL+F9返回
好了到了这里
movedx,ebx
moveax,[ebx+124]
call[ebx+120]
这个时候我们发现EAX的值
EAX=[ebx+124]
我们发现CALL地址并不是是直接的地址。
在这个CALL下断点下加血按钮
我们发现[EBX+124]=[0099493C]=00991FA8
EAX=991FA8
刚刚我们找过EAX的基址了
[ebx+120]=[00994938]=00453014
这里的CALL地址写成代码是
moveax,456d68
moveax,[eax]
call453014
CALL成功了`
P:
为什么2个不同地址的CALL都会成功呢?
经过不断测试(如何测试?
点击不同的按钮看看CALL的地址)
发现不同按钮断下来的地址都是不同的。
补魔的地址
冰系的地址
==========
我们来测试下第三个CALL
movedx,[ebx+214]
mov[eax+24c],edx
moveax,ebx
call4324d8
调试过程中
[EBX+214]=0那么edx的值=0
[EAX+24C]=EDX=0
EAX=00991FA8
EAX=EBX=994818
CALL4324d8
寄存器的值都搞清楚了然后我们看看CALL还调用了哪个寄存器
跟进CALL(按F7进入CALL)
004324D8/$53pushebx
004324D9|.8BD8movebx,eax
004324DB|.66:
83BB22010>cmpwordptr[ebx+122],0
004324E3|.742Djeshort00432512
004324E5|.8BC3moveax,ebx
004324E7|.8B10movedx,dwordptr[eax]
004324E9|.FF523Ccalldwordptr[edx+3C]
004324EC|.85C0testeax,eax
004324EE|.7422jeshort00432512
004324F0|.8BC3moveax,ebx
004324F2|.8B10movedx,dwordptr[eax]
004324E5|.8BC3moveax,ebx
这里有一行调用了EBX我们往上找找发现有给EBX赋值的代码那么我们就不必理会了
004324E7|.8B10movedx,dwordptr[eax]
这里调用了EAX在上一层有给EAX赋值的代码
下面就没了
好了用代码注入器写CALL
movedx,[ebx+214],[EBX+214]=0
那么第一句就是movedx,0
mov[eax+24c],edx,edx的值=0EAX=00991FA8
那么第二句就是MOV[EAX+24C],0但是注入器不通过这个时候我们换一种写法
首先给EAX赋值moveax,991FA8这里我们刚刚找过这个基址456d68是EAX的基址
首先放入基址的值moveax,456d68
然后在读取基址moveax,[eax]
然后加上偏移24Cadd[eax],24c
地址写好后我们把EDX放到地址里去mov[eax],edx
moveax,ebx第三句EBX=994818
因为CALL没有调用EBX所以我们不必给ebx赋值
moveax,994818
call4324d8
放到一起那么就是
movedx,0
moveax,456d68
moveax,[eax]
addeax,24c
mov[eax],edx
moveax,994818
call4324d8
好了CALL成功了~
经过调试发现不同的按钮他的EBX里的值也不一样
好了我们发现这也可以调用
提问:
P:
为什么3个不同地址的CALL都会成功呢?
总结
*retn表示一段程序的结束
*send是微软提供的一个API函数,可以用来发送数据包.绝大部分游戏都是用这个函数来发包的,其他还有WSASendsendtoWSASendto==send对应的收包函数是recvWSASend对应的收包函数是WSARecv
*要写一个CALL,我们就要模拟出他所需要的寄存器,还有堆栈的环境
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- call 图文 教程