逆向工程实验

软件保护方式

  1. 功能限制
  2. 时间限制
  • 运行时长限制
  • 使用日期限制
  • 使用次数限制
  1. 警告窗口

分析工具

  1. 静态分析工具
  • IDA
  • W32Dasm
  • lordPE
  • Resource Hacker
  1. 动态分析工具
  • OllyDbg
  • WinDbg

对抗分析技术

  1. 反静态分析技术
  • 花指令
  • 自修改代码技术
  • 多态技术
  • 变形技术
  • 虚拟机保护技术
  1. 反动态分析技术
  • 检测调试状态
  • 检测用户态调试器
  • 检测内核态调试器
  • 其他方法:父进程检测;StartupInfo 结构;时间差;通过Trap Flag检测
  1. 发现调试器后的处理
  • 程序自身退出
  • 向调试器窗口发送消息使调试器退出
  • 使调试器窗口不可用
  • 终止调试器进程

PE文件格式基础

加壳脱壳

实验1:软件破解

对象

crack.exe,28.0 KB

  • 无保护措施:无壳、未加密、无反调试措施
  • 用户名至少要5个字节
  • 输入错误验证码时输出:“Bad Boy!”

爆破

查找显示注册结果相关代码

当输入错误验证码时,程序会输出“Bad Boy”,因此我们将程序拖入IDA,以流程图显示函数内部的跳转。查找“Bad Boy”字符串,我们可以定位到显示注册结果的相关代码:

查找注册码验证相关代码

用鼠标选中程序分支点,按空格切换回汇编指令界面

可以看到,这条指令位于PE文件的.text节,并且IDA已经自动将地址转换为运行时的内存地址VA:004010F9

修改程序跳转

  • 现在关闭IDA,换用OllyDbg进行动态调试来看看程序时如何分支跳转的Ctrl+G直接跳到由IDA得到的VA:004010F9处查看那条引起程序分支的关键指令
  • 选中这条指令,按F2设置断点,再按F9运行程序,这时候控制权会回到程序,OllyDbg暂时挂起。到程序提示输入名字和序列号,随意输入(名字大于五个字节),点击ok后,OllyDbg会重新中断程序,收回控制权,如图:
  • 验证函数的返回值存于EAX寄存器中,if语句通过以下两条指令执行

    1
    2
    cmp eax,ecx
    jnz xxxxxxx
  • 也就是说,当序列号输入错误时,EAX中的值为0,跳转将被执行。
    如果我们把jnz这条指令修改为jz,那么整个程序的逻辑就会反过来。
    双击jnz这条指令,将其改为jz,单击”汇编”将其写入内存

    可以看到此时程序执行了相反的路径

  • 上面只是在内存中修改程序,我们还需要在二进制文件中也修改相应的字节,这里考察VA与文件地址之间的关系

  • 用LordPE打开.exe文件,查看PE文件的节信息

    根据VA与文件地址的换算公式:
    1
    2
    3
    文件偏移地址 = VA - Image Base - 节偏移
    = 0x004010F9 - 0x00400000 - 0
    = 0x10F9

也就是说,这条指令在PE文件中位于10F9字节处,使用010Editer打开crack.exe,将这一字节的75(JNZ)改为74(JZ),保存后重新执行,破解成功!

编写注册机

查找显示注册结果相关代码

查找注册码验证相关代码

根据注册码验证代码编写注册机

实验二:软件反动态调试技术分析

对象

CrackMe1.exe 1641.0 KB
无保护措施:无壳、未加密、无反调试措施
使用OllyDbg对该程序进行调试时,程序会自动退出

要求

  1. 分析CrackMe1.exe是如何通过父进程检测实现反OllyDbg调试的
  2. 分析除父进程检测外,该程序用到的反动态调试技术

实验三:加花加密反调试技术分析

对象

CrackMe2.exe 9.00 KB
保护措施:部分加花、部分加密、简单反调试
根据(提示)[https://res.cloudinary.com/dozyfkbg3/raw/upload/v1553779403/%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3/Crackme2%E6%8F%90%E7%A4%BA.docx]分析该程序

内容

  1. 加壳脱壳深入理解
  2. 尝试手动脱壳
  3. 分析CrackMe2.exe中花指令
  4. 分析CrackMe2.exe中的被加密的函数的功能
  5. 分析CrackMe2.exe中的反调试手段
  6. 分析CrackMe2.exe中混合的64位代码的功能
您的支持将鼓励我继续创作!