想通过Hook Com IFileOperation中的复制,剪切函数,实现在WIN7系统下

结帖率 0%
回复于 2012-08-08 16:34:26  #1 得分:0
这是我DLL模块中的另外一个源文件:
//main.cpp
#include <windows.h>
#include "ifileophook.h"
#define IEQUALW(str1, str2) (str1 && str2 && (0 == wcsicmp(str1, str2)))
#pragma warning(disable:4996)
#pragma comment(linker, "/Section:.shared,RWS")
#pragma data_seg(".shared")
HHOOK g_oldHook = NULL; // CallNextHook
#pragma data_seg()
HMODULE g_hThisModule = 0; // 本模块句柄
static BOOL gs_bHooked = FALSE; // 是否HOOK
BOOL WINAPI IsProcessW(LPCWSTR procName)
{
wchar_t path[MAX_PATH] = {0};
GetModuleFileNameW(0, path, MAX_PATH);
wchar_t* tmp = (wchar_t*)wcsrchr(path, L'\\');
if(!tmp)
{
WriteLog("tmp is null and path:%s", path);
return FALSE;
}
tmp++;
return IEQUALW(tmp, procName);
}
void OnLoadDll()
{
if(IsProcessW(L"explorer.exe"))
{
WriteLog("IsProcessW(explorer.exe) success");
OutputDebugStringA("HOOK explorer.exe 的 IFileOperation");
gs_bHooked = HookIFileOp();
}
}
void OnFreeDll()
{
if(gs_bHooked)
{
OutputDebugStringA("解 explorer.exe 的HOOK");
UnhookIFileOp();
}
}
BOOL APIENTRY DllMain(HANDLE handle, DWORD dwReason, LPVOID reserved)
{
g_hThisModule = (HMODULE)handle;
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
{
DisableThreadLibraryCalls(g_hThisModule);
OnLoadDll();
break;
}
case DLL_PROCESS_DETACH:
{
OnFreeDll();
break;
}
}
return TRUE;
}
LRESULT CALLBACK GlobalCBTHook(int nCode, WPARAM w, LPARAM l)
{
if(g_oldHook)
{
return CallNextHookEx(g_oldHook, nCode, w, l);
}
return 0;
}
BOOL WINAPI InstallGlobalHook()
{
g_oldHook = SetWindowsHookEx(WH_CBT, GlobalCBTHook, g_hThisModule, 0);
return TRUE;
}
void WINAPI UninstallGlobalHook()
{
if(g_oldHook)
{
UnhookWindowsHookEx(g_oldHook);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM w, LPARAM l)
{
if(WM_DESTROY == msg)
{
PostQuitMessage(0);
}
return DefWindowProcA(hWnd, msg, w, l);
}
void WINAPI EnterMessageLoop()
{
do
{
WNDCLASSEXA wcex = {sizeof(wcex)};
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = g_hThisModule;
wcex.hIcon = LoadIcon(NULL, IDI_INFORMATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszClassName = "proclimitwnd";
if(!RegisterClassExA(&wcex))
{
break;
}
HWND hWnd = CreateWindowExA(0, "proclimitwnd", NULL, WS_OVERLAPPEDWINDOW,
0, 0, 50, 50, NULL, NULL, g_hThisModule, NULL);
if(!IsWindow(hWnd))
{
break;
}
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
} while (FALSE);
}
// 进入注入模式
__declspec(dllexport) void WINAPI EnterInjectMode()
{
if(!InstallGlobalHook())
{
return;
}
if(IsProcessW(L"rundll32.exe"))
{
EnterMessageLoop();
}
}
0  0
引用  ・  举报  ・  管理
结帖率 0%
回复于 2012-08-08 16:36:11  #2 得分:0
上面的DLL程序,编译一切正常,最后生成了fotracker.dll文件 。

这是我的EXE程序的代码:
#include "stdafx.h"
#include <Windows.h>
#include <atlstr.h>
typedef void (WINAPI *HOOKAPI)();
HINSTANCE hHookDllL;
HOOKAPI  m_hookProc;
int _tmain(int argc, _TCHAR* argv[])
{
//安装钩子
hHookDllL = LoadLibraryA("fotracker.dll");
m_hookProc = (HOOKAPI)GetProcAddress(hHookDllL,"EnterInjectMode"); //get pointer of proc
if (!m_hookProc)
{
CString str;
str.Format(_T("GetProcAddress(InstallHookProc) FAILED! ErrorCode: %d"),GetLastError());
OutputDebugString(str);
}
else
{
m_hookProc();
MessageBox(NULL, _T("安装钩子成功!"), _T("操作提示"), 0);
//卸载钩子
if(hHookDllL)
{
FreeLibrary(hHookDllL);
hHookDllL = NULL;
}
}
return 0;
}
0  0
引用  ・  举报  ・  管理
结帖率 0%
回复于 2012-08-08 16:42:06  #3 得分:0
现在我遇到的问题是,当我的EXE执行
m_hookProc();
MessageBox(NULL, _T("安装钩子成功!"), _T("操作提示"), 0);
执行这代码后,设置断点,这是我在电脑中,做些复制,剪切的操作,可是我的日志文件里没有这些相关日志,只有OnLoadDll();执行后的几条日志,


if(IsProcessW(L"explorer.exe"))
{
   WriteLog("IsProcessW(explorer.exe) success");
   OutputDebugStringA("HOOK explorer.exe 的 IFileOperation");
   gs_bHooked = HookIFileOp();
}

也就是执行到IsProcessW(L"explorer.exe"),执行该函数后,条件不成立,程序就退出了,而且该函数只执行了3次。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值