游戏找CALL练习实例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以外不会有很明确的数值当做依据这个时候就要靠你的经验去猜了.我们在点下吃蓝发现只断下第一个.好了,第一个先不要管了.为啥?猜的...好了我们来看看第二个CALLmovedx,00453028call00452E98retn*要写一个CALL,我们就要模拟出他所需要的寄存器,还有堆栈的环境P:如果看一个CALL所需要的寄存器?我们进入call00452E98的内部选中call00452E98那行按回车就会跳到下面00452E98/$55pushebp00452E99|.8BECmovebp,esp00452E9B|.83C4F8addesp,-800452E9E|.53pushebx00452E9F|.8955FCmovdwordptr[ebp-4],edx00452EA2|.8BD8movebx,eax00452EA4|.8B45FCmoveax,dwordptr[ebp-4]00452EA7|.E81414FBFFcall004042C000452EAC|.33C0xoreax,eax00452EAE|.55pushebp00452EAF|.687E2F4500push00452F7E00452EB4|.64:FF30pushdwordptrfs:[eax]00452EB7|.64:8920movdwordptrfs:[eax],esp00452EBA|.8B45FCmoveax,dwordptr[ebp-4]00452EBD|.BA942F4500movedx,00452F9400452EC2|.E85513FBFFcall0040421C00452E98/$55pushebp00452E99|.8BECmovebp,esp00452E9B|.83C4F8addesp,-800452E9E|.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,00453028moveax,00991FA8call00452E98我们来测试下CALL成功了但是,我们拿到另外一台电脑发现居然不能用了?调试了下发现EAX的值跟刚刚的不一样~P:如何取到EAX的固定值呢?答案很简单用CE搜看到那个绿色的值了么那个就是EAX的基址,无论EAX的值怎么变都可以在这个地址读取到真正的值代码如下movedx,00453028moveax,456d68moveax,[eax]call00452E98好了现在可以再任意一台电脑上运行了=======================================================好了先不管这个CALL我们现在来找下EAX的值。在call00452E98下断按下加血OD断下来了然后我们按CTRL+F9返回好了到了这里movedx,ebxmoveax,[ebx+124]call[ebx+120]这个时候我们发现EAX的值EAX=[ebx+124]我们发现CALL地址并不是是直接的地址。在这个CALL下断点下加血按钮我们发现[EBX+124]=[0099493C]=00991FA8EAX=991FA8刚刚我们找过EAX的基址了[ebx+120]=[00994938]=00453014这里的CALL地址写成代码是moveax,456d68moveax,[eax]call453014CALL成功了`P:为什么2个不同地址的CALL都会成功呢?经过不断测试(如何测试?点击不同的按钮看看CALL的地址)发现不同按钮断下来的地址都是不同的。补魔的地址冰系的地址==========我们来测试下第三个CALLmovedx,[ebx+214]mov[eax+24c],edxmoveax,ebxcall4324d8调试过程中[EBX+214]=0那么edx的值=0[EAX+24C]=EDX=0EAX=00991FA8EAX=EBX=994818CALL4324d8寄存器的值都搞清楚了然后我们看看CALL还调用了哪个寄存器跟进CALL(按F7进入CALL)004324D8/$53pushebx004324D9|.8BD8movebx,eax004324DB|.66:83BB22010cmpwordptr[ebx+122],0004324E3|.742Djeshort00432512004324E5|.8BC3moveax,ebx004324E7|.8B10movedx,dwordptr[eax]004324E9|.FF523Ccalldwordptr[edx+3C]004324EC|.85C0testeax,eax004324EE|.7422jeshort00432512004324F0|.8BC3moveax,ebx004324F2|.8B10movedx,dwordptr[eax]004324E5|.8BC3moveax,ebx这里有一行调用了EBX我们往上找找发现有给EBX赋值的代码那么我们就不必理会了004324E7|.8B10movedx,dwordptr[eax]这里调用了EAX在上一层有给EAX赋值的代码下面就没了好了用代码注入器写CALLmovedx,[ebx+214],[EBX+214]=0那么第一句就是movedx,0mov[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],edxmoveax,ebx第三句EBX=994818因为CALL没有调用EBX所以我们不必给ebx赋值moveax,994818call4324d8放到一起那么就是movedx,0moveax,456d68moveax,[eax]addeax,24cmov[eax],edxmoveax,994818call4324d8好了CALL成功了~经过调试发现不同的按钮他的EBX里的值也不一样好了我们发现这也可以调用提问:P:为什么3个不同地址的CALL都会成功呢?总结*retn表示一段程序的结束*send是微软提供的一个API函数,可以用来发送数据包.绝大部分游戏都是用这个函数来发包的,其他还有WSASendsendtoWSASendto==send对应的收包函数是recvWSASend对应的收包函数是WSARecv*要写一个CALL,我们就要模拟出他所需要的寄存器,还有堆栈的环境