zoukankan      html  css  js  c++  java
  • [逆向/壳]脱壳方法

    壳的作用

    1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等,即为了保护软件不被破解,通常都是采用加壳来进行保护。

    2.需要把程序压缩的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩。

    3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。

    脱壳方法

     

    方法

    详细过程

    单步跟踪法

    1.OD载入,点“不分析代码!”

    2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4

    3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)

    4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!

    5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP

    6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALLF7进入

    7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就会到程序的OEP


    备注:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP

    ESP定律法

    ESP定理脱壳(ESPOD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)

    1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)

    2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!

    3.选中下断的地址,断点--->硬件访--->WORD断点。

    4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP

    内存镜像法

    1:用OD打开软件!

    2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!

    3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP

    Popad

    1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPXASPACK壳),然后按下F2F9运行到此处

    2.来到大跳转处,点下F8,到达OEP

    最后一次异常法

    1:用OD打开软件

    2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序

    3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m

    4CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)

    5:在OD的右下角我们看见有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!

    6:按F2下断点!然后按SHIFT+F9来到断点处!

    7:去掉断点,按F8慢慢向下走!

    8:到达程序的OEP

    模拟跟踪法

    1:先试运行,跟踪一下程序,看有没有SEH暗桩之类

    2ALT+M打开内存镜像,找到(包含=SFX,imports,relocations


    内存镜像,项目 30

    地址=0054B000

    大小=00002000 (8192.)

    Owner=check 00400000

    区段=.aspack

    包含=SFX,imports,relocations

    类型=Imag 01001002

    访问=R

    初始访问=RWE

    3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪


    备注:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用

    SFX”

    1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾

    2:切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。

    3:重载程序(如果跳出是否“压缩代码?”选择“否”,OD直接到达OEP


    Btw:这种方法不要滥用得好,锻炼能力为妙。

    壳与脱壳


    UPX

    手动脱壳

    单步跟踪法

    ESP定律

    内存镜像法

    Popad

    模拟跟踪法

    SFX

    脱壳机

    UPXShell

    PEID

    ASPack

    手动脱壳

    单步跟踪法

    ESP定律法

    内存镜像法

    模拟跟踪法

    SFX

    脱壳机

    PEID(PEID Generic Unpacker)

    AspackDie

    UnAspack

    FSG

    手动脱壳

    单步法(忽略所有异常)

    ESP定律忽略所有异常

    模拟跟踪法(忽略所有异常)

    SFX

    内存镜像法

    脱壳机

    PEID

    UnFSG2.0(只针对FSG2.0有效)

    PECompact

    手动脱壳

    单步法(忽略所有异常)

    ESP定律忽略所有异常

    模拟跟踪法

    脱壳机

    PEID(PEID Generic Unpacker)

    DePeCompact1.x DePeCompact2.x DePeCompact3.x DePeCompact2.x-3.x

    Armadillo

    手动脱壳

    见穿山甲脱壳总结

    脱壳机

    此脱壳机很少,且很难脱干净

    Acprotect

    手动脱壳

    OD异常设置不忽略内存异常,隐藏OD

    OD载入程序

    F9一下,到最后一次典型异常!

    ***********************************************

    堆栈提示:

    0012FF84 0012FFE0 指针到下一个 SEH 记录

    0012FF88 00433731 SE 句柄 //右键--转存中跟随--下内存访问断点

    ***********************************************

    下好断点后,Shift+F9运行!

    00433731 8B5C24 0C mov ebx,dword ptr ss:[esp+C] //运行到这里,F2下断,Shift+F9运行

    00433735 8383 B8000000 02 add dword ptr ds:[ebx+B8],2

    0043373C 33C0 xor eax,eax

    0043373E C3 retn

    00433781 8B048E mov eax,dword ptr ds:[esi+ecx*4] //运行到这里,F2下断,Shift+F9运行

    00433784 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+4>

    00433788 2BC3 sub eax,ebx

    0043378A C1C8 05 ror eax,5

    0043378D 2BC2 sub eax,edx

    0043378F 81C2 43A18EAB add edx,AB8EA143

    00433795 89048E mov dword ptr ds:[esi+ecx*4],eax //Shift+F9运行后就跳到这里

    00433798 49 dec ecx

    00433799 ^ EB E1 jmp short 123.0043377C

    0043379B 61 popad

    0043379C 61 popad

    0043379D C3 retn //取消所有的断点[2F2INT3断点),1次内存访问断点]F4下来!

    打开内存镜像

    .text段下F2断点地址,Shift+F9运行


    备注:真正脱AcProtect的时候以上出现的地址应该都不相同,但是操作流程不变。

    脱壳机

    ACKiller

    ASProtect

    手动脱壳

    OD载入之后忽略除了内存访问之外的所有异常,隐藏ODShift+F9,注意堆栈!

    0012FF54 018032F0

    0012FF58 01811810 ASCII "6uob9ACQoUA=" //硬盘指纹

    当第2次出现硬盘指纹的时候,在00401000F2断点Shift+F9

    00480650 55 push ebp

    00480651 8BEC mov ebp,esp

    00480653 8B45 08 mov eax,dword ptr ss:[ebp+8]

    00480656 A3 EC7E4800 mov dword ptr ds:[487EEC],eax //487EEC就是保存注册名的位置

    0048065B 5D pop ebp

    0048065C C2 0400 retn 4

    继续Shift+F9运行来到最后一次异常!

    01802CD1 3100 xor dword ptr ds:[eax],eax //最后一次异常

    01802CD3 64:8F05 0000000>pop dword ptr fs:[0]

    01802CDA 58 pop eax

    01802CDB 833D 7C6D8001 0>cmp dword ptr ds:[1806D7C],0

    01802CE2 74 14 je short 01802CF8

    01802CE4 6A 0C push 0C

    01802CE6 B9 7C6D8001 mov ecx,1806D7C

    01802CEB 8D45 F8 lea eax,dword ptr ss:[ebp-8]

    01802CEE BA 04000000 mov edx,4

    01802CF3 E8 54E1FFFF call 01800E4C

    01802CF8 FF75 FC push dword ptr ss:[ebp-4]

    01802CFB FF75 F8 push dword ptr ss:[ebp-8]

    01802CFE 8B45 F4 mov eax,dword ptr ss:[ebp-C]

    01802D01 8338 00 cmp dword ptr ds:[eax],0

    01802D04 74 02 je short 01802D08

    01802D06 FF30 push dword ptr ds:[eax]

    01802D08 FF75 F0 push dword ptr ss:[ebp-10]

    01802D0B FF75 EC push dword ptr ss:[ebp-14]

    01802D0E C3 retn //F2下断,Shift+F9运行,注意堆栈

    0012FF5C 018148AC

    0012FF60 00400000 ASCII "MZP"

    0012FF64 C9F5F162

    0012FF68 0012FFA4 //要的就是0012FF68


    hr 0012FF68,F9运行

    01815082 03C3 add eax,ebx ; emailcas.00400000 //来到这里,F8

    01815084 894424 1C mov dword ptr ss:[esp+1C],eax

    01815088 61 popad

    01815089 FFE0 jmp eax //跳到OEP


    备注:寻找OEP的过程大致如上所述,当然,破解时地址可能不一致,代码也不会相同

    修复IAT,经常需要将无法修复的指针直接cut掉,而且需要将原程序打开,形成新的进程,然后在ImportREC中选择新的进程进行修复。


    Asprotect中经常会用到stolen code技术,所以最后还需要还原被抽取的字节。

    脱壳机

    AsProtect Unpack


  • 相关阅读:
    异常
    一线互联网大厂,内推吧!
    node-sass 安装失败的解决办法
    上下文执行栈
    1像素边框
    babel需要这样配置
    【webpack】中enforce的使用方法
    【webpack】中resolveLoader的使用方法
    【webpack】中的devtool的使用方法
    【webpack】中splitChunk的使用方法
  • 原文地址:https://www.cnblogs.com/sevensd/p/5479396.html
Copyright © 2011-2022 走看看