• 安装全局消息钩子实现dll窗体程序注入


    说明{
         通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll,
    然后在入口处做处理就可以了。注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了。
    这个也可以传递不同的劫持类型来进行键盘按键记录等。
    }
    注意{
        1.dll注入期间注入程序不可以退出,否则dll内核句柄有可能被释放。
        2.注意32位和64位注入问题

    }

    DLL调用
    /*
    HMODULE h = LoadLibrary(L"xx.dll");
    _SetHook SetHook = (_SetHook)GetProcAddress(h,"SetHook");
    _UnHook UnHook = (_UnHook)GetProcAddress(h,"UnHook");
    
    SetHook();
    
    Sleep(10000);
    
    UnHook();
    
    CloseHandle(h);
    */
    

    //DLL相关代码
    
    #include <windows.h>
    #include <tlhelp32.h>
    #include <Psapi.h>
    #pragma comment(lib,"psapi.lib")
    
    #pragma data_seg("Yrrehs")
    HHOOK HT = NULL;
    #pragma data_seg()
    
    HINSTANCE DLLhinst = NULL;
    
    LRESULT CALLBACK CProc(int nCode,WPARAM wParam,LPARAM lParam){
    	return CallNextHookEx(HT,nCode,wParam,lParam);
    }
    
    //安装钩子
    extern "C" __declspec(dllexport) BOOL SetHook(){
    	HT = SetWindowsHookEx(WH_CALLWNDPROC,CProc,DLLhinst,0);
    	if(HT == NULL){
    		return false;
    	}
    	return true;
    }
    
    //卸载钩子
    extern "C" __declspec(dllexport) BOOL UnHook(){
    	BOOL HM_BOOL = FALSE;
    	if(HT != NULL){
    		HM_BOOL = UnhookWindowsHookEx(HT);
    	}
    	return HM_BOOL;
    }
    
    //获得进程名
    wchar_t* GetProcessName(DWORD processID){
    	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,processID);
    	wchar_t *procName = new wchar_t[MAX_PATH];
    	GetModuleFileNameEx(hProcess,NULL,procName,MAX_PATH);
    	CloseHandle(hProcess);
    	return procName;
    }
    
    //获得进程名
    wchar_t* GetProcessName(wchar_t *FileName){
    	size_t len = wcslen(FileName);
    	size_t i = len-1;
    	for(;i>=0;i--){
    		if(FileName[i] == L'\'){
    			break;
    		}
    	}
    	wchar_t *temp = FileName + i + 1;
    	return temp;
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReserved){
    	DLLhinst = hinstDll;
    	if(DLL_PROCESS_ATTACH == fdwReason){
    		wchar_t *procName = GetProcessName(GetCurrentProcessId());
    		if(_wcsicmp(L"xxx.exe",GetProcessName(procName))==0){
    			//XXXXXX
    		}
    	}
    	if(DLL_PROCESS_DETACH == fdwReason){
    
    	}
    	return TRUE;
    }


  • 相关阅读:
    线程池
    单例设计模式
    String,StringBuffer,StringBuilder
    马踏棋盘算法
    最短路径问题 (迪杰斯特拉算法,弗洛伊德算法)
    最小生成树 修路问题(普里姆算法,克鲁斯卡尔算法)
    贪心算法 求解集合覆盖问题
    Stream 数组转换
    unittest与pytest对比
    条件编译
  • 原文地址:https://www.cnblogs.com/csnd/p/12062209.html
Copyright © 2020-2023  润新知