关于hook com,还差一点就成功了!

HSxuguangxing 2008-08-27 11:23:48
真不好意思在开帖,没办法啊,就差那么一点了,我已经能替换虚函数EndScene()函数到我的函数了,可是不知道如何返回回去啊,我是这么搞的,代码如下:
//改回原来的数据
NewProtect = PAGE_READWRITE;
VirtualProtect((void*)g_Create,8,NewProtect,&OldProtect);
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_Create,(void*)g_btOldBytes,sizeof(DWORD)*2,0);
VirtualProtect((void*)g_Create,8,OldProtect,&NewProtect);

FARPROC procTemp;
procTemp = (FARPROC)place; //place里面是EndScene()的函数地址。
(*procTemp)();

我是想让他执行完我的函数以后返回EndScene函数继续执行,就像没发生过一样,可是我这么一搞,魔兽界面就只剩下一个框了,里面是空的!我改怎么办啊?
...全文
1064 79 打赏 收藏 转发到动态 举报
写回复
用AI写文章
79 条回复
切换为时间正序
请发表友善的回复…
发表回复
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
哈哈,果然啊,终于成功了,感谢w_anthony ,等我做完了以后在开贴来谢你们!
w_anthony 2008-08-28
  • 打赏
  • 举报
回复
对了,这个procTemp也应该是void (__stdcall*)(void*)类型才是。
w_anthony 2008-08-28
  • 打赏
  • 举报
回复
对了,这个procTemp也应该是void (__stdcall*)()类型才是。
w_anthony 2008-08-28
  • 打赏
  • 举报
回复
不要用MessageBox,这会打乱BeginScene-EndScene-Present的流程,改用OutputDebugString输出。
而且调用原来的(*procTemp)(pThis)的时候要先把jmp还原回原来的代码。
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
不好意思,上面那段代码忘记加还原的那部分了,不过加了还是同样的效果!

DWORD OldProtect;
DWORD NewProtect;
NewProtect = PAGE_EXECUTE_READWRITE;

VirtualProtect((void*)place,8,NewProtect,&OldProtect);
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)place,
(void*)g_btOldBytes,sizeof(DWORD)*2,0);
VirtualProtect((void*)place,8,OldProtect,&NewProtect);

HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
虽然我的目的是要写屏,但是我还是想通过hook技术来写,毕竟这技术以后还有很大的用处。
Amuro1987218 2008-08-28
  • 打赏
  • 举报
回复
裸函数协议在外挂程序里应用很频繁的,d2hackmap里处处可见.
为了写屏而hook的话更好的建议是找到游戏自身的写屏CALL,可以以同样的风格写屏
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
To w_anthony :
按你的方法我也试了一下,一下是我的代码:

void __stdcall HookEndSceneTwo(void *pThis)
{
HWND hWnd = FindWindow("Warcraft III",NULL);
RECT rect = {10,10,100,100};
ExtTextOut(GetDC(hWnd),10,10,0,&rect,"你好",4,0);

MessageBox(0,"成功!","提示",0);
LPFN_HOOKPROC procTemp;
procTemp = (LPFN_HOOKPROC)place;
(*procTemp)(pThis);
}

这段是我的代码,如果可以成功的应该在给出了一个“成功”提示后继续执行,可是他在给出成功提示后又包了上面的错误了!
rageliu 2008-08-28
  • 打赏
  • 举报
回复
哈哈,看了这个帖把我happy坏了,原来vc版还是有几个汇编也8错的兄弟的,对函数 对象 等等的底层点的运行原理理解的挺帅
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
To w_anthony :
很有道理!我试试看一下!
w_anthony 2008-08-28
  • 打赏
  • 举报
回复
哪那么麻烦,void __stdcall hookproc(void* pThis),这个就是hookproc最正确的原型,__stdcall的this用堆栈传递,这样就可以了。
To LZ,你jmp过来确实没有push,但是魔兽本身调用的时候push过了,你放心。
To lake_cx,inlineHook做jmp的时候,原先函数push ebp, mov ebp, esp, add esp, xx,这些动作它还没有机会做,而在hookproc里面的时候,即使做过这些动作了,但是编译器编译的时候pThis就是ebp + xx,绝对没有问题。
rageliu 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 HSxuguangxing 的回复:]
ebp一般是堆栈的基址,如果我naked声明后是不是意味着【ebp+8】便存放着我要的指针呢?
[/Quote]

HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
ebp一般是堆栈的基址,如果我naked声明后是不是意味着【ebp+8】便存放着我要的指针呢?
rageliu 2008-08-28
  • 打赏
  • 举报
回复
楼上的意思,就是去掉函数一般的入口模式push ebp; mov ebp,esp;...
lake_cx 2008-08-28
  • 打赏
  • 举报
回复
直接用魔兽调用pD3DDev->EndSecen时压入的参数,所以要用naked声明,不然this参数就不正确了
rageliu 2008-08-28
  • 打赏
  • 举报
回复
做了hook,不用处理ecx来处理this,你的替代函数里面不是有参数直接就是指针了吗,直接用
rageliu 2008-08-28
  • 打赏
  • 举报
回复
this指针,一般是通过ecx传递的

__asm mov pThis, ecx
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
莫非要我直接

DWORD* pThis
__asm
{
mov pThis,ebp
}

可以这么搞吗?
HSxuguangxing 2008-08-28
  • 打赏
  • 举报
回复
我还是不清楚该如何得到当时的this指针,inlinehook是直接修改头几个字节跳转到我的函数,没有任何参数啊。你发的那段代码在我的vs2005上没有通过,而lake_cx是直接在hookproc里面加一个参数,可是一般来说在汇编里面__stdcall函数传递参数是先push到堆栈,我直接用jmp语句给跳转过来没有push任何参数,难道是要我直接取堆栈里面的最后一个值?
w_anthony 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 lake_cx 的回复:]
inline Hook中hookproc要用naked声明,因为默认方法会把ESP、EBP压栈,导致你拿不到堆栈中的参数(也就是this)
[/Quote]

这个倒不用担心,void hookproc(void* pThis),不管它把esp和ebp怎么改,这个pThis它都会用ebp好好存着。
加载更多回复(59)

16,466

社区成员

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

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

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