转载请注明来源:https://www.cnblogs.com/hookjc/

//位置结构。x,y不多说,unknown是3F800000。浮点数1.0??
struct Pos
{
  DWORD x,y,unknow;
}; //由于但是是写成shellcode的,所以封装了函数 //storm.dll的地址
DWORD _declspec(noinline) GetStromAddr()
{
  return 0x15000000;
}
//game.dll的地址
DWORD _declspec(noinline)GetGameAddr()
{
  return 0x6f000000;
} //只要在某些地方HOOK,调用这个函数就可以小地图上画出英雄单位
void AllDraw()
{
  DWORD HeroPoint,HeroNext;
  HeroPoint=GetHeroAddrPFunc();//获取英雄单位链表。(我称他为链表~~:p:)
  if (HeroPoint==0)
  {
    return ;
  }
  HeroNext=*(DWORD*)HeroPoint;//取出第一个单位的地址
  while (HeroNext!=0)
  {     BYTE Dead=0;
    Dead=*(BYTE*)(HeroNext+0x20);//死了自然不用画
    if(Dead==0x46)
    {
                        //没死就画
      MainDraw(HeroNext);
    }     HeroPoint+=0x18;//链表自增
    HeroNext=*(DWORD*)HeroPoint;//取出下一个单位地址。直到为0表示没有了
  }
} //大地图坐标转小地图坐标的call 本来是有参数的。这里naked就不写了
void  _declspec(naked) FloatCall()
{
  _asm
  {
    push ebp
    mov ebp,esp
    pushad
      pushfd
      mov edx,[ebp+0xc]
    mov ecx,[ebp+0x10]
    push DWORD PTR SS:[ebp+8]
    push eax
    PUSH ESI
    MOV ESI,DWORD PTR SS:[ESP+0x8]
    FLD DWORD PTR DS:[ESI+0xC]
    MOV EAX,ECX
    FMUL DWORD PTR DS:[EDX+4]
    FLD DWORD PTR DS:[EDX]
    FMUL DWORD PTR DS:[ESI]
    FADDP ST(1),ST
    FLD DWORD PTR DS:[ESI+0x18]
    FMUL DWORD PTR DS:[EDX+0x8]
    FADDP ST(1),ST
    FSTP DWORD PTR DS:[EAX]
    FLD DWORD PTR DS:[ESI+0x4]
    FMUL DWORD PTR DS:[EDX]
    FLD DWORD PTR DS:[ESI+0x10]
    FMUL DWORD PTR DS:[EDX+4]
    FADDP ST(1),ST
    FLD DWORD PTR DS:[ESI+0x1C]
    FMUL DWORD PTR DS:[EDX+8]
    FADDP ST(1),ST
    FSTP DWORD PTR DS:[EAX+4]
    FLD DWORD PTR DS:[ESI+8]
    FMUL DWORD PTR DS:[EDX]
    FLD DWORD PTR DS:[ESI+0x14]
    FMUL DWORD PTR DS:[EDX+4]
    FADDP ST(1),ST
    FLD DWORD PTR DS:[ESI+0x20]
    POP ESI
    FMUL DWORD PTR DS:[EDX+8]
    FADDP ST(1),ST
    FSTP DWORD PTR DS:[EAX+8]
    pop eax
    add esp,4
    popfd
    popad
    mov esp,ebp
    pop ebp
    retn
  }
}; //这个确实不记得了
DWORD  GetHeroLC(DWORD HeroAddr)
{
  return *(DWORD*)(HeroAddr+0x58);
} //获取坐标地址。填充需要的结构
void  GetHeroLocData(DWORD HeroAddr,Pos * p)
{   p->x=*(DWORD*)(HeroAddr+0x284);
  p->y=*(DWORD*)(HeroAddr+0x288);
  p->unknow=0x3f800000;//浮点1.0
} void  MainDraw(DWORD HeroAddr)
{
  Pos pReal;
  Pos pChange;
  DWORD lc=GetHeroLC(HeroAddr);       //获取大地图坐标
  GetHeroLocData(HeroAddr,&pReal);     DWORD Gaddr=GetGameAddr(); //把大地图 转到 小地图结构
  DWORD MiniVal=*(DWORD*)(Gaddr+0xACD06C);
  LPVOID p1=&pChange;
  LPVOID p2=&pReal;
  DWORD p3=MiniVal+0x750;
  _asm mov esp,esp
  _asm
  {
    pushad
    push p1
    push p2
    push p3
    call FloatCall
    add esp,0xc
    popad
  } /*这里记得了,上面的GetHeroLC是用于计算玩家楼层。有一个标记。
所有的英雄单位还有一个数组,1表示要画图,0表示不要画图。*/ //想起来了,LC=楼层。   //FloatCall(MiniVal+0x750,&pReal,&pChange);
  DWORD StartAddr=*(DWORD*)(MiniVal+0x2e4); //StartAddr就是这个数组的地址   DWORD TempCount=*(DWORD*)(StartAddr+lc*4);
  if (TempCount!=0)//如果数组里面显示要画了,那我们没必要多此一举
  {
    return ;
  }   DWORD Judge=*(DWORD*)(MiniVal+0x2f0);
  Judge=*(DWORD*)(lc*4+Judge);
  if (Judge==0)//这里还有个判断,不记得是干嘛的了。
  {
    return ;
  } //把数组里面的值标记为1,表示要画出来
  *(DWORD*)(StartAddr+lc*4)=TempCount+1; //把这个结构放到一个位置,让魔兽画出来。
  lc=lc<<4;
  DWORD CopyAddr=*(DWORD*)(lc+MiniVal+0x2fc);
  DWORD Offset=TempCount*3;
  CopyAddr+=Offset*4;
  ((Pos*)CopyAddr)->x=pChange.x;
  ((Pos*)CopyAddr)->y=pChange.y;
  ((Pos*)CopyAddr)->unknow=pChange.unknow;
} //获取英雄表头
DWORD  GetHeroAddrPFunc()
{
  DWORD HeroAddrPoint=0;
  DWORD Addr=0x55514+GetStromAddr();
  memcpy(&HeroAddrPoint,(LPCVOID)(Addr),4);   if(*(DWORD*)(HeroAddrPoint+0x88)!=0x18)
    return 0;   HeroAddrPoint=HeroAddrPoint+0x98;
  //特别注意,这里返回值可能为0;
  return HeroAddrPoint;
}
暂存:
原地址:http://www.ipahoo.com/2014/software_0807/1487.html

来源:python脚本自动迁移

war3 Game的更多相关文章

  1. C# war3 巨魔精灵 minimap

    弃坑LOL后,无聊的时候玩玩 war3的RPG地图,巨魔与精灵.  玩了一段时间精灵....然后玩魔结果总是找不到人.所以就有了这个想法. 代码纯粹靠搬运. 说下原理,网上有份代码,可以查看当前选中目 ...

  2. 【原创】C# war3 巨魔精灵 minimap

    弃坑LOL后,无聊的时候玩玩 war3的RPG地图,巨魔与精灵.  玩了一段时间精灵....然后玩魔结果总是找不到人.所以就有了这个想法. 代码纯粹靠搬运. 说下原理,网上有份代码,可以查看当前选中目 ...

  3. War3编辑器

    [War3编辑器] 1.英雄在商店买东西叫“任意单位 出售物品”,英雄卖东西给商店叫“抵押物品”. 2.触发器中的一级窗口包含: 1)设置事件窗口. 2)设置条件窗口. 3)设置动作窗口. 3.二级设 ...

  4. 如何修改魔兽争霸war3分辨率

    如何修改魔兽争霸war3 分辨率 有时候发现老电脑从XP系统升级到WIN7之后,发现玩魔兽不能全屏了(2边会有一些黑屏的).最后检查发现是魔兽在安装注册表之后显示的分辨率跟电脑的实际分辨率不同导致的. ...

  5. 魔兽争霸war3心得体会(一):UD的冰甲蜘蛛流

    玩war3好几年了,之前都是打打电脑,随便玩玩的.刚刚在浩方等平台上和人玩的时候,各种被虐,很难赢一局.从去年开始,才认真玩.思考下各种战术. 最初,使用的是兽族orc,后来觉得兽族不够厉害,玩到对战 ...

  6. 魔兽争霸war3心得体会(二):狗转蜘蛛,DK光环+游侠二发

    最近几周,勤奋地在QQ对战平台上,练习war3对战. 10年玩到14年初, 也玩了很多,主要是抱着"随便玩玩"的心态,结果也很显然,可以轻松打赢中等电脑,以及AI不够高的发狂的Hu ...

  7. 对战平台虚拟War3局域网的原理对战平台虚拟War3局域网的原理

    转载请注明来源:https://www.cnblogs.com/hookjc/ 以War3为例,启动魔兽后,首先是如何看见主机的问题:魔兽是通过TCP/UDP协议进行数据发送的,那如何实现看到对方?我 ...

  8. 关于hook d3d在war3上绘图的几点疑问

    学到了. 你得记住,com接口全是stdcall调用方式,不是thiscall,不要搞错了,不信,你看接口定义 因为com调用得兼容c调用,而c没有thiscall调用方式stdcall时,this指 ...

  9. 魔兽争霸war3心得体会(四):不死族vs人族1本火魔塔

    QQ对战平台上玩随机的人特别多,为了应对对方的"出其不意",我最近一直用小狗去探路,小狗在家采集30个木头-摆放商店,就可以去探路了.主要有几个好处:知道对方的种族-出生点位-开局 ...

  10. 魔兽争霸war3心得体会(三):UD内战

    最近,经常匹配到UD内战.有输有赢,有的时候,自己双矿经济,人口优势巨大,却很遗憾地输掉比赛. 本文,简要分析下 对战过程. 前期狗流开局, 5只狗,一只出去骚扰,攻击商店,防止对方科技蜘蛛骚扰我.二 ...

随机推荐

  1. Swoole 中使用 Table 内存表实现进程间共享数据

    背景 在多进程模式下进程之间的内存是相互隔离的,在一个工作进程中的全局变量和超全局变量,在另一个工作进程中是无法读取和操作的. 如果只有一个工作进程,则不存在进程隔离问题,可以使用全局变量和超全局变量 ...

  2. [学习笔记] Oracle基础增删改查用法

    查询 select *|列名|表达式 from 表名 where 条件 order by 列名 select t.* from STUDENT.STUINFO t where t.stuname = ...

  3. nginx配置图片路径

    首先, 在linux下创建你存放资源的目录,例如:/data/images:用于存放图片. 下一步,打开default.conf配置文件找到server块下的location添加如下 location ...

  4. HTML5基本结构和语法

    1.1HTML5文档基本结构 HTML5文档省略了<html>,<head>,<body>等元素,使用HTML5的DOCTYRE声明文档类型,简化<meta& ...

  5. FIS 使用

    从淘宝npm镜像安装fis $ npm install -g fis --registry=https://registry.npm.taobao.org 安装less插件 $ npm install ...

  6. Texture+PBR两种工作流程

    一.导入Texture 1.Inpspector TextureSize 2的n次幂,底层图形学需要,计算更快:不使用2的倍数,系统也会添加像素补全2n: 有最大尺寸限制8k,cubemap最高4k: ...

  7. python2.7发送邮件失败之——SMTPAuthenticationError问题

    使用python2.7发送邮件,代码如下: from email.header import Headerfrom email.mime.text import MIMETextimport smtp ...

  8. Git使用:版本回退

    在Git中,我们可以用 git log命令查看我们修改的历史记录 C:\Users\Administrator\Documents\GitHub\learngit [master]> git l ...

  9. 《剑指offer》面试题33. 二叉搜索树的后序遍历序列

    问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ ...

  10. 论文翻译:2019_TCNN: Temporal convolutional neural network for real-time speech enhancement in the time domain

    论文地址:TCNN:时域卷积神经网络用于实时语音增强 论文代码:https://github.com/LXP-Never/TCNN(非官方复现) 引用格式:Pandey A, Wang D L. TC ...