逆向破解

逆向破解

暴力破解

原理:

脱壳以后,如果软件有登录机制,我们可以利用软件登录时提供的关键字,反汇编后找到关键跳转。

确认跳转是否与登录失败有关,如果有关系,想办法让跳转不实现。

直接修改汇编代码,把关键命令跳转修改为nop,就可以去除登录验证了。

实验过程:

  • 尝试运行
    886825-20170621164124241-917862383.png

  • 发现关键词False
    886825-20170621164132179-1371859411.png

  • PEiD查不出壳,用OD调试
    886825-20170621164144538-1639736924.png

  • Ctrl+g 00401000来到代码段
    886825-20170621164152648-2100978766.png

  • 右键中文搜索引擎,搜索关键字False
    886825-20170621164159241-768104423.png

  • 双击找到False对应的代码,向上找相关的跳转,”>”表示有跳转进入,”﹀”表示有向下的跳转。找到可能的跳转关键句,下断,运行。
    886825-20170621164205210-655627055.png

  • 出现登录界面,随意输入使得登录失败,观察跳转是否实现
    886825-20170621164216257-1814079062.png

  • 灰色线变成红色,表示登录失败后跳转实现。
    886825-20170621164223320-10493928.png

  • 右键,二进制,用Nop填充,并复制到可执行文件,保存文件,尝试运行,破解成功。
    886825-20170621164231632-1861164405.png

逆向破解——程序去自校验方法

自校验

意思是这些程序会检查自己有没有被修改,如果发现被修改的话,便会离开或进行其它动作。基本的校检方法包括 checksum, 检查大小, 检查跳转代码,等等。

什么情况下考虑自校验

当一个程序脱壳前可以正常运行,脱壳以后不能运行,修复以后也不行,程序不能运行或者闪退、弹窗提示错误等,我们就要考虑是不是因为程序有自校验了。

自校验破解思路

将脱壳前和脱壳后的程序分别单步运行,对比找出关键跳转,使得自校验保护程序的跳转不能实现。

实验步骤

  • 尝试运行练习程序
    886825-20170622114744913-2071234542.png

  • 查壳
    886825-20170622114749616-548529818.png

  • ESP定律法脱壳,单步,数据窗口跟随当前ESP值,设置硬件访问断点,运行到断点处,单步运行到程序OPE
    886825-20170622114756570-2034912955.png

  • 脱壳后提示程序被非法修改,不能运行。
    886825-20170622114806351-1846366057.png
    886825-20170622114816820-978257738.png

  • 尝试修复,自动修复-->失败
    886825-20170622114824273-112341656.png

  • 手动修复
    886825-20170622114830523-955180838.png

  • IAT起始地址
    886825-20170622114836835-1122800095.png

  • IAT结束地址
    886825-20170622114843570-1216502603.png

  • size=25c-190=cc
  • 手动修复IAT后
    886825-20170622114851663-2059107355.png

  • 修复后仍不能运行,考虑自校验,把脱壳后的程序发送到OD,原始程序脱壳完停留在OPE的界面不要关,我们来对比原始程序和脱壳完成的程序。
  • 在命令输入 bp CreateFileA,定位到kernel32的CreateFileA函数
  • CreateFileA是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
  • 两边都对这个函数下断点,然后运行到断点处,再执行到用户代码。
  • 先下API断点,执行到断点处,我们就来到函数内部;然后执行到用户代码,回到主程序中调用这个API的位置。
  • 至于为什么是CreateFileA,我觉得自校验之前可能要打开文件,读取一些校验信息。
  • 接下来单步运行,对比脱壳前后两个程序的跳转。
  • 这个跳转在脱壳后的程序20145315_.exe里实现了;
    886825-20170622114901429-1708348813.png

  • 但是在还未脱壳的程序 练习.exe 里没有实现。
    886825-20170622114907913-298579041.png

  • 这是一个条件跳转
cmp eax ,dword ptr ss:[ebp-0x8]
Jnz shoet  00401215

如果当前eax的值与ss:[ebp-0x8]相等,跳转实现;
JE/JZ 等于转移;
JNE/JNZ 不等于时转移.

  • 修改方法有很多种
  • 比如,用Nop替换
    886825-20170622114949226-1295190481.png

  • 保存到可执行文件
  • 修改后正常运行
    886825-20170622114955570-1651090972.png

  • 还可以做其他修改
  • 比如直接修改汇编语言
    cmp eax ,dword ptr ss:[ebp-0x8]
    Jnz shoet 00401215
    如果当前eax的值与ss:[ebp-0x8]相等,跳转实现
    JE/JZ 等于转移
    JNE/JNZ 不等于时转移
    把汇编语句修改为jz short 00401215
    886825-20170622115005726-1363795041.png
    886825-20170622115010976-1721501758.png

  • 保存,显示正常运行
    886825-20170622115017554-1177446836.png

    逆向破解——处理附加数据

    附加数据[overlay]

  • 实际应用:软件要处理一些数据流文件,这些数据文件被单独的保存在硬盘上,当我们使用notepad的打开功能的时候,就可以去读取数据文件了。如果将这些需要读取的数据放到pe文件的后面,让程序自动的运行打开的功能,而不需要打开操作。
  • 一般情况下,代码运行时,会根据文件偏移RA,文件偏移大小RS和与其对应的虚拟地址偏移VA,虚拟地址偏移大小VS的值,把磁盘的代码、数据、资源等加载到内存中。
  • 如果数据不在PE的区段中,代码执行时就不会从磁盘被映射到内存,就是说如果在文件中存在不在区段里面的数据,这部分数据就被认为是附加数据(overlay).
  • overlay是不映射到内存的,他将被程序以打开自己的方式来读取数据

    处理附加数据

  • 附加数据是在附加在文件后面的,不被映射到内存空间中的数据,他提供他自己的程序打开自己来读取,所以dump下来的时候是没有overlay的,需要我们手动把这一部分的数据粘贴到dump下来的数据后面。
  • 一般来说在区段里面我们能找到所有区段的大小,这个大小的后面就是overlay的开始,就是说,overlay的开始地方就是最后一个区段的RA+RS

    工具与环境

  • 环境:WIN XP虚拟机
  • 工具:PEiD查壳、OD调试、WinHEX 16进制编辑器

    实验步骤

  • 查壳
    886825-20170626130316039-1524936752.png

  • 开头是pushfd和pushad入栈,后面的出栈命令肯定是popad和popfd
    886825-20170626130325024-1739308095.png

  • 在出栈命令处下断点,再单步,运行到OPE
    886825-20170626130338227-1348466628.png

  • 脱壳后查壳,显示无壳,但是附加数据的标志[overlay]也没有了,因为用OD载入时,附加数据没有映射到内存,所以domp程序时,附加数据没有被复制。
    886825-20170626130345180-966792505.png

  • 尝试运行,运行失败,打不开。
  • 尝试修复,自动修复IAT
    886825-20170626130354711-322462766.png

  • 运行,还是不行,滴的一声,无法运行。
  • 查壳中有[Overlay],表示有附加字段。
    886825-20170626130403539-1564742527.png

  • 我们用两种方法来处理附加数据

方法一
  • 用WinHex打开还未脱壳的程序,拉到底,从最下方开始向上查找第一段全零数据。
    886825-20170626130530914-128624678.png

  • 原理:由于文件的对齐机制,磁盘上每个段的结束都填充了大量的0.附加数据在文件末尾,所以只要找到磁盘文件中最后一个全零段,接下来就是附加数据。
  • 把附加数据复制粘贴到脱壳以后的文件中,运行成功。
    886825-20170626130539805-1385244745.png

  • 再次查壳,显示有附加数据。
    886825-20170626130549524-704807664.png

方法二
  • 在loadPE中打开未脱壳的程序
  • 打开PE编辑器,打开程序区段表
    886825-20170626130556743-1982889998.png

  • 找区段表里的最后一个区段
  • 找到文件偏移RA和文件偏移大小RS
  • [RA+RS]=0X4000+X8800=0X8C00
  • 用WinHex打开,转到偏移量8C00
    886825-20170626130623524-782411120.png

  • 从8C00开始,就是附加数据,把附加数据复制到脱壳后的程序末尾即可。

886825-20170626130731493-943812743.png

转载于:https://www.cnblogs.com/5315hejialei/p/7124528.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值