如何让指定 Windows 程序崩溃

一、为何要把人家搞崩溃呢

看到这个标题,大家可能觉得奇怪,为什么要让指定程序崩溃呢,难道是想作恶吗?😓

哈哈,绝对不是,真实原因是这样的。如果大家用过 Windows 电脑,可能见过类似下面这样的软件崩溃提示框。

QQ
微信
迅雷
WPS​​​
百度网盘
百度如流

Windows 上软件通常会做一个崩溃捕捉的功能。在软件发生崩溃时,弹出个友好的提示框,先道个歉(的确是自己错了嘛,对吧),然后提示框关闭的时候,还会主动帮用户重启软件,多贴心。同时,也会将一些崩溃信息上传到服务端,服务端对这些崩溃进行分类,然后按照崩溃数目对崩溃类型进行排序,最后开发人员按顺序修复。因此,当我们开发、测试崩溃捕捉功能时,自然就经常需要让自己的程序发生崩溃。

为了达到这个目的,一般的做法是临时在程序中加入引发异常的代码。这种做法只在临时测试版本中有效,在正式版本中无法进行验证。另外一种方法是加入一个隐藏开关的逻辑,但这样会带到正式版本中,有风险。另外,我们也需要参考下别人的这个功能,所以也希望可以随心所欲地让别人的软件崩溃,但是别人的软件我们可没法修改代码。所以,最好的方法是在不修改任何代码的情况下,能够让指定程序崩溃,指哪打哪。下面就介绍两种这样的方法。

二、代码注入法

试想,如果我们可以将一段有问题、会引起崩溃的代码,注入到指定进程并运行,这样,此进程必崩无疑。

注入代码的方法有很多种,比如全局钩子、APC 注入、远程线程等。这里,我们介绍经典的远程线程注入的方法。

顾名思义,远程线程就是指一个进程在另一个进程的虚拟地址空间中创建线程,然后运行指定代码。当然,这里我们为了搞崩溃别的进程,这个指定的代码就可以是一段会引起异常的代码。

创建远程线程可以用 CreateRemoteThread 函数,原型如下。

HANDLE CreateRemoteThread(
    [in] HANDLE hProcess,
    [in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
    [in] SIZE_T dwStackSize,
    [in] LPTHREAD_START_ROUTINE lpStartAddress,
    [in] LPVOID lpParameter,
    [in] DWORD dwCreationFlags,
    [out] LPDWORD lpThreadId
);

我们来看看关键参数 lpStartAddress,这个参数指定远程线程的入口点地址,这个地址必须是在目标进程的地址空间中。在本文的特殊需求下,我们并不需要传一个实际可执行的地址,只需要传入 0 即可。这样的话,该线程会尝试从 0 地址处执行。

Windows 进程的虚拟地址空间中有一个特殊的区间,叫空指针赋值分区,从地址 0x00000000 到 0x0000FFFF。如果线程试图读写位于这一分区内的地址,就会引发访问违规,随即导致程序崩溃——哈哈,这就达到了我们的目的。

主要流程

核心代码

constint pid = <目标进程 PID>;
const DWORD desiredAccess = PROCESS_CREATE_THREAD |
                            PROCESS_QUERY_INFORMATION |
                            PROCESS_VM_OPERATION |
                            PROCESS_VM_WRITE |
                            PROCESS_VM_READ;
// 打开进程,获得句柄
const HANDLE hProcess = OpenProcess(desiredAccess, FALSE, pid);
// 创建远程线程
CreateRemoteThread(hProcess, nullptr, 0, 0, nullptr, 0, nullptr);
// 关闭进程句柄
CloseHandle(hProcess);

三、修改指令指针寄存器法

这个方法更直接更暴力,它劫持 CPU 的指令指针寄存器 RIP 或 EIP,使其直接指向 0 地址处。

RIP 是 x64 架构中的 64 位寄存器,存储着 CPU 要执行的下一条指令的地址,EIP 是对应的 x86 架构中的 32 位寄存器。如果下一条指令从 0 地址处开始执行,同前一个方法一样,必然引起访问违规,进而导致崩溃。

指令指针寄存器存放在线程的 CONTEXT 结构体中,可以用 GetThreadContext 获取指定线程的 CONTEXT,然后修改指令指针寄存器的值后,再通过 SetThreadContext 替换原始的 CONTEXT。

主要流程

核心代码

// 打开目标进程的一个线程,获得线程句柄,threadId 为该线程的 id
const DWORD desiredAccess = THREAD_GET_CONTEXT |
                            THREAD_SET_CONTEXT |                 
                            THREAD_QUERY_INFORMATION;
const HANDLE hThread = OpenThread(desiredAccess, FALSE, threadId);
// 获取线程 CONTEXT 之前,必须先挂起该线程
SuspendThread(hThread);
// 获取线程 CONTEXT
CONTEXT context = {0};
context.ContextFlags = CONTEXT_ALL;
GetThreadContext(hThread, &context);
// 根据目标进程位数的不同,修改 RIP 或 EIP
#ifdef _WIN64
context.Rip = 0;
#else
context.Eip = 0;
#endif
// 替换 CONTEXT
SetThreadContext(hThread, &context);
// 恢复线程
ResumeThread(hThread);
// 关闭线程句柄
CloseHandle(hThread);

四、效果演示

说了这么多,咱们实践一把,以微信为例,使用代码注入法,传入微信进程 ID,可以看到微信瞬间崩溃,弹出了崩溃提示框。😂😂😂

五、总结

通过这两种方法,我们就可以在不修改任何代码的前提下,做到让指定程序崩溃,方便了开发和测试工作。顺带也可以感受到 Windows 上一个程序的能力之大、破坏力之强,这也是黑客比较青睐 Windows 的原因之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/557049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【个人博客搭建】(3)添加SqlSugar ORM 以及Json配置文件读取

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…

展会媒体邀约资源,媒体宣传服务执行

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 在组织展会时&#xff0c;媒体宣传服务的执行是提升展会知名度和影响力的关键环节。 确定目标媒体&#xff1a;根据展会的主题和目标受众&#xff0c;选择适合的媒体进行邀请。这可能包…

微软 SDL 安全研发生命周期详解

微软SDL&#xff08;Security Development Lifecycle&#xff09;是一种安全软件开发的方法论&#xff0c;它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程&#xff0c;包括多个阶段和活动&#xff0c;以确保产品的安全开发、测试、部署和运行。Microsoft 要…

2023天梯赛 L3_2 完美树 【树形DP、01最大/小价值】

完美树 思路 观察发现&#xff1a;如果一颗子树 u u u&#xff0c;它刚好有偶数个节点&#xff0c;那么 0 0 0 和 1 1 1 的染色数量一定相等&#xff0c;如果有奇数个节点&#xff0c;那么 0 0 0 和 1 1 1 的数量一定恰好相差 1 1 1&#xff08;可能是 0 0 0 多&#x…

OpenHarmony多媒体-mp4parser

简介 一个读取、写入操作音视频文件编辑的工具。 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->Openharmony SDK 把native选项勾上下载&#xff0c;API版本>10 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择开发板类型是rk3568&#xf…

高可用集群——keepalived

目录 1 高可用的概念 2 心跳监测与漂移 IP 地址 3 Keepalived服务介绍 4 Keepalived故障切换转移原理介绍 5 Keepalived 实现 Nginx 的高可用集群 5.1 项目背景 5.2 项目环境 5.3 项目部署 5.3.1 web01\web02配置&#xff1a; 5.3.2nginx负载均衡配置 5.3.3 主调度服…

碳实践|手把手教你开展组织碳核算

一、背景介绍 政府间气候变化委员会 IPCC(Intergovernmental Panel on Climate Chang)是世界气象组织(WMO)及联合国环境规划署(UNEP)于1988年联合建立的政府间机构。 IPCC在1997年和2000年分别发布了《1996 年 IPCC 国家温室气体清单指南修订本》和《国家温室气体清单优良作法…

【氮化镓】栅极漏电对阈值电压和亚阈值摆幅影响建模

本文是一篇关于p-GaN门AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;的研究文章&#xff0c;发表于《应用物理杂志》&#xff08;J. Appl. Phys.&#xff09;2024年4月8日的期刊上。文章的标题为“Analysis and modeling of the influence of gate leakage curren…

什么是SRE?

什么是SRE&#xff1f; SRE&#xff0c;全称为Site Reliability Engineering&#xff0c;即网站可靠性工程&#xff0c;是一种职能角色&#xff0c;它融合了软件工程和系统管理的技能与实践&#xff0c;旨在通过软件和自动化的方式来提高系统的可靠性、稳定性和扩展性。以下是…

Zabbix自定义模板、邮件报警、自动发现与注册、proxy代理、SNMP监控

目录 自定义监控内容 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key 3.在服务端验证新建的监控项 在 Web 页面创建自定义监控项模板 1.创建模板 2.创建应用集&#xff08;用于管理监控项的&#xff09; 3.创建监控项 4.创建…

JEECG表格选中状态怎么去掉

官网代码&#xff08;在取消选中状态的时候不生效&#xff09; rowSelection() {return {onChange: (selectedRowKeys, selectedRows) > {console.log(selectedRowKeys: ${selectedRowKeys}, selectedRows: , selectedRows);},getCheckboxProps: record > ({props: {disa…

【基础】gcc-动态库和静态库的创建和使用-命令

目录 1 动态库的建立使用2 动态库封装过程2.1 编译动态库2.2 使用动态库2.3 命令参数说明 3 静态库封装过程3.1 静态库的封装3.2 静态库的使用 1 动态库的建立使用 首先建立一个头文件&#xff0c;和三个.cpp文件&#xff0c;目的是要把这些文件链接成动态库&#xff1a; 其中…

C#创建背景色渐变窗体的方法:创建特殊窗体

目录 1.让背景渐变色的理论基础 2.让背景渐变色的方法 3.一个实施例 &#xff08;1&#xff09;Form1.Designer.cs &#xff08;2&#xff09;Form1.cs &#xff08;3&#xff09;渐变的蓝色背景 在窗体设计时&#xff0c;可以通过设置窗体的BackColor属性来改变窗口的背…

Golang | Leetcode Golang题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; func searchInsert(nums []int, target int) int {n : len(nums)left, right : 0, n - 1ans : nfor left < right {mid : (right - left) >> 1 leftif target < nums[mid] {ans midright mid - 1} else {left mid 1}}retu…

【mac】【python】新建项目虚拟环境后,使用命令pip出现错误:zsh: command not found: pip

【mac】【python】新建项目虚拟环境后&#xff0c;使用命令pip出现错误&#xff1a;zsh: command not found: pip 问题描述&#xff1a; 拉取或者创建新的python项目时&#xff0c;为项目添加了新的解释器&#xff0c;创建啦虚拟环境&#xff0c;但是执行pip命令的时候找不到命…

倾斜摄影修模软件模方(ModelFun)4.1.0下载及安装教程

文章目录 一、模方(ModelFun)4.1.0安装二、模方(ModelFun)4.1.0下载一、模方(ModelFun)4.1.0安装 订阅专栏后(获取专栏内所有文章阅读权限及软件安装包),从文末下载软件模方(ModelFun)4.1.0安装包,如下所示,并开始安装。 1.计算机需要进入测试模式 键盘WIN+R,打开运行窗…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

jenkins修改全局安全配置之后登录错误

教训&#xff08;流泪&#xff09; 事情是这样的&#xff0c;第一次我需要用单点登录集成jenkins&#xff0c;jenkins可以通过插件的方式支持cas协议&#xff0c;我当时也不很懂&#xff0c;经过我学网上的一顿乱配置&#xff0c;jenkis上不去了&#xff0c;虽然这是公司本地环…

【Linux学习】初识shell命令以及运行原理

这里写目录标题 &#x1f680;shell命令以及运行原理 &#x1f680;shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff08;如下图所示&#xff09;&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ 。 Linux系统的shell作为操作系统的外壳&…