欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]那些年我曾今玩过的魔兽外挂(一)

[原创]那些年我曾今玩过的魔兽外挂(一)

0x0 序言  

本系列文章的发布顺序并非按照外挂功能复杂程度排序,这点请各位看官注意。

  另外,亲爱的大手子们,你以为不封你们真的是因为没检测到你们吗?

  那么,接下来要说的这个,应该是我目前玩过的在思路上最巧妙的,涉及到的点也是个检测的盲点,在长达10年(毫不夸张)的对抗过程中被双方都忽略点。

  文件名:jasstools.zip

  包含文件:jasstools.m3d,globals.txt,function.txt,main.txt,Game.dll

  MD5:

  jasstools.m3d: f55f15eb7a6c5b962df6a32c40d09372

  game.dll:267861a0dfd416dbad13e7ee3ec7794a

0x1 分析

  OK,依照惯例从DllMain()开始:


  DllMain()非常清晰没什么好看的,当 ul_reason_for_call == DLL_PROCESS_ATTACH,即dll挂靠的时候执行 InitHack()函数

  显然这个“InitHack()”函数才是我们要关注的重点。


  就一份外挂来说,这个流程是写得非常符合“war3的规范的”,甚至比一些商业代码都要规范,当然还有更规范的外挂代码。其中有一句代码是我要吐槽的:

if ( strstr(&v_file_name, "War3.exe") || (v_ret_val = strstr(&v_file_name, "war3.exe")) != 0 )

  这种代码在这份显得“非常正规”的代码中简直是神一样的存在,因为正常做法大概是:

std::transform(name.begin(), name.end(), name.begin(), ::tolower);

  虽然这样要多写一点代码,但是看起来更符合这份代码的风格不是吗?

  当然这句话我在很多易语言源码中见过比如:“game.dll”、““Game.dll” 、“GAME.DLL”比较三次的,实际上根本不用比较。


  其流程图大致如下:


  吐槽完毕,显然通过观察流程我们发现样本做了一个非常关键的操作,即hook g_game_module_handle + 0x1FAB34 也就是compline_jass_script()这个函数。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功