脱壳经验(二)--如何优化

PE脱壳后,文件长度一般会增大,原因有以下几点:

1、脱壳后,壳的尸体依然存在;
2、脱壳后,重新建立了新的Import节、Reloc节等;
3、有些加壳程序,将原程序的某些节跟外壳增加的某些节合并后,搬移到了其他位置。
4、脱壳时候,因为采用的是dump内存,所以,在内存中对齐的PE镜象一般也会大于原始的PE文件,各个节的dump实际尺寸也会较原始PE文件的实际尺寸大。

解决方案:
(1) 脱壳后,将各个有效的节分别转存到临时文件中。如:将“.text节,单独转存到一个text_tem.bin中”,其它节也是同样暂存到各个文件中,没有用的节(如壳尸体),抛弃掉。
(2) 首先将text_tmp.bin等节中没有用的多余部分去掉,一般是最后对齐的内存镜象的多余部分。可以通过2进制编辑器,查看最后部分,一般是全00的部分。
(3) 对应有多少个有效section,重新构造PE头,尽量做到最小。
(4)
重新构造PE:将新的PE头、.text、.Import、.Export、.Data、..reloc等一次连接起来到一个新的PE文件。如果为了尽量
缩小PE尺寸,连接前还可以考虑将某些节合并成一个节(如:将.Data,.Import,.Export,.Reloc等合并到一个节中)。
(5) 按照PE格式,调整新的PE文件。这个过程比较复杂,包括:
1、按照新的PE头中节的队齐要求对齐各个节的起始RVA
2、对于各个节中RVA相关的地方,根据新的PE头重新计算并调整。如
资源节中的各个RVA,Reloc中对应的重定位项,import和export中
的某些地址指针等。
3、按照文件对齐要求对齐新的PE文件。
(6) 测试新的PE,如果有错误,通过跟踪调试,重新执行第(5)步骤,直到正常运行。

对于(5)中调整相关的RVA,可以通过写一个工具完成,如计算调整资源节、Reloc节等,如果调整的比较好,新的PE一般跟原来的几乎一样,甚至会更
小。我曾经作过一些调整工具,可以将:资源节、Reloc节等自动调整,并可以搬移到新的PE的任何可用的节空余部分,这些工具写起来很简单,可以根据需
要自行编写,同时通过编写这些工具,可以大大增加对PE格式的认识。需要说明的是:大部分表(节)的起始地址一般要求双字边界的地址(即起始地址为4的整
数倍,如0x634b4有效,0x634b1-0x634b3无效),如资源表、Reloc表等。其他没有什么可注意的,只要细心就完全可以做到。

脱壳经验(二)--如何优化,布布扣,bubuko.com

时间: 2024-12-30 03:08:35

脱壳经验(二)--如何优化的相关文章

脱壳经验(一)--脱壳感想

教程倒没有,说一下脱壳感想吧! 我们拿到一个壳,如想深入了解,非深入跟踪不可,那是没什么捷径可言的!你要付出的是大量的时间和思考分析,如果不能做到,请放弃吧,也是对自己的身心的一种尊重和关心! 如果你是一个期代脱壳tips的人,做起脱壳来很容易感到空虚的... (工具以Ollydbg为例) 遇上一个陌生壳,请不要太慌张,做一些简单的分析先,明确一下壳的类型.级别.就 saft103 说说,虽然脱壳论坛已经有介绍和一些“壳霸”对其手到拿来,但我们可以先抛开这些道听途说,认真地跟踪一下(可以参考一下

百万级运维经验二:Redis和Memcached的选择

看到很多人推荐使用Redis代替Memcached,我觉得这两个是不一样的东西,它们的关系应该是共存而不是替代. Memcached是个纯内存型的缓存系统,支持数据类型单一,单个缓存数据有限制,支持分布式,我觉得这是个很理想的缓存系统. Redis是个简单的NOSQL数据库,支持几种简单的数据类型,支持主从复制,支持持久化,可以看作是个内存型数据库. 由此可见,Memcached是正宗的缓存系统,Redis是个可以做缓存系统的内存型数据库. 由于Redis的数据可以设置过期时间,支持多种数据类型

洛谷P2365 任务安排 [解法二 斜率优化]

解法一:http://www.cnblogs.com/SilverNebula/p/5926253.html 解法二:斜率优化 在解法一中有这样的方程:dp[i]=min(dp[i],dp[j]+(sumf[i]-sumf[j])*sumt[i]+s*(sumf[n]-sumf[j]) ) 其中min的后半部分,也就是dp[j]+(sumf[i]-sumf[j])*sumt[i]+s*(sumf[n]-sumf[j]) 计算了将j~i分为一组的花费(以及提前计算的受影响花费) 设f(j)=dp[

C#进阶系列——动态Lamada(二:优化)

前言:前几天写了一篇动态Lamada的文章C#进阶系列——动态Lamada,受园友xiao99的启发,今天打算来重新优化下这个动态Lamada的工具类.在此做个笔记,以免以后忘了. 一.原理分析 上篇里面我们说了动态Lamada的使用必要性以及使用场景,但是感觉用在项目里面还不太方便,最难用的就是需要传递属性名称的字符串,感觉这有点太lower了.然后就是那个枚举的使用着实感觉没啥必要,我们只需要将Contains.Equal.LessThan.GreaterThan等方法分别封装一个独立的方法

基于移动最小二乘曲面的点云对齐(二) —— 优化点云对齐迭代点

本文重点 上一篇博客介绍了基本隐式曲面的生成,以及点云对齐的基本操作,但是发现精度达不到理想要求,本文通过优化迭代点和步长设置优化点云对齐到隐式曲面的精度. 一.优化迭代点 接上文图 图1 点P向法截线在g0处的曲率圆做投影 其中交点Q1(X,Y,Z)和Q2(m,n,l)可以通过下面的方程解得 $\left\{ {\begin{array}{*{20}{c}}{{{\left( {X - {O_{x0}}} \right)}^2} + {{\left( {Y - {O_{y0}}} \right

spark(二)优化思路

优化思路 内存优化 内存优化大概分为三个方向 1.所有对象的总内存(包括数据和java对象) 2.访问这些对象的开销 3.垃圾回收的开销 其中Java的原生对象往往都能被很快的访问,但是会多占据2-5倍或更多的内存,有下面4点原因 ·每个单独的java对象都有一个对象头(16字节),其中包括指向对象的指针(栈->堆),如果该对象只有几个属性,那么对象头可能比实际数据占用的空间都大(严重浪费资源) ·java每个string都包含了40字节的额外开销(因为底层其实是存储在数组,需要记录数组的指针,

作业二:优化购物车:用户入口:1.将商品的信息存到文件中;2.将已经购买的商品、余额记录存到文件中。商家入口:1.可以添加商品;2.可以修改商品的价格

#Author:AXIN #Date:2017/5/22 12:04 #优化版的购物车 #用户入口: #1.商品的信息存到文件里 #2.已购商品,余额记录 #商家入口: #1.可以添加商品 #2.修改商品价格 product_list = [ ('Iphone',5288), ('Mac pro',12000), ('Bike',800), ('Watch',36000), ('Coffe',39), ('Python book',120), ] #将商品信息打印到console窗口下 def

WEB前端性能优化之二——css优化

1.把样式表置于顶部 现把样式表放到文档的< head />内部似乎会加快页面的下载速度.这是因为把样式表放到< head />内会使页面有步骤的加载显示.HTML规范清 楚指出样式表要放包含在页面的< head />区域内:“和< a />不同,< link />只能出现在文档的< head />区域内,尽管它可以多次使用它”.无论是引起白屏还是出现没有样式化的内容都不值得去尝试.最好的方案就是按照HTML规范在文 档< he

Android Ripple 按钮水波纹效果(二)优化

上一篇中我们讲了自定义ripple 水波纹效果,先来回顾一下效果吧! 看了以后感觉没甚么问题,我一开始也觉得很满意了,那好,我们拿Android 5.0自带的效果来对比一下 发现了不同之处没?点击中间的时候是看不出什么区别,但是点击两边的时候,就很明显了,我们自定义的效果,波纹向两边同速度的扩散,所以就会出现,如果点击点不在中心的时候,距离短的一边波纹先到达,而距离长的一边后到达,不能同时到达边缘!而系统自带的则不存在这种情况,所以这是一个优化点;另一个优化点是:我们自定义的效果,在波纹全部覆盖