魔兽争霸3 1.24 Maphack教程(本人翻译)
1. 写一个魔兽争霸3 1.24d的maphack [mAsm]
贫血吃什么补血效果最好女人
一场正在进行的暴风雪,使得所有快餐店都关了,看来无法摆脱我的宿舍了,正是如此,我再没有藉口去逃避写这篇教程了,该开始了:
在我谈论之前,我想有必要提出以下要点:这也是我首次hacking魔兽3,同时也是首次写maphack,因此所有出现在这篇文章的要点完全规定-我鼓励你去指出任何我可以制造的错误,因为我有时不像1337那样。带着这些不碍事的,让我们在这里开始。
  有需要提出的是你的地址可能会不同,因为Game.dll是一个可装载的dll,它伸请了6F000000H的空间,然而,它会意想不到地重新分配它自己,所以要记住。如果它真的做了(重新分配它自己),你有两个选择:重新开始游戏,或者简单地离开你的地址,把所有的在这个教程中的地址作为Game.dll+偏移的组合。哈哈,从每个地址中减去6F000000H,并把结果加入你的基址里。
  这篇教程是基于魔兽争霸3 版本1.24.3.6384(即1.24d)。如果你使用一个不同的版本,偏移很可能会改变,但是这个方法仍然可行。
妇女节放假吗
  去尝试阻止人们hacking他们的游戏,暴雪公司放入了一些反调试的代码,主要以调用SetSecurityInfo()形式,这个函数修改Game.dll的DACL(任意访问控制表),并且不允许从外部修改。然而,知道这个我们通过修改SetSecurityInfo的能数可以很容易地修正这个行为,而这个参数不过是一些代表安全描述的位的组合罢了。
  现在我们怎么着手去这个?好吧,我们知道Game.dll必须导出一个函数到主执行文件,所以最好开始在那个地方。
  最好的方法去着手调试魔兽争霸3是将它运行于窗口模式。你可以通过在它的快捷方式上点击右键,选属性,并在目标这个方框后面加上“ -window”(没有引号,但有个空格),
  打开魔兽争霸3使它在主屏幕里空闲,并用OLLY附加到它上面(文件->附加)。一旦它被附加了,查看Game.dll(右键->查看->Game)并按Ctrl+N弹出一些导入导出函数的列表。马上你会注意到Game.dll仅导出两个函数,只有一个我们感肖趣:
代码:
Names in Game, item 0
Address=6F009870
Section=.text我为党旗添光彩演讲稿
Type=Export
Name=GameMain
Names in Game, item 1
Address=6F7E1CE8
Section=.text
Type=Export
Name=<ModuleEntryPoint>
在GameMain上面按Enter,你应该到这里:
代码:
6F009870 > 81EC 08010000    SUB ESP,108
6F009876  A1 6041AC6F      MOV EAX,DWORD PTR DS:[6FAC4160]
6F00987B  33C4            XOR EAX,ESP
6F00987D  898424 04010000  MOV DWORD PTR SS:[ESP+104],EAX
6F009884  56              PUSH ESI
6F009885  8BB424 10010000  MOV ESI,DWORD PTR SS:[ESP+110]
6F00988C  E8 1F2F0000      CALL Game.6F00C7B0
6F009891  E8 7ABC6B00      CALL <JMP.&KERNEL32.GetTickCount>
这个函数调用一些函数,在Game.dll及在Kernel.dll里。但它看起来是最好的开始这些函数的地方,因为它有意义在于它们会保护这些模块,并在继续执行前使这些反调试弄到一边去。所以知道这些,进入到6F00C7B0H的调用:
代码:
6F00C7B0  81EC 20020000    SUB ESP,220
6F00C7B6  A1 6041AC6F      MOV EAX,DWORD PTR DS:[6FAC4160]
6F00C7BB  33C4            XOR EAX,ESP
6F00C7BD  898424 1C020000  MOV DWORD PTR SS:[ESP+21C],EAX
没有感兴趣的东西在这里,只是个开始的函数;然而,如果你向下滚动一些,你会这个宝贵的函数调用:
6F00C852  B8 A484886F      MOV EAX,Game.6F8884A4                    ; ASCII "SetSecurityInfo"
授权书怎么写6F00C857  8BCE            MOV ECX,ESI
6F00C859  E8 32FFFFFF      CALL Game.6F00C790
这个有趣-想知道为什么它们把字符串传到EAX中,跟随到6F00C790H的调用,马上你可以见到为什么了:
代码:
6F00C790  50              PUSH EAX
6F00C791  51              PUSH ECX
6F00C792  FF15 BCF2876F    CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; kernel32.GetProcAddress
6F00C798  85C0            TEST EAX,EAX
6F00C79A  75 03            JNZ SHORT Game.6F00C79F
6F00C79C  C2 0400          RETN 4股份转让协议
6F00C79F  8B5424 04        MOV EDX,DWORD PTR SS:[ESP+4]
上海政法大学
6F00C7A3  8902            MOV DWORD PTR DS:[EDX],EAX
6F00C7A5  B8 01000000      MOV EAX,1
6F00C7AA  C2 0400          RETN 4
看来这个函数没有做什么只是取会这个传给EAX的地址。虽然我们知道这个,我们但我们也可以假定SetSecurityInfo很可能会在我们现在的函数中调用,所以回到6F00C7B0H,向下滚动直到你到了这里:
6F00C8AB  53              PUSH EBX
6F00C8AC  8D4424 30        LEA EAX,DWORD PTR SS:[ESP+30]
6F00C8B0  50              PUSH EAX
6F00C8B1  53              PUSH EBX
6F00C8B2  53              PUSH EBX
6F00C8B3  68 04000080      PUSH 80000004
6F00C8B8  6A 06            PUSH 6
6F00C8BA  55              PUSH EBP
6F00C8BB  FF5424 34        CALL DWORD PTR SS:[ESP+34]
6F00C8BF  85C0            TEST EAX,EAX
6F00C8C1  75 03            JNZ SHORT Game.6F00C8C6
好了马上烦挠我的是在6F00C8B3H行的内容-我们在处理WIN32 API时知道大部份位标志通常以一些8XXXXXXX的形式派生。另一样事情是跳过这个调用。因为SetSecurityInfo是现在这个函数最后的调用API,它看起来应该属于栈帧的顶部。
现在我们怎么处理这个?转换到C,这个函数看起来像:
SetSecurityInfo(ebp,6,0x80000004,ebx,ebx,eax,ebx);
在MSDN查这个函数,你可以看到第三个参数代表安全信息,如果我们简单地也一个NULL位标志入栈,函数会什么也不做。所以改变PUSH 80000004H成为PUSH 0,你很轻松到这里:
6F00C8B3  6A 00            PUSH 0
6F00C8B5  90              NOP
6F00C8B6  90              NOP
6F00C8B7  90              NOP
所有都完成的时候,最后我们可以设置断点了,开始hacking这个游戏了。
在我们开始做之前,我们应该给这一个想法,因为写一个maphack不是像搜索一个显示了的数值那么容易。所有我们真正可以继续下去的事实就是作弊码“iseedeadpeople”让我们查看全地图,并且自从我过去研究过星际争霸的引擎,我们可以假定设定地图可见的状态为0,然而搜索0 及未知值将会是一个错误的方向去处理很多地址,所以我们无论如何也要削减它们。
  然而我们也知道另一个事情,地图数组在地图开始时必须被初始化,所以我们可以用Olly出那些内存段是从那里改变的。
  在魔兽争霸3里,转到单人游戏,开始自定义游戏,从那里,向动到列表尽头并选择Ice Crown作为你的地图(这个会在后面解释),现在,在你开始前,切换到Olly,按Alt+M弹出内存映射,并刷新它(右键->刷新),这所做的是基本上保存一个现时内存状态的参考指针,并且一旦我们再选择刷新,会比较这些内存段,并标出哪些被改变的。
  我们的参考指针设置了,切换到魔兽争霸3,开始你的游戏,并等待它装载。当最后你的单位出现在屏幕前,切换到Olly,并再次刷新内存并放大内存的方框,看看成堆的红和黄的地址。那些红高亮的是我们感兴趣的。因为它们代表着改变的内存段。然而你会注意到它们混合着,所以现在开始分开它们两部分这个有趣的任务。
  不要在你排序时,在任何环境下给予魔兽争霸3焦点。所有的内存会被重刷新,而你会失去所有。
我建议你有时间才去做这件事,因为这会耗费一些时间并确保你做一些吸引你的事去使你的思想得到休息。例如:我在洗衣服。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。