易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 2613|回复: 8

用HOOK Call 提升挂的效率和及时性

[复制链接]

9

主题

1

回帖

553

积分

编程入门

Rank: 1

魔鬼币
553
发表于 2010-7-27 20:48:44 | 显示全部楼层 |阅读模式
下面从取游戏数据的角度来说明目前的情况

1、按键精灵,通过取色来进行,效率很低(由于找基址的普及,现在按键也用内存取值了)
2、内存挂,通过基址+偏移的方式进行,用定时轮询来保证及时性。
3、注入挂,同样通过基址+偏移方式进行,也采用定时器保证及时性,好处是内call调用方便,也省过了ReadProcessMemory读取函数,可以直取内存。

这是目前广海菜菜们的三种挂,相比以前来说,注入的开始多起来,这是好事情,说明大家水平都提高了,有人说安全性不高,注入的容易被反外挂检测到。实际上,无论是内存型,还是注入型,都有对应的API函数让反外挂检测到(像内存用的ReadProcessMemory),所以关键还是在分析反外挂检测,拦截检测函数,改变检测结果。这里顺便提一下,不是今天的主题。

我们提到了一个概念,就是及时性,为什么要保证及时性呢,外挂的一个基础功能,就是保护角色不死亡,自动加血,如果不能及时加血,那么后果,大家都很清楚。同样的,高级一些的功能,如根据怪物剩余血量选择技能进行攻击,也是对及时性要求高的。再有一点,大家能比较的,打怪效率,好的挂怪物刚死亡,就开始打下一个了,而有的挂要等一会儿,这是为什么?同样也是及时性判断。目前用定时器来判断,就有这个问题,当然你可以把定时间隔设得很短,那你一个挂要用到多少定时器?怪物血量,人物血量,背包是否满,任务是否完成等等,都需要判断。而且我们做的是内挂,游戏就占了很多资源,在多开的情况下,尽量避免浪费资源,也是一个挂是否优秀的首要条件。

也许有人说,现在电脑硬件条件好,无所谓,那我们单纯从程序角度来看,用定时轮询,是一种什么样的浪费,有没有更好的方式?有一句话,监视不如自觉,从程序上翻译,就是监视不如触发。通过定时器来监视,一般都是1ms一次,频繁的检测,却只有极低的命中率(即确实血量变化了),当然还有一种方法,就是注入到recv(收包),在每次收包时触发一次血量检测,这就是一种好的方式,大大提高了命中率。

注入到收发包函数,网上有很多相关的资料,但这还不是我推荐大家使用的方式,我们仔细分析下,游戏中很多动作都会造成收发包,包括其他人物移动,攻击,怪物移动,等等,有很多都和血量无关的,所以事实上,命中率还是很低,如何做到只在血量发生变化时调用我们的血量判断呢?这就要主角上场了,HOOK Call

进阶

现在大家有调用call的经验,自然也就有了od找call的经验,我们以一个游戏“武林”为例,在武林中,你可以通过OD断下一个地方,然后会发现,只要你受到攻击,它就会断下来。很好,这就是我们要的地方,然后我们在它断下时,查看寄存器值,eax +4,血量,eax +8 蓝量,好了,数据也有了。实际上,这和用CE找数据基址是一样的,eax的值实际上就来自于[一级基址]+偏移+[二级基址]这样的组合(和内存挂取值一样),只是由于我们已经在call的内部,所以能一下就取到值。

找到了合适的地方,接下来如何去HOOK它呢,需要注意的是,这里的HOOK,我们不需要用到API,只需要直接改汇编代码就行了(API实际上也是同样操作)。在我们断下的那个点附近,上下看看,有没有call(HOOK call嘛,肯定要找call),好,我们找到一个,我们在call的第一行下个断点,进游戏受攻击,断下来,看eax+4的值,是正确的。恭喜这个call可用,然后说明一下汇编中call的环境。

大家知道,一个call就是一个函数,可带参数,也可不带参数,参数在进call以前,被压入堆栈里,进call后从栈中取出。由于我们要HOOK call,也就是把call 0425142改为call 自己函数的地址,我们就应该像警察一样,要对现场进行保护。下面用Delphi给出一个自己函数的例子

[url=javascript:][/url]

{人物血量信息拦截函数 }
function Char_call(): longint;
begin
  asm
    pushad  //将当前寄存器环境保存
    mov ebx,dword ptr ds:[esi+$254] //将值取出
    mov Char_ohp,ebx  //将值赋给变量
    mov ebx,dword ptr ds:[esi+$26c]
    mov Char_mhp,ebx
    mov ebx,dword ptr ds:[esi+$258]
    mov Char_omp,ebx
    mov ebx,dword ptr ds:[esi+$270]
    mov Char_mmp,ebx
    mov Char_hpChgFlag ,eax
    mov ebx,_char_c_addr //将原有call地址写入
    call ebx //执行原有的call
  end;
  Ctrl_Char_call(); //进入自己的人物处理函数(负责判断加血)
  asm
    popad  //恢复环境
    ret;  //返回
  end;
end;



大家可以看到,在这里取血量,没有用一级基址了,至于为什么血量不能直接赋给变量,要用二行代码,这就是语言的限制了。如果嵌入的是C,就可以一行搞定。最后为什么要写一个ret呢,实际上编译器在编译delphi代码后,会自动生成ret的,但有的时候,我们需要的是ret 4,或者是add esp,4,再ret,这时候就不能依靠编译器了,只能自己处理,所以我就习惯了干脆都自己处理。

接下来说一个很重要的概念“堆栈平衡”,由于我们修改了call,在我们的call里又要调用原来的call,所以必须保证堆栈里是每次call所需要的数据,否则你就会看到程序崩溃。通过od你可以看到,如果堆栈不平衡,你在返回时,将返回到别的地方去了,自然就执行不下去。HOOK call,一定要哪里来,回哪里去。

我们的call写好了,就可以通过写内存的方法,将原来的call xxxxxx,改为call 我们的函数,初学这个,需要多次调试,一不小心就会程序崩溃,所以需要你受得了打击。

使用这个技术,还需要注意你要取的值,在call前在,还是call后在,以方便你在你的函数里取值,我例子里是call前在,call后就没有了。

找HOOK call的原则:
1、越简单的call越好,也就是参数少,进call后,代码也少,更不要看到有一堆case的call。
2、层次越少越好,被你替换的call里面,最好没有别的call,这样你甚至不用调用它这个call,直接在你的代码里实现它的功能就行了。
3、参数不要有esp,如果在call里面通过esp读了参数,那就在恢复环境时比较麻烦,要做额外处理,让esp在它希望的位置。

再次进阶
也许在你使用一段时间后,你发现,你找着了关键位置,断下来命中率很高,可附近没有call,或者只有一个很麻烦的call,应该怎么办。
我们一样有办法,这就是HOOK anywhere,任意地方都可以HOOK,原理就是把普通的汇编代码,改为call 我们的函数,然后在我们的函数里执行它原有代码,再取数据。你也可以动手试一下,和HOOK call一样的写法,只是由于环境不同,需要具体处理而已。

选择语言
我个人来说,从VB开始,由于工作需要,学了JAVA和.net,可惜这二样都不能用来做外挂,因为它们是高级语言,对底层处理都自动了,这不是我们需要的。后来学了VC,VC写外挂很好很强大,可惜MFC我太不喜欢了(.net用习惯了),才改用了DELPHI。所以推荐大家用C++和Delphi来做,E和VB会很困难,基本上不要去考虑了。

总结
HOOK call极大的提升了效率,命中率很高,但同时对技术要求也高,必须要熟悉汇编的知识,容易受到打击(程序崩溃),找call来HOOK,比找call调用要简单一些,主要工作量还是在hook后的堆栈平衡调试上,有基础的朋友可以试下。
由于我这是写的介绍文,不是教程,所以代码不多,有的地方也是一句带过,没有介绍具体的实现方法,主要在引导大家.

8

主题

12

回帖

18

积分

编程入门

Rank: 1

魔鬼币
592
发表于 2010-7-30 12:31:26 | 显示全部楼层
是不是注入挂比较强大?

4

主题

5

回帖

9

积分

编程入门

Rank: 1

魔鬼币
666
发表于 2010-8-2 19:30:57 | 显示全部楼层
还没看明白什么回事,我新手啊.

0

主题

15

回帖

15

积分

编程入门

Rank: 1

魔鬼币
15
发表于 2010-8-24 07:42:58 | 显示全部楼层
啥子注入。

0

主题

11

回帖

-4

积分

编程新手

Rank: 1

魔鬼币
96
发表于 2011-1-11 12:31:51 | 显示全部楼层
学习中....

1

主题

45

回帖

24

积分

编程入门

Rank: 1

魔鬼币
84
发表于 2011-2-14 12:41:22 | 显示全部楼层
11111111111111111111

0

主题

4

回帖

7

积分

编程入门

Rank: 1

魔鬼币
7
发表于 2011-5-10 23:24:02 | 显示全部楼层
你在不在。想要跟你学习哇。

7

主题

22

回帖

29

积分

终身VIP会员

Rank: 7Rank: 7Rank: 7

魔鬼币
14224
发表于 2012-6-30 19:42:53 | 显示全部楼层
楼主的方法就是把自己的代码写在游戏进程的空间中,然后CALL这段代码,执行完后i,RET,就返回到调用前的下一条代码处执行。这个方法是改变游戏流程,是很危险的,游戏官方最反感这样的作法,要是用于商业,容易做板房。但是这个方法用于单机游戏确实极好地方法。

0

主题

1

回帖

1

积分

编程入门

Rank: 1

魔鬼币
21
发表于 2024-2-1 18:27:48 | 显示全部楼层











































































































您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表