- 积分
- 34683
- 威望
- 499
- 魅力
- 507
- 经验
- 20330
- 热心度
- 9
- 注册时间
- 2006-3-13
- 最后登录
- 2025-1-28
- 主题
- 134
- 回帖
- 4950
- 精华
- 35
- 阅读权限
- 150
TA的每日心情 | 郁闷 2015-6-6 16:12 |
---|
签到天数: 52 天 连续签到: 1 天 [LV.5]女巫

超级版主
   
- 积分
- 34683
  
|
发表于 2015-2-17 10:08:10
|
显示全部楼层
ERM_HOOKER是bersy在ERA基础上制作的强大插件,它能直接HOOK内存并引申到ERM语言上来处理。
所谓HOOK(常说的钩子)可以理解为一个外挂式的插入。这在C语言等编程上很常用。
楼主应该看过ERM,WOG的所有触发器都可以看做是一个HOOKER。你想象一下,运行SOD版本,战斗开始前强制引导到 BA触发器上,生物行动前引导到BG触发器上等等。这都有点HOOK的意味。只不过这些都属于WOG源码的一部分。通常可以用C语言做一个插件造出效果。
甚至,你可以把HD模式也看成很多HOOK的造成。它是一种注入方式。由于ERA已经脱掉了EXE的保护,可以对游戏进行内存修改,常用的 UN:C和SN:E语法就是其中之一。
Bersy为了让ERM创作者更好地应用ERM来HOOK游戏的内存,制作了这么个插件。这样就不需要应用其它高级编程来做插件处理。
这个ERM_HOOKER插件要应用的好,需要有以下方面的知识:
1.首先要懂得一定的ERM基础,因为它是以ERM来引导处理的。
2.懂得基本的汇编知识,因为需要处理内存寄存器等(在插件上只是一个地址的处理,但仍旧跟内存相关)。
3.能自行解释内存(汇编),找到适合的HOOK入处是一个关键。不然崩溃是家常便饭,也得考虑和本身WOG是否冲突。
这里贴出当时写火盾HOOK的例子。
- *需要erm_hooker.era插件才能运行.
- *007的FU触发器约定用3个FU函数代表一次内存HOOK:
- *第一函数用于新增HOOK(x1=0为HOOK,x1=1为UNHOOK)
- *第二函数是被HOOK的函数,在HOOK位置上获得一些信息(处理寄存器),传递给第三函数.(使用第一函数号+1)
- *第三函数相当于一个触发器.强烈建议不修改FU触发器的x参数,以便每次触发均得到正确的参数(返回的除外,切记有返回参数时需要至少设定一个真正的默认值)
- *FU777712[x1,x2,x3] 火盾伤害产生之前(FU111119-FU111120)x1=堆栈,x2=原始火盾伤害值,x3=寄存火盾伤害的地址(触发器过程有效)
- *-----------------------------初始化HOOK或解除HOOK---------------
- !?BA0&1000;[战斗前]
- !!FU111119:P0;[火盾伤害前]
- !?BA1&1000;[战斗后]
- !!FU111119:P1;[火盾伤害前]
- *------------------------------------------------------------
- *火盾伤害之前触发(FU111119-FU111120)
- !?FU111119&x1=0;[火盾伤害之前]
- *004406E8 - 8b f1 - mov esi,ecx #esi=堆栈内存
- *004406EA - 57 - push edi
- *004406EB - 8b 0d 20 94 69 00 - mov ecx,[00699420] : 0498E820 ->hook入
- *004406F1 - 89 75 ec - mov [ebp-14],esi #[ebp-14]仍然是堆栈内存
- !!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
- !!SN:Ey2/1/4458219/111120; hook at 0x004406EB => FU111120
- !?FU111119&x1=1;[火盾伤害之前]解除HOOK
- !!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^UnsetHook^/?y2;
- !!SN:Ey2/1/4458219;
- !?FU111120;[火盾伤害之前]
- *此时esi=堆栈内存,[EBP+8]为形参a2
- !!SN:X?y1/1; [运行原来的代码]
- !!VRy2:Sy1+4;[ESI]
- !!VRy3:Sy1+8;[EBP]
- !!UN:Cy2/4/?y4;[堆栈内存]
- !!UN:Cy3/4/?y5;
- !!VRy6:Sy5+8;
- !!UN:Cy6/4/?y7;
- !!UN:C6919200/4/?y10;
- !!VRy11:Sy4-y10-21708:1352;[堆栈号]
- !!VRy12:Sy4-y10-21708%1352;
- !!FU|y12<>0/y11<0/y11>41:E;[堆栈错误]
- !!FU777712:Py11/y7/y6;[x1=堆栈,x2=原始伤害值,x3=修改伤害的地址(用作返回)]
- *示例,希瑞尔特长火盾,其带领部队的火盾伤害按等级每级增加10%,己方部队只受火盾伤害的一半.
- !#HE57:X3/29/0/0/0/0/0;[希瑞尔特长火盾,原特长地狱烈焰]
- !#HE57:M29/1 M22/0;[希瑞尔初始火盾魔法]
- !?FU777712;[007-火盾伤害产生前(触发器)]
- *最好不要在此FU触发器中引导堆栈攻击行动(比如若引导火盾伤害将导致死循环)
- *强烈建议不要在FU触发器内存修改X1/X2/x3的值(只读,让每个触发器均正常获取或设定)
- *要修改火盾伤害请使用UN:Cx3/4/数值(也可用于获取修改后的值)
- !!IF:M^FU777712火盾产生前(受伤堆栈=%X1,原火盾伤害=%X2)^;[用于检验火盾伤害值是否一致]
- !!VRy1&x1<21:S1;
- !!VRy1&x1>20:S0;[受伤堆栈的另一方]
- !!BHy1:N?y2;[对方英雄(产生火盾的那方)]
- !!FU&y2<0:E;
- !!HEy2:X?y3/?y4/d/d/d/d/d;
- !!FU&y3<>3/y4<>29:E;[非特长火盾]
- !!HEy2:Ed/?y5/1;[英雄等级y5]
- !!VRy6:Sy5*10;[每级增加10%火盾伤害]
- !!VRy7:Sx2*y6:100;[增加伤害]
- !!UN:Cx3/4/?y8;[原值]
- !!VRy8:+y7;
- !!UN:Cx3/4/y8;[重设伤害]
- !!HEy2:B0/?z2;
- !!VRz-1:S^%Z2所带部队对目标的火盾伤害增加%Y6%%。^;
- !!BU:Mz-1;
- ! !IF:M^FU777712火盾伤害修改后(受伤堆栈=%X1,原火盾伤害=%X2,最终伤害=%Y8)^;
- !?FU777712;[007-火盾伤害产生前(触发器)]
- *可以和上面语句合并,这里只是演示触发器多重分段的功能
- *特长火盾时,己方部队降低原始火盾伤害的一半.
- !!VRy1&x1<21:S0;
- !!VRy1&x1>20:S1;[受伤堆栈方]
- !!BHy1:N?y2;[对方英雄(产生火盾的那方)]
- !!FU&y2<0:E;
- !!HEy2:X?y3/?y4/d/d/d/d/d;
- !!FU&y3<>3/y4<>29:E;[非特长火盾]
- !!VRy7:Sx2:2;[原始伤害的一半(并非修改后的值)]
- !!UN:Cx3/4/?y8;[原值]
- !!VRy8:-y7;
- !!VRy8&y8<1:S1;[伤害至少为1]
- !!UN:Cx3/4/y8;[重设伤害]
- !!HEy2:B0/?z2;
- !!VRz-1:S^%Z2所带部队减少火盾带来的自身伤害。^;
- !!BU:Mz-1;
- *贤知有您 2014-10-24*
复制代码 |
|