用PEiD查壳

        
 UPX v0.89.6 - v1.02 / v1.05 - v1.22    这个是入门的壳,只是一个简单的压缩壳

用Stud_PE查看PE文件头信息

        
主要是看一下ImageBase的值 00400000,这是一个16进制数。在后面OD载入后,可以用这个值在内存映像中查看PE文件加载到内存后的情况。 还有EntryPoint的值: 0000E8C0 程序入口

OD载入看内存映像

        
      用OD载入,ALT+M打开这个窗口,就可以看到upx.exe程序加载到内存后的映像,主要有四块,但重要的是区段UPX0区段UPX1。因为区段UPX0就是原程序压缩后的代码存放区,而区段UPX1就是UPX壳的执行代码。

OD中单步跟踪,找OEP

F8键单步跟踪法,学习了前辈总结的两点:

①程序都向下执行的,所以遇到向上的jump,鼠标配合F4键,跳过向上的jump;

 遇到向下的jmp直接F8继续执行。
 运行到0040E8E9可以看到这是一个向上跳转,而且通过下边的提示窗口得知这个跳转是已实现的。这时,就需要用鼠标点一下0040E8EB这一行, 也就是跳转的下一行。
 再按一下F4键,就可以通过上面向上跳的jump了

※注意:

运行到这里,会遇到一个特殊情况,就是向上jump后面还是一个向上jump,我们可以用鼠标选中0040E974行的jump,再按F4,运行到0040E974行
 oh,no~~ 还是向上跳的, 那就老方法,鼠标选中下一行,再按F4?
不行,0040E974行的下一行, 是一个nop指令,而OD是不能在nop上下断点的, 所以要注意。
因此我们可以顺势再向下一行,鼠标选中0040E97C行, 再按F4通过:
 

原理就是这么简单,但能不能做成,还需要看耐心!

②当发生区段间的跳转, 证明程序即将运行到OEP。

 运行到上图的位置时, 因为已经到了壳代码区的最尾部了,因为从这个位置到区段的结尾,内存都是00,为空。
在0040EA06行上, 也是一个向上跳转, 但这些还用老方法的时候,就会发现,程序根本就不会暂停在0040EA08行,而是程序直接就运行了。这是因为这个jump向上执行的过程,执行了一个直接跳转到0040EA0E行的指令, 这个可以跟踪一下。所以这里可以鼠标直接选中0040EA0E行,再F4。

 执行到这里, 后面是没代码, 而且这个jump很奇怪,没有红线标明会跳转到哪里了?
那是因为这是个长跳,就是长距离的跳转。就很可能是区段间的跳转哦!我可是有证据的:
先把内存映像拿下来:
 这行指令是在 0040EA0F行上, 很明显是属于UPX1区段的。
但指令: jmp UPX.004010CC, 明显是属于UPX0区段的哦,是不是从UPX1区段跳转到UPX0区段了!
前辈总结过,区段间跳转,很可能就是进入到OEP的时候,所以我们再F8跟踪下去:
 到这里, 就是脱壳后的OEP了。至于我为什么会知道呢?前辈的经验!

找到OEP后,OllyDump把脱壳后程序保存

程序暂停在004010CC行,就可以鼠标在汇编窗右键:
这是一个OllyDump插件,怎么加插件可以百度一下~~~~
 在dump的时候,要注意一下入口点地址,一般OD跟踪的都是可以通过EIP作为OEP。
另外就是下边的重建输入表, 对于UPX加壳的, 可以直接使用这里面的, 如果不使用会怎么样,等一下再说。
基本上没什么问题了, 就点击一下【脱壳】按钮进行保存,再运行一下保存后的可以执行文件,测试一下!没问题就OK了。
最后是再用PEiD查一下脱壳后的文件是否脱干净了:

  

用工具重建输入表

在这里,就不使用OllyDump里的重建输入表功能,一样在不选中重建输入表的情况下脱壳:
 这样脱壳出来的文件是不可执行的:
 因为在加壳后,程序的输入表都被破坏的,所以很多时候脱壳后都需要修复一下程序的输入表,这里用到的工具叫: Import REC

Import REC的使用

①跟踪到OEP的OD,千万不要关
②运行Import REC,在【选取一个活动进程】下面选取正在脱壳的程序进程, 然后还需要在右边【需要的IAT信息】中,在【OEP】项输入OD跟踪到的OEP, 再点击【自动查找IAT】, 最后点一下【获取输入表】。
 因为UPX壳并没有对API进行钩取,所以不用多做其他操作。但在其他一些壳中,壳会对API进行钩取,这时就需要点一下【无效函数】按钮,显示出一些无效函数的列表, 再进行清除就好!
③在完成上面的步骤后, 就可以点击【转储到文件】按钮,会弹出一个选择文件的窗口,这时我们需要选中在OD用OllyDump脱壳出来的文件就行了,再点打开。
④去查看一下, 会多了一个文件,要做测试运行一下并再查一下壳

重建PE文件

到了上面的步骤,其实脱壳的工作都基本上算完成了,但回想一下,加壳后的程序,是有两个比较重要的区段UPX0、UPX1,其实UPX1是存放壳代码的,但脱壳后,壳代码就没用了,那干嘛还留着呢?

在重建PE文件时, 需要用到工具LordPE,先运行LordPE:
 运行后,不要把文件拖进来,而是点【PE编辑器】按钮:

打开了需要重建的文件后, 会显示上面的窗口, 这里点右边的区段,再如下操作:
 
 选中需要删除的区段,鼠标右键,在右键菜单中点击【清除区段】,再关闭【区段表】窗口,回到【PE编辑器】窗口, 先点一下【保存】,再点【确认】哦!
此时窗口自动关闭,回到LoadPE, 这里需要点击右侧的【重建PE】按钮:
选中刚刚操作的文件:
 就自动重建完成的:
 
最后, 一定要运行一下做测试! OK~~~~
 

 
 

附件列表

【笔记】单步跟踪法与UPX的脱壳理解的更多相关文章

  1. Visual Studio调试之避免单步跟踪调试模式

    Visual Studio调试之避免单步跟踪调试模式 写完Visual Studio调试之断点进阶篇之后,想分享一下我常用的一些调试技巧,后面发现写之前,一些背景知识需要介绍一下. 下面是几篇今年2月 ...

  2. upx 手动脱壳

    查壳 UPX 0.89.6 - 1.02 / 1.05 - 2.90 (Delphi) stub -> Markus & Laszlo upx这类压缩壳手动脱壳非常简单. 一.查找oep ...

  3. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  4. 目标跟踪之klt---光流跟踪法

    近来在研究跟踪,跟踪的方法其实有很多,如粒子滤波(pf).meanshift跟踪,以及KLT跟踪或叫Lucas光流法,这些方法各自有各自的有点,对于粒子滤波而言,它能够比较好的在全局搜索到最优解,但其 ...

  5. linux 进程学习笔记-进程跟踪

    进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...

  6. 最近公共祖先算法LCA笔记(树上倍增法)

    Update: 2019.7.15更新 万分感谢[宁信]大佬,认认真真地审核了本文章,指出了超过五处错误捂脸,太尴尬了. 万分感谢[宁信]大佬,认认真真地审核了本文章,指出了超过五处错误捂脸,太尴尬了 ...

  7. spark源码单步跟踪阅读-从毛片说起

    想当年读大学时,那时毛片还叫毛片,现在有文明的叫法了,叫小电影或者爱情动作片.那时宿舍有位大神,喜欢看各种毛片,当我们纠结于毛片上的马赛克时,大神大手一挥说道:这算啥,阅尽天下毛片,心中自然无码!突然 ...

  8. 网络学习笔记----01--pathping跟踪数据包路径

    操作系统win7 Pathping主要用于提供有关在来源和目标之间的中间跃点处的网络滞后和网络丢失的信息. Pathping将多个回显请求消息发送到来源和目标之间的各个路由器一段时间,然后根据各个路由 ...

  9. Servlet 笔记-Session 跟踪

    HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录. 但是仍然有以下三种方式来维持 ...

随机推荐

  1. Laravel中如何做数据库迁移

    总的来说,做一次独立数据库迁移只需要三步,分别是创建迁移文件.修改迁移文件.运行迁移 1.创建数据库迁移文件php artisan make:migration create_articles_tab ...

  2. 前端必备 Nginx 配置

    Nginx (engine x) 是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用 代理服务器 (TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人Igor Sysoev编写 ...

  3. Visual Studio Code快捷键大全

    原文链接:https://segmentfault.com/a/1190000007688656 常用 General 按 Press 功能 Function Ctrl + Shift + P,F1 ...

  4. js面向对象的程序设计 --- 上篇(理解对象)

    前言 ECMAScript中没有类的概念,因此它们的对象与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序的集合属性,其属性可以包含基本值,对象或者函数".正因 ...

  5. Vue中父组件向子组件echarts传值问题

    原文链接:https://blog.csdn.net/Uookic/article/details/80638883?utm_source=copy 问题:当父组件传值给子组件echarts时,发现子 ...

  6. 极客工具,PDF合并工具

    前言 这两天一番花两天的时间,重新用python和python图形化开发工具tkinter,完善了下PDF合并小工具,终于可以发布了. 工具目前基本功能已经完善,后期如果有反馈可以修复部分bug或完善 ...

  7. 钉钉内网穿透工具在windows的使用。

    钉钉内网穿透工具在windows环境下使用 1.WIN+R,然后cmd,调出dos控制台 2.进入内网穿透程序ding.exe所在目录 3.执行 ./ding.exe -config=ding.cfg ...

  8. 动态数组、allocator 类

    12.2 动态数组 12.2.1 new 和数组 1.分配一个动态数组即是在分配一个new对象时在类型名之后加一对方括号,用来存放数组大小,该数可以是任意表达式.也可以是0,只需是整形.无需是常量.数 ...

  9. Docker - 构建一个简单的应用镜像

    概述 做个简单的可用镜像 背景 之前的镜像, 都是 命令教程 类的 这次我想构建一个 可以用的 简单镜像镜像 1. 环境 os centos7 docker 18.09 docker image ja ...

  10. AAC Joint coding

    1. M/S stereo M/S stereo 作用于channel pair. channel pair对于listener来说通常具有对称性,即第一个channel和第二个channel相似性较 ...