您好,欢迎访问三七文档
DLLInjection使用SetWindowsHookEx来设定HookfunctionHHOOKhHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,0);当有任何message被post过来,就会呼叫我们的拦截程序我们指定的拦截程序代码(Hookprocedure)包含拦截function的DLL指定要Monitor所有的thread指定hook的形式WH_CALLWNDPROC:设定当目标收到Message之前,呼叫你的functionWH_CALLWNDPROCRET:当目标已经把Message处理完,呼叫你的function可以设定的值(部分)参考MSDNz系统如何应对SetWindowsHookEx?BOOLWINAPISetDIPSHook(DWORDdwThreadId){//安装hookfunctionGetMsgProc到指定的threadHHOOKhHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,\dwThreadId);}Step1:ProcessBSend一个message给一个窗口处理Step2:系统检查是否有WH_GETMESSAGE拦截被安装Step3:系统检查GetMsgProc是否被映射到ProcessB的地址空间中Step4:载入包含GetMsgProc的DLL并递增DLLcounterStep5:1.呼叫GetMsgProc()2.再度递增DLLcounter返回时,递减DLLcounterWhy?防止ProcessB在执行GetMsgProc时,有其他thread呼叫UnhookWindowsHookEx,导致DLLUnMap把GetMsgProc安装到目标process中01120解除Hook•BOOLUnhookWindowsHookEx(HHOOKhhook);Step1:找出系统中,所有被注入该DLL的processStep2:递减那些process对DLL的referencecounter范例程序:新版本操控程序:SetMouseMessageHook呼叫SetHook(dwThreadID);DLL挂钩程序:MouseProcLibrary.dllMyHook_MouseProc();SetHook(dwThreadID)实作鼠标讯息挂钩程序安装挂钩目标窗口:TargetWindowwhile(GetMessage(…)){…}Message-loop只要鼠标有动作,就会先呼叫挂钩安装挂钩到指定的thread范例程序•将桌面的icon位置存起来•将桌面的icon位置读回来SimpleDIP.cppProgmanProgramManager到底是谁在管理桌面?spy拉到最后一项修正WinAPIWINMAIN(…){…SetDIPSHook…}SetDIPSHook{SetWindowsHookEx(…)}Explorer相关的程序代码(SysListView32)SetDIPSHook{SetWindowsHookEx(…)}GetMsgProc(){}GetMsgProc(){}1载入DLPSLIB.dll(寄生程序)DLPSLIB.dllDLPSLIB.dll2建立隐藏的dialog34通知注射完成(Message)5要求处理事情存取资料6先看看架构:总共有三个档案互动SimpleDIP.exe目标process隐藏的dialog设定要将GetMsgProc()注射进目标ProcessPostMessage给process以启动目标Process呼叫GetMsgProc();开始写程序喽!!123加入resource修改ID=IDC_SAVE修改ID=IDC_RESTORE12修改ID=IDD_DIALOG1加入MessageHandle#includeWindows.h//Windows程序必要的头文件#includeWindowsX.h#includeresource.h//对应到你刚刚建立的Dialogtemplate#includetchar.h//forTCHAR字符intWINAPI_tWinMain(..){TCHARcWhatToDo;switch(DialogBox(hinstExe,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Dlg_Proc)){caseIDC_SAVE:cWhatToDo=TEXT('S');break;caseIDC_RESTORE:cWhatToDo=TEXT('R');break;}}Step1:建立一个Dialog让使用者选择是否要将[桌面的icon]位置存起来自定义的Dialog讯息处理函式(见下页)窗口主程序{MessageHandlefunction的prototype片段方便宏定义的片段…}将传回用户按键的选项当用户按下按钮时//Dialog的讯息处理主要函式BOOLWINAPIDlg_Proc(HWNDhwnd,UINTuMsg,…){switch(uMsg){chHANDLE_DLGMSG(hwnd,WM_COMMAND,Dlg_OnCommand);}return(FALSE);}//方便宏chHANDLE_DLGMSG定义//利用SetDlgMsgResult将Dialog的message导向指定的//function#definechHANDLE_DLGMSG(hwnd,message,fn)case(message):return(SetDlgMsgResult(hwnd,uMsg,\HANDLE_##message((hwnd),(wParam),(lParam),(fn))))voidDlg_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,…){switch(id){caseIDC_SAVE:caseIDC_RESTORE:EndDialog(hwnd,id);break;}}当用户按下按钮后,destroysthemodalDialogbox程序藉由id判断到底是哪一个按钮被按下休息一下•你可以把Dialog架框建好将寄生的DLL程序注入指定的processintWINAPI_tWinMain(..){//Step1:建立窗口,读取使用者的需求TCHARcWhatToDo;switch(DialogBox(hinstExe,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Dlg_Proc)){caseIDC_SAVE:cWhatToDo=TEXT('S');break;caseIDC_RESTORE:cWhatToDo=TEXT('R');break;}//Step2~6:处理与操纵寄生的DLLfunction}注入的寄生程序写在下面//Step2:取得桌面管理程序(ProgMan)HWNDhwndLV=GetFirstChild(GetFirstChild(FindWindow(TEXT(Progman),NULL)));//Step3:将DIPLib.dll注射到Explorer's地址空间SetDIPSHook(GetWindowThreadProcessId(hwndLV,NULL));//Step4:等待寄生程序的响应MSGmsg;GetMessage(&msg,NULL,0,0);//Step5:因为寄生程序会建立一个隐藏的窗口RichterDIPS123//我们将利用这个窗口,操控寄生程序HWNDhwndDIPS=FindWindow(NULL,TEXT(RichterDIPS123));SendMessage(hwndDIPS,WM_APP,(WPARAM)hwndLV,(cWhatToDo==TEXT('S')));//Step6:操作完成,移除寄生程序SendMessage(hwndDIPS,WM_CLOSE,0,0);SetDIPSHook(0);也可以用KernelObject做同步,这里使用Message这是DIPLib.dll中的一个functionSysListView32LinkDLLWinAPIWINMAIN(…){…SetDIPSHook…}SetDIPSHook{SetWindowsHookEx(…)}Explorer相关的程序代码(SysListView32)SetDIPSHook{SetWindowsHookEx(…)}GetMsgProc(){}GetMsgProc(){}1载入DLPSLIB.dll(寄生程序)DLPSLIB.dllDLPSLIB.dll2建立隐藏的dialog34通知注射完成(Message)5要求处理事情存取资料6互动流程SimpleDIP.exe设定要将GetMsgProc()注射进目标ProcessPostMessage给process以启动目标Process呼叫GetMsgProc();互动流程BOOLWINAPISetDIPSHook(DWORDdwThreadId){//安装hookfunctionGetMsgProc到指定的threadSetWindowsHookEx(…,GetMsgProc,…,dwThreadId);}Expoler.exethreadidExpoler的窗口处理thread会载入DIPSLib.dllHookfunction已经存在于Expoler的addressspace呼叫Hookfunction,GetMsgProcExploerprocess引发的一连串动作寄生在Expoler的FunctionSetDIPSHook的部分//[设定/解除]寄生DLL//dwThreadId==0则解除BOOLWINAPISetDIPSHook(DWORDdwThreadId){BOOLfOk=FALSE;if(dwThreadId!=0){//Step1://将我们的threadID存起来,以便当serverwindow被建立起来时,//GetMsgProc可以postamessage回来g_dwThreadIdDIPS=GetCurrentThreadId();//Step2:g_hhook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,g_hinstDll,dwThreadId);fOk=(g_hhook!=NULL);if(fOk){//Step3:fOk=PostThreadMessage(dwThreadId,WM_NULL,0,0);}}else{//当dwThreadId==0时,表示我们要移除hook了fOk=UnhookWindowsHookEx(g_hhook);g_hhook=NULL;}return(fOk);}随便送一个nooperationmessage,WM_NULL给指定的thread,以便启动我们的hookfunction,GetMsgProc将hookfunctionGetMsgProc安装到指定的thread中监控端的thread目标thread要注入的function(见下页)也就是要被注射的DLLLRESULTWINAPIGetMsgProc(intnCode,WPARAMwParam,LPARAMlParam){staticBOOLfFirstTime=TRUE;if(fFirstTime){//TheDLLjustgotinjected.fFirstTime=FALSE;//Step1:建立一个Dialog用来处理client的request//所有送到这个dialogmessage都会交给Dlg_Proc管理//目前这个Dialog的title=RichterDIPS123CreateDialog(g_hinstDll,MAKEINTRESOURCE(IDD_DIPS),NULL,Dlg_Proc)
本文标题:dll注入
链接地址:https://www.777doc.com/doc-3508496 .html