如何让指定 Windows 程序崩溃

news2024/10/7 8:30:07

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

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

哈哈,绝对不是,真实原因是这样的。如果大家用过 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 的原因之一。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正版四月惠,MarginNote _ BookxNote _ 白描优惠啦!会场软件 5 折起

我们的老朋友数码荔枝&#xff0c;最近开启了「正版四月惠」活动&#xff01;会场精选了一批高效办公软件和系统增强工具&#xff0c;快来看看有没有你期待的那一款吧&#xff5e; 会场商品低至 5 折&#xff0c;快把它们带回家&#xff1a; MarginNote 3&#xff1a;7 折价 4…

Linux 系统下的进程间通信 IPC 入门 「下」

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IvPHnEsC6ZdIHaFL8Deazg 共享内存 我们在进程间传输比较大的数据块时&#xff0c;通常选用共享内存的方式。共享内存大小也是有限制的&#xff0…

python-django企业设备配件检修系统flask+vue

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 前端&#xff1a;vue.jselementui 框架&#…

OpenCV杂记(2):图像拼接(hconcat, vconcat)

OpenCV杂记&#xff08;1&#xff09;&#xff1a;绘制OSD&#xff08;cv::getTextSize, cv::putText&#xff09;https://blog.csdn.net/tecsai/article/details/137872058 1. 简述 做图像处理或计算机视觉技术的同学都知道&#xff0c;我们在工作中会经常遇到需要将两幅图像拼…

李沐51_序列数据——自学笔记

1.时序模型中&#xff0c;当前数据跟之前观察到的数据相关 2.自回归模型使用自身过去数据来预测未来 3马尔可夫模型假设当前只跟最近少数数据相关&#xff0c;从而简化模型 4.潜变量模型使用潜变量来概括历史信息 生成一些数据&#xff1a;使用正弦函数和一些可加性噪声来生…

Qt/QML编程之路:carplay认证(52)

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

Android开发——ViewPager

适配器 package com.example.myapplication; import android.view.View; import android.view.ViewGroup; import androidx.annotation.AnimatorRes; import androidx.annotation.NonNull; import androidx.viewpager.widget.PagerAdapter; import java.util.ArrayList; publi…

单链表逆置(头插法,递归,数据结构栈的应用)

链表逆置就是把最后一个数据提到最前面&#xff0c;倒数第二个放到第二个……依次类推&#xff0c;直到第一个到最后一个。 由于链表没有下标&#xff0c;所以不能借助下标来实行数据的逆置&#xff0c;要靠空间的转移来完成链表的逆置&#xff0c;这里采用没有头节点的链表来实…

SSM项目前后端分离详细说明

1.后端 1.1打包 说明&#xff1a;使用idea打开项目&#xff0c;然后进行打包。 1.2tomcat 说明&#xff1a;把后端打成war包后放入tomcat启动。 1.3启动tomcat 说明&#xff1a; 找到tomcat中bin目录中的startup.bat文件&#xff0c;进行启动。如果启动失败&#xff0c;可以…

【英文演讲】人工智能,Artificial Intelligence: A Glimpse into the Future World

文章目录 1、Power Point(演示文稿)2、Speech manuscript(演讲稿)【假】序言:在这个充满机遇与挑战的时代,人工智能正以惊人的速度改变着我们的生活与工作方式。它不仅是一种技术,更是一种全新的思维方式,引领着我们走向未来世界的新篇章。本次演讲将深入探讨人工智能对…

wechat机器人个性化维护部署修改

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 服务端部署配置 在新服务器上安装mysql8.0 ,redis ,nginx,emqx修改数据库的远程访问权限&#xff0c;导入数据库文件application.yml中修改redis的信息application-druild.yml中修改数据…

一文详解视觉Transformer模型压缩和加速策略(量化/低秩近似/蒸馏/剪枝)

视觉Transformer&#xff08;ViT&#xff09;在计算机视觉领域标志性地实现了一次革命&#xff0c;超越了各种任务的最先进模型。然而&#xff0c;它们的实际应用受到高计算和内存需求的限制。本研究通过评估四种主要的模型压缩技术&#xff1a;量化、低秩近似、知识蒸馏和剪枝…

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

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

C++数组的创建、初始化、传参

C数组创建 静态数组&#xff1a;填入具体的大小 type arrayName [arraySize];动态数组&#xff1a;在运行时分配内存。 int* arrnew int[5]; //当程序使用完new分配的内存时&#xff0c;应使用delete释放他们 delete []arr;用标准库容器&#xff1a;std::vector 可以动态增长…

Python 异常处理深度解析:掌握健壮代码的关键

文章目录 1. 异常处理的基础1.1 使用 try 和 except1.2 捕获多种异常 2. 高级异常处理2.1 捕获所有异常2.2 使用 else 和 finally 3. 异常链与自定义异常3.1 异常链3.2 自定义异常 有效管理和处理异常是构建健壮、可靠和用户友好应用程序的基石。异常处理不仅有助于防止程序意外…

衣康酸(ITA)应用领域广泛 工业发酵法为其主流制备方法

衣康酸&#xff08;ITA&#xff09;应用领域广泛 工业发酵法为其主流制备方法 衣康酸&#xff08;ITA&#xff09;又称亚甲基丁二酸、甲叉琥珀酸&#xff0c;化学式为C5H6O4&#xff0c;是一种不饱和二元有机酸。衣康酸外观呈白色结晶粉末&#xff0c;含强烈刺激性气味&#xf…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

看现货白银平台测评要注意的几个事项

在网上我们会看到很多现货白银平台测评的文章或短视频&#xff0c;我们要注意&#xff0c;这些测评内容包括本文在内&#xff0c;多少都会存在着一些主观性的东西&#xff0c;这是无可避免的。不过在看现货白银平台测评时&#xff0c;有一些客观的东西&#xff0c;是需要我们留…

专注底层技术创新,超高性能公链新星 Sui Network 有何独特优势?

近年来&#xff0c;Sui Network 为了能够打造让开发者低成本实现广泛应用开发的公链环境付诸实际行动。其建立了以对象为中心的数据模型、在交易签名和 PTB 中实现精细化权限、优化用户友好功能&#xff0c;逐步为开发者和用户提供了一个更为灵活、安全的链上运行环境。在优越技…

【吊打面试官系列】Java高并发篇 -为什么使用 Executor 框架比使用应用创建和管理线程好?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 为什么要使用 Executor 线程池框架 1、每…