dll建立hook问题?

李雷 2008-01-21 09:39:33
dll建立hook问题?我把一个dll注入到了别的进程 我想在这个dll里 来设置一个全局hook或者hook一个目标进程 但是我在dll里写了hook 但是 没有反应啊 没有被hook住 但是我用一个exe调用这个dll 他就hook全局成功 难道dll里没办法 hook全局或者某个进程吗?是不是dll线程不是主线程的原因啊?

现在问 有什么方法可以 在被注入的dll里 申请个hook hook全局或者hook某个进程的 鼠标事件?
...全文
227 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linuxpgy 2008-06-10
  • 打赏
  • 举报
回复
你要的功能据我所知很难实现。 我刚刚想了一下,你可以试试如下方法:

DLL里要建立Hook,那么那个Hook fucntion需要在DLL里,但是因为你的dll是注入的,所以这个hook function 的地址不是固定的,所以,你需要自己去计算这个hook function 在目标进程中的地址,将其传递给SetWindowsHookEx函数,也许可以成功。

我没有试过,呵呵,自己去试试吧~
cba5796 2008-06-10
  • 打赏
  • 举报
回复
郁闷 没一个答案沾上边的
coolerhero 2008-05-30
  • 打赏
  • 举报
回复
你是想要远程注入你的DLL到别的进程里.

其实用SetWindowsHookEx安装鼠标钩子就行了

SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)MessageHook ,g_hinstDll ,processId )
goodwinds 2008-05-30
  • 打赏
  • 举报
回复
全局Hook 做一个DLL,在DLL中调用SetWindowsHookEx,安装好钩子。这个钩子就可以拦截到所有进程了。
cba5796 2008-05-23
  • 打赏
  • 举报
回复
兄弟 和我遇到一样的问题啦
有什麽进展告诉我一声啊
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
ethan119 2008-01-24
  • 打赏
  • 举报
回复
API HOOK 实现

源自:《Windows API 编程》 P182

实现目标:拦截API函数MessageBoxA();


DLL部分:

HHOOK g_hHook;
HINSTANCE g_hinstDll;
FARPROC pfMessageBoxA;
Int WINAPI MyMessageBoxA( HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType);
BYTE OldMessageBoxACode[5] , NewMessageBoxACode[5];
HMODULE hModule;
DWORD dwIdOld , dwIdNew;
BOOL bHook = false;
Void HookOn();
Void HookOff();
BOOL init();
LRESULT WINAPI MessageHook( int nCode , WPARAM wParam , LPARAM lParam);


BOOL APIENTRY DllMain( HANDLE hModule , DWORD ul_reason_for_call , LPVOID lpReserved)//DLL入口
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
if( !init() )//初始化
{
MessageBoxA( NULL , ”Init” , ”ERROR” , MB_OK );
return ( false );
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if( bHook) UnintallHook();//卸载钩子
break;
}
return TRUE;
}


LRESULT WINAPI Hook( int nCode , WPARAM wParam , LPARAM lParam );
{
return ( CallNextHookEx( g_hHook , nCode , wParam , lParam));
}


HOOKAPI2_API BOOL InstallHook()
{
g_hinstDll = LoadLibrary( “ApiHook.dll” );
g_hHook = SetWindowsHookEx( WH_GETMESSAGE , ( HOOKPROC ) MessageHook , g_hinstDll , 0 );
if ( !g_hHOOK )
{
MessageBoxA( NULL , “SET ERROR” , “ERROR” , MB_OK );
return ( false );
}
return ( ture );
}


HOOKAPI2_API BOOL UninstallHook()
{
return ( UnHookWindowsHookEx(g_hHook) );
}


BOOL init()
{
hModule = LoadLibrary ( “user32.dll” );
pfMessageBoxA = GetProcAddress( hModule , “MessageBoxA” );
if( pfMessageBoxA == NULL )
return false;
_asm
{
lea edi,OldMessageBoxACOde
mov esi,pfMessageBoxA
cld
movsd
movsb
}
NewMessageBoxACode [0] = 0xe9;
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}
dwIdNew = GetCurrentProcessId();
dwIdOld = dwIdNew;
HookOn();
return ( true );
}


int WINAPI MyMessageBoxA ( HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType )
{
int nReturn=0;
HookOff();
nReturn = MessageBoxA ( hWnd, “Hook”, lpCaption, uType );
HookOn();
return ( nReturn );
}


void HookOn()
{
HANDLE hProc;
dwIdOld = dwIdNew;
hProc = OpenProcess ( PROCESS_ALL_ACCESS , 0 , dwIdOld );
VirtualProtectEx( hProc , pfMessageBoxA, 5, PAGE_READWRITE, &dwIdOld );
WriteProcessMemory( hProc, pfMessageBoxA, 5, NewMessageBoxACode, 5, 0 );
VirtualProtectEx( hProc, pfMessageBoxA, 5, dwIdOld, &dwIdOld );
bHook = true;
}


void HookOff()
{
HANDLE hProc;
dwIdOld =dwIdNew;
hProc = OpenProcess (PROCESS_ALL_ACCESS, 0,dwIdOld );
VirtualProtectEx(hProc, pfMessageBoxA,5,PAGE_READWRITE, &dwIdOld );
WriteProcessMemory( hProc, pfMessageBoxA, OldMessageBoxACode,5,0);
VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);
bHook = false;
}




测试EXE部分


int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevIndtance, LPDTR lpCmdLine, int nCmdShow )
{
if( !InstallHook())
{
MessageBoxA(NULL, “Hook Error!”, “Hook”,MB_OK);
return 1;
}
MessageBoxA(NULL, “TEST”, “TEST” ,MB_OK );
if(!UninstallHook())
{
MessageBoxA(NULL, “Uninstall Error!”, “Hook”, MB_OK);
return 1;
}
return 0;
}
ethan119 2008-01-24
  • 打赏
  • 举报
回复
API HOOK 实现

源自:《Windows API 编程》 P182

实现目标:拦截API函数MessageBoxA();


DLL部分:

HHOOK g_hHook;
HINSTANCE g_hinstDll;
FARPROC pfMessageBoxA;
Int WINAPI MyMessageBoxA( HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType);
BYTE OldMessageBoxACode[5] , NewMessageBoxACode[5];
HMODULE hModule;
DWORD dwIdOld , dwIdNew;
BOOL bHook = false;
Void HookOn();
Void HookOff();
BOOL init();
LRESULT WINAPI MessageHook( int nCode , WPARAM wParam , LPARAM lParam);


BOOL APIENTRY DllMain( HANDLE hModule , DWORD ul_reason_for_call , LPVOID lpReserved)//DLL入口
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
if( !init() )//初始化
{
MessageBoxA( NULL , ”Init” , ”ERROR” , MB_OK );
return ( false );
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if( bHook) UnintallHook();//卸载钩子
break;
}
return TRUE;
}


LRESULT WINAPI Hook( int nCode , WPARAM wParam , LPARAM lParam );
{
return ( CallNextHookEx( g_hHook , nCode , wParam , lParam));
}


HOOKAPI2_API BOOL InstallHook()
{
g_hinstDll = LoadLibrary( “ApiHook.dll” );
g_hHook = SetWindowsHookEx( WH_GETMESSAGE , ( HOOKPROC ) MessageHook , g_hinstDll , 0 );
if ( !g_hHOOK )
{
MessageBoxA( NULL , “SET ERROR” , “ERROR” , MB_OK );
return ( false );
}
return ( ture );
}


HOOKAPI2_API BOOL UninstallHook()
{
return ( UnHookWindowsHookEx(g_hHook) );
}


BOOL init()
{
hModule = LoadLibrary ( “user32.dll” );
pfMessageBoxA = GetProcAddress( hModule , “MessageBoxA” );
if( pfMessageBoxA == NULL )
return false;
_asm
{
lea edi,OldMessageBoxACOde
mov esi,pfMessageBoxA
cld
movsd
movsb
}
NewMessageBoxACode [0] = 0xe9;
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}
dwIdNew = GetCurrentProcessId();
dwIdOld = dwIdNew;
HookOn();
return ( true );
}


int WINAPI MyMessageBoxA ( HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType )
{
int nReturn=0;
HookOff();
nReturn = MessageBoxA ( hWnd, “Hook”, lpCaption, uType );
HookOn();
return ( nReturn );
}


void HookOn()
{
HANDLE hProc;
dwIdOld = dwIdNew;
hProc = OpenProcess ( PROCESS_ALL_ACCESS , 0 , dwIdOld );
VirtualProtectEx( hProc , pfMessageBoxA, 5, PAGE_READWRITE, &dwIdOld );
WriteProcessMemory( hProc, pfMessageBoxA, 5, NewMessageBoxACode, 5, 0 );
VirtualProtectEx( hProc, pfMessageBoxA, 5, dwIdOld, &dwIdOld );
bHook = true;
}


void HookOff()
{
HANDLE hProc;
dwIdOld =dwIdNew;
hProc = OpenProcess (PROCESS_ALL_ACCESS, 0,dwIdOld );
VirtualProtectEx(hProc, pfMessageBoxA,5,PAGE_READWRITE, &dwIdOld );
WriteProcessMemory( hProc, pfMessageBoxA, OldMessageBoxACode,5,0);
VirtualProtectEx(hProc,pfMessageBoxA,5,dwIdOld,&dwIdOld);
bHook = false;
}




测试EXE部分


int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevIndtance, LPDTR lpCmdLine, int nCmdShow )
{
if( !InstallHook())
{
MessageBoxA(NULL, “Hook Error!”, “Hook”,MB_OK);
return 1;
}
MessageBoxA(NULL, “TEST”, “TEST” ,MB_OK );
if(!UninstallHook())
{
MessageBoxA(NULL, “Uninstall Error!”, “Hook”, MB_OK);
return 1;
}
return 0;
}
qq14923349 2008-01-22
  • 打赏
  • 举报
回复
hook用处?
cnzdgs 2008-01-21
  • 打赏
  • 举报
回复
你想Hook全局还是单个进程?
Hook全局用不找注入线程。做一个DLL,在DLL中调用SetWindowsHookEx,dwThreadId参数给0就行。
一、简介   AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook里面生成一个按钮,截获事件等等)。 二、使用   1.用 AheadLib 打开要模拟的 DLL,生成一个 CPP 文件。   2.用 Visual Studio 6.0/.NET 建立一个 DLL 工程,把这个 CPP 文件加入到项目中。   3.使用 Release 方式编译,生成的 DLL 将和原来的 DLL 具有一模一样的导出函数,并且能顺利把这些函数转发到原来的函数中。   4.AheadLib 还可以生成 Hook 代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注   1.如果导出函数过多,在 Visual Studio 6.0 中,如果出现编译错误,请在项目属性关闭与编译头功能。   2.如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。   3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)导出,且指定导出序号。   4.如果系统中没有 DbgHelp.dll,将无法识别 C++ 模式的导出。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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