c语言hook作用,C++/C语言中的钩子(Winsock)应用

我有一个(旧的)应用程序调用winsocket函数:

struct hostent* FAR gethostbyname(

__in const char *name

);

它当前将其导入为

WS32_动态链接库。52

而是正常的名字调用。

我的目的只是在主机搜索发生时(应该在应用程序启动时)打开一个消息框。

我试图创建一个C++DLL,用注释52指向Apple DIR并将其放到App DIR(包括一个“exe。本地”和“exe。清单”文件中试图重定向它),但是它加载了C:\Windows \Stase32。

之后,我创建了一个C项目,启动进程本身(因此从进程对象中获取PID),并将easyhook dll添加到它中。

将呼叫更改为:

FileMon.FileMonInterface Interface;

LocalHook CreateFileHook;

Stack Queue = new Stack();

public Main(

RemoteHooking.IContext InContext,

String InChannelName)

{

// connect to host...

Interface =

RemoteHooking.IpcConnectClient(InChannelName);

}

public void Run(

RemoteHooking.IContext InContext,

String InChannelName)

{

// install hook...

try

{

CreateFileHook = LocalHook.Create(

LocalHook.GetProcAddress("ws2_32.dll", "gethostbyname"),

new DCreateFile(GetHostByName_Hooked),

this);

CreateFileHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });

}

catch (Exception ExtInfo)

{

Interface.ReportException(ExtInfo);

return;

}

Interface.IsInstalled(RemoteHooking.GetCurrentProcessId());

// wait for host process termination...

try

{

while (true)

{

Thread.Sleep(500);

// transmit newly monitored file accesses...

if (Queue.Count > 0)

{

String[] Package = null;

lock (Queue)

{

Package = Queue.ToArray();

Queue.Clear();

}

Interface.OnCreateFile(RemoteHooking.GetCurrentProcessId(), Package);

}

else

Interface.Ping();

}

}

catch

{

// NET Remoting will raise an exception if host is unreachable

}

}

[UnmanagedFunctionPointer(CallingConvention.StdCall,

CharSet = CharSet.Auto,

SetLastError = true)]

delegate IntPtr DGetHostByName(

String name);

// just use a P-Invoke implementation to get native API access

// from C# (this step is not necessary for C++.NET)

[DllImport("ws2_32.dll",

CharSet = CharSet.Auto,

SetLastError = true,

CallingConvention = CallingConvention.StdCall)]

static extern IntPtr gethostbyname(

String name);

// this is where we are intercepting all file accesses!

static IntPtr GetHostByName_Hooked(

String name)

{

try

{

Main This = (Main)HookRuntimeInfo.Callback;

MessageBox.Show("hi!");

}

catch

{

}

// call original API...

return GetHostByName(

name);

}

}

}

(可能在此处输入了错别字,但项目编译成功@home)。

问题是我不知道我需要做什么来连接这个方法应用程序本身。

我是说……还有什么方法可以让你只需要用c easyhook(假设应用程序是“foo.exe”)进行连接?

我需要为easyhook创建自定义dll吗?(在这种情况下,我需要在内部定义什么内容?)

我发现了一点……”复杂的“地狱世界的钩子,呵呵。

事先谢谢;)

目前最好的EasyHook的完整Demo程序,包括了Hook.dll动态库和Inject.exe注入程序。 Hook.dll动态库封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,操作起来非常的简便。 这个Demo的代码风格也非常的好,用VS2010成功稳定编译通过,非常值得下载使用。 部分代码片段摘录如下: //【Inject.exe注入程序的代码片段】 void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { ////////////////////////////////////////////////////////////////////////// //【得到进程ID值】 UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T("%s GetProcessID 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【得到DLL完整路径】 CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T("%s GetDllFilePath 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【注入DLL】 NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T("%s ShowStatusInfo 失败"), __FUNCTION__); return; } } //【Hook.dll动态库的代码片段】 extern "C" __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T("%s DylibMain 失败"), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T("kernel32"), "CreateFileW", (void*)CreateFileW_new}, {_T("kernel32"), "CreateFileA", (void*)CreateFileA_new}, {_T("kernel32"), "ReadFile", (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { /////////////////////////////////////////////////////////////// int nPos = 0; do { /////////////////////////////// FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (NULL == stFunctionOldNew->strModuleName) { break; } /////////////////////////////// if (!HookFunctionBySymbol(stFunctionOldNew->strModuleName, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T("%s HookFunctionBySymbol 失败"), __FUNCTION__); return FALSE; } } while(++nPos); /////////////////////////////////////////////////////////////// return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T("CreateFileW_new. lpFileName = %s"), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值