转载请注明来源: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. Linux开关机与登录注销

    开机和重启 shutdown -h now:立即关机计算机 shutdown -h 1:1分钟后关机 halt:立即关机 reboot:立即重启 sync:把内存的数据同步到磁盘 注: shutdow ...

  2. Java程序设计基础笔记 • 【第7章 Java中的类和对象】

    全部章节   >>>> 本章目录 7.1 理解类和对象 7.1.1 对象 7.1.2 抽象与类 7.1.3 类与对象的关系: 7.2 Java中的类和对象 7.2.1 类的定义 ...

  3. Drools集成SpringBoot

    1.说明 为了更好的在项目中使用Drools, 需要把Drools集成到Spring Boot, 下面介绍集成的方法, 并且开发简单的Demo和测试用例. 2.创建Maven工程 pom.xml工程信 ...

  4. winform 自定义自动完成控件

    做过前端的朋友肯定很清楚自动完成控件,很多优秀的前端框架都会带有自动完成控件,同样的,winform也有,在我们的TextBox和ComboBox中,只需要设置AutoCompleteSource属性 ...

  5. 内联模板、X-Template

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script s ...

  6. Selenium_单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)

    简单写个单选框和复选框界面 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /&g ...

  7. 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  8. 数据库锁(mysql)

    InnoDB支持表.行(默认)级锁,而MyISAM支持表级锁 本文着中介绍InnoDB对应的锁. mysql锁主要分为以下三类: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...

  9. linux + opencv + cuvid中使用cv::cuda::GpuMat类的一些坑

    1.我最终成功实现了opencv中利用cuvid实现GPU视频解码:核心代码是: 1 cv::cuda::GpuMat d_frame; 2 cv::Ptr<cv::cudacodec::Vid ...

  10. golang中往脚本传递参数的两种用法os.Args和flag

    1. os.Args package main import ( "fmt" "os" ) func main() { // 执行:./demo.exe 127 ...