网站公告列表     加入外挂作坊终生会员200元,获取最新外挂作坊模块与加入会员群  [admin  2007年8月3日]        
您现在的位置: 外挂作坊 >> 第九章 动态内存 >> 文章正文
  [组图]10-内存事件回调         ★★★ 【字体:

 

  10-内存事件回调
 

       前节最后留下了个难题,如何让演示程序写新值到内存时,同时通知我们呢? 若能得到这个通知,我们就能掌握最佳时机去获取这个值.

本节演示例子包下载

本节所用的例子,仍然是上节的演示程序!


现在我们要在前节分析并且修改好的固定内存代码上,再做改进,让它能有回调我们的子程序的功能实现自动通知,

因为需要增加CALL的代码,上面的NOP空的内存不够用,需要重排一下代码,以能够节省出来更多的空间!

把这里的 push 80000301 与 push 00 两条代码下移了,上面多空出来了8个字节内存可以用来写一些代码.NOP正有八个了.

现在我希望,在演示程序写内存到我们的地址后,再调用通知我们的一个子程序.可以修改成如下图的代码样式

这里的增加了 mov edx,00000000 与 call edx 两条指令.

mov edx,00000000      把我们的一个子程序指针保存到EDX寄存器中

call edx              调用执行我们的子程序,此时我们的子程序就可以去那个整数型变量中读取数据了!


004034df - 8b 5d fc -       mov ebx,[ebp-04]
004034e2 - 89 03 -          mov [ebx],eax
004034e4 - b9 00 00 b2 00 - mov ecx,00b20000
004034e9 - 89 01 -          mov [ecx],eax
004034eb - ba 00 00 00 00 - mov edx,00000000
004034f0 - ff d2 -          call edx
004034f2 - 90 -             nop
004034f3 - 68 01 03 00 80 - push 80000301
004034f8 - 6a 00 -          push 00
004034fa - ff 33 -          push [ebx]
004034fc - 68 01 00 00 00 - push 00000001
00403501 - bb 68 01 00 00 - mov ebx,00000168

通过这个方式后,我们可以省去了时钟的麻烦.这个的效率远远的高于时钟~,,

机器码是 8b 5d fc 89 03 b9 00 00 b2 00 89 01 ba 00 00 00 00 ff d2 90 68 01 03 00 80 6a 00 ff 33 68 01 00 00 00 bb 68 01 00 00

我们只需要把这段机器码转换为十进制的易语言字节集格式,然后把第七,八,九,十这4字节换成你的一个整数型变量的内存地址,然后把第十四,十五,十六,十七这4字节换成你的某个无参数无返回值的子程序指针.

然后就可以把这段机器码字节集写入演示程序的 004034df 内存地址处了.

详细的代码见本节例子包里的 mydll.dll 回调方案一这里


再来介绍一下,第二种的回调方案,上面的那种方式,咱们的子程序是无参数,无返回值的,虽然得到了通知,但是还得去读取内存数据.显示还是有些麻烦.再改进之~

去掉了那段写固定内存的代码.

push eax             把要写内存的值入栈

mov edx,00000000   把我们的有一个整数型参数,无返回值的易语言子程序指针存入EDX

call edx             让演示程序自动调用咱们的子程序,然后我们的子程序里的参数一里的值就是这个数据了.

很显然,这个方式确实是最棒的了,哈哈~~


004034df - 8b 5d fc - mov ebx,[ebp-04]
004034e2 - 89 03 - mov [ebx],eax
004034e4 - 50 - push eax
004034e5 - ba 00 00 00 00 - mov edx,00000000
004034ea - ff d2 - call edx
004034ec - 90 - nop
004034ed - 90 - nop
004034ee - 90 - nop
004034ef - 90 - nop
004034f0 - 90 - nop
004034f1 - 90 - nop
004034f2 - 90 - nop
004034f3 - 68 01 03 00 80 - push 80000301
004034f8 - 6a 00 - push 00
004034fa - ff 33 - push [ebx]
004034fc - 68 01 00 00 00 - push 00000001
00403501 - bb 68 01 00 00 - mov ebx,00000168

机器码是 8b 5d fc 89 03 50 ba 00 00 00 00 ff d2 90 90 90 90 90 90 90 68 01 03 00 80 6a 00 ff 33 68 01 00 00 00 bb 68 01 00 00

我们只需要把这段机器码转换为十进制的易语言字节集格式,然后把第八,九,十,十一这4字节换成你的有一个整数型参数无返回值的子程序指针.

然后就可以把这段机器码字节集写入演示程序的 004034df 内存地址处了.

详细的代码见本节例子包里的 mydll.dll 回调方案二这里


下载截图了实现上述两个方案的核心代码

上面是重组机器码与把这些机器码写到演示程序的004034DF内存里

这里是回调子程序,这个DLL已经使用自动回调来获取数据了,不再与上节的那个例子那样用时钟去读.

演示程序运行后的最终效果图.


本章教材内容已完.有关其它更多的资料可以加入外挂作坊终生会员.

 

经验小提示.由于CE功能的强大,在外挂开发中常被用来分析游戏,现在的很多游戏都会检测CE的存在,如果你的游戏用CE无法操作的话,建议去找UCE或一些做过特殊修改的CE来用.

对于动态内存固定这个方案.应用起来的话可是有利也有敝,因为需要修改游戏内存的执行汇编代码.如果游戏里使用了内存代码自校验的话,就会被检测出来外挂的存在.

虽然用时钟读取内存,因为不会修改内存代码,而不会被内存自校验给检测出来,但是时钟的效率不高.大家各自视自已所搞的游戏,实际情况而决定要使用哪种技术吧!

 

预告,外挂作坊2.0模块与外挂作坊高级教材近期即将推出.该版本的模块功能提供了更多强大的底层操作功能等.通用的CALL调用支持任何的调用约定,支持跨进程调用等等~~~~~


文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
           
    客服QQ:147422159 技术QQ:42724920 浙ICP备06023406号 近期项目多,在线时间不定,有事请QQ留言 Copyright © 2006 www.zuowg.com Inc. All rights reserved.外挂作坊.版权所有 站长:外挂作坊