UPX脱壳逐一跟踪分析

UPX脱壳逐一跟踪分析UPX脱壳逐一跟踪分析写在前面OD跟踪命令先结合PE知识分析分析“新年快乐.exe”写在前面之前看到的UPX脱壳文章都只是教了方法,对UPX的原理少有提及。看了《逆核》的UPX脱壳一章后,俺尝试把UPX脱壳与PE文件结构的知识结合起来整理了一些(也可联系压缩器Paker的知识)。分析样本来自BUUCTF:Reverse题目“新年快乐”(本文将寻找样本的OEP)OD跟踪命令可能会用到的几个跟踪命令:命令快捷键作用AnimateIntoCtrl+F7反复执行StepIn

大家好,又见面了,我是你们的朋友全栈君。

写在前面

之前看到的UPX脱壳文章都只是教了方法,对UPX的原理少有提及。看了《逆核》的UPX脱壳一章后,俺尝试把UPX脱壳与PE文件结构的知识结合起来整理了一些(也可联系压缩器Paker的知识)。
分析样本来自BUUCTF:Reverse题目“新年快乐”(本文将寻找样本的OEP)

OD跟踪命令

可能会用到的几个跟踪命令:

命令 快捷键 作用
Animate Into Ctrl+F7 反复执行Step Into命令(画面显示)
Animate Over Ctrl+F8 反复执行Step Over命令(画面显示)
Trace Into Ctrl+F11 反复执行Step Into命令(画面不显示)
Trace Over Ctrl+F12 反复执行Step Over命令(画面不显示)
停止跟踪 F7

Animate:执行时画面会跟着光标移动一直显示;
Trace:会在事先设置好的跟踪条件处停下,并生成日志文件。
跟踪命令适合用在大型代码,一好处是容易发现短循环。
我分析时只是使用了F8/F7/F4。

先结合PE知识分析

一般情况下,分析压缩后的UPX壳,可以看到第一个节区的名称为UPX0,SizeOfRawData=0,而VirtualSize=1000h(大于0),第二个节区UPX1,它的PointerToRawData和第一个节区的相同。也就是说,第一个节区在文件中是不占用空间的,只有运行时才分配大小。
其实,第二个节区含有解压代码和将被解压的代码(压缩前的代码),在加载过程中,第二个节区的解压代码运行,将被解压代码解压到第一个节区。最后到达EP执行代码。

分析“新年快乐.exe”

  1. 打开:
    打开程序后

  2. 根据上文,下面会先执行解压代码,这个代码在UPX1节区,在此节区设置内存访问断点。
    Memory map

  3. F9几次,就能在UPX1看到经典pushad了。
    解压代码 4. F8一会可以在下面不远处发现一个循环
    循环1
    大致作用:从ESI(指向UPX1)中读取一个字节写入EDI(指向UPX0)
    需要F4跳出循环的话记得先删除刚刚下的内存断点,继续F8

  4. 提示:后面遇到的这个循环得跳出去
    循环

  5. 走出上面循环就会到这,这里的循环比较重要。它有一个像重定位表的作用,会把机器码为E8和E9(CALL/JMP指令)后跟的地址修改。重要循环

0040E3C2    5E              pop esi                                  ; 新年快乐.<ModuleEntryPoint>
0040E3C3    89F7            mov edi,esi     			//EDI=ESI ; 新年快乐.00401000
0040E3C5    B9 4A000000     mov ecx,0x4A	
0040E3CA    8A07            mov al,byte ptr ds:[edi]		//0101540A 取EDI的值进行对比
0040E3CC    47              inc edi                                  ; 新年快乐.00401006
0040E3CD    2C E8           sub al,0xE8
0040E3CF    3C 01           cmp al,0x1
0040E3D1  ^ 77 F7           ja short 新年快乐.0040E3CA		//判断取出来的值是否是E8/E9
0040E3D3    803F 00         cmp byte ptr ds:[edi],0x0
0040E3D6  ^ 75 F2           jnz short 新年快乐.0040E3CA
0040E3D8    8B07            mov eax,dword ptr ds:[edi]		//需要修改的地址
0040E3DA    8A5F 04         mov bl,byte ptr ds:[edi+0x4]
0040E3DD    66:C1E8 08      shr ax,0x8
0040E3E1    C1C0 10         rol eax,0x10
0040E3E4    86C4            xchg ah,al
0040E3E6    29F8            sub eax,edi                              ; 新年快乐.00401006
0040E3E8    80EB E8         sub bl,0xE8
0040E3EB    01F0            add eax,esi                              ; 新年快乐.00401000
0040E3ED    8907            mov dword ptr ds:[edi],eax		//处理后的新地址放入EDI
0040E3EF    83C7 05         add edi,0x5
0040E3F2    88D8            mov al,bl
0040E3F4  ^ E2 D9           loopd short 新年快乐.0040E3CF
  1. 走出循环后,下面来到这,设置IAT表
    IAT
    40E3F6处执行后ESI = 401000(第一个节区),EDI = 40D000(第二个节区)
    API名字
    在这里插入图片描述
    GetProcAddress可以根据函数名称获取地址:GetProcAddress
    按照书中的说法,此段程序会根据API名称,用GetProcAddress()函数获取API函数的地址,然后把地址输入到EBX指向的原IAT区域。
  2. 设置完IAT表,差不多会到程序入口点。我的想法是要到程序入口点所在的第一节区,需要有一个大的往上跳转,如是分析,然后有:
    最后
    401280就是程序的OEP

本人是菜鸡,调试能力有限,如有错误的地方麻烦指出。

这篇文章非工具脱UPX壳,也涉及PE知识:
https://my.oschina.net/u/1171187/blog/1143063
(侵权则删)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158192.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • paceMaker_pacemaker怎么读

    paceMaker_pacemaker怎么读1. 简介 Pacemaker是一个集群资源管理者。他用资源级别的监测和恢复来保证集群服务(aka.资源)的最大可用性。它可以用你所擅长的基础组件(Corosync或者是Heartbeat)来实现通信和关系管理。​2. 特性 Pacemaker包含以下的关键特性:  监测并恢复节点和服务级别的故障​  存储无关,并不需要共享存储​  资源无关,任何能用脚本控制的资源

    2025年7月30日
    5
  • java 链表长度_Java实现单向链表[通俗易懂]

    java 链表长度_Java实现单向链表[通俗易懂]一、前言最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用~本文主要讲解单链表的基础知识点,做一个简单的入门~如果有错的地方请指正二、回顾与知新说起链表,我们先提一下数组吧,跟数组比较一下就很理解链表这种存储结构了。2.1回顾数组数组我们无论是C、Java都会学过:数组是一种连续存储线性结构,元素类型相同…

    2022年6月6日
    26
  • intellij idea最新版安装步骤_学生用idea用哪个版本好

    intellij idea最新版安装步骤_学生用idea用哪个版本好1、首先在官网上面下载idea网址:https://www.jetbrains.com/idea/2、选择下载DownLoad3、下载可能需要注册,不需要理会,等待下载界面出来就行了4、双击下载好的ideaIU-2018.3.4.exe文件,选择next5、自定义设置安装目录6、按照下面的勾选就行了7、点击install,等待安装成功就行了…

    2022年10月2日
    3
  • so文件版本问题_so文件可以删除吗

    so文件版本问题_so文件可以删除吗开发时使用的.so文件,一般版本都是低于开发的版本,所以都会遇到兼容问题。如下图所示:当遇到这种问题的时候只需要修改build.gradle中的targetSDKVersion为低版本即可,这样就可以解决兼容问题…

    2022年9月19日
    5
  • matlab——for循环「建议收藏」

    matlab——for循环「建议收藏」简单for循环for循环用来循环处理数据。例:输出1~100的和>>clear>>sum=0;>>fori=1:100sum=sum+i;end>>sumsum=5050解释:i从1到100,每次增加一个,该共循环100次注意:分号的位置;不能使用“+=”符号…

    2022年6月25日
    41
  • navicat15 for mysql激活码【2021免费激活】「建议收藏」

    (navicat15 for mysql激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~14…

    2022年3月30日
    1.8K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号