• 逆向破解——程序去除自校验


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

    自校验

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

    什么情况下考虑自校验

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

    自校验破解思路

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

    实验步骤

    • 尝试运行练习程序

    • 查壳

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

    • 脱壳后提示程序被非法修改,不能运行。

    • 尝试修复,自动修复-->失败

    • 手动修复

    • IAT起始地址

    • IAT结束地址

    • size=25c-190=cc

    • 手动修复IAT后

    • 修复后仍不能运行,考虑自校验,把脱壳后的程序发送到OD,原始程序脱壳完停留在OPE的界面不要关,我们来对比原始程序和脱壳完成的程序。

    • 在命令输入 bp CreateFileA,定位到kernel32的CreateFileA函数

    • CreateFileA是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

    • 两边都对这个函数下断点,然后运行到断点处,再执行到用户代码。

    • 先下API断点,执行到断点处,我们就来到函数内部;然后执行到用户代码,回到主程序中调用这个API的位置。

    • 至于为什么是CreateFileA,我觉得自校验之前可能要打开文件,读取一些校验信息。

    • 接下来单步运行,对比脱壳前后两个程序的跳转。

    • 这个跳转在脱壳后的程序20145315_.exe里实现了;

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

    • 这是一个条件跳转

    cmp eax ,dword ptr ss:[ebp-0x8]
    Jnz shoet  00401215
    

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

    • 修改方法有很多种

    • 比如,用Nop替换

    • 保存到可执行文件

    • 修改后正常运行

    • 还可以做其他修改

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

    • 保存,显示正常运行

  • 相关阅读:
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    今日总结
    Interesting Finds: 2010 02.08 ~ 02.13
  • 原文地址:https://www.cnblogs.com/5315hejialei/p/7064190.html
Copyright © 2020-2023  润新知