Linux下的upx命令学习
upx学习
今天我们来学习一款给应用加壳的软件,叫做upx(the Ultimate Packer for eXecutables)
首先我们先看下它**百科的释义:
UPX (the Ultimate Packer for eXecutables)是一款先进的可执行程序文件压缩器,压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间、网络上传下载的时间和其它分布以及存储费用。 通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。 UPX 支持许多不同的可执行文件格式 包含 Windows 95/98/ME/NT/2000/XP/CE 程序和动态链接库、DOS 程序、 Linux 可执行文件和核心。
那么百科的释义呢很简单,主要有两点,一个是加壳,一个是压缩。
具体原理嘛,我也想知道
好,那么废话不多说,Let's do it
小试牛刀
先准备好材料
//hello.cpp
#include <iostream>
using namespace std;
int main() {
int i = 10;
for(;i > 0;i--) {
cout<<"hello,i = "<<(10 - i)<<endl;
}
return 0;
}
还是熟悉的配方。好,那么我们upx一下
$ g++ hello.cpp -o hello.out
$ upx hello.out -o hello.upx.out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2017
UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: hello.strip.out: NotCompressibleException
Packed 1 file: 0 ok, 1 error.
$
那么是什么问题呢,我上网找了一下。原来是upx不支持太小的文件。小于40kb的文件就不支持了。
好,那么本文就到此结束啦,谢谢大家的观看。
再次尝试
等等,我辈岂是如此轻言放弃之人。
//hello.go
package main
import "fmt"
func main() {
i := 10
for ; i > 0; i-- {
fmt.Printf("hello,i = %d\n",(10 - i))
}
}
然后编译
$ go build hello.go
$ ls -l
total 2040
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
$
那么我们得到了一个20M的可执行文件,让我们来upx一下它
$ upx hello -o hello.upx.out
$ ls -l
total 4592
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
$
嗯,确实小了不少,upx处理后,变成了11M;看小减少了百分之多少。
(2080925-1143336)/2080925≈45.07%
嗯,比strip多一点。
那么看看,能不能再strip
$ strip hello.upx.out -o hello.upxs.out
strip: error: the input file 'hello.upx.out' has no sections
$
那么我们分析一下应该不难得知,upx把壳给加上了,导致strip找不到那些标记
反向操作
那么呢,我们是不能把这个过程给反一下。是不是就可以了呢
好,那么说干就干
$ strip hello -p -o hello.s.out
$ ls -l
total 4592
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
$ upx hello.s.out -o hello.su.out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2017
UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
File size Ratio Format Name
-------------------- ------ ----------- -----------
1463768 -> 574340 39.24% linux/amd64 hello.su.out
Packed 1 file.
$ ls -l
total 5156
-rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
-rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
-rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
-rwxr-xr-x 1 root root 574340 Jul 13 03:23 hello.su.out
-rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
$
嗯,很好。套娃成功
看下减少了多少,1-574340/2080925≈72.40%
那么这个减少的量是比较多的,让我们来看看可以运行吗
$ ./hello.su.out
hello,i = 0
hello,i = 1
hello,i = 2
hello,i = 3
hello,i = 4
hello,i = 5
hello,i = 6
hello,i = 7
hello,i = 8
hello,i = 9
$
那么我们可以看到,这个是可以正常运行的。
继续研究
那么我们来看看upx可以带哪些选项吧,
$ upx
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2017
UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..
Commands:
-1 compress faster -9 compress better
-d decompress -l list compressed file
-t test compressed file -V display version number
-h give more help -L display software license
Options:
-q be quiet -v be verbose
-oFILE write output to 'FILE'
-f force compression of suspicious files
-k keep backup files
file.. executables to (de)compress
Type 'upx --help' for more detailed help.
UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io
$
命令:
有1到9的压缩等级;
-d 不压缩;
-l 列出压缩的文件;
-t 测试压缩文件;
-h 显示帮助文档
-V 显示版本号
-L 显示软件许可证
选项:
-q 安静模式
-v 详细模式
-o 大家都懂,输出到文件
-f 强制压缩可以的文件
-k 保持备份文件
嗯, 好像没有什么值得深究的功能, 这个压缩等级大家可以按照自己的需要去调整。
好,就这样。
总结
最后我们来总结一下
首先这个upx之后的东西,嗯,它的时间戳还是保留之前的
然后呢,upx操作之后呢,这个sections会变得面目全非。所以再去strip呢,就不行了
所以我们需要采取反向操作先strip然后再upx
然后呢就是压缩的等级,-1是优先速度,-9是优先质量。那么中间的按照这个去推断。
好了,本文到这里就结束啦,如果喜欢这篇文章,记得点赞。谢谢
Linux下的upx命令学习的更多相关文章
- Linux下的strip命令学习
strip strip是Linux下的一个命令.可以用于给应用脱衣服,帮助我们抹除一些调试信息.(虽然不知道具体是什么,但是会用就好了) 在嵌入式开发领域用到的应该比较多 首先,先写一个示例看看 // ...
- linux下文件搜索命令学习笔记
1. locate:按照文件名搜索文件 locate filename 与find在整个操作系统中遍历搜索不同,locate命令在/var/lib/mlocate这个后台数据库中按照文件名搜索,所以优 ...
- Linux下使用mail命令发送邮件
因为需要经常备份网站的数据,所以了解并学习了下linux下如何通过shell来发送邮件,这里以CentOS为例,使用mail命令来进行外部邮件的发送.mail命令的语法如下: Usage: mail ...
- Linux下的Make命令实例详解
众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.下面这 篇文章我们将用一 ...
- linux下显示dd命令的进度:
linux下显示dd命令的进度: dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比 ...
- [转] 关于linux下通过shell命令(自动)修改用户密码
关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自 ...
- linux下安装7z命令及7z命令的使用
本文主要介绍了在linux下安装7z命令的方法,同时介绍了7z命令的使用.7z压缩格式拥有众多优点,具有极高的压缩比率,如果你还不了解,请看文章:7z格式.LZMA压缩算法和7-Zip详细介绍. re ...
- 将linux下的rm命令改造成移动文件至回收站【转】
转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移 ...
- linux下常用FTP命令
linux下常用FTP命令 1. 连接ftp服务器 1. 连接ftp服务器格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1b)服 ...
随机推荐
- VS调试相关
1.查看DataSet的数据
- STL—— 容器(vector)的数据插入之 insert()
vector 容器可以使用 vectorName.insert() 方法插入元素,vectorName.insert() 函数一共有4种重载方法: 第一种 insert() 用法:在指定地址插入单个元 ...
- Python之re正则
1. 基本规则 # 元字符: # . ^ $ * + ? { } [ ] | ( ) \ # 字符类型匹配: # . 表示匹配任意一个字符(换行符除外) # [asdf] 表示匹配中括号里面的任意一个 ...
- eclipse提示JVM版本太低
解决方案:去eclipse的安装路径找到eclipse.ini文件,然后在头部指定JVM的版本(第一第二行) -vm C:/Program Files/Java/jdk-11.0.9/bin -sta ...
- Pytest 学习(二十七)- Jenkins+Allure+Pytest的持续集成
一.配置 allure 环境变量 1.下载 allure是一个命令行工具,可以去 github 下载最新版:https://github.com/allure-framework/allure2/re ...
- js上 十三、函数初步-2
13-1.函数的参数 函数的本质: ü 函数的作用,代码重用,编写一个函数,就是为了解决一类问题. ü 函数每次调用,都有一个结果,那么结果和什么相关呢?y = x , y = x2,y = sin( ...
- 精尽Spring MVC源码分析 - HandlerAdapter 组件(三)之 HandlerMethodArgumentResolver
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- [日常摸鱼]poj1741Tree-点分治
还有两天就要去FJWC啦- 题意:一颗无根树,$k$为给定常数,求树上距离不超过$k$的点对的数量,多组数据,$n \leq 10^4$. 应该是点分治经典题~ 一般对于无根树我们都可以把它转变成有根 ...
- Windows安装Pytorch并配置Anaconda与Pycharm
1 开发环境准备 Python 3.7+Anaconda3 5.3.1(64位)+CUDA+Pycharm Community 2 安装Anaconda 2.1 进入官网下载: 根据windows版本 ...
- 2020软件测试工程师面试题汇总(内含答案)-看完BATJ面试官对你竖起大拇指!
测试技术面试题 1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通常说的软件的可移植性. 兼容的类型,如果细分的话 ...