• “破解大牛是怎么炼成的”之壳与ESP定律


    文章难易度:★★★
    文章阅读点/知识点:逆向破解
    文章作者:Sp4ce
    文章来源: i春秋     
    关键字:网络 信息安全技术

    本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!
    一、前言
    通过前面几篇的学习,我们学会了利用暴力破解达到绕过注册机制和追踪注册码来达到“合法”用软件的方法,但是我们往往会遇到代码经过混淆器混淆的程序,此类混淆器可以称之为壳,壳又可分为压缩壳(常见的有UPX、北斗、ASDPack、Npack、PECompact等)和保护壳(如强壳Safengine、VMprotect、winlicense、Themida等),压缩壳作用是把程序进行体积缩小化处理,保护壳主要作用是混淆或加密代码防止他人进行逆向程序、破解程序。我们可以通过一些侦壳程序进行识别,但有些壳会采用伪装技术来混淆侦壳程序。
    本次文章是UPX压缩壳的脱壳工作。
    二、目录

    1、前期工作

    2、OD操作

    3、小结

    三、正文

    我们先看下加壳软件和未加壳对比

    左边是没有加壳的,右边是加壳的,明显的发现体积缩小了一半

    我们再用PEID对比下加壳前和加壳后的EP段和一些有用的信息

    我们载入OD后会发现这个提示,为了方便接下来的操作,我们在这里选否

    载入后的OD

    我们F8单步走走,注意右面寄存器FPU的显示,当有且只有ESP和EIP为红色时,我们可以用ESP定律了

    下图就是这样的例子,我们这时候可以右键ESP后面那个地址,然后选择在数据窗口中跟随

    也可以直接在下面的Command窗口中输入dd 0012FFA4 后回车

    这两种方法最终的效果都会在数据窗口中跟随到0012FFA4这个地址,然后我们可以右键那一段地址任意HEX设置断点→硬件访问→word型

    这个操作也可以在command窗口输入 HR 0012FFA4 回车后完成,然后我们按F9运行程序,此时程序会暂停在我们设置的断点位置

    然后我们F8单步走,到了jnz位置后不要再按F8了(这是向上跳转的),我们用鼠标点击她的下一行然后按F4,让程序强制转到跳转下面继续运行,到达jmp后我们必须跳过去,因为接下来就有可能是程序的OEP领空

    OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP)

    这里就是易语言/VC程序的OEP

    然后我们就可以脱壳了,脱壳前我们先把断点清理掉,以免出错【调试→硬件断点→删除】

    然后右击程序当前位置第一行代码,选择OllyDump脱壳调试进程

    然后我们在弹出的窗口中选择脱壳,然后输入要另存为的文件名

    此时,我们已经脱壳结束,检查下程序能否正常运行

    我们再看下PEID对比脱壳前和脱壳后的不同

    EP段提示UPX0是因为我没有优化区段

    我们可以点>>来详细看下对比

    脱壳后

    未脱壳

    到此,脱壳完成。

    3、小结

    程序在下面,部分语言OEP

    delphi:

      55            PUSH EBP
      8BEC          MOV EBP,ESP
      83C4 F0       ADD ESP,-10
      B8 A86F4B00   MOV EAX,PE.004B6FA8


    vc++
       55            PUSH EBP
       8BEC          MOV EBP,ESP
       83EC 44       SUB ESP,44
       56            PUSH ESI

    vc6.0
      55                 push ebp
      8BEC               mov ebp,esp
      6A FF              push -1

    vc7.0

      6A 70              push 70
      68 50110001        push hh.01001150
      E8 1D020000        call hh.010017B0
      33DB               xor ebx,ebx

    vb:


    00401166  - FF25 6C104000   JMP DWORD PTR DS:[<&MSVBVM60.#100>]      ; MSVBVM60.ThunRTMain
    0040116C >  68 147C4000     PUSH PACKME.00407C14
    00401171    E8 F0FFFFFF     CALL <JMP.&MSVBVM60.#100>
    00401176    0000            ADD BYTE PTR DS:[EAX],AL
    00401178    0000            ADD BYTE PTR DS:[EAX],AL
    0040117A    0000            ADD BYTE PTR DS:[EAX],AL
    0040117C    3000            XOR BYTE PTR DS:[EAX],AL


    bc++
    0040163C > $ /EB 10         JMP SHORT BCLOCK.0040164E
    0040163E     |66            DB 66                                    ;  CHAR 'f'
    0040163F     |62            DB 62                                    ;  CHAR 'b'
    00401640     |3A            DB 3A                                    ;  CHAR ':'
    00401641     |43            DB 43                                    ;  CHAR 'C'
    00401642     |2B            DB 2B                                    ;  CHAR '+'
    00401643     |2B            DB 2B                                    ;  CHAR '+'
    00401644     |48            DB 48                                    ;  CHAR 'H'


    00401645     |4F            DB 4F                                    ;  CHAR 'O'
    00401646     |4F            DB 4F                                    ;  CHAR 'O'
    00401647     |4B            DB 4B                                    ;  CHAR 'K'
    00401648     |90            NOP
    00401649     |E9            DB E9
    0040164A   . |98E04E00      DD OFFSET BCLOCK.___CPPdebugHook
    0040164E   > A1 8BE04E00   MOV EAX,DWORD PTR DS:[4EE08B]
    00401653   .  C1E0 02       SHL EAX,2
    00401656   .  A3 8FE04E00   MOV DWORD PTR DS:[4EE08F],EAX
    0040165B   .  52            PUSH EDX
    0040165C   .  6A 00         PUSH 0                                   ; /pModule = NULL
    0040165E   .  E8 DFBC0E00   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; GetModuleHandleA
    00401663   .  8BD0          MOV EDX,EAX

    dasm:

    00401000 >/$  6A 00         PUSH 0                                   ; /pModule = NULL
    00401002  |.  E8 C50A0000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; GetModuleHandleA
    00401007  |.  A3 0C354000   MOV DWORD PTR DS:[40350C],EAX
    0040100C  |.  E8 B50A0000   CALL <JMP.&KERNEL32.GetCommandLineA>     ; [GetCommandLineA
    00401011  |.  A3 10354000   MOV DWORD PTR DS:[403510],EAX
    00401016  |.  6A 0A         PUSH 0A                                  ; /Arg4 = 0000000A
    00401018  |.  FF35 10354000 PUSH DWORD PTR DS:[403510]               ; |Arg3 = 00000000
    0040101E  |.  6A 00         PUSH 0                                   ; |Arg2 = 00000000
    00401020  |.  FF35 0C354000 PUSH DWORD PTR DS:[40350C]               ; |Arg1 = 00000000

    本节出现的名词解释

    EP段:EntryPoint,入口点
    OD命令:
    HR 访问时进行硬件中断
    DD 转存在堆栈格式
    EIP:寄存器的一种,EIP寄存器里存储的是CPU下次要执行的指令的地址
    ESP:寄存器的一种,寄存器里存储的是是栈的栈底指针,通常叫栈基址

    四、总结

    有看客私下问我能不能直接学破解网络验证,那么我的回答是不能,没有基础的人,直接上难度高的,会丧失自信心,网络验证往往会伴随各种暗桩,轻则关机重启蓝屏,重则格盘毁MBR放毒,这些我在后面都会有提到

    更多安全技术、精品好文、白帽黑客大佬尽在:http://bbs.ichunqiu.com/portal.php

  • 相关阅读:
    [DB2]删除大数据量数据及57011错误处理
    [DB2]DB2日常维护——REORG TABLE命令优化数据库性能
    [转]解读DIV CSS网页布局中CSS无效十个原因
    [DB2]DB2 sqlstate 57016 原因码 "7"错误
    [翻译]15个最常见的WCF问题
    [DB2]DB2数据库备份与恢复和导出表结构与导入导出表数据
    [转]网站(bs系统)怎样实现即时消息思路总结
    【摘抄】DB2字符集问题
    [转]jQuery必知必熟基础知识
    sql 2005/2008 订阅与发布的几个概念
  • 原文地址:https://www.cnblogs.com/ichunqiu/p/6213852.html
Copyright © 2020-2023  润新知