• 2669阅读
  • 1回复

[已解决]问个类似辅助是如何炼成的问题[054-HOOK的应用-行为监测] [复制链接]

上一主题 下一主题
离线heye
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2014-01-23
此帖悬赏结束
最佳答案:10 小风币,本次悬赏被取消
先上代码
  1. const UINT WM_HOOK_DATA = ::RegisterWindowMessage(_T("WM_HOOK_DATA"));                //接收到HOOK SEND的数据
  2. afx_msg LRESULT GetHOOKData(WPARAM wParm,LPARAM lParm);
  3. ON_REGISTERED_MESSAGE(WM_HOOK_DATA,CWGForm::GetHOOKData)
  4. LRESULT CWGForm::GetHOOKData(WPARAM wParm,LPARAM lParm)
  5. {
  6.     
  7.     return FALSE;
  8. }
  1. extern "C" _declspec(naked)void Hook_Role()
  2. {
  3.     //数据处理
  4.     _asm
  5.     {
  6.         mov eax,[esp + 0x4]
  7.         mov num,eax
  8.         mov eax,[esp + 0x8]
  9.         mov p1,eax
  10.         mov eax,[esp + 0xC]
  11.         mov p2,eax
  12.         mov eax,[esp + 0x10]
  13.         mov p3,eax
  14.         mov role,ecx
  15.     }
  16.     _asm pushad;//保存寄存器环境数据
  17.     msg->num = num;
  18.     msg->p1 = p1;
  19.     msg->p2 = p2;
  20.     msg->p3 = p3;
  21.     msg->Role = role;
  22.     
  23.     PostMessage(MainHwnd,WM_HOOK_DATA,(WPARAM)num,(LPARAM)msg);
  24.     //执行覆盖的代码
  25.     _asm
  26.     {
  27.         popad  //还原寄存器环境数据
  28.         PUSH    EBX
  29.         MOV     EBX,DWORD PTR SS:[ESP+8]
  30.     }
  31.     //执行返回到原来的代码
  32.     _asm jmp m_hk_Role_backadress
  33. }
  34. void CWGForm::OnBnClickedCheckHook()
  35. {
  36.     // TODO: 在此添加控件通知处理程序代码
  37.     Config.Set();
  38.     if (Config.Return("是否HOOK") == "1")
  39.     {
  40.         HookRole.SetHook(m_hk_Role_startadress,(DWORD)Hook_Role,m_hk_Role_len);
  41.     }
  42.     else
  43.     {
  44.         HookRole.UnHook();
  45.     }
  46. }
  47. LRESULT CWGForm::GetHOOKData(WPARAM wParm,LPARAM lParm)
  48. {
  49.     HookMsg *msg = (HookMsg *)lParm;
  50.     //TRACE("监测到一个行为 编码%d,参数1%x,参数2%x,参数3%x,对象指针%x",(int)wParm,msg->p1,msg->p2,msg->p3,msg->Role);
  51.     switch ((int)wParm)
  52.     {
  53.     case 1:
  54.         {
  55.             break;
  56.         }
  57.     case 2:
  58.         {
  59.             if (Config.Return("过滤移动")=="0")
  60.             {
  61.                 TRACE("------移动行为  执行者:%s 执行坐标:%d/%d ",*(DWORD*)(msg->Role+0x580),((int)msg->p1/128),((int)msg->p2/128));
  62.             }
  63.             break;
  64.         }
  65.     case 3:
  66.         {
  67.             if (Config.Return("过滤打怪")=="0")
  68.             {
  69.                 TRACE("------攻击行为 执行者:%s 执行技能:%x,目标对象ID:%x",*(DWORD*)(msg->Role+0x580),msg->p1,msg->p3);
  70.             }
  71.             break;
  72.         }
  73.     }
  74.     
  75.     //delete msg;
  76.     //msg = NULL;
  77.     return FALSE;
  78. }

看过教程的一定知道HOOK后,不能TRACE输出,不能关联控件UpdateData()显示.
需要SendMessage或PostMessage自定义一个消息来接受!然后再自定义消息里显示或输出.
教程中都是读DOWRD数据.
我自己写了个HOOK发包,需要读字节数组.

我要问的是.除了下面这种for的方式还有其他方式来读吗?

for (int i=0;i<len;i++)//len为要读取的字节长度
    {
        m_1.Format(_T("%x"),*(BYTE*)(ll+i));//ll为数据内容的地址
        m_2+=m_1;
    }

1.能不能直接读一段内存.比如定义个 字节数组指针,要是可以具体怎么写.

2.能写出类似易语言这样的代码吗
编辑框1.加入文本 (十到十六 (len) + “ [” + 到文本 (ll) + “] ” + 转换_字节集到十六进制 (指针到字节集 (len, ll)) + #换行符)
//len为要读取的长度,ll为数据内容的地址

3.或者还有其他更好的方式?


ps:有人会问,for读字节不是很简单了么?
因为是PostMessage传递过来的内存地址,等接收到消息,在去读这个地址的内容时,内容已经发生了改变.(改变了很少,没去具体跟哪里改变)

还想到可以在自定义数据类型中,定义个字节数组.
可是问题又来了,因为是 extern "C" _declspec(naked) 静态的裸CALL 这个数组不能动态分配大小,但封包长度却不一样,有的相差十几二十多字节.
寻求帮助!!


游戏更新,不知道用CByteArray类能不能实现!!

离线啊冲

只看该作者 沙发  发表于: 2014-01-23
热心助人奖励:+1 小风币
问题好多啊,祝你早日研究明白~
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个