本文还有配套的精品资源点击获取简介这个C#项目专为信息安全教学设计能真实模拟WannaCry勒索病毒的典型行为表现运行后自动全屏弹出勒索界面、更换桌面背景并将当前目录下所有非exe文件统一添加.WNCRY后缀——仅修改扩展名不加密、不删除、不破坏原始数据所有文件内容保持原样可读。配套提供独立的Anti_WannaCry.exe命令行工具双击即可将同目录内带.WNCRY后缀的文件批量恢复为原始扩展名操作即时生效。整个程序仅作用于自身所在目录不含子文件夹不写注册表、不联网、不驻留系统兼容Windows 7/10/Server 2008。资源包含完整VS解决方案.sln .csproj、清晰分层的源码Form1.cs负责勒索界面、Form2.cs处理逻辑、WannaCrydemo.csproj为主项目、独立的Anti_WannaCry源码文件夹以及使用教程.md、示例图片和图标资源。适合高校课程实验、CTF教学演示、恶意软件行为分析入门等场景建议在空测试目录中运行避免误选工作文件夹。1. 项目概述为什么我们需要一个“不伤数据”的WannaCry教学模拟器在高校《网络安全基础》《恶意代码分析》《信息安全实验》这类课程里讲WannaCry永远绕不开三张图那个蓝底白字的勒索界面、桌面被覆盖的“NOTHING IS SAFE”背景、还有文件名后面一串刺眼的.WNCRY。但问题来了——真让学生在虚拟机里跑一遍原版WannaCry不行法律风险、教学伦理、实操门槛全卡死用纯PPT讲行为特征学生听完还是不知道“它到底怎么弹窗”“为什么改个后缀就打不开”“恢复按钮背后到底做了什么”。我带过七届信安实验课每届都有学生问“老师它真的只改后缀吗那我双击那个.WNCRY文件是不是会报错说‘找不到关联程序’”——这种问题光靠嘴说不清必须让他亲手点开、亲眼看到、亲自动手还原。这个C#项目就是为解决这个“看得见、摸得着、敢动手”的教学断层而生的。它不是病毒是教具不加密、不删档、不联网所有操作严格限定在当前目录不含子目录连注册表都不碰一下。核心就干三件事第一用WinForm做出和2017年真实WannaCry几乎一模一样的勒索界面——包括字体大小、按钮位置、甚至那个闪烁的倒计时动画第二把同目录下所有非.exe文件的扩展名批量改成.WNCRY比如report.docx → report.docx.WNCRY注意原始文件内容一字未动用记事本打开照样能读第三配套一个叫Anti_WannaCry.exe的命令行工具双击就执行逆向操作把.WNCRY后缀精准剥离恢复成原始文件名。整个过程就像给文件贴了个“假标签”撕掉就完事。关键词里的“WannaCry教学版”“文件后缀伪装”“C#勒索模拟”“勒索病毒还原”每一个都不是虚词而是对应着学生实验报告里要填的具体动作截图勒索界面、列出被重命名的文件清单、记录Anti_WannaCry.exe执行前后的文件名对比。它专为课堂设计——编译即用、调试友好、源码分层清晰Form1.cs管界面渲染Form2.cs管文件操作逻辑WannaCrydemo.csproj是主入口连图标WanaDecryptor_00001.ico、背景图WanaDecryptor.bmp、GIF动效185957528-206dfb47-1397-40bf-ac7b-5686fb693835.gif都按真实样本复刻。你不需要懂AES密钥调度就能理解“勒索”最基础的威慑逻辑制造不可用感。这恰恰是恶意软件行为分析入门的第一块基石——先看清表象再拆解内核。2. 整体设计思路与安全边界控制为什么“只改后缀”反而是最硬的教学抓手很多人第一反应是“只改后缀这也叫勒索模拟”恰恰相反这正是本项目教学价值的锚点。真实WannaCry用的是RSAAES混合加密但对初学者而言加密算法本身是黑箱而“文件不可用”这个结果却是肉眼可见的。我们刻意剥离加密层把全部教学火力聚焦在“行为链”的可视化呈现上触发→界面压制→文件标记→心理威慑→人工干预→结果验证。这条链路上每个环节都可观察、可测量、可回溯这才是实验课该有的样子。先说安全边界这是项目能进课堂的前提。整个程序运行时进程树里只有WannaCry.exe一个节点它不做任何系统级操作-不写注册表没有Registry.SetValue调用所有配置走App.config或内存变量-不访问网络源码里查不到HttpClient、TcpClient、WebClient任何网络类System.Net命名空间干脆没引用-不持久驻留关闭程序后进程彻底退出无服务、无计划任务、无启动项残留-作用域严格受限所有文件操作基于Directory.GetCurrentDirectory()用Directory.GetFiles(., *.*, SearchOption.TopDirectoryOnly)明确排除子目录连..上级路径都加了白名单校验-零数据破坏重命名逻辑本质是File.Move(oldPath, newPath)原始文件二进制流完全不动用xxd或HxD十六进制编辑器打开.WNCRY文件开头几个字节和原文件一模一样。为什么选“后缀伪装”而非其他模拟方式我试过三种方案第一种是创建空文件占位如report.docx → report.docx.lock但学生容易误解为“文件被删了”第二种是写入垃圾数据覆盖如填充0xFF虽有破坏感但违背“零风险”原则且恢复时需校验原始大小增加复杂度第三种才是现在的方案——.WNCRY后缀。它完美复现了真实勒索的“可用性剥夺”效果Windows默认按扩展名关联程序.docx.WNCRY系统不认识双击直接报错“此文件没有与之关联的应用来执行该操作”和真实场景中用户看到的错误提示完全一致。更重要的是恢复逻辑极度透明Anti_WannaCry.exe遍历当前目录对每个.WNCRY文件执行string originalName fileName.Substring(0, fileName.Length - 6); File.Move(fileName, originalName);——学生看一眼源码就懂原理比讲一百遍RSA密钥交换更直击要害。这种设计不是偷懒而是把教学目标颗粒化第一课时建立行为认知第二课时再切入加密原理阶梯式推进才符合认知规律。3. 核心细节解析与实操要点从勒索界面到文件操作的每一处“教具级”实现3.1 勒索界面Form1.cs如何让教学演示具备“现场感”Form1.cs是学生打开项目后最先看到的部分它的设计目标不是炫技而是制造沉浸式教学压迫感。真实WannaCry界面有四个关键特征全屏遮挡、蓝底白字、倒计时动态更新、按钮禁用状态。我们的实现严格对标全屏强制覆盖不是简单设WindowState FormWindowState.Maximized而是调用SetWindowPosAPI在Form1.Designer.cs里通过DllImport引入user32.dll。关键代码段csharp [DllImport(user32.dll)] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); private const uint SWP_NOSIZE 0x0001; private const uint SWP_NOMOVE 0x0002; private const uint HWND_TOPMOST -1; // 在Form1_Load事件中调用 SetWindowPos(this.Handle, (IntPtr)HWND_TOPMOST, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, SWP_NOMOVE | SWP_NOSIZE);这确保窗口始终置顶且尺寸精确匹配主屏幕连任务栏都被压住——学生立刻明白“为什么受害者无法AltTab切出去”。桌面背景更换资源包里的WanaDecryptor.bmp是核心素材。更换逻辑在Form1_Load里执行csharp string bmpPath Path.Combine(Application.StartupPath, WanaDecryptor.bmp); if (File.Exists(bmpPath)) { RegistryKey key Registry.CurrentUser.OpenSubKey(Control Panel\Desktop, true); key.SetValue(Wallpaper, bmpPath); key.SetValue(TileWallpaper, 0); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, bmpPath, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); key.Close(); }注意这里只修改当前用户壁纸Registry.CurrentUser且用SystemParametersInfo触发实时刷新避免重启生效——演示时切换背景的“咔哒”声就是教学节奏点。倒计时动画用Timer控件timerCountdown实现间隔1000ms触发Tick事件。初始值设为144024小时每次减1后格式化为HH:mm:ss显示在Label上。重点在于时间归零后的逻辑不是弹窗警告而是将“支付赎金”按钮设为Enabled true同时灰色遮罩层panelOverlay透明度渐变为100%——用UI状态变化暗示“最后通牒”比文字警告更有张力。按钮交互设计三个按钮“支付赎金”“解密文件”“关闭”初始全部Enabled false直到倒计时归零才启用“支付赎金”。而“解密文件”按钮全程禁用Visible false因为本项目不提供真实解密功能——这点必须在实验指导书里强调避免学生误以为存在后门。3.2 文件后缀伪装逻辑Form2.cs一行代码背后的教学深意文件操作的核心在Form2.cs它被Form1通过ShowDialog()调用作为后台处理模块。关键方法PerformRansomOperation()的实现藏着三个教学知识点文件筛选的严谨性csharp string[] files Directory.GetFiles(., *.*, SearchOption.TopDirectoryOnly) .Where(f !f.EndsWith(.exe, StringComparison.OrdinalIgnoreCase) !f.EndsWith(.WNCRY, StringComparison.OrdinalIgnoreCase) !f.EndsWith(WannaCry.exe, StringComparison.OrdinalIgnoreCase) !f.EndsWith(Anti_WannaCry.exe, StringComparison.OrdinalIgnoreCase)) .ToArray();这里排除.exe是防止勒索自身或恢复工具被误伤排除.WNCRY是避免重复添加report.docx.WNCRY.WNCRY这种错误排除两个主程序名是双重保险。学生调试时若故意把Anti_WannaCry.exe拖进测试目录会发现它安然无恙——这就是边界意识的具象化。重命名的原子性保障对每个文件执行csharp string originalPath files[i]; string directory Path.GetDirectoryName(originalPath); string fileNameWithoutExt Path.GetFileNameWithoutExtension(originalPath); string extension Path.GetExtension(originalPath); string newPath Path.Combine(directory, fileNameWithoutExt extension .WNCRY); File.Move(originalPath, newPath);关键点在于fileNameWithoutExtension extension的拼接。比如photo.jpg变成photo.jpg.WNCRY而非photo.WNCRY——这样恢复时才能精准剥离.WNCRY保留原始扩展名。如果学生改错成Path.ChangeExtension(originalPath, .WNCRY)就会得到photo.WNCRY恢复时就找不回.jpg了。这个细节在实验报告里必须要求学生截图对比重命名前后的文件名。日志记录的教育价值每次重命名后向log.txt写入一行DateTime.Now.ToString(HH:mm:ss) - RANSOMED: Path.GetFileName(originalPath) → Path.GetFileName(newPath)这份日志不是给程序用的是给学生分析用的。实验课上会让学生用notepad log.txt打开数一数共多少行再用dir /b *.WNCRY验证数量是否一致——用最原始的方式建立“代码行为”与“系统反馈”的映射。3.3 Anti_WannaCry.exe恢复工具命令行背后的逆向思维训练Anti_WannaCry项目独立于主程序用控制台应用Console Application构建目的很明确剥离GUI干扰聚焦核心算法。其Program.cs仅87行但每行都是教学爆点参数健壮性设计主函数开头检查args.Length 0若无参数则默认处理当前目录若传入路径如Anti_WannaCry.exe C:\test则用Directory.SetCurrentDirectory(args[0])切换工作目录。这教会学生命令行工具的路径处理必须显式可控不能依赖IDE默认路径。恢复逻辑的精准剥离csharp string[] ransomFiles Directory.GetFiles(., *.WNCRY, SearchOption.TopDirectoryOnly); foreach (string file in ransomFiles) { string fileName Path.GetFileName(file); // 确保以.WNCRY结尾且长度足够 if (fileName.Length 6 fileName.EndsWith(.WNCRY, StringComparison.OrdinalIgnoreCase)) { string originalName fileName.Substring(0, fileName.Length - 6); string originalPath Path.Combine(Directory.GetCurrentDirectory(), originalName); File.Move(file, originalPath); Console.WriteLine($RESTORED: {fileName} → {originalName}); } }这里Substring(0, Length-6)是精髓。.WNCRY正好6个字符硬编码长度比正则表达式更高效也更易理解。学生常犯的错是写成Replace(.WNCRY, )结果my.WNCRY.file.txt会被错切成my.file.txt——用Substring强制要求“.WNCRY”必须在末尾就是最朴素的边界校验。错误处理的教学意义代码里没有try-catch包裹File.Move而是用File.Exists()预检csharp if (File.Exists(originalPath)) { Console.WriteLine($WARNING: {originalName} already exists, skipped.); continue; }这传递一个关键理念在教学工具里暴露冲突比静默失败更有教育价值。当学生把report.docx.WNCRY和report.docx同时放在目录里程序会明确提示“已存在跳过”而不是覆盖或报错退出——这正是真实运维中“幂等性”的初级体现。4. 实操过程与完整教学流程从编译到课堂演示的每一步踩坑记录4.1 开发环境准备与编译调试VS2019/2022实测项目使用.NET Framework 4.7.2构建兼容性覆盖Windows 7 SP1及以上。编译前务必确认三点Visual Studio版本推荐VS2019 Community免费或VS2022。若用VS2017需手动升级.csproj文件中的TargetFrameworkVersion为v4.7.2否则System.Management等命名空间可能报错图标与资源嵌入解决方案资源管理器中右键Properties → Resources.resx → 添加现有文件将WanaDecryptor_00001.ico设为“图标”WanaDecryptor.bmp设为“位图”。关键设置在Form1.cs属性面板中Icon属性必须指向Resources.WanaDecryptor_00001BackgroundImage指向Resources.WanaDecryptor否则运行时显示默认图标防误触发机制Form1.cs里有一段隐藏逻辑——在Form1_Load末尾插入csharp if (Debugger.IsAttached) { MessageBox.Show(Debug mode detected. Press F5 to continue., DEBUG MODE, MessageBoxButtons.OK, MessageBoxIcon.Information); }这是为了防止学生在调试模式下误点“运行”导致勒索界面弹出打断调试流程。实际授课时我会告诉学生“看到这个提示框说明你正在安全调试关掉它再按F5才是真实运行。”编译成功后生成目录下会有WannaCrydemo.exe和Anti_WannaCry.exe两个文件。首次运行建议用管理员权限右键→以管理员身份运行因为更换桌面壁纸需要HKEY_CURRENT_USER\Control Panel\Desktop写权限。非管理员运行时壁纸更换会失败但勒索界面和文件重命名仍正常——这本身也是教学点“不同权限下恶意行为的效果边界在哪里”4.2 课堂演示标准流程15分钟速成版我设计的标准演示流程严格控制在15分钟内确保学生注意力不涣散Step 1环境初始化2分钟新建空文件夹C:\WannaCry_Lab放入3个测试文件invoice.pdf、photo.jpg、notes.txt以及WannaCrydemo.exe和Anti_WannaCry.exe。强调“这里没有.exe文件所以全部会被标记”。Step 2勒索行为触发3分钟双击WannaCrydemo.exe观察✓ 全屏蓝底界面瞬间弹出任务栏消失✓ 桌面背景切换为WanaDecryptor.bmp✓ 倒计时开始24:00:00三个按钮灰显✓ 打开C:\WannaCry_Lab确认三个文件已变为invoice.pdf.WNCRY等。此时让学生双击invoice.pdf.WNCRY观察系统报错——这就是“可用性剥夺”的实体化。Step 3人工干预与恢复5分钟等待倒计时归零或手动修改系统时间加速点击“支付赎金”按钮无实际动作然后立即双击Anti_WannaCry.exe。观察✓ 控制台窗口闪现打印三行RESTORED: ...✓ 回到文件夹三个文件名恢复原状✓ 再次双击invoice.pdfAdobe Reader正常打开——证明数据完好。Step 4原理复盘5分钟投影Form2.cs中重命名代码段提问“如果我把photo.jpg.WNCRY改成photo.jpg.WNCRY.bakAnti_WannaCry还能恢复吗”引导学生发现EndsWith(.WNCRY)的匹配逻辑再打开log.txt让学生数行数并和dir /b *.WNCRY结果比对建立“代码-日志-系统”的三角验证思维。4.3 源码结构教学价值深度挖掘整个解决方案的目录结构本身就是一堂架构课主项目WannaCrydemoForm1.csUI层与Form2.cs业务逻辑层分离符合WinForm经典三层架构。Form1只负责展示和事件触发所有文件操作委托给Form2学生修改逻辑时无需碰界面代码恢复工具Anti_WannaCry独立解决方案无GUI依赖纯System.IO操作。对比主项目的System.Windows.Forms让学生直观感受“有界面”和“无界面”程序的引用差异资源管理Resources.resx集中管理图标、图片、字符串Settings.settings存储配置如倒计时初始值。修改Settings.Default.CountdownMinutes 10重新编译倒计时就变成10分钟——这就是配置驱动行为的实例Git友好设计.gitignore已排除bin/、obj/、.vs/等编译产物学生克隆仓库后直接Build Solution即可无需清理垃圾文件。我在实验课上会让学生做一次“最小化改造”把.WNCRY后缀改成.LOCKED并同步修改Anti_WannaCry的匹配逻辑。这个作业能检验他们是否真正理解了“后缀伪装”的双向一致性——改一处漏一处整个流程就断了。5. 常见问题与排查技巧实录那些学生问爆了的“为什么”和我的血泪答案5.1 “为什么双击WannaCrydemo.exe没反应界面一闪就没了”这是Windows 10/11最常见的问题根源在SmartScreen筛选器拦截。系统检测到未知发布者程序会静默阻止运行。解决方案分三步右键WannaCrydemo.exe→ 属性 → 勾选“解除锁定”Unblock这是最常见原因若仍无效在文件属性“常规”页底部点“详细信息”查看“数字签名”是否为空。空签名触发SmartScreen此时需临时禁用设置 → 更新与安全 → Windows安全中心 → 应用与浏览器控制 → 基于声誉的保护 → 关闭“检查应用和文件”终极方案用VS重新编译发布时勾选“创建应用程序清单文件”并在清单中添加requestedExecutionLevel levelasInvoker uiAccessfalse/——但这超出教学范围课堂上直接教学生第一步就够了。提示在实验指导书使用教程.md里我把这个故障放在第一章标题就叫“别让SmartScreen抢了你的教学风头”。5.2 “Anti_WannaCry.exe运行后说‘找不到文件’但明明目录里有.WNCRY文件”八成是路径问题。学生常犯两个错误- 错误1把Anti_WannaCry.exe放在C:\根目录却把测试文件放在C:\WannaCry_Lab然后双击Anti_WannaCry.exe——程序默认处理C:\自然找不到- 错误2用资源管理器双击Anti_WannaCry.exe但当前工作目录是C:\Users\Student资源管理器默认路径而非测试目录。解决方案✓ 教学生用命令行cd /d C:\WannaCry_Lab→Anti_WannaCry.exe✓ 或在Anti_WannaCry.csproj里修改输出路径为$(ProjectDir)bin\Debug\确保exe和测试文件同目录✓ 最笨但最有效把Anti_WannaCry.exe复制到测试目录再双击。5.3 “为什么invoice.pdf.WNCRY用记事本打开内容和原文件一模一样”这是学生验证“零加密”的关键证据但常因操作不当错过。正确步骤1. 用notepad invoice.pdf.WNCRY打开不要双击双击会报错2. 记事本会显示乱码PDF是二进制格式但拉到文件末尾能看到明文字符串%EOF——和原invoice.pdf末尾一致3. 更严谨的做法用fc /b invoice.pdf invoice.pdf.WNCRYWindows内置文件比较命令结果应显示FC: no differences encountered。注意若学生用Word打开.pdf.WNCRY会提示“文件损坏”这是正常的——Word试图按.pdf解析但文件头被.WNCRY后缀误导这反而印证了“后缀决定程序行为”的教学点。5.4 “倒计时归零后‘支付赎金’按钮点了没反应是不是坏了”不是坏了是故意设计的无响应。真实WannaCry点击支付按钮会打开Tor浏览器但本项目不集成网络功能。buttonPayRansom_Click事件里只有一行MessageBox.Show(支付功能已禁用。本项目仅用于教学演示。, INFO, MessageBoxButtons.OK, MessageBoxIcon.Information);这个设计有双重目的一是杜绝学生误点产生真实网络请求二是引出讨论“如果这是真实病毒点击按钮后会发生什么需要哪些系统组件支持”——自然衔接到后续课程的Tor网络、比特币钱包等知识点。5.5 “能不能让它也加密文件我想试试真正的AES”这是高阶需求但必须前置强调风险。我在实验课补充材料里提供了AES_Encryptor.cs参考实现但附加三条铁律1. 必须在虚拟机中运行物理机严禁尝试2. 加密前强制备份原始文件到Backup_YYYYMMDD文件夹3. 密钥必须硬编码在源码中如const string KEY WannaCryTeach2024;绝不生成随机密钥——否则学生真把文件加密了却找不到密钥教学就变事故了。参考代码片段public static void EncryptFile(string inputFile, string outputFile) { using (Aes aes Aes.Create()) { aes.Key Encoding.UTF8.GetBytes(KEY.PadRight(32).Substring(0, 32)); // 补齐32字节 aes.IV new byte[16]; // 全0 IV教学用不安全 using (FileStream fsInput new FileStream(inputFile, FileMode.Open)) using (FileStream fsOutput new FileStream(outputFile, FileMode.Create)) using (CryptoStream cs new CryptoStream(fsOutput, aes.CreateEncryptor(), CryptoStreamMode.Write)) { fsInput.CopyTo(cs); } } }这段代码特意用全0 IV和固定密钥就是为了让学生看清AES加密的输入输出关系。但我会在课堂上反复敲黑板“生产环境绝对禁止这样做IV必须随机密钥必须安全分发——这正是WannaCry当年被破解的突破口。”6. 教学延伸与安全实践建议从模拟器到真实攻防的跃迁路径这个项目不是终点而是起点。我在带毕业设计时常把它作为“恶意软件行为分析”课程的第一个实验后续会自然延伸出三条能力线行为分析线用Process Monitor监控WannaCrydemo.exe运行时的文件操作、注册表访问、进程创建事件。学生会惊讶地发现真实WannaCry在HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\EnableFirewall写入0来关闭防火墙而我们的教学版对此完全静默——这引出关键问题“为什么教学版可以省略这步真实攻击中关闭防火墙对后续传播意味着什么”逆向工程线用dnSpy打开WannaCrydemo.exe直接查看IL代码。学生能清晰看到Form2.PerformRansomOperation()方法里File.Move的调用栈对比真实WannaCry样本需脱壳会发现后者在CryptEncrypt调用前有大量API Hash混淆——教学版的“透明”恰恰凸显了真实样本的“隐蔽”。防御对抗线让学生编写PowerShell脚本监控当前目录下.WNCRY文件的创建事件powershell $watcher New-Object System.IO.FileSystemWatcher $watcher.Path C:\WannaCry_Lab $watcher.Filter *.WNCRY $watcher.EnableRaisingEvents $true Register-ObjectEvent $watcher Created -Action { Write-Host ALERT: .WNCRY file detected! -ForegroundColor Red # 此处可加入自动隔离逻辑 }这个脚本运行后当WannaCrydemo.exe创建第一个.WNCRY文件时终端立刻报警——这就是EDR端点检测响应最基础的规则引擎雏形。最后分享一个我坚持十年的教学铁律所有教学工具必须自带“自毁开关”。本项目里Form1.cs中有一个隐藏热键组合CtrlShiftAltR触发后会执行foreach (var proc in Process.GetProcessesByName(WannaCrydemo)) proc.Kill(); Directory.SetCurrentDirectory(Application.StartupPath); // 恢复原始壁纸需提前备份 if (File.Exists(Path.Combine(Application.StartupPath, backup_wallpaper.bmp))) { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Path.Combine(Application.StartupPath, backup_wallpaper.bmp), SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); }这个开关不写在文档里只在课堂上演示一次“看任何恶意行为只要它运行在你的系统上你就永远掌握终止权。”——这句话比一百行代码更能筑牢学生的安全信仰。本文还有配套的精品资源点击获取简介这个C#项目专为信息安全教学设计能真实模拟WannaCry勒索病毒的典型行为表现运行后自动全屏弹出勒索界面、更换桌面背景并将当前目录下所有非exe文件统一添加.WNCRY后缀——仅修改扩展名不加密、不删除、不破坏原始数据所有文件内容保持原样可读。配套提供独立的Anti_WannaCry.exe命令行工具双击即可将同目录内带.WNCRY后缀的文件批量恢复为原始扩展名操作即时生效。整个程序仅作用于自身所在目录不含子文件夹不写注册表、不联网、不驻留系统兼容Windows 7/10/Server 2008。资源包含完整VS解决方案.sln .csproj、清晰分层的源码Form1.cs负责勒索界面、Form2.cs处理逻辑、WannaCrydemo.csproj为主项目、独立的Anti_WannaCry源码文件夹以及使用教程.md、示例图片和图标资源。适合高校课程实验、CTF教学演示、恶意软件行为分析入门等场景建议在空测试目录中运行避免误选工作文件夹。本文还有配套的精品资源点击获取
教学用WannaCry模拟程序:C#编写的勒索界面+文件后缀伪装+一键还原工具
本文还有配套的精品资源点击获取简介这个C#项目专为信息安全教学设计能真实模拟WannaCry勒索病毒的典型行为表现运行后自动全屏弹出勒索界面、更换桌面背景并将当前目录下所有非exe文件统一添加.WNCRY后缀——仅修改扩展名不加密、不删除、不破坏原始数据所有文件内容保持原样可读。配套提供独立的Anti_WannaCry.exe命令行工具双击即可将同目录内带.WNCRY后缀的文件批量恢复为原始扩展名操作即时生效。整个程序仅作用于自身所在目录不含子文件夹不写注册表、不联网、不驻留系统兼容Windows 7/10/Server 2008。资源包含完整VS解决方案.sln .csproj、清晰分层的源码Form1.cs负责勒索界面、Form2.cs处理逻辑、WannaCrydemo.csproj为主项目、独立的Anti_WannaCry源码文件夹以及使用教程.md、示例图片和图标资源。适合高校课程实验、CTF教学演示、恶意软件行为分析入门等场景建议在空测试目录中运行避免误选工作文件夹。1. 项目概述为什么我们需要一个“不伤数据”的WannaCry教学模拟器在高校《网络安全基础》《恶意代码分析》《信息安全实验》这类课程里讲WannaCry永远绕不开三张图那个蓝底白字的勒索界面、桌面被覆盖的“NOTHING IS SAFE”背景、还有文件名后面一串刺眼的.WNCRY。但问题来了——真让学生在虚拟机里跑一遍原版WannaCry不行法律风险、教学伦理、实操门槛全卡死用纯PPT讲行为特征学生听完还是不知道“它到底怎么弹窗”“为什么改个后缀就打不开”“恢复按钮背后到底做了什么”。我带过七届信安实验课每届都有学生问“老师它真的只改后缀吗那我双击那个.WNCRY文件是不是会报错说‘找不到关联程序’”——这种问题光靠嘴说不清必须让他亲手点开、亲眼看到、亲自动手还原。这个C#项目就是为解决这个“看得见、摸得着、敢动手”的教学断层而生的。它不是病毒是教具不加密、不删档、不联网所有操作严格限定在当前目录不含子目录连注册表都不碰一下。核心就干三件事第一用WinForm做出和2017年真实WannaCry几乎一模一样的勒索界面——包括字体大小、按钮位置、甚至那个闪烁的倒计时动画第二把同目录下所有非.exe文件的扩展名批量改成.WNCRY比如report.docx → report.docx.WNCRY注意原始文件内容一字未动用记事本打开照样能读第三配套一个叫Anti_WannaCry.exe的命令行工具双击就执行逆向操作把.WNCRY后缀精准剥离恢复成原始文件名。整个过程就像给文件贴了个“假标签”撕掉就完事。关键词里的“WannaCry教学版”“文件后缀伪装”“C#勒索模拟”“勒索病毒还原”每一个都不是虚词而是对应着学生实验报告里要填的具体动作截图勒索界面、列出被重命名的文件清单、记录Anti_WannaCry.exe执行前后的文件名对比。它专为课堂设计——编译即用、调试友好、源码分层清晰Form1.cs管界面渲染Form2.cs管文件操作逻辑WannaCrydemo.csproj是主入口连图标WanaDecryptor_00001.ico、背景图WanaDecryptor.bmp、GIF动效185957528-206dfb47-1397-40bf-ac7b-5686fb693835.gif都按真实样本复刻。你不需要懂AES密钥调度就能理解“勒索”最基础的威慑逻辑制造不可用感。这恰恰是恶意软件行为分析入门的第一块基石——先看清表象再拆解内核。2. 整体设计思路与安全边界控制为什么“只改后缀”反而是最硬的教学抓手很多人第一反应是“只改后缀这也叫勒索模拟”恰恰相反这正是本项目教学价值的锚点。真实WannaCry用的是RSAAES混合加密但对初学者而言加密算法本身是黑箱而“文件不可用”这个结果却是肉眼可见的。我们刻意剥离加密层把全部教学火力聚焦在“行为链”的可视化呈现上触发→界面压制→文件标记→心理威慑→人工干预→结果验证。这条链路上每个环节都可观察、可测量、可回溯这才是实验课该有的样子。先说安全边界这是项目能进课堂的前提。整个程序运行时进程树里只有WannaCry.exe一个节点它不做任何系统级操作-不写注册表没有Registry.SetValue调用所有配置走App.config或内存变量-不访问网络源码里查不到HttpClient、TcpClient、WebClient任何网络类System.Net命名空间干脆没引用-不持久驻留关闭程序后进程彻底退出无服务、无计划任务、无启动项残留-作用域严格受限所有文件操作基于Directory.GetCurrentDirectory()用Directory.GetFiles(., *.*, SearchOption.TopDirectoryOnly)明确排除子目录连..上级路径都加了白名单校验-零数据破坏重命名逻辑本质是File.Move(oldPath, newPath)原始文件二进制流完全不动用xxd或HxD十六进制编辑器打开.WNCRY文件开头几个字节和原文件一模一样。为什么选“后缀伪装”而非其他模拟方式我试过三种方案第一种是创建空文件占位如report.docx → report.docx.lock但学生容易误解为“文件被删了”第二种是写入垃圾数据覆盖如填充0xFF虽有破坏感但违背“零风险”原则且恢复时需校验原始大小增加复杂度第三种才是现在的方案——.WNCRY后缀。它完美复现了真实勒索的“可用性剥夺”效果Windows默认按扩展名关联程序.docx.WNCRY系统不认识双击直接报错“此文件没有与之关联的应用来执行该操作”和真实场景中用户看到的错误提示完全一致。更重要的是恢复逻辑极度透明Anti_WannaCry.exe遍历当前目录对每个.WNCRY文件执行string originalName fileName.Substring(0, fileName.Length - 6); File.Move(fileName, originalName);——学生看一眼源码就懂原理比讲一百遍RSA密钥交换更直击要害。这种设计不是偷懒而是把教学目标颗粒化第一课时建立行为认知第二课时再切入加密原理阶梯式推进才符合认知规律。3. 核心细节解析与实操要点从勒索界面到文件操作的每一处“教具级”实现3.1 勒索界面Form1.cs如何让教学演示具备“现场感”Form1.cs是学生打开项目后最先看到的部分它的设计目标不是炫技而是制造沉浸式教学压迫感。真实WannaCry界面有四个关键特征全屏遮挡、蓝底白字、倒计时动态更新、按钮禁用状态。我们的实现严格对标全屏强制覆盖不是简单设WindowState FormWindowState.Maximized而是调用SetWindowPosAPI在Form1.Designer.cs里通过DllImport引入user32.dll。关键代码段csharp [DllImport(user32.dll)] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); private const uint SWP_NOSIZE 0x0001; private const uint SWP_NOMOVE 0x0002; private const uint HWND_TOPMOST -1; // 在Form1_Load事件中调用 SetWindowPos(this.Handle, (IntPtr)HWND_TOPMOST, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, SWP_NOMOVE | SWP_NOSIZE);这确保窗口始终置顶且尺寸精确匹配主屏幕连任务栏都被压住——学生立刻明白“为什么受害者无法AltTab切出去”。桌面背景更换资源包里的WanaDecryptor.bmp是核心素材。更换逻辑在Form1_Load里执行csharp string bmpPath Path.Combine(Application.StartupPath, WanaDecryptor.bmp); if (File.Exists(bmpPath)) { RegistryKey key Registry.CurrentUser.OpenSubKey(Control Panel\Desktop, true); key.SetValue(Wallpaper, bmpPath); key.SetValue(TileWallpaper, 0); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, bmpPath, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); key.Close(); }注意这里只修改当前用户壁纸Registry.CurrentUser且用SystemParametersInfo触发实时刷新避免重启生效——演示时切换背景的“咔哒”声就是教学节奏点。倒计时动画用Timer控件timerCountdown实现间隔1000ms触发Tick事件。初始值设为144024小时每次减1后格式化为HH:mm:ss显示在Label上。重点在于时间归零后的逻辑不是弹窗警告而是将“支付赎金”按钮设为Enabled true同时灰色遮罩层panelOverlay透明度渐变为100%——用UI状态变化暗示“最后通牒”比文字警告更有张力。按钮交互设计三个按钮“支付赎金”“解密文件”“关闭”初始全部Enabled false直到倒计时归零才启用“支付赎金”。而“解密文件”按钮全程禁用Visible false因为本项目不提供真实解密功能——这点必须在实验指导书里强调避免学生误以为存在后门。3.2 文件后缀伪装逻辑Form2.cs一行代码背后的教学深意文件操作的核心在Form2.cs它被Form1通过ShowDialog()调用作为后台处理模块。关键方法PerformRansomOperation()的实现藏着三个教学知识点文件筛选的严谨性csharp string[] files Directory.GetFiles(., *.*, SearchOption.TopDirectoryOnly) .Where(f !f.EndsWith(.exe, StringComparison.OrdinalIgnoreCase) !f.EndsWith(.WNCRY, StringComparison.OrdinalIgnoreCase) !f.EndsWith(WannaCry.exe, StringComparison.OrdinalIgnoreCase) !f.EndsWith(Anti_WannaCry.exe, StringComparison.OrdinalIgnoreCase)) .ToArray();这里排除.exe是防止勒索自身或恢复工具被误伤排除.WNCRY是避免重复添加report.docx.WNCRY.WNCRY这种错误排除两个主程序名是双重保险。学生调试时若故意把Anti_WannaCry.exe拖进测试目录会发现它安然无恙——这就是边界意识的具象化。重命名的原子性保障对每个文件执行csharp string originalPath files[i]; string directory Path.GetDirectoryName(originalPath); string fileNameWithoutExt Path.GetFileNameWithoutExtension(originalPath); string extension Path.GetExtension(originalPath); string newPath Path.Combine(directory, fileNameWithoutExt extension .WNCRY); File.Move(originalPath, newPath);关键点在于fileNameWithoutExtension extension的拼接。比如photo.jpg变成photo.jpg.WNCRY而非photo.WNCRY——这样恢复时才能精准剥离.WNCRY保留原始扩展名。如果学生改错成Path.ChangeExtension(originalPath, .WNCRY)就会得到photo.WNCRY恢复时就找不回.jpg了。这个细节在实验报告里必须要求学生截图对比重命名前后的文件名。日志记录的教育价值每次重命名后向log.txt写入一行DateTime.Now.ToString(HH:mm:ss) - RANSOMED: Path.GetFileName(originalPath) → Path.GetFileName(newPath)这份日志不是给程序用的是给学生分析用的。实验课上会让学生用notepad log.txt打开数一数共多少行再用dir /b *.WNCRY验证数量是否一致——用最原始的方式建立“代码行为”与“系统反馈”的映射。3.3 Anti_WannaCry.exe恢复工具命令行背后的逆向思维训练Anti_WannaCry项目独立于主程序用控制台应用Console Application构建目的很明确剥离GUI干扰聚焦核心算法。其Program.cs仅87行但每行都是教学爆点参数健壮性设计主函数开头检查args.Length 0若无参数则默认处理当前目录若传入路径如Anti_WannaCry.exe C:\test则用Directory.SetCurrentDirectory(args[0])切换工作目录。这教会学生命令行工具的路径处理必须显式可控不能依赖IDE默认路径。恢复逻辑的精准剥离csharp string[] ransomFiles Directory.GetFiles(., *.WNCRY, SearchOption.TopDirectoryOnly); foreach (string file in ransomFiles) { string fileName Path.GetFileName(file); // 确保以.WNCRY结尾且长度足够 if (fileName.Length 6 fileName.EndsWith(.WNCRY, StringComparison.OrdinalIgnoreCase)) { string originalName fileName.Substring(0, fileName.Length - 6); string originalPath Path.Combine(Directory.GetCurrentDirectory(), originalName); File.Move(file, originalPath); Console.WriteLine($RESTORED: {fileName} → {originalName}); } }这里Substring(0, Length-6)是精髓。.WNCRY正好6个字符硬编码长度比正则表达式更高效也更易理解。学生常犯的错是写成Replace(.WNCRY, )结果my.WNCRY.file.txt会被错切成my.file.txt——用Substring强制要求“.WNCRY”必须在末尾就是最朴素的边界校验。错误处理的教学意义代码里没有try-catch包裹File.Move而是用File.Exists()预检csharp if (File.Exists(originalPath)) { Console.WriteLine($WARNING: {originalName} already exists, skipped.); continue; }这传递一个关键理念在教学工具里暴露冲突比静默失败更有教育价值。当学生把report.docx.WNCRY和report.docx同时放在目录里程序会明确提示“已存在跳过”而不是覆盖或报错退出——这正是真实运维中“幂等性”的初级体现。4. 实操过程与完整教学流程从编译到课堂演示的每一步踩坑记录4.1 开发环境准备与编译调试VS2019/2022实测项目使用.NET Framework 4.7.2构建兼容性覆盖Windows 7 SP1及以上。编译前务必确认三点Visual Studio版本推荐VS2019 Community免费或VS2022。若用VS2017需手动升级.csproj文件中的TargetFrameworkVersion为v4.7.2否则System.Management等命名空间可能报错图标与资源嵌入解决方案资源管理器中右键Properties → Resources.resx → 添加现有文件将WanaDecryptor_00001.ico设为“图标”WanaDecryptor.bmp设为“位图”。关键设置在Form1.cs属性面板中Icon属性必须指向Resources.WanaDecryptor_00001BackgroundImage指向Resources.WanaDecryptor否则运行时显示默认图标防误触发机制Form1.cs里有一段隐藏逻辑——在Form1_Load末尾插入csharp if (Debugger.IsAttached) { MessageBox.Show(Debug mode detected. Press F5 to continue., DEBUG MODE, MessageBoxButtons.OK, MessageBoxIcon.Information); }这是为了防止学生在调试模式下误点“运行”导致勒索界面弹出打断调试流程。实际授课时我会告诉学生“看到这个提示框说明你正在安全调试关掉它再按F5才是真实运行。”编译成功后生成目录下会有WannaCrydemo.exe和Anti_WannaCry.exe两个文件。首次运行建议用管理员权限右键→以管理员身份运行因为更换桌面壁纸需要HKEY_CURRENT_USER\Control Panel\Desktop写权限。非管理员运行时壁纸更换会失败但勒索界面和文件重命名仍正常——这本身也是教学点“不同权限下恶意行为的效果边界在哪里”4.2 课堂演示标准流程15分钟速成版我设计的标准演示流程严格控制在15分钟内确保学生注意力不涣散Step 1环境初始化2分钟新建空文件夹C:\WannaCry_Lab放入3个测试文件invoice.pdf、photo.jpg、notes.txt以及WannaCrydemo.exe和Anti_WannaCry.exe。强调“这里没有.exe文件所以全部会被标记”。Step 2勒索行为触发3分钟双击WannaCrydemo.exe观察✓ 全屏蓝底界面瞬间弹出任务栏消失✓ 桌面背景切换为WanaDecryptor.bmp✓ 倒计时开始24:00:00三个按钮灰显✓ 打开C:\WannaCry_Lab确认三个文件已变为invoice.pdf.WNCRY等。此时让学生双击invoice.pdf.WNCRY观察系统报错——这就是“可用性剥夺”的实体化。Step 3人工干预与恢复5分钟等待倒计时归零或手动修改系统时间加速点击“支付赎金”按钮无实际动作然后立即双击Anti_WannaCry.exe。观察✓ 控制台窗口闪现打印三行RESTORED: ...✓ 回到文件夹三个文件名恢复原状✓ 再次双击invoice.pdfAdobe Reader正常打开——证明数据完好。Step 4原理复盘5分钟投影Form2.cs中重命名代码段提问“如果我把photo.jpg.WNCRY改成photo.jpg.WNCRY.bakAnti_WannaCry还能恢复吗”引导学生发现EndsWith(.WNCRY)的匹配逻辑再打开log.txt让学生数行数并和dir /b *.WNCRY结果比对建立“代码-日志-系统”的三角验证思维。4.3 源码结构教学价值深度挖掘整个解决方案的目录结构本身就是一堂架构课主项目WannaCrydemoForm1.csUI层与Form2.cs业务逻辑层分离符合WinForm经典三层架构。Form1只负责展示和事件触发所有文件操作委托给Form2学生修改逻辑时无需碰界面代码恢复工具Anti_WannaCry独立解决方案无GUI依赖纯System.IO操作。对比主项目的System.Windows.Forms让学生直观感受“有界面”和“无界面”程序的引用差异资源管理Resources.resx集中管理图标、图片、字符串Settings.settings存储配置如倒计时初始值。修改Settings.Default.CountdownMinutes 10重新编译倒计时就变成10分钟——这就是配置驱动行为的实例Git友好设计.gitignore已排除bin/、obj/、.vs/等编译产物学生克隆仓库后直接Build Solution即可无需清理垃圾文件。我在实验课上会让学生做一次“最小化改造”把.WNCRY后缀改成.LOCKED并同步修改Anti_WannaCry的匹配逻辑。这个作业能检验他们是否真正理解了“后缀伪装”的双向一致性——改一处漏一处整个流程就断了。5. 常见问题与排查技巧实录那些学生问爆了的“为什么”和我的血泪答案5.1 “为什么双击WannaCrydemo.exe没反应界面一闪就没了”这是Windows 10/11最常见的问题根源在SmartScreen筛选器拦截。系统检测到未知发布者程序会静默阻止运行。解决方案分三步右键WannaCrydemo.exe→ 属性 → 勾选“解除锁定”Unblock这是最常见原因若仍无效在文件属性“常规”页底部点“详细信息”查看“数字签名”是否为空。空签名触发SmartScreen此时需临时禁用设置 → 更新与安全 → Windows安全中心 → 应用与浏览器控制 → 基于声誉的保护 → 关闭“检查应用和文件”终极方案用VS重新编译发布时勾选“创建应用程序清单文件”并在清单中添加requestedExecutionLevel levelasInvoker uiAccessfalse/——但这超出教学范围课堂上直接教学生第一步就够了。提示在实验指导书使用教程.md里我把这个故障放在第一章标题就叫“别让SmartScreen抢了你的教学风头”。5.2 “Anti_WannaCry.exe运行后说‘找不到文件’但明明目录里有.WNCRY文件”八成是路径问题。学生常犯两个错误- 错误1把Anti_WannaCry.exe放在C:\根目录却把测试文件放在C:\WannaCry_Lab然后双击Anti_WannaCry.exe——程序默认处理C:\自然找不到- 错误2用资源管理器双击Anti_WannaCry.exe但当前工作目录是C:\Users\Student资源管理器默认路径而非测试目录。解决方案✓ 教学生用命令行cd /d C:\WannaCry_Lab→Anti_WannaCry.exe✓ 或在Anti_WannaCry.csproj里修改输出路径为$(ProjectDir)bin\Debug\确保exe和测试文件同目录✓ 最笨但最有效把Anti_WannaCry.exe复制到测试目录再双击。5.3 “为什么invoice.pdf.WNCRY用记事本打开内容和原文件一模一样”这是学生验证“零加密”的关键证据但常因操作不当错过。正确步骤1. 用notepad invoice.pdf.WNCRY打开不要双击双击会报错2. 记事本会显示乱码PDF是二进制格式但拉到文件末尾能看到明文字符串%EOF——和原invoice.pdf末尾一致3. 更严谨的做法用fc /b invoice.pdf invoice.pdf.WNCRYWindows内置文件比较命令结果应显示FC: no differences encountered。注意若学生用Word打开.pdf.WNCRY会提示“文件损坏”这是正常的——Word试图按.pdf解析但文件头被.WNCRY后缀误导这反而印证了“后缀决定程序行为”的教学点。5.4 “倒计时归零后‘支付赎金’按钮点了没反应是不是坏了”不是坏了是故意设计的无响应。真实WannaCry点击支付按钮会打开Tor浏览器但本项目不集成网络功能。buttonPayRansom_Click事件里只有一行MessageBox.Show(支付功能已禁用。本项目仅用于教学演示。, INFO, MessageBoxButtons.OK, MessageBoxIcon.Information);这个设计有双重目的一是杜绝学生误点产生真实网络请求二是引出讨论“如果这是真实病毒点击按钮后会发生什么需要哪些系统组件支持”——自然衔接到后续课程的Tor网络、比特币钱包等知识点。5.5 “能不能让它也加密文件我想试试真正的AES”这是高阶需求但必须前置强调风险。我在实验课补充材料里提供了AES_Encryptor.cs参考实现但附加三条铁律1. 必须在虚拟机中运行物理机严禁尝试2. 加密前强制备份原始文件到Backup_YYYYMMDD文件夹3. 密钥必须硬编码在源码中如const string KEY WannaCryTeach2024;绝不生成随机密钥——否则学生真把文件加密了却找不到密钥教学就变事故了。参考代码片段public static void EncryptFile(string inputFile, string outputFile) { using (Aes aes Aes.Create()) { aes.Key Encoding.UTF8.GetBytes(KEY.PadRight(32).Substring(0, 32)); // 补齐32字节 aes.IV new byte[16]; // 全0 IV教学用不安全 using (FileStream fsInput new FileStream(inputFile, FileMode.Open)) using (FileStream fsOutput new FileStream(outputFile, FileMode.Create)) using (CryptoStream cs new CryptoStream(fsOutput, aes.CreateEncryptor(), CryptoStreamMode.Write)) { fsInput.CopyTo(cs); } } }这段代码特意用全0 IV和固定密钥就是为了让学生看清AES加密的输入输出关系。但我会在课堂上反复敲黑板“生产环境绝对禁止这样做IV必须随机密钥必须安全分发——这正是WannaCry当年被破解的突破口。”6. 教学延伸与安全实践建议从模拟器到真实攻防的跃迁路径这个项目不是终点而是起点。我在带毕业设计时常把它作为“恶意软件行为分析”课程的第一个实验后续会自然延伸出三条能力线行为分析线用Process Monitor监控WannaCrydemo.exe运行时的文件操作、注册表访问、进程创建事件。学生会惊讶地发现真实WannaCry在HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\EnableFirewall写入0来关闭防火墙而我们的教学版对此完全静默——这引出关键问题“为什么教学版可以省略这步真实攻击中关闭防火墙对后续传播意味着什么”逆向工程线用dnSpy打开WannaCrydemo.exe直接查看IL代码。学生能清晰看到Form2.PerformRansomOperation()方法里File.Move的调用栈对比真实WannaCry样本需脱壳会发现后者在CryptEncrypt调用前有大量API Hash混淆——教学版的“透明”恰恰凸显了真实样本的“隐蔽”。防御对抗线让学生编写PowerShell脚本监控当前目录下.WNCRY文件的创建事件powershell $watcher New-Object System.IO.FileSystemWatcher $watcher.Path C:\WannaCry_Lab $watcher.Filter *.WNCRY $watcher.EnableRaisingEvents $true Register-ObjectEvent $watcher Created -Action { Write-Host ALERT: .WNCRY file detected! -ForegroundColor Red # 此处可加入自动隔离逻辑 }这个脚本运行后当WannaCrydemo.exe创建第一个.WNCRY文件时终端立刻报警——这就是EDR端点检测响应最基础的规则引擎雏形。最后分享一个我坚持十年的教学铁律所有教学工具必须自带“自毁开关”。本项目里Form1.cs中有一个隐藏热键组合CtrlShiftAltR触发后会执行foreach (var proc in Process.GetProcessesByName(WannaCrydemo)) proc.Kill(); Directory.SetCurrentDirectory(Application.StartupPath); // 恢复原始壁纸需提前备份 if (File.Exists(Path.Combine(Application.StartupPath, backup_wallpaper.bmp))) { SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Path.Combine(Application.StartupPath, backup_wallpaper.bmp), SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); }这个开关不写在文档里只在课堂上演示一次“看任何恶意行为只要它运行在你的系统上你就永远掌握终止权。”——这句话比一百行代码更能筑牢学生的安全信仰。本文还有配套的精品资源点击获取简介这个C#项目专为信息安全教学设计能真实模拟WannaCry勒索病毒的典型行为表现运行后自动全屏弹出勒索界面、更换桌面背景并将当前目录下所有非exe文件统一添加.WNCRY后缀——仅修改扩展名不加密、不删除、不破坏原始数据所有文件内容保持原样可读。配套提供独立的Anti_WannaCry.exe命令行工具双击即可将同目录内带.WNCRY后缀的文件批量恢复为原始扩展名操作即时生效。整个程序仅作用于自身所在目录不含子文件夹不写注册表、不联网、不驻留系统兼容Windows 7/10/Server 2008。资源包含完整VS解决方案.sln .csproj、清晰分层的源码Form1.cs负责勒索界面、Form2.cs处理逻辑、WannaCrydemo.csproj为主项目、独立的Anti_WannaCry源码文件夹以及使用教程.md、示例图片和图标资源。适合高校课程实验、CTF教学演示、恶意软件行为分析入门等场景建议在空测试目录中运行避免误选工作文件夹。本文还有配套的精品资源点击获取