//
dllmain.cpp : 定义 DLL 应用程序的入口点。
HHOOK g_hHook = NULL;
HMODULE g_hDll = 0;
typedef BOOL (WINAPI *pfnDeleteFileW)(LPCWSTR lpFileName);
typedef BOOL (WINAPI *pfnDeleteFileA)(LPCSTR lpFileName);
pfnDeleteFileW realDeleteFileW = DeleteFileW;
pfnDeleteFileA realDeleteFileA = DeleteFileA;
BOOL WINAPI MyDeleteFileA(LPCSTR lpFileName)
{
MessageBox(NULL, lpFileName,
"In MyDeleteFileA"
, 0);
return
FALSE;
}
BOOL WINAPI MyDeleteFileW(LPCWSTR lpFileName)
{
MessageBoxW(NULL, lpFileName, L
"In MyDeleteFileW"
, 0);
return
FALSE;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case
DLL_PROCESS_ATTACH:
g_hDll = hModule;
Mhook_SetHook((PVOID*)&realDeleteFileA, MyDeleteFileA);
Mhook_SetHook((PVOID*)&realDeleteFileW, MyDeleteFileW);
break
;
case
DLL_THREAD_ATTACH:
break
;
case
DLL_THREAD_DETACH:
break
;
case
DLL_PROCESS_DETACH:
Mhook_Unhook((PVOID*)&realDeleteFileA);
Mhook_Unhook((PVOID*)&realDeleteFileW);
break
;
}
return
TRUE;
}
LRESULT CALLBACK GlobalCBTHook(int nCode, WPARAM w, LPARAM l)
{
if
(g_hHook)
{
return
CallNextHookEx(g_hHook, nCode, w, l);
}
return
0;
}
BOOL WINAPI InstallGlobalHook()
{
g_hHook = SetWindowsHookEx(WH_CBT, GlobalCBTHook, g_hDll, 0);
return
g_hHook==NULL?FALSE:TRUE;
}
void WINAPI UninstallGlobalHook()
{
if
(g_hHook)
{
UnhookWindowsHookEx(g_hHook);
}
}
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_hDll;
wcex.hIcon = LoadIcon(NULL, IDI_INFORMATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszClassName =
"DeleteHook"
;
if
(!RegisterClassExA(&wcex))
{
break
;
}
HWND hWnd = CreateWindowExA(0,
"DeleteHook"
, NULL, WS_OVERLAPPEDWINDOW,
0, 0, 50, 50, NULL, NULL, g_hDll, NULL);
if
(!IsWindow(hWnd))
{
break
;
}
UpdateWindow(hWnd);
MSG msg;
while
(GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
while
(FALSE);
}
//
导出函数
void WINAPI EnterInjectMode()
{
if
(!InstallGlobalHook())
{
MessageBox(0,
"InstallGlobalHook FAIL"
,
""
, 0);
return
;
}
char szExe[MAX_PATH+1] = {0};
char szPath[MAX_PATH+1] = {0};
GetModuleFileName(NULL, szPath, MAX_PATH);
strcpy(szExe, strrchr(szPath,
'\\'
)+1);
if
(!strcmpi(szExe,
"rundll32.exe"
))
EnterMessageLoop();
}