本系列文章的发布顺序并非按照外挂功能复杂程度排序,这点请各位看官注意。
另外,亲爱的大手子们,你以为不封你们真的是因为没检测到你们吗?
那么,接下来要说的这个,应该是我目前玩过的在思路上最巧妙的,涉及到的点也是个检测的盲点,在长达10年(毫不夸张)的对抗过程中被双方都忽略点。
文件名:jasstools.zip
包含文件:jasstools.m3d,globals.txt,function.txt,main.txt,Game.dll
MD5:
jasstools.m3d: f55f15eb7a6c5b962df6a32c40d09372
game.dll:267861a0dfd416dbad13e7ee3ec7794a
OK,依照惯例从DllMain()开始:
DllMain()非常清晰没什么好看的,当 ul_reason_for_call == DLL_PROCESS_ATTACH,即dll挂靠的时候执行
InitHack()函数
显然这个“InitHack()”函数才是我们要关注的重点。
就一份外挂来说,这个流程是写得非常符合“war3的规范的”,甚至比一些商业代码都要规范,当然还有更规范的外挂代码。其中有一句代码是我要吐槽的:
这种代码在这份显得“非常正规”的代码中简直是神一样的存在,因为正常做法大概是:
虽然这样要多写一点代码,但是看起来更符合这份代码的风格不是吗?
当然这句话我在很多易语言源码中见过比如:“game.dll”、““Game.dll” 、“GAME.DLL”比较三次的,实际上根本不用比较。
其流程图大致如下:
吐槽完毕,显然通过观察流程我们发现样本做了一个非常关键的操作,即hook g_game_module_handle + 0x1FAB34 也就是compline_jass_script()这个函数。
不得了啦!偷梁换柱嘞!不被发现的那种~~~
好,那么我们看下这个回调函数DetourGameComplineJassScript()
就截图了上半部分,下半部分不是关键,所以省略了。
那么这一大串东西,到底做了些什么?其实很简单,看以下伪代码:
while(编译的脚本 != nullptr)
{
if(v_当前编译的脚本名称 == "war3map.j")
{
......
v_修改后的脚本大小 == 向原地图脚本中插入作弊脚本();
将脚本使用暴雪字符串处理规范进行处理();
覆盖原脚本Buffer();
......
}
}
调用原ComplineJassScript();
看以下流程图:
while(编译的脚本 != nullptr)
{
if(v_当前编译的脚本名称 == "war3map.j")
{
......
v_修改后的脚本大小 == 向原地图脚本中插入作弊脚本();
将脚本使用暴雪字符串处理规范进行处理();
覆盖原脚本Buffer();
......
}
}
调用原ComplineJassScript();
看以下流程图:
所以,这个外挂的核心功能流程已经被我们分析清晰了,当然这个关键函数里还有一个关键点:InsertCheatScriptToMapOrginJassScript()
这个函数负责向内存中的原地图脚本插入作弊脚本,那么我们跟进去看看它是怎么实现这个操作的:
哇!这密密麻麻的一坨是啥?看着好恐怖啊!实际上一点都不恐怖,你只需要关注我画红框的地方。这些就是这个函数的关键,你只要关心它们就好了。
再给出流程图之前,我们要引入一个前置知识,Jass2语言:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-3-6 12:35
被黑洛编辑
,原因: