cs插件吧 关注:8,234贴子:88,332
  • 12回复贴,共1

【小白白】无限AllocString解决方案之一...看起来很奇怪

只看楼主收藏回复

之前的原贴https://tieba.baidu.com/p/5176972066
小灰灰dalao提出了由于无节制AllocString导致的炸服问题
于是我想了一个办法,在AllocString之前检查一下,
没有见过的东西就塞进容器里面去,有的话直接从容器取出来

效果大致是这样子,图片里面第一次出现weapon_c4的时候就分配...第二次出现weapon_c4直接返回之前分配的


IP属地:广东1楼2017-07-07 19:26回复
    那么问题来了...假如用fakemeta模块的register_forward(FM_AllocString, "fw_AllocString");这样子的函数
    就会出现只勾住原版mp.dll等调用的AllocString,
    而由engfunc(EngFunc_AllocString, "info_target");这样子的fakemeta模块调用的函数就不会被勾住了
    (engfunc类似于ExecuteHam不会执行钩子,不像ExecuteHamB一样会受到RegisterHam的钩子影响)
    所以,只好使用orpheu大法,请自行下载orpheu模块。
    然后你需要制作一个signature文件,名字叫做AllocString(没有txt什么的扩展名),把它
    放到addons/amxmodx/configs/orpheu/functions
    (以下{}大括号里面的才是需要的内容
    {
    "name" : "AllocString",
    "library" : "engine",
    "arguments" :
    [
    {
    "type" : "const char *"
    }
    ],
    "return" :
    {
    "type" : "int"
    }
    }
    (以上{}大括号里面的才是需要的内容
    实际上AllocString是引擎提供的engfunc函数,不需要特征码什么的所以与游戏版本无关。


    IP属地:广东2楼2017-07-07 19:33
    回复
      然后把下面的源码保存成x_stringman.sma并且编译放到游戏里面
      #include <amxmodx>
      #include <orpheu_stocks>
      #define PLUGIN "[x] String Manager"
      #define VERSION "1.0"
      #define AUTHOR "Xiaobaibai"
      // 用一个map容器来装这些类似于map["info_target"]=233的东西
      new Trie:g_mapAllocString;
      new OrpheuFunction:g_pfnAllocString;
      public plugin_init()
      {
      register_plugin(PLUGIN, VERSION, AUTHOR)
      }
      public plugin_precache()
      {
      g_mapAllocString = TrieCreate();
      g_pfnAllocString = OrpheuGetEngineFunction("pfnAllocString", "AllocString")
      OrpheuRegisterHook(g_pfnAllocString, "OnAllocString", OrpheuHookPre);
      }
      public OrpheuHookReturn:OnAllocString(const szValue[])
      {
      new iReturn;
      // 已经有的话就不再分配了
      if(TrieGetCell(g_mapAllocString, szValue, iReturn) == true)
      {
      OrpheuSetReturn(iReturn);
      return OrpheuSupercede;
      }
      // 没有的话重新分配
      iReturn = OrpheuCall(g_pfnAllocString, szValue);
      TrieSetCell(g_mapAllocString, szValue, iReturn);
      return OrpheuSupercede;
      }


      IP属地:广东3楼2017-07-07 19:33
      回复
        涉及到的两个文件可以在这里看
        x_stringman.sma
        http://codepad.org/8nLpTWq6
        AllocString
        http://codepad.org/4WCvL1JV


        IP属地:广东4楼2017-07-07 19:35
        回复
          灰灰感觉有点复杂


          IP属地:重庆5楼2017-07-07 19:49
          回复
            看不懂


            IP属地:广东来自Android客户端6楼2017-07-07 20:00
            回复
              向大佬低头
              —— 老铁没毛病


              IP属地:广西来自WindowsPhone客户端8楼2017-07-08 06:36
              回复
                膜拜大佬,有些复杂,我觉得我还是写的时候注意一点吧


                IP属地:广西9楼2017-07-08 13:03
                回复
                  用上这个的好处是可以在全局上面直接限制了AllocString,因为如果只是普通地声明一个变量去保存AllocString的返回值,理论上来说,当类似这样的插件足够多时,依然会造成崩溃(一个插件AllocString一次或多次)


                  IP属地:广东10楼2017-07-08 14:32
                  收起回复
                    你不要帮助别人养成坏习惯


                    IP属地:广东来自Android客户端11楼2017-07-08 19:45
                    收起回复