能力值:
( LV2,RANK:10 )
|
-
-
2 楼
还是我的理解有问题???HOOK程序自身倒是可以的。(这似乎意义不大) 为什么HOOK另外一个程序就崩溃掉了呢??代码几乎完全一样啊!!!请高手指点下。。或者是我哪里理解不对??
解决这问题后就放全部代码
|
能力值:
( LV9,RANK:250 )
|
-
-
3 楼
用DLL实现
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
return ((PFNMESSAGEBOX)g_orgProc)(hWnd, _T("New func"), _T("HookDemo"), uType);
中的g_orgProc未看见其定义
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
LZ,最近我也在学习hook api,你这是IAT hook吧,要想hook其他进程的MessageBox,必须将函数放入DLL并载入其他进程,这样才不会出现进程空间的边界问题吧
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
为什么HOOK其他程序就会出错呢?
答:因为你给定的MyMessageBox地址是属于本程序进程的地址空间,而在其他进程的地址空间里该位置数据未知,故而可能导致程序崩溃啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
6楼,我的目标程序也是我写的。。。该位置数据我是直接输出的,,换言之,地址是不太可能有问题的。。。
给定的地址当然是目标程序的地址,,
|
能力值:
( LV9,RANK:490 )
|
-
-
8 楼
能否把你的两个程序发上来瞧瞧
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
刚发现个BUG,,我再调下看看。。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
我贴下完整的代码吧。。
目标程序代码如下
如果执行BUTTON3 则可以成功HOOK掉Button1,但是如果用其他程序就不行。
void Cdlg1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
::MessageBoxW(NULL, _T("I am dlg1"), _T("hello"), 0);
}
PROC g_orgProc = (PROC)MessageBoxW;
typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCWSTR, LPCWSTR, UINT uType);
int WINAPI MyMessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
return ((PFNMESSAGEBOX)g_orgProc)(hWnd, _T("New func dlg1"), _T("HookDemo dlg1"), uType);
}
void ShowError()
{
DWORD dwError = GetLastError();
LPVOID lpMsgBuf;
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
void Cdlg1Dlg::OnBnClickedButton3()
{
DWORD *lpAddr ;
lpAddr =(DWORD *) 0x00421BD0;
DWORD dwOldProtect;
VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
DWORD* lpNewProc = (DWORD*)MyMessageBox;
if(::WriteProcessMemory(::GetCurrentProcess(),
lpAddr, &lpNewProc, sizeof(DWORD), NULL))
{
}
else
{
ShowError();
}
VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);
}
HOOK程序代码如下。
hMyHandle = GetSpecialWindow(_T("dlg1"));//此函数获取目标程序句柄,(确保正确的)
ShowError();
DWORD *lpAddr ;
lpAddr =(DWORD *) 0x00421BD0;
DWORD dwOldProtect;
VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
DWORD* lpNewProc = (DWORD*)MyMessageBox;
if(::WriteProcessMemory(hMyHandle,
(LPVOID)lpAddr, &lpNewProc, sizeof(DWORD), NULL))
{
cout<<"WriteProcessMemory ok"<<endl;
}
else
{
ShowError();
}
VirtualProtectEx(hMyHandle,lpAddr, sizeof(DWORD), dwOldProtect, 0);
cout<<"Set Hook Over"<<endl;
但是此时再按BUTTON1就崩掉啦!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
哪位高人稍微指点下原理??
|
能力值:
( LV9,RANK:490 )
|
-
-
12 楼
HOOK中 lpNewProc 你是如何取得的?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
多谢老大提点。。。应该就是那个问题。。地址空间应该放在目标程序内。
|
能力值:
( LV9,RANK:610 )
|
-
-
14 楼
进程空间,基础啊基础~
|
能力值:
( LV5,RANK:60 )
|
-
-
15 楼
我汗,我不是说了你的那个函数的地址是有问题的吗,为什么我说的不信,人家高级会员说的你就信,不能这样啊
:
为什么HOOK其他程序就会出错呢?
答:因为你给定的MyMessageBox地址是属于本程序进程的地址空间,而在其他进程的地址空间里该位置数据未知,故而可能导致程序崩溃啊
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
呵呵。。我已经知道啦。。。呵呵。。也谢谢你拉。。。现在开始准备研究下一种HOOK了
|