10 授人以鱼不如授之以渔● CALL 入门篇二:CALL 的寻找与分析* 所谓的 call, 其实本质上来说就是一条汇编指令. * 只要找到了关键代码的地址,传入适当参数,就可以借用游戏中已有功能来完成内挂的功能。目标:武易的喊话 CALL 目的:以喊话 CALL 更深入了解所谓的 CALL 参数. 问: 写一个 CALL, 如何传入适当的参数? 什么是适当的参数? 是不是一定要按照反汇编代码来写? 好了, 废话就不说了,用 OD 载入游戏, 武易并下 bp send 断点. 在游戏中喊一句话,OD 便断了下来. 好了, 这里我们已经非常熟悉了,是 send 函数的内部, 我们再来看看堆栈中的情况其中 11111111 是我喊出去的话的内容, 喊话 CALL 一般比较好找,因为有比较明确的数据好了, 我们按 CTRL+F9 返回这里是第一层, 这里是游戏调用 send 函数的发包的位置, 这里也不说了我已经在前面几篇详细的介绍用法. 我们继续返回好了, 我们又来到这一层, 这里在上篇找打坐中也出现过, 非常眼熟吧. 这里一层应该是封包组合之类的 CALL 我们暂时跳过它. 这一层中, 我们也在上一篇遇到过, 上次断下来后是压入的加密后封包的内容. 还有一个应该是时间戳一类的东西.( 这里也是猜的, 因为不经过深入分析, 是无法确认最终的作用.) * 时间戳是根据时间的变化而变化的一个数值, 经常被用来加在封包内, 来检测封包达到前后, 或者用来验证封包的真伪. 好了继续返回. 到了这一层, 这里 OD 显示了压入的封包地址中有我们喊话的内容(因为写教程的原因不能暂停太长时间所以又喊了一遍, 内容可能跟上面不同) 0047218F 68 F0A77001 push 0170A7F0 ; ASCII "11**********" 这里有一个地址里面的内容是我们的喊话内容, 我们来测试下这个 CALL 是不是我们要找的喊话 CALL ===========================CALL 分 析===================== 0047218F 68 F0A77001 push 0170A7F0 这里压入了我们喊话的内容指针地址, 这里到我们手里该怎么写呢? 是否一定要按照这个地址来写入我们的喊话内容呢? 其实不然, 我说过, 一个 CALL 只要压入适当的参数, 他这里需要的是一个喊话内容的指针地址, 而并非一定要系统指定的, 所以我们可以自己找一个空白的,或在语言定义一个变量然后取他的指针地址来压入堆栈都可以. 这里我说一个用 CE+ 代码注入器写喊话 CALL 的方法. 用 ce 写入我们的喊话内容. 并用代码注入器调试. 随便取一个地址, 将类型改变为文本型然后内容变成我们要喊话的内容这里参数只有一个我们已经弄好了, push 4ED056 (4ed056 是我选的喊话内容地址, 这里保存着我的喊话你让) 00472194 E8 D7B9FBFF call 0042DB70 这里是 CALL 的地址. call 0042DB70 写完参数和 CALL 地址后我们还要干嘛? 当然是看 CALL 内部是否需要调用寄存器. 我们来看看 CAL L 内部调用了什么寄存器, 我在前几篇中用过很多次这种方法来找 CAL L 所需要的寄存器. 其实所谓的适当的参数就是如此, 你想要什么我就给你什么~~ 当内部 CALL 出现这种,mov ebx,eax 或者 push eax 这个时候我们往上面看看有没有给 EAX 赋值的指令, 如果没有的话, 那么我们需要给 EA X EAX 本身并不带数据, 除了几个特殊的寄存器外, 寄存器本身就是用来给我们存放数据的, 他本身并没有数据. 0042DB7D 50 push eax 我们在第四行找到这样一句, 但是上面有一行给 EAX 赋值的指令所以 EAX 一句不需要我们来赋值了. 0042DB83 64:8925 0000000 mov dword ptr fs:[0], esp ES P 是堆栈指针, 永远指向栈顶, 属于特殊寄存器, 所以也不需要赋值. 0042DB8E 53 push ebx 这里有一句, 上面并没有赋值, 我们来看看他的值是多少, 喊一句话进入 CALL 之后发现 EB X 一直=0 . 在这里我们先写入 EB X 的值=0 ( 经过后来我们测试发现不用给 EBX 赋值也不会出错, 这个可能是因为这里的 PUSH EBX 只是保存寄存器环境用来恢复, 或者说寄存器本身的值为 0 不需要写入他也等于 0. 我认为前者可能大一些) 好了其他就没了. 我们来整理下 push 04ED056 call 0042DB70 add esp,4
10授人以鱼不如授之以渔●CALL入门篇二CALL的寻找与分析 来自淘豆网m.daumloan.com转载请标明出处.