免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 软件破解 > 浅谈魔兽争霸 DotA外挂制作(2)

浅谈魔兽争霸 DotA外挂制作(2)

时间:2011-11-08 13:29来源:未知 整理:寂涯网络 点击:


6F3D4B9C    E8 7F100800     call    6F455C20
……

当然这里是是那一大坨代码的头上,可见除了第一行,下面都是 4 条指令一组,都是 call
6F455C20这个函数。很明显这是个fastcall,有3个参数,分别是native的函数地址、函
数名和签名。像这样的表还有一个,虽然函数名和签名都是像这样,函数地址却全部指向同
一个仅仅返回 0 的 dummy。这样我们就找到了所有 native 函数的地址!而且另外捎带着 3
个地址:6F3D4B60 也就是这一大坨的开始地址,命名为 PInitNatives;6F455C20 添加
native 函数的函数,命名为 PAddNative;6F454710 也就是第一句的那个 call,实际上这
个是初始化 Jass 运行环境的函数,但是现在还看不出来,这是作者后来在分析
PGetCurrentJassEnv 函数(下文会提到)后得出的结论,只是这个函数与外挂的编写没有
关系,就简单的说明一下直接带过了。
恩 知道了函数地址,也要知道函数应该改怎么调用才是啊。随便牵出几个native 分析了一
下,发现大部分的native都是 cdecl调用约定的,少数是thiscall (ecx中存放 this指针,
剩下的跟 stdcall一样),参数跟Jass 中的参数是一一对应的。只是还有一些要注意的问题:
integer 类型是直接传值(int),real 类型是指向单精度浮点数的指针(float*),handle类
型只是一个id(int),string稍复杂,这里做一下分析。
随便在某个需要string类型参数的native上设断,中断后发现是一个指向不明结构的指针。
OD 在 I2S函数(用作将integer转换成 string)上设断,却发现返回值是一个代表string
 的 id。作者在这个地方卡了有一段时间,后来在分析 native 函数的 caller(下文叫做
RunJassNative,因为这个函数接受 native 的函数名和 JassEnv作为参数,运行 native 函
数)的时候,发现了这样的一段代码:

;这个是 RunJassNative上按 F5 的结果,其中的一个switch
       switch ( v10 )
        {
          case 'R': // real
            v16 = *(_DWORD *)(v8 + 32);
            v17 = offs_funcptr;
            *(_DWORD *)offs_funcptr = v16;
            *(_DWORD *)v7 = offs_funcptr;
            offs_funcptr = (int (*)(void))((char *)v17 + 4);
            break;
          case 'C': // code
            if ( v9 != 3 )
              goto LABEL_6;
            *(_DWORD *)v7 = sub_6F45D960(v22, *(_DWORD *)(v8 + 32));
            break;
          case 'S': // string
            *(_DWORD *)v7 = sub_6F45A150(v22, *(_DWORD *)(v8 + 32));
            break;

          case 'H': // handle
            for ( ; *(_BYTE *)v6 != 59; ++v6 )
              ;
            ++v6;
            goto LABEL_15;
          default:
LABEL_15:
            *(_DWORD *)v7 = *(_DWORD *)(v8 + 32);
            break;
        }

注意其中的case ‘S’的情况,发现6F45A150 这个函数,接受两个参数,其中第二个参数
就是 stringid,第一个参数是某个结构的指针。返回值就是应该传给native的描述string
的不明结构。这个函数命名为PSIdToPointer。F5后发现,这个函数只有一句话,大概就是
从参数中的的结构取出一个地址,以 stringid 作为 index 计算后返回。那么这个结构大概

本页地址 http://www.jybase.net/ruanjianpojie/20111109592.html

百度搜索更多

谷歌搜索更多

顶一下
(4)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com