帮我分析一下hook注入dll的源码

wyouken 2003-01-25 08:30:05
我在看《windows核心编程》中有个hook注入dll的源码
我对其中的一些不大懂
BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,PVOID fImpload)
{
switch (fdwReason){
case DLL_PROCESS_ATTACH://这些DLL_PRODESS_ATTACH 是什么意思呀
g_hinstDll=hinstDll;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return(true);
}
BOOL WINAPI SetHookThead(DWORD dwThreadId)
{
BOOL fok=false;
if(dwThreadId!=0)
{
g_dwThreadId=GetCurrentThreadId();
g_hhook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hinstDll,dwThreadId);
fok=(g_hhook!=NULL);
if(fok)
{ fok= PostThreadMessage(dwThreadId,WM_NULL,0,0);
}
}
else
{
fok=UnhookWindowsHookEx(g_hhook);
g_hhook=NULL;
}
return(fok);
}

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
static bool fFirstmir=true;
if(fFirstmir)
{
fFirstmir=false;
PostThreadMessage(g_dwThreadId,WM_NULL,0,0);
}
return(CallNextHookEx(g_hhook,nCode,wParam,lParam));
我不懂这个程序怎么加载dll到另一个进程里去的
我没发现一个函数呀 要是在nt/xp 中用一个函数
这里到底是怎么加入的呢


...全文
120 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2003-01-27
  • 打赏
  • 举报
回复
你用的是日志钩子,达不到目的的。用消息钩子。
wyouken 2003-01-27
  • 打赏
  • 举报
回复
我用用了keyboard hook
源码如下
hook.dll

//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include "kook2.h"
#include "kook2.cpp"//这两个是带vcl的
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
//----------------------------------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall SetHook(HWND,bool);
extern "C"__declspec(dllexport) void WriteLog(void);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
//-------------------------------------
void WriteLog(void)
{
Form1->Show();//这是一个带vcl的dll
}
//--------------------
HINSTANCE hInstance; // 应用实例句柄
HWND hWndMain; // MainForm句柄
HHOOK hKeyHook; // HOOK句柄
DWORD ThreadProcessId;
//------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ hInstance=hinst; return 1; }
//---------------------------------------------------------------------------
void __stdcall SetHook(HWND hMainWin,bool nCode)
{
ThreadProcessId =GetWindowThreadProcessId(WndHandle,NULL);
if(nCode) // 安放HOOK
{

hKeyHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,
hInstance,ThreadProcessId);
}
else // 卸下HOOK
UnhookWindowsHookEx(hKeyHook);
}
//----------------------------------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{

if (nCode<0)
{
CallNextHookEx(hKeyHook, nCode, wParam, lParam);
return 0;
}
if ((lParam&0x80000000)==0) //有键被按下
{
if(GetAsyncKeyState(VK_F12)) WriteLog();
}
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}
//-----------------------------------------------------------------------------
下面是调用的tcaiv.exe
tcai.cpp

void __fastcall TForm1::FormCreate(TObject *Sender)
{
static HINSTANCE hDLL;
hDLL=LoadLibrary((LPCTSTR)"hook.dll");
if(hDLL==NULL)
{ ShowMessage("DLL: 不能加载!程序退出。"); exit(1); }
DLLSetHookThread=(DLLFUN)GetProcAddress(hDLL,"SetHook");
if(DLLSetHookThread==NULL)
{ ShowMessage("DLL: 函数没找到!程序退出。"); FreeLibrary(hDLL); exit(1); }
DLLSetHookThread(FindWindow(NULL,"软件"),0);

}
tcai.h
private:
typedef void __stdcall (*DLLFUN)(HWND,bool);
DLLFUN DLLSetHookThread;
可是没有实现加入
帮我看看我错在那里
chinayang 2003-01-27
  • 打赏
  • 举报
回复
用windows的消息处理可以很容易地把DLL插入到别的进程中.如mouse hook或者keyboard hook等..
wyouken 2003-01-27
  • 打赏
  • 举报
回复
我对消息钩子不明白 能不告诉我 我想一个我想加入的程序一运行 就加入dll
这种消息钩子我不懂
NOIR 2003-01-26
  • 打赏
  • 举报
回复
case DLL_PROCESS_ATTACH:是DLL的加载原应,这个是进程被创建时加载

DLL加载到另一个进程里去一般是用CreatRemoteTheard在另一个进程里开一个
LoadLibray的线程,然后用LoadLibray加载你的DLL

《windows核心编程》里有解释!!!
wyouken 2003-01-26
  • 打赏
  • 举报
回复
我还是有点糊涂 《windows核心编程》 中说的哪个例子我好象没看见LoadLibray
等函数呀 能不能帮我一下 把这个程序中到底在那里加入dll 我看得头都疼了
还有 这几个参数nCode,wParam,lParam 是怎么获得的 特别是ncode钩子号是什么回事
pj19811024 2003-01-26
  • 打赏
  • 举报
回复
你怎么进到别人的进程空间里去,你怎么让别人的程序调用你的DLL
NowCan 2003-01-26
  • 打赏
  • 举报
回复
GetWindowProcessThreadId

如果我想当 “菜鸟学习”运行就 进行加入用那种类型的钩子呢
个人认为还是要用消息钩子。
wyouken 2003-01-26
  • 打赏
  • 举报
回复
其实我是对这一部分有点迷糊
《核心编程》原文
”以使用挂钩将D L L插入进程的地址空间。为了使挂钩能够像它们在 1 6位Wi n d o w s中那样
工作,Microsoft不得不设计了一种方法,使得DLL能够插入另一个进程的地址空间中。
下面让我们来看一个例子。进程 A(类似Microsoft Spy++的一个实用程序)安装了一个挂
钩W N_GETMESSAGE,以便查看系统中的各个窗口处理的消息。该挂钩是通过调用下面的
SetWindowsHookEx函数来安装的
SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hinstDll,dwThreadId);
第一个参数W H _ G E T M E S S A G E用于指明要安装的挂钩的类型。第二个参数 G e t M s g P r o c用
于指明窗口准备处理一个消息时系统应该调用的函数的地址(在你的地址空间中)。第三个参
数hinstDll用于指明包含GetMsgProc函数的DLL。在Windows中,DLL的hinstDll的值用于标识
DLL被映射到的进程的地址空间中的虚拟内存地址最后一个参数 0用于指明要挂接的线程。
对于一个线程来说,它可以调用 SetWindowsHookEx函数,传递系统中的另一个线程的 ID。通
过为这个参数传递0,就告诉系统说,我们想要挂接系统中的所有 G U I线“
这里第三个参数我用
HWND hwndcai1;
hwndcai1=FindWindow(NULL,"菜鸟学习");
dwThreadId=?????,0);//我是想把dll加入hwndcai的线程中去这个参数用什么函数获得
还有我想是对hook的理解有点问题 如果我想当 “菜鸟学习”运行就 进行加入用那种类型的钩子呢
我再去看看钩子 谢谢 麻烦你们那


NowCan 2003-01-26
  • 打赏
  • 举报
回复
可是我的想法是用这个dll来在另一个进程中加入另一个dll
这种情况怎么办哪 我知道在在w2k和nt下可以实现三级跳 可是在98下我就不明白了
方法一样的,另外你怎么看的《核心编程》?他又没讲怎么实现三级跳。
NowCan 2003-01-26
  • 打赏
  • 举报
回复
第一个dll使用钩子进入到别的进程里的,第二个dll是第一个dll用LoadLibrary加载到第一个dll所在进程的。
wyouken 2003-01-26
  • 打赏
  • 举报
回复
可是我的想法是用这个dll来在另一个进程中加入另一个dll
这种情况怎么办哪 我知道在在w2k和nt下可以实现三级跳 可是在98下我就不明白了
NOIR 2003-01-26
  • 打赏
  • 举报
回复
恩,怎么说呢???

CallNextHookEx(g_hhook,//当前挂钩的句柄
nCode,//挂钩处理过程的挂钩代码,下以个挂钩用此代码决定
//如何处理消息
wParam,//挂钩消息
lParam));//挂钩消息
这些参数都是系统自动传递的

还有就是你的这段就是一个DLL的代码啊!!
你要做的是写一个函数来调用你的这个DLL

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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