佳丽云

英雄无敌3-WoG中文站

 找回密码
 英雄注册|Register
查看: 2259|回复: 2

请问Erm_Hooker是个什么插件?

[复制链接]
  • TA的每日心情
    擦汗
    2014-2-3 08:29
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]投石矮人

    236

    回帖

    1万

    金币

    0

    精华

    4级 Famous Hero

    Rank: 4

    积分
    1073
    发表于 2015-2-17 04:13:03 | 显示全部楼层 |阅读模式
    新版封神,由007提供的大量功能都需要Erm_hooker的支持,但是这到底是个啥东西?

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

    能否请沧海或者007来解释一下这个插件是啥和怎么用?谢谢
  • TA的每日心情
    郁闷
    2015-6-6 16:12
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]女巫

    4950

    回帖

    3万

    金币

    35

    精华

    超级版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    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的例子。

    1. *需要erm_hooker.era插件才能运行.
    2. *007的FU触发器约定用3个FU函数代表一次内存HOOK:
    3. *第一函数用于新增HOOK(x1=0为HOOK,x1=1为UNHOOK)
    4. *第二函数是被HOOK的函数,在HOOK位置上获得一些信息(处理寄存器),传递给第三函数.(使用第一函数号+1)
    5. *第三函数相当于一个触发器.强烈建议不修改FU触发器的x参数,以便每次触发均得到正确的参数(返回的除外,切记有返回参数时需要至少设定一个真正的默认值)
    6. *FU777712[x1,x2,x3] 火盾伤害产生之前(FU111119-FU111120)x1=堆栈,x2=原始火盾伤害值,x3=寄存火盾伤害的地址(触发器过程有效)
    7. *-----------------------------初始化HOOK或解除HOOK---------------
    8. !?BA0&1000;[战斗前]
    9. !!FU111119:P0;[火盾伤害前]

    10. !?BA1&1000;[战斗后]
    11. !!FU111119:P1;[火盾伤害前]
    12. *------------------------------------------------------------
    13. *火盾伤害之前触发(FU111119-FU111120)
    14. !?FU111119&x1=0;[火盾伤害之前]
    15. *004406E8 - 8b f1 - mov esi,ecx #esi=堆栈内存
    16. *004406EA - 57 - push edi
    17. *004406EB - 8b 0d 20 94 69 00 - mov ecx,[00699420] : 0498E820 ->hook入
    18. *004406F1 - 89 75 ec - mov [ebp-14],esi #[ebp-14]仍然是堆栈内存
    19. !!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
    20. !!SN:Ey2/1/4458219/111120; hook at 0x004406EB => FU111120

    21. !?FU111119&x1=1;[火盾伤害之前]解除HOOK
    22. !!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^UnsetHook^/?y2;
    23. !!SN:Ey2/1/4458219;

    24. !?FU111120;[火盾伤害之前]
    25. *此时esi=堆栈内存,[EBP+8]为形参a2
    26. !!SN:X?y1/1; [运行原来的代码]
    27. !!VRy2:Sy1+4;[ESI]
    28. !!VRy3:Sy1+8;[EBP]
    29. !!UN:Cy2/4/?y4;[堆栈内存]
    30. !!UN:Cy3/4/?y5;
    31. !!VRy6:Sy5+8;
    32. !!UN:Cy6/4/?y7;
    33. !!UN:C6919200/4/?y10;
    34. !!VRy11:Sy4-y10-21708:1352;[堆栈号]
    35. !!VRy12:Sy4-y10-21708%1352;
    36. !!FU|y12<>0/y11<0/y11>41:E;[堆栈错误]
    37. !!FU777712:Py11/y7/y6;[x1=堆栈,x2=原始伤害值,x3=修改伤害的地址(用作返回)]

    38. *示例,希瑞尔特长火盾,其带领部队的火盾伤害按等级每级增加10%,己方部队只受火盾伤害的一半.
    39. !#HE57:X3/29/0/0/0/0/0;[希瑞尔特长火盾,原特长地狱烈焰]
    40. !#HE57:M29/1 M22/0;[希瑞尔初始火盾魔法]
    41. !?FU777712;[007-火盾伤害产生前(触发器)]
    42. *最好不要在此FU触发器中引导堆栈攻击行动(比如若引导火盾伤害将导致死循环)
    43. *强烈建议不要在FU触发器内存修改X1/X2/x3的值(只读,让每个触发器均正常获取或设定)
    44. *要修改火盾伤害请使用UN:Cx3/4/数值(也可用于获取修改后的值)
    45. !!IF:M^FU777712火盾产生前(受伤堆栈=%X1,原火盾伤害=%X2)^;[用于检验火盾伤害值是否一致]
    46. !!VRy1&x1<21:S1;
    47. !!VRy1&x1>20:S0;[受伤堆栈的另一方]
    48. !!BHy1:N?y2;[对方英雄(产生火盾的那方)]
    49. !!FU&y2<0:E;
    50. !!HEy2:X?y3/?y4/d/d/d/d/d;
    51. !!FU&y3<>3/y4<>29:E;[非特长火盾]
    52. !!HEy2:Ed/?y5/1;[英雄等级y5]
    53. !!VRy6:Sy5*10;[每级增加10%火盾伤害]
    54. !!VRy7:Sx2*y6:100;[增加伤害]
    55. !!UN:Cx3/4/?y8;[原值]
    56. !!VRy8:+y7;
    57. !!UN:Cx3/4/y8;[重设伤害]
    58. !!HEy2:B0/?z2;
    59. !!VRz-1:S^%Z2所带部队对目标的火盾伤害增加%Y6%%。^;
    60. !!BU:Mz-1;
    61. ! !IF:M^FU777712火盾伤害修改后(受伤堆栈=%X1,原火盾伤害=%X2,最终伤害=%Y8)^;

    62. !?FU777712;[007-火盾伤害产生前(触发器)]
    63. *可以和上面语句合并,这里只是演示触发器多重分段的功能
    64. *特长火盾时,己方部队降低原始火盾伤害的一半.
    65. !!VRy1&x1<21:S0;
    66. !!VRy1&x1>20:S1;[受伤堆栈方]
    67. !!BHy1:N?y2;[对方英雄(产生火盾的那方)]
    68. !!FU&y2<0:E;
    69. !!HEy2:X?y3/?y4/d/d/d/d/d;
    70. !!FU&y3<>3/y4<>29:E;[非特长火盾]
    71. !!VRy7:Sx2:2;[原始伤害的一半(并非修改后的值)]
    72. !!UN:Cx3/4/?y8;[原值]
    73. !!VRy8:-y7;
    74. !!VRy8&y8<1:S1;[伤害至少为1]
    75. !!UN:Cx3/4/y8;[重设伤害]
    76. !!HEy2:B0/?z2;
    77. !!VRz-1:S^%Z2所带部队减少火盾带来的自身伤害。^;
    78. !!BU:Mz-1;


    79. *贤知有您 2014-10-24*
    复制代码
  • TA的每日心情
    郁闷
    2015-6-6 16:12
  • 签到天数: 52 天

    连续签到: 1 天

    [LV.5]女巫

    4950

    回帖

    3万

    金币

    35

    精华

    超级版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    34683

    论坛守望者论坛元老杰出贡献

    发表于 2015-2-17 10:19:24 | 显示全部楼层
    忘了说。
    封神的ERM_HOOK应用基本是已经设置好的。
    首先把ERM_HOOK引导到一个FU函数上。
    我们就直接使用FU函数作为一个触发器来处理。只需要了解触发的时机,触发时参数通过FU的X参数来传递,并结合自定义的一些约定,应用起来跟普通触发器一样。沧海一粟在应用方面是最得心应手的。
    简单来说。我只是用ERM_HOOKER延伸出一个FU类触发器。(当然有些内存修改是直接HOOK出来改的,没有FU触发器的应用)
    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 英雄注册|Register

    本版积分规则

    捐赠
    关注我们,英3Mod一网打尽!

    WoG中文站 ( 辽B2-20210485-10 )|辽公网安备 21128202000228 号

    GMT+8, 2025-2-24 04:20 , Processed in 0.210862 second(s), 12 queries , Gzip On, File On.

    Powered by Discuz! X3.4

    Copyright © 2004-2022, Beijing Second Sight Technology Co., LTD.

    快速回复 返回顶部 返回列表