好久没说说话了,转眼就到了2009年,大学生涯也即将完毕,庆幸自己终于可以摆脱学生时代。即使没有进入社会,我也隐约感到前途并不美好。其实,无论你获得活得怎样,最后得到的也不过是衣食,住行,男女。所幸,我胸无大志,应该容易得到满足。
来此blog的人一般都不想看我的什么心情随笔,都是抱着别的目的来的,比如魔兽工具,一些破解。好了,下面就满足你们。
今天的话题是如何过某些地图的-MH。“某些地图”,比如最近的什么真三国无双二(貌似是不争气的VS出品的吧),真三国无双奥运版,等等~~~
地图反MH其实很好破解,知道地图怎么编辑的就可以搞定了。这些地图之所以能够运行一些特殊的功能就在于它使用了jass脚本。我以前对jass api有过研究,当然,我的目的不是编地图。
今天某位朋友在lynn论坛发消息给我说,有个真三奥运版可以反所有现今流行的MH。好久没搞东西了,兴趣也来了点,于是下了那个地图看了看。
刚开始也走了些弯路,现在我只说重点怎么搞了。我不想做什么现成的工具了,我写了这篇文章后,一些指望从魔兽获取收益的人会出相关工具的,什么人我不说了,看谁更新的最快就知道了。另外,今晚还剩些时间,我想看部电影。如今看部电影对我来说比搞什么反汇编好玩多了,主要是很轻松。
我下的是“BT真三专署奥运修改版3.1.w3x”,BT应该是跟蓝宝石一类的图,很没意思,我很久都不玩真三了。
前面说了war3地图会用jass脚本,如何查看地图呢,其实war3自身的目录就有,就是那个worldedit.exe。不过用worldedit.exe打不开上面这个图,于是我直接用MPQMaster查看。
很快就找到脚本了,直接解压出来,是文本文件,打开可以直接搜索-MH提示:is cheating,马上就定位到关键点。呵呵,这个直接是源代码了,比反汇编好懂多了!
仔细看了下代码,心里大概有数了,主要是一些jass api调用,我们的关键点也就是patch这些jass api。于是我用上了google去搜索这些api,没想到一搜索是直接搜索到这段-MH的源码了,呵呵,原来这段-MH是网上都有的东西。有兴趣可以去这里看看:http://www.islga.org/bbs/read.php?tid=19231&page=e&fpage=1
关键地方:
//x,y是一个对玩家而言不可见的一个点的坐标,我们要利用这个坐标来创建一个闪电。
function DetLighning takes nothing returns nothing
local real MFWGx=GetRandomReal(GetRectMinX(DetZoom),GetRectMaxX(DetZoom))
local real MFWGy=GetRandomReal(GetRectMinY(DetZoom),GetRectMaxY(DetZoom))
if IsVisibleToPlayer(MFWGx,MFWGy,GetLocalPlayer())==false then
set ZeustheViews=AddLightning(“CLPB”,true,MFWGx,MFWGy,MFWGx,MFWGy) //创建闪电
if ZeustheViews!=null then //本地玩家闪电H2I值非0,就是说明上面的不可见点变得可见,说明开外挂
call DestroyLightning(ZeustheViews) //删除上面创建的闪电
set ZeustheViews=null
call SelectUnit(Cheatout,true) //让这个玩家选择前面创建的单位,来标记他
endif
endif
endfunction
原理说来很简单,就是在本来不可见的地图区域创建一个“玩家闪电”,根据什么H2I值判断是否开MH,开了MH的直接选中那个创建的那个单位,然后如果当前玩家能够选中那个单位就把当前玩家放到一个势力方Force里。最后有玩家输入-MH就直接这个Force里读取开了MH的玩家。注意并不是输入-MH时才检查MH,而是从游戏开始一直每隔3秒就检测,只要被检查出了就放到一个Force势力方里。
那么如何破解,前面说了直接从jass api入手即可。确实如此,不过我这里的方法还有待改进。
仔细看了上面的jass脚本,最关键的api是AddLightning和SelectUnit。注意,虽然你已经看到源码了,但是却不能修改它的执行流程,至少我暂时没办法。因为脚本不是汇编,脚本是解释执行的。不过有一种可能就是在内存中找到那段jass代码然后直接文本修改,我没试过,你可以试试。
我一开始是直接搞弄AddLightning,我以为它是一个BOOL或者int返回类型,所以直接改那个call返回后的eax值就可以了。
哦,忘记说了,jass api是对应魔兽game里的一个call段的。找这个call段不难,先搜索game.dll段的字符串,然后在结果中查找jass api的字符串,找到的地方的汇编代码处就有对应call的地址。比如:
6F2AC93A BA 644B816F mov edx, 6F814B64 ; addlightning
6F2AC93F B9 50C02D6F mov ecx, 6F2DC050 ; 6F2DC050就是addlightning对应的call
6F2AC944 E8 271C3F00 call 6F69E570
在6F2DC050我先是直接改了call最后处的返回值,把eax赋值成0,结果不行。有尝试了其他方法,结果也不行。不过我相信有办法对付这个addlightning的,也许只是需要点时间和耐心。
好了,换SelectUnit。这个我看了下,jass脚本里只有几处调用了SelectUnit,所以你可以直接让这个call返回。我试了下,确实可行。变换代码如下:
6F2C59A0 C3 retn
呵呵,就这么简单,只改了一个字节。注意,SelectUnit非jass脚本魔兽自己是不会去调用它的,所以你可以放心修改,只要它不出问题。这个call类似一个接口。
鉴于只修改了一个字节,我直接用小鸡bug的程序改了个现成的。修改方法已经写得很清楚了,稍微懂点编程和汇编的都可以自己写程序搞定了。
现成的可以到论坛下:http://bbs.pleee.com