zoukankan      html  css  js  c++  java
  • 逆向破解程序脱壳篇-压缩壳

    一、普及
    What
    所谓“壳”就是专门压缩的工具。 
       这里的压缩并不是我们平时使用的RAR、ZIP这些工具的压缩,壳的压缩指的是针对exe、com、和dll等程序文件进行压缩,在程序中加入一段如同保护层的代码,使原程序文件代码失去本来面目,从而保护程序不被非法修改和反编译,这段如同保护层的代码,与自然界动植物的壳在功能上有很多相似的地方,所以我们就形象地称之为程序的壳。


    WHY  对程序专门进行压缩,以减小文件大小,方便传播和储存。
    ② 我这是一个商业的程序,是用来赚钱的,怎么可以被别人破解呢,那我就是加密保护壳(Safengine、VMprotect、winlicense、Themida)保护程序不被非法修改和反编译。
    ③ 其他(病毒、木马加壳,Anti-AntiVirus)
     
    DO?
    脱壳
    就是把保护壳去掉更好的调试和破解能清楚看到代码

    OEP
    程序的入口点如果我们找到OEP我们就能快速脱壳就类似于找到钥匙就能开门
    壳就是一把锁OEP就是锁孔
     
    IAT
    IAT就是指针脱壳的话可能要修复指针如果没有指针就相当于人只有一个身体没有灵魂
    壳可能会对指针进行处理修复输入表就是修复IAT
    段首和段尾
    段首,是上一段的结尾也是下一段的开头一段是以retn开始和retn结尾。我们经常听到在段首下断所以我们要找的就是retn下面第一个push ,段首是以push开始滴所以我们不会在retn那里下段而段尾我们是在retn处下断因为软件的子程序是以retn返回到某一地方所以返回的时候要在retn出下断。
     
    二、准备知识
    ESP定律的原理就是“堆栈平衡”原理。
    1、在命令行下断hresp-4(此时的ESP就是OD载入后当前显示的值)
    2、hrESP(关键标志下一行代码所指示的ESP值(单步通过))
    CALL
    1.向堆栈中压入下一行程序的地址;
    2.JMP到call的子程序地址处。
     
    RETN
    call对应的就是RETN了。对于RETN我们可以这样来理解:
    1.将当前的ESP中指向的地址出栈;
    2.JMP到这个地址
     
    三、开始
    工具:
    ①、peid
    ②、OD
    ③、DetectItEasy
    ④、LordPE
    ⑤、ImportREC
     
     esp定律
    1.F8,观察OD右上角寄存器中ESP有没有实现(红色)
    2.命令行下 DD ******(当前代码ESP值),回车
    3.DD就选中下端地址,断点—硬件访问—DWORD断点,F9运行,到跳转处按F8 OEP

    1PEID先看程序的壳
     
    2ASPACK的壳子属于压缩壳的一种
    3、用DetectItEasy V1.0看一下编译器为Delphi
    看一下delphi的oep
    4、之后,载入od
     

    5、选择是否都可以的

    这是带壳的.
    6f8单步往下走

    7ESPEIP都变成红色(实现)的时候,在ESP上右键下ESP断点
     
    8、下完断点,F9运行程序
     
    9、之后F8单步往下走,一直走
     
    10、到达OEP,右键-OD脱壳调试进程
     

    11、复制红框里面的oep,(9C25C之后关闭这个框,OD最小化
    12、打开loadpe
    13、选择刚刚的程序进程--修复镜像大小-完全转存
     
    14、转存后打开会出现这样的结果
     
    15、然后再用ImportREC修复
     
    16、点选刚刚的进程
    17、把之前复制的OEP放到1里面,按序号依次点击
     

    18、修正转储刚刚导出的那个
    19、脱壳完成...
    之后放到原目录下运行即可
    三、内存镜像法
    内存镜像法找oep
    1.OD载入软件
    2.点选项—调试选项—忽略全部—CTRL+F2重载
    3.ALT+N打开内存镜像,找程序第一个.rsrcF2下断—SHIFT+F9运行到断点,再打开找到程序第一个.rsrc上面的.code处(就是00401000处),F2下断—SHIFT+F9或无异常按F9,到OEP
    1、载入DO之后,alt+m
     
    2、在程序的资源处下内存访问断点

     

     
    3、返回程序按F9运行程序,也可以用快捷键SHIFT+F9运行程序
    界面是这个样子的

     

     
    4ALT+M返回,在代码段下内存访问断点

     

    5SHIFT+F9运行程序

     

     
    6、直接到达OEP,按照之前的方法脱壳就可以了
    7、OD自带的插件即可脱壳
     
    单步跟踪法
    1.OD载入,不分析代码。
    2.CALLF7,远CALLF8,实现向下的跳转。
    3.有回跳处,下一句代码处—F4 (右键—代码断点运行到所选)
    4.大的跳转(大跨段,JMP***JE***RETN),很快就会到OEP
     
     
    最后一次异常
    1.OD打开—点选项—调试选项—去掉所有异常—CTRL+F2重载.
    2.SHIFT+F9.只到程序运行,记下次数M
    3.CTRL+F2重载—按SHIFT+F9(次数为M-1次)
    4.CTRL+G—输入OE右下角的SE句柄前的地址.
    5.F2下断—SHIFT+F9到断点处.
    6.去断按F8,到OEP.
     
    OEP大全
     
     
     
     
    常用脱壳工具: 
    1、文件分析工具(侦测壳的类型):Fi,GetTyp,peid,pe-scan, 
    2、OEP入口查找工具:SoftICE,TRW,ollydbg,loader,peid 
    3、dump工具:IceDump,TRW,PEditor,ProcDump32,LordPE 
    4、PE文件编辑工具PEditor,ProcDump32,LordPE 
    5、重建Import Table工具:ImportREC,ReVirgin 
    6、ASProtect脱壳专用工具:Caspr(ASPr V1.1-V1.2有效),Rad(只对ASPr V1.1有效),loader,peid
     
     
    总结:
    1、介绍了什么是压缩壳,什么是加密壳
    2、脱壳原理
    3、脱壳常用的工具
    4、4种脱壳方法及修复
    5、各种语言OEP特征
    6、压缩壳这几种方法几乎够用了,如果出现冷门壳,用这些方法脱不掉,可以用之间说的打补丁的方法。
    现在压缩壳都有很多自动脱壳机,但是加密壳呢?学习手工脱壳不是为了单纯去学怎么脱这一种壳,学习的是技巧,以后遇到其他的没有脱壳机的壳要尝试手工去脱,就像一个网站注入点,你可以用sqlmap去注入,如果有waf呢?Sqlmap脚本绕不过去呢?不还得靠手工去试,工具是死的,人是活的.
  • 相关阅读:
    java如何手动创建一个线程池
    HashMap的面试总结(摘抄)
    JDK源码调试
    分布式和集群的区别
    开发中model,entity和pojo的区别
    java并发编程_CountDownLanch(倒计数锁存器)应用场景
    Map 怎么排序
    java中Thread的 interrupt异常处理
    zookeeper节点失效重连机制
    java并发库_并发库知识点整理
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/7274418.html
Copyright © 2011-2022 走看看