注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

教大家如何找CALL及写CALL  

2009-03-06 20:56:19|  分类: 外挂学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

说一下跟踪CALL是怎么跟的..

首先在开工之前..我们必须知道..游戏客户端和服务器必须要建立一条链接.而且这条链接是每过多少时间就会互相联系一下..以确保是处于连接状态..否则的话..就会出现与服务器连接断开的东西.

另外呢..游戏是基于系统的平台上运行的.所以在我们发技能的时候.游戏肯定先会和系统声明说我要做XX事.这个按我的理解就是通信的一个协议.

说完废话.咱开始进入正题.我以完美国际这个游戏为例了.

首先.用OD载入已经运行的游戏.(文件->附加->选完美国际游戏进程->点打开),载入完成之后.先按一下F9让游戏在OD里面运行起来..进入调试模式.以防因为中断的时间太久.而导致与服务器连接断开.

比如说我们要找打坐的CALL.

就先在OD的命令(Command)里面打入bp send ,然后马上切换到游戏打坐,这时..OD会把游戏中断下来..

断在71A24C27 >  8BFF            mov    edi, edi                      /断的地方

这里..

因为我们客户机要向服务器说明我们要做什么..中间有一个发送包的过程.所以OD就会断下来.

接下来呢.我们看OD的标题(cpu-主线程,模块-WS2-32)

说明我们现在是在系统的领空,就是我们要打坐.游戏和系统先打个招呼,说我要做XX,我们按ctrl+F9执行到返回.

接下来..我们来到这里

00596131  /EB 07          jmp    short 0059613A                      /断的地方

看一下全部的.

00596124    6A 01          push    1

00596126    68 58139300    push    00931358

0059612B    51              push    ecx

0059612C    E8 65151F00    call    <jmp.&WS2_32.#19>

00596131    EB 07          jmp    short 0059613A

00596133    C605 719E9300 0>mov    byte ptr [939E71], 1

0059613A    8B5424 24      mov    edx, dword ptr [esp+24]

0059613E    896C24 20      mov    dword ptr [esp+20], ebp

可以看到我们这句的前面一句是call    <jmp.&WS2_32.#19>.说明还是在和系统会话.

(跟踪CALL多了.会发现..前面的四次ctrl+F9所跳过的内容是一样的.都是在和系统会话.这也就是前辈们

所说的.call基本上都在第4层-第7层之中.也就是这个道理.这也是我找CALL的总结.)

再按下ctrl+f9

来到这里

0058E01D    E8 8E7F0000    call    00595FB0

0058E022    5E              pop    esi                        /断的地方

0058E023    C2 0800        retn    8

我们继续按ctrl+f9跳过

00590126    895424 24      mov    dword ptr [esp+24], edx

0059012A    E8 C1DEFFFF    call    0058DFF0

0059012F    8B4C24 18      mov    ecx, dword ptr [esp+18]                      /断的地方

00590133    8AD8            mov    bl, al

00590135    51              push    ecx

00590136    C74424 18 1CAC8>mov    dword ptr [esp+18], 0086AC1C

0059013E    FF15 44948600  call    dword ptr [<&MSVCRT.free>]      ; MSVCRT.free

继续ctrl+f9

来到

005AE5A1    66:C706 2E00    mov    word ptr [esi], 2E

005AE5A6    A1 F4159300    mov    eax, dword ptr [9315F4]

005AE5AB    6A 02          push    2

005AE5AD    56              push    esi

005AE5AE    8B48 20        mov    ecx, dword ptr [eax+20]

005AE5B1    E8 CA1AFEFF    call    00590080

005AE5B6    56              push    esi                      /断的地方

005AE5B7    E8 B42A1500    call    00701070

005AE5BC    83C4 04        add    esp, 4

005AE5BF    5E              pop    esi

005AE5C0    C3              retn

我们可以在这里发现

005AE5A6    A1 F4159300    mov    eax, dword ptr [9315F4]

就是我们的发包地址

现在.我们按一下ALT+K看一下这个地址所调用到的堆栈

调用堆栈:    主线程

地址      堆栈      函数过程 / 参数                      调用来自                      结构

0012EB2C  00449BAB  elementc.005AE590                    elementc.00449BA6

0012EB30  004933BB  elementc.00449B90                    elementc.004933B6

0012EB40  004BC7A7  包含elementc.004933BB                  elementc.004BC7A4

0012ECB8  006E149A  包含elementc.004BC7A7                  elementc.006E1497

0012ECE0  006E141A  elementc.006E1440                    elementc.006E1415

0012ED04  006D523D  elementc.006E13F0                    elementc.006D5238

0012ED18  006DDB37  包含elementc.006D523D                  elementc.006DDB34

0012ED74  006D5603  elementc.006DD8D0                    elementc.006D55FE

0012EDE8  005535DF  elementc.006D5240                    elementc.005535DA

0012EE34  00430C07  elementc.0056ACA0                    elementc.00430C02

0012EE50  0042BB81  elementc.00430BE0                    elementc.0042BB7C

0012EF34  0043BD33  elementc.0042B6F0                    elementc.0043BD2E

0012EF58  77D18734  包含elementc.0043BD33                  USER32.77D18731

0012EF84  77D18816  ? USER32.77D1870C                    USER32.77D18811

0012EFEC  77D189CD  ? USER32.77D1875F                    USER32.77D189C8              0012EFE8

0012F04C  77D18A10  ? USER32.77D188F1                    USER32.77D18A0B              0012F048

0012F05C  0043B408  ? USER32.DispatchMessageW            elementc.0043B402            0012F058

0012F060  0012F070    pMsg = ???

0012FF28  0082B86B  ? elementc.0043AC10                  elementc.0082B866            0012FF24

现在可以判断5AE590也许就是我们的打坐CALL.我们双击5AE590所对应的调用来自elementc.00449BA6看看情况

可以看到汇编代码:

00449B9E    8A4424 04      mov    al, byte ptr [esp+4]

00449BA2    84C0            test    al, al

00449BA4    74 0A          je      short 00449BB0

00449BA6    E8 E5491600    call    005AE590

00449BAB    B0 01          mov    al, 1

00449BAD    C2 0400        retn    4

我们在此处按下F2下个断点看看..下完断点..让游戏运行正常..(中间也许隔的时间太长了.游戏会挂掉..那就重新载入一下游戏.按以上步骤重新来过.)让游戏运行正常之后我们再按下打坐..OD把游戏断下来了.就断在00449BA6处.可以得出结论.005AE590就是我们要找的打坐CALL.

而在这个CALL下面的

00449BB0    E8 1B4A1600    call    005AE5D0

00449BB5    B0 01          mov    al, 1

00449BB7    C2 0400        retn    4

就是恢复正常状态的CALL.

验证是不是真的是对应的CALL.我们可以下个断点来看看.然后进游戏进行对应的操作.

接下来就是写call了.

从上面的代码可以看出.在call上面是一个je跳转.没有带上参数.所以呢.我们可以直接调用这个CALL

换成原形就是

Dim asm As New ClsAsm

Const dazuo = &H5AE590

With asm

    .Pushad

    .Mov_EAX dazuo

    .Call_EAX

    .Popad

    .ret

End With

asm.inject pid

asm.Run_ASM pid, 0

asm.free pid, 0

End Sub

-------------------------------------------------------------------------------------

文章就弄到这里吧..新手看看..我自己当初就在载入游戏那弄了几天没明白.因为载入游戏的时候游戏就会中断在那里..而这个简单的问题又不敢去问别人..最后终于弄明白了.原来还要运行一下..让游戏在调试模式下运行起来.

上一节我讲解了吃血的CALL,吃蓝,回城,其实跟吃血一样,我个人觉得没必要去写了。如果仔细看过我的文章的话,我坚信一定可以做出来的。

好的,废话不多说,我们继续找“冰系”“火系”CALL以及如何去表达它。

打开OD和找CALL练习并且附加,下断,一系列工作不再赘述。

单击“冰系”-----断了。根据上次我们所说的,CALL在第四层中。我们直接进入第四层

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

好的,我们看到了RETN之前的4条语句,

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

这里就是我们要找的CALL了。好的,在此CALL上下断!(F2)并去掉原来的断(ALT+B)

OK,F9运行程序并再次点击“冰系”使其断下。

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

很好,很好,在我们要找的CALL处断下了。

OK,首先看汇编语句

我们首先要判断,那条语句对CALL产生了作用,那么如何判断呢?

我目前有三个途径可以判断,一是根据断点判断,二是根据寄存器判断,三是跟踪判断。

好的,这里我们先说下断点判断。

在上面四条语句中全部下断。并让程序恢复运行状态。

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

好的,再次点击“冰系”我们发现了一个问题。就是前面两条命令并没有参与CALL的调用动作,因为直接跳过了,并没有在语句中断下。于此判断,这两个语句跟这里的CALL无关。

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

OK,既然确定了CALL的因素,我们就来分析,应该如何去调用它。

下面三个图大家看一下,我给大家一个对比

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

教大家如何找CALL及写CALL - 白云飘飘 - 白云飘飘的博客

好,通过上面的图,大家可以发现

当命令

mov edx,1执行的时候,调用了寄存器中EAX ECX EDX中的值

CALL 00452DF8  执行的之后只调用了EDX。也就是说,这里的EDX是影响CALL的因素。

RETN EAX ECX EDX 这里返回的时候也是返回了三个值,正好跟EDX的因素有关系。

现在这样就确定了,EAX,ECX,EDX就是CALL的因素。

那么该如何调用应该不用我去说了吧。不清楚的去看我的第一篇文章,

有变化的仅仅是这里其中一条命令应该为 mov edx,1

  评论这张
 
阅读(9013)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018