|
|
| | 网站首页 | 初级教材 | 中级教程 | 高级教程 | 模块文档1.8 | 资源下载 | 外挂海论坛 | 加入外挂作坊 | | ||
|
||
|
|||||
|
|
|||||
| 10-内存事件回调 | |||||
|
前节最后留下了个难题,如何让演示程序写新值到内存时,同时通知我们呢? 若能得到这个通知,我们就能掌握最佳时机去获取这个值. 本节所用的例子,仍然是上节的演示程序!
现在我们要在前节分析并且修改好的固定内存代码上,再做改进,让它能有回调我们的子程序的功能实现自动通知, 因为需要增加CALL的代码,上面的NOP空的内存不够用,需要重排一下代码,以能够节省出来更多的空间!
把这里的 push 80000301 与 push 00 两条代码下移了,上面多空出来了8个字节内存可以用来写一些代码.NOP正有八个了. 现在我希望,在演示程序写内存到我们的地址后,再调用通知我们的一个子程序.可以修改成如下图的代码样式
这里的增加了 mov edx,00000000 与 call edx 两条指令. mov edx,00000000 把我们的一个子程序指针保存到EDX寄存器中 call edx 调用执行我们的子程序,此时我们的子程序就可以去那个整数型变量中读取数据了!
通过这个方式后,我们可以省去了时钟的麻烦.这个的效率远远的高于时钟~,, 机器码是 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 让演示程序自动调用咱们的子程序,然后我们的子程序里的参数一里的值就是这个数据了. 很显然,这个方式确实是最棒的了,哈哈~~
机器码是 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 | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
|
|||||||||||
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|