文章难易度:★★★
文章阅读点/知识点:逆向破解

文章作者: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

“破解大牛是怎么炼成的”之壳与ESP定律的更多相关文章

  1. fir.im Weekly - 论个人技术影响力是如何炼成的

    每个圈子都有一群能力强且懂得经营自己的人,技术圈也是如此.本期 fir.im Weekly 一如往期精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和 ...

  2. MyEclipse10破解后将工程导成war包时报错

    MyEclipse10.7 破解后将工程导成war包时报错 : SECURITY ALERT:INTEGRITY CHECK ERROR     This product did not pass t ...

  3. 我的 Github 个人博客是怎样炼成的

    Joey's Blog 长大后才发现政府建造 GFW 真是太 TM 机智了,由于本人自制力较差,且不说 91porn, youporn 等两性知识网站的超强战斗力,单单一个Youtube就可以让我瞬间 ...

  4. 自由是有代价的:聊聊这几年尝试的道路 要想生活好,别看哲学书和思想书。简单看看可以,看多了问题就大了。还是要去研究研究些具体的问题。别jb坐在屋子里,嘴里念着海子的诗,脑袋里想康德想的事情,兜里屁都没有,幻想自己是大国总理,去想影帝是怎么炼成的。

    自由是有代价的:聊聊这几年尝试的道路 现在不愿意写过多的技术文章了,一点是现在做的技术比较偏,写出来看的人也不多,二来是家庭事务比较繁多,没以前那么有时间写了.最近,园子里多了一些写经历的文章,我也将 ...

  5. 2星|《10W+走心文案是怎样炼成的》:标题党。实际是台湾创意总监的一些人生感悟和两三个很一般的创意文案

    10W+走心文案是怎样炼成的 作者是台湾人,曾在台湾奥美担任创意总监,做过一些广告.本书是他的一些经验介绍. 总体来说是标题党,作者的广告基本是电视广告,跟文案也有关系,估计播放量也很容易过10W+, ...

  6. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  7. AI算法工程师炼成之路

    AI算法工程师炼成之路 面试题: l  自我介绍/项目介绍 l  类别不均衡如何处理 l  数据标准化有哪些方法/正则化如何实现/onehot原理 l  为什么XGB比GBDT好 l  数据清洗的方法 ...

  8. 老杜告诉你java小白到大神是怎么炼成的(转载)

    老杜告诉你java小白到大神是怎么炼成的 1. 学习前的准备 一个好的学习方法(应该怎么学习更高效): 一个合格的程序员应该具备两个能力 有一个很好的指法速度(敲代码快) 有一个很好的编程思想(编程思 ...

  9. 开会不用把人都轰进一个小黑屋子——《Office妖精是怎样炼成的》续2

    <Office妖精是怎样炼成的>http://blog.sina.com.cn/s/articlelist_1446470001_6_1.html 一本不是技术图书却含有技术内容的图书,一 ...

随机推荐

  1. web前端学习笔记(CSS盒子的定位)

    相对定位 使用相对定位的盒子的位置常以标准流的排版方式为基础,然后使盒子相对于它在原本的标准位置偏移指定的距离.相对定位的盒子仍在标准流中,它后面的盒子仍以标准流方式对待它.      使用relat ...

  2. 生成二维码的方法,基于zxing

    现在生活中常用了一些二维码,这些在现实生活中已经非常密切了,那么怎么使用java来产生一个二维码呢? 下面给出代码 首先给出一个工具类,这里包含了生成二维码的图片对象,保存到流中,或者文件中: pac ...

  3. 详解css中的position属性

    这一次直接进入主题. css中最常用的布局类属性,一个是float,另一个就是定位属性position. 对于position来讲,有以下属性值: static : 无特殊定位,对象处于正常文档流.其 ...

  4. velocity分页模板

    以前用后台java拼接分页代码,不利于修改.找到一份velocity模板. <!-- 分页模板 --> #macro(pager $url $pager) <url class=&q ...

  5. 性能调优:理解Set Statistics IO输出

    性能调优是DBA的重要工作之一.很多人会带着各种性能上的问题来问我们.我们需要通过SQL Server知识来处理这些问题.经常被问到的一个问题是:早上这个存储过程运行时间还是可以的,但到了晚上就很慢很 ...

  6. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  7. Android客户端消息推送原理简介

    首先简单介绍一下Android消息推送的主要三种方式,如果你已经看过类似的文章,请直接忽略三种介绍.    1.使用SMS服务,即服务器端发送短信,然后手机客户端监听短信的广播,然后对数据进行一定的处 ...

  8. 在IIS服务器上部署svg/woff/woff2字体

    在url没错的前提下,字体文件报404错误,如.woff,.woff2 出错原因: IIS不认SVG,WOFF/WOFF2这几个文件类型 解决方案: 在IIS服务器上部署svg/woff/woff2字 ...

  9. 检测IP地址的正则表达式

    正则表达式: ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) ((2[0-4]\d|25[0-5]|[01]?\d\ ...

  10. 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载

    在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...