wuxiangjinxing 发表于 2015-2-17 04:13:03

请问Erm_Hooker是个什么插件?

新版封神,由007提供的大量功能都需要Erm_hooker的支持,但是这到底是个啥东西?

试着GOOGLE了一下,找到了一个erm_hooker.era,可以下载……但尼玛那是个俄语网站,压根看不懂。

能否请沧海或者007来解释一下这个插件是啥和怎么用?谢谢

贤知有您 发表于 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 火盾伤害产生之前(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, : 0498E820 ->hook入
*004406F1 - 89 75 ec - mov ,esi #仍然是堆栈内存
!!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=堆栈内存,为形参a2
!!SN:X?y1/1; [运行原来的代码]
!!VRy2:Sy1+4;
!!VRy3:Sy1+8;
!!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;

*示例,希瑞尔特长火盾,其带领部队的火盾伤害按等级每级增加10%,己方部队只受火盾伤害的一半.
!#HE57:X3/29/0/0/0/0/0;[希瑞尔特长火盾,原特长地狱烈焰]
!#HE57:M29/1 M22/0;[希瑞尔初始火盾魔法]
!?FU777712;
*最好不要在此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;
*可以和上面语句合并,这里只是演示触发器多重分段的功能
*特长火盾时,己方部队降低原始火盾伤害的一半.
!!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*

贤知有您 发表于 2015-2-17 10:19:24

忘了说。
封神的ERM_HOOK应用基本是已经设置好的。
首先把ERM_HOOK引导到一个FU函数上。
我们就直接使用FU函数作为一个触发器来处理。只需要了解触发的时机,触发时参数通过FU的X参数来传递,并结合自定义的一些约定,应用起来跟普通触发器一样。沧海一粟在应用方面是最得心应手的。
简单来说。我只是用ERM_HOOKER延伸出一个FU类触发器。(当然有些内存修改是直接HOOK出来改的,没有FU触发器的应用)
页: [1]
查看完整版本: 请问Erm_Hooker是个什么插件?

捐赠