编辑
2026-06-01
恶意代码分析实验报告
00

目录

实验六:OllyDebug动态结合实验报告
一、实验目的
二、实验内容
三、实验步骤
四、实验分析

实验六:OllyDebug动态结合实验报告

一、实验目的

  1. 掌握OllyDebug调试器的界面布局及基础操作,熟练掌握地址跳转、断点设置与单步调试技巧。
  2. 学习在动态调试过程中查看内存窗口与堆栈视图数据,能够跟踪并分析栈中字符串的构建过程。
  3. 实践IDA Pro静态分析与OllyDebug动态调试的结合方法,掌握通过加载符号表辅助识别未知函数的技术。

二、实验内容

  1. OD基础操作与环境搭建:熟悉OD的CPU、寄存器、栈及内存四大窗口,利用IDA定位程序入口点,在OD中进行程序载入与地址跳转。
  2. 动态跟踪与数据监控:通过设置断点和单步执行(F8),跟踪程序执行流,利用“数据窗口中跟随”功能观察栈中字符数据的写入与构建过程。
  3. 工具结合与逻辑验证:结合IDA分析未知函数功能,使用LoadMapEx插件加载符号表,分析文件名比对逻辑,通过重命名文件触发恶意代码Payload。

三、实验步骤

步骤1:入口点定位与断点设置 首先使用IDA Pro打开目标文件Lab09-02.exe,分析并确认main函数的入口地址为0x00401128。启动OllyDebug,按F3快捷键载入Lab09-02.exe。在反汇编窗口中按下Ctrl+G,输入地址0x00401128跳转至主函数入口,按下F2键在该处设置断点。

步骤2:运行程序并观察栈数据 按下F9键运行程序,程序中断在断点处。连续按F8(单步步过)执行,观察反汇编窗口中的一系列mov指令,这些指令正在将字节数据写入栈空间。注意栈中出现两次0(字符串结束符),这表明程序正在栈上构建两个独立的字符串。

步骤3:内存窗口查看隐藏字符串 在堆栈窗口中右键点击存放数据的地址,选择“数据窗口中跟随”。持续按F8执行,直到内存窗口中数据写入完毕。此时可以清晰地看到在栈上生成的两个字符串:一个是1qaz2wsx3edc,另一个是ocl.exe

步骤4:API函数参数与返回值分析 继续按F8执行至GetModuleFileNameA函数调用处。在调用前观察堆栈中的参数,确认第二个参数是用于存储路径的缓冲区,第三个参数是缓冲区长度。执行该函数后,在内存窗口跟随缓冲区地址,发现该位置已被写入当前程序的完整路径(如桌面路径+Lab09-02.exe)。

步骤5:IDA结合OD识别未知函数 执行至地址0x00401217处,遇到一个未知调用函数。此时切换到IDA Pro查看该地址对应的函数,确认为strrchr,用于查找字符串中最后一次出现指定字符的位置。为了在OD中显示该函数名,在IDA中点击File -> Produce file -> Create MAP file...导出符号文件。回到OD,使用插件LoadMapEx加载该MAP文件,此时反汇编窗口中原本未识别的地址已显示为strrchr

步骤6:触发条件分析与验证 继续按F8执行至strcmp函数处。观察堆栈窗口,发现该函数正在比较两个字符串:一个是通过GetModuleFileNameA获取的当前文件名(如Lab09-02.exe),另一个是之前在栈中构建的ocl.exe。 分析可知,程序逻辑要求当前文件名必须为ocl.exe才能继续执行Payload。将Lab09-02.exe重命名为ocl.exe并运行,通过Process Explorer观察到程序未直接退出,而是持续运行,成功触发了恶意负载。

四、实验分析

实验结果 通过OllyDebug动态调试,成功在内存地址中定位到了恶意代码构建的两个关键字符串1qaz2wsx3edcocl.exe。分析发现,程序调用GetModuleFileNameA获取自身路径,并使用strrchr提取文件名,随后通过strcmp将当前文件名与ocl.exe进行严格比对。当文件名不匹配时程序直接退出,只有在将程序重命名为ocl.exe后,才绕过了自我检测,成功激活了恶意代码的后续攻击负载。

个人收获 本次实验深刻体会到了动静结合分析的高效性。通过IDA导出的MAP文件解决了OD无法识别系统函数符号的问题,极大地提升了代码可读性。同时,掌握了栈数据追踪技巧,理解了恶意代码利用栈空间动态构建敏感字符串以对抗静态字符串扫描的手段。此外,通过分析文件名自校验逻辑,我对恶意代码的反调试和环境检测机制有了更直观的认识。

本文作者:Linxiong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!