我HOOK了某个类的构造函数,想得到其对象地址,并用这个地址调用其成员函数,请帮我看看错在何处。

PDD123 2010-10-01 11:03:52
我HOOK了某个DLL中的某个类的构造函数,想得到其对象地址,并用这个地址调用其成员函数。
HOOK似乎成功了,目标程序能顺利执行下去,并且在预计的时机执行了HOOK的函数。
但是用得到的地址来调用其成员函数,得到的结果似乎不正确。

我是用Detours 来HOOK的。以下是部分代码:



int res;
int myeax;
int myebx;
int myecx;
int myedx;
int myesp;
int myebp;
int myedi;
int myesi;
CString callinf;
CString callstr;//以上是一些全局对象

void ( * Target_CI_HYGameMapData__CI_HYGameMapData)()=0;//目标函数地址
void Detour_CI_HYGameMapData__CI_HYGameMapData()//我自己的函数
{
_asm
{
mov myecx,ecx
mov myesp,esp
}//myecx 记录了此对象的地址,应该没有错吧?
Target_CI_HYGameMapData__CI_HYGameMapData();
_asm
{
mov myeax,eax
}


/////////////////////////通知窗口,已经HOOK到数据了///////////////////////
callinf.Format("CI_HYGameMapData::CI_HYGameMapData address:%d",myecx);
RecordArr.Add(callinf);

if(MainDlg)
::PostMessage(MainDlg->m_hWnd,IDC_ShowNewInf,0,0);
//////////////////////////////////////////////////////////////////////////

_asm
{
mov ecx,myecx
// mov esp,myesp
mov eax,myeax
}

}


myecx记录了对象地址,然后我在主窗口中调用其成员函数:


void CFileWatchDlg::OnBnClickedtestbutton()
{
// TODO: 在此添加控件通知处理程序代码
int x=0,y=0;
_asm
{
mov ecx,myecx
call CI_HYGameMapData__GetScaleX
mov x,eax
mov ecx,myecx
call CI_HYGameMapData__GetScaleY
mov y,eax
}
CString str;
str.Format("%d %d %d",myecx,x,y);
MessageBox(str);
}


不知道有没有什么问题?那个地址是否需要处理一下?
...全文
177 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenqiabing 2010-10-03
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101003/10/a41a6083-aa99-40dd-96b8-d1823a2ac31e.html?96
PDD123 2010-10-01
  • 打赏
  • 举报
回复

void CFileWatchDlg::OnBnClickedtestbutton()
{
// TODO: 在此添加控件通知处理程序代码
int x=0,y=0;
int *MD=(int *)myecx;
/* _asm
{
mov ecx,myecx
call CI_HYGameMapData__GetScaleX
mov x,eax
mov ecx,myecx
call CI_HYGameMapData__GetScaleY
mov y,eax
}*/
x=MD[0x40/4];
y=MD[0x44/4];
CString str;
str.Format("%d %d %d",myecx,x,y);
MessageBox(str);
}

如果修改成这样,似乎能得到正确的值。所以是不是myecx是不是要经过什么处理才能用来调用其指向的对象的成员函数?
PDD123 2010-10-01
  • 打赏
  • 举报
回复
用IDA反汇编DLL后的代码

public: int __thiscall CI_HYGameMapData::GetScaleX(void) proc near
mov eax, [ecx+40h]
retn
public: int __thiscall CI_HYGameMapData::GetScaleX(void) endp


public: int __thiscall CI_HYGameMapData::GetScaleY(void) proc near
mov eax, [ecx+44h]
retn
public: int __thiscall CI_HYGameMapData::GetScaleY(void) endp


CI_HYGameMapData__GetScaleX
CI_HYGameMapData__GetScaleY
分别就是这两个函数的地址
skyxie 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pdd123 的回复:]
如果修改成这样,似乎能得到正确的值。所以是不是myecx是不是要经过什么处理才能用来调用其指向的对象的成员函数?[/Quote]

说明你的 CI_HYGameMapData__GetScaleX 这里有问题~

dll中的类是派生类? GetScaleX 是virtual还是非virtual的?

请参看这里:http://wenku.baidu.com/view/01e54c175f0e7cd1842536f1.html

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧