找回密码
 点一下
查看: 4112|回复: 7

存个档.. 制造数据包和发布数据包的函数

[复制链接]
发表于 2009-5-17 21:12:12 | 显示全部楼层 |阅读模式
据说他是这样发布不影响UI的选择单位的

FUNCPTR(GAME, SendPacket, VOID __fastcall, (cPacket* pcPacket, DWORD dwZero), 0x53FA60),

class cPacket
{
    private:
    virtual VOID Function1() { } // 0x00
    virtual VOID Function2() { } // 0x04
    virtual VOID Function3() { } // 0x08
    virtual VOID Function4() { } // 0x0C
    virtual VOID Function5() { } // 0x10
    virtual VOID Function6() { } // 0x14
    virtual VOID Function7() { } // 0x18
        BYTE* pPacket;//0x04
        DWORD _1;//0x08 - zero
        DWORD _2;//0x0C - ?
        DWORD dwSize;//0x10
        DWORD _3;//0x14, -1
    public:
        VOID SendPacket(VOID);
        VOID SetPacket(BYTE* pPacket, DWORD dwSize);
        BYTE* GetPacket(VOID);
        DWORD GetPacketSize(VOID);
        cPacket(BYTE* pPacket, DWORD dwSizr);
};





<DecnicX> you got to initialize the virtual table i think

ASMPTR(GAME, cPacketTable, 0x935D54)
cPacket::cPacket(BYTE* pPacket, DWORD dwSize)
{
    this->pPacket = pPacket;
    this->dwSize = dwSize;
    this->_1 = 0;
    this->_2 = 0;
    this->_3 = -1;
    memcpy(this, &GAME_cPacketTable, sizeof(DWORD));
}
发表于 2009-5-17 23:32:16 | 显示全部楼层
"他"是谁
回复

使用道具 举报

 楼主| 发表于 2009-5-18 00:06:02 | 显示全部楼层
rolle2k.. 某邪恶东西的作者

下面是根据他的提示,对发送的数据的格式分析

6F53FA60

EDX = 0
ECX = 数据包的指针


选择单位

偏移   用途          数据
ECX
+0        虚函数表       6F935D54
+4        数据指针       ECX偏移18
+8        未知           0
+C       未知           5B4
+10      数据长度            从+18开始的数据长度
+14      未知                    -1

数据开始 (ECX+18)
字节
1           操作类型           选择=16, 目标命令 = 12, 无目标命令 = 10
1           选择类型       加选择 = 1, 减选择 = 2. 不是选择= 0
1           个数                改变选择单位的数量,如增加2个单位 = 2.  不是选择操作 = 0
1           未知            0, 似乎在选择单位时这里会补足4字节

以下只符合操作为选择/去选单位时的数据
4           单位hash         被操作单位hash =[punit + 0xC]
4           单位hash         数据同上

[当改变多个单位选择状态时

4    第二个单位hash
4    第二个单位hash

4    第三个单位hash
4    第三个单位hash

...]

数据结束
回复

使用道具 举报

发表于 2009-5-18 00:36:03 | 显示全部楼层
ECX又是传说中的this指针~
回复

使用道具 举报

发表于 2009-5-18 01:08:01 | 显示全部楼层
thewisp很热衷于这种研究学习嘛~~~
无视汇编的人悄悄的路过
回复

使用道具 举报

发表于 2009-5-18 08:42:43 | 显示全部楼层
这个意思是每个单位有一个“当前目标”么
回复

使用道具 举报

发表于 2020-3-9 11:25:14 | 显示全部楼层
本帖最后由 dnx2009 于 2020-3-9 11:30 编辑
  1. struct UnitSelectionModifyObjects {
  2.         unsigned int ObjectID1;
  3.         unsigned int ObjectID2;
  4. };

  5. struct UnitSelectionModify {
  6.         unsigned int vtable;
  7.         uint8_t unk_1[17];
  8.         uint8_t playerNumber;
  9.         uint8_t unk_2[2];
  10.         uint8_t type;  //1 = select 2 = deselect
  11.         uint8_t unk_3[3];
  12.         unsigned int unitCount[2];
  13.         UnitSelectionModifyObjects* selectedUnits;
  14. };

  15. struct SelectableSelectionModify {
  16.         unsigned int vtable;
  17.         uint8_t unk_1[17];
  18.         uint8_t playerNumuber;
  19.         uint8_t unk_2[2];
  20.         uint8_t type;                         // always 4
  21.         uint8_t unk_3[3];
  22.         UnitSelectionModifyObjects selectedSelectable;
  23. };
复制代码


1.27版本hook的地方
  1. typedef  void(__fastcall* OnDispatchUnitSelectionModify)(UnitSelectionModify* command);
  2. static OnDispatchUnitSelectionModify aOnDispatchUnitSelectionModify;
  3. typedef  void(__fastcall* OnDispatchSelectableSelectionModify)(SelectableSelectionModify* command);
  4. static OnDispatchSelectableSelectionModify aOnDispatchSelectableSelectionModify;
  5.         aOnDispatchUnitSelectionModify = (OnDispatchUnitSelectionModify)(dwGameDll + 0x69F080);
  6.         aOnDispatchSelectableSelectionModify = (OnDispatchSelectableSelectionModify)(dwGameDll + 0x69B7D0);
复制代码

附注:thewisp大大应该后来开发了DreamDota,并开源在github上
本代码是我写来用于全图检测的 能在论坛上发现thewisp的帖子十分感慨

回复

使用道具 举报

发表于 2020-10-2 18:41:09 | 显示全部楼层
打开体彩排列5游戏之窗,此生别样风光。游戏台湾威力彩你我他 共同赢天下!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 10:33 , Processed in 0.087741 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表