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

小试牛刀

先准备好材料

  1. //hello.cpp
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. int i = 10;
  6. for(;i > 0;i--) {
  7. cout<<"hello,i = "<<(10 - i)<<endl;
  8. }
  9. return 0;
  10. }

还是熟悉的配方。好,那么我们upx一下

  1. $ g++ hello.cpp -o hello.out
  2. $ upx hello.out -o hello.upx.out
  3. Ultimate Packer for eXecutables
  4. Copyright (C) 1996 - 2017
  5. UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
  6. File size Ratio Format Name
  7. -------------------- ------ ----------- -----------
  8. upx: hello.strip.out: NotCompressibleException
  9. Packed 1 file: 0 ok, 1 error.
  10. $

那么是什么问题呢,我上网找了一下。原来是upx不支持太小的文件。小于40kb的文件就不支持了。

好,那么本文就到此结束啦,谢谢大家的观看。

再次尝试

等等,我辈岂是如此轻言放弃之人。

  1. //hello.go
  2. package main
  3. import "fmt"
  4. func main() {
  5. i := 10
  6. for ; i > 0; i-- {
  7. fmt.Printf("hello,i = %d\n",(10 - i))
  8. }
  9. }

然后编译

  1. $ go build hello.go
  2. $ ls -l
  3. total 2040
  4. -rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
  5. -rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
  6. $

那么我们得到了一个20M的可执行文件,让我们来upx一下它

  1. $ upx hello -o hello.upx.out
  2. $ ls -l
  3. total 4592
  4. -rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
  5. -rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
  6. -rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
  7. $

嗯,确实小了不少,upx处理后,变成了11M;看小减少了百分之多少。

(2080925-1143336)/2080925≈45.07%

嗯,比strip多一点。

那么看看,能不能再strip

  1. $ strip hello.upx.out -o hello.upxs.out
  2. strip: error: the input file 'hello.upx.out' has no sections
  3. $

那么我们分析一下应该不难得知,upx把壳给加上了,导致strip找不到那些标记

反向操作

那么呢,我们是不能把这个过程给反一下。是不是就可以了呢

好,那么说干就干

  1. $ strip hello -p -o hello.s.out
  2. $ ls -l
  3. total 4592
  4. -rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
  5. -rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
  6. -rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
  7. -rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
  8. $ upx hello.s.out -o hello.su.out
  9. Ultimate Packer for eXecutables
  10. Copyright (C) 1996 - 2017
  11. UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
  12. File size Ratio Format Name
  13. -------------------- ------ ----------- -----------
  14. 1463768 -> 574340 39.24% linux/amd64 hello.su.out
  15. Packed 1 file.
  16. $ ls -l
  17. total 5156
  18. -rwxr-xr-x 1 root root 2080925 Jul 13 03:12 hello
  19. -rw-r--r-- 1 root root 141 Jul 13 03:00 hello.go
  20. -rwxr-xr-x 1 root root 1463768 Jul 13 03:23 hello.s.out
  21. -rwxr-xr-x 1 root root 574340 Jul 13 03:23 hello.su.out
  22. -rwxr-xr-x 1 root root 1143336 Jul 13 03:23 hello.upx.out
  23. $

嗯,很好。套娃成功

看下减少了多少,1-574340/2080925≈72.40%

那么这个减少的量是比较多的,让我们来看看可以运行吗

  1. $ ./hello.su.out
  2. hello,i = 0
  3. hello,i = 1
  4. hello,i = 2
  5. hello,i = 3
  6. hello,i = 4
  7. hello,i = 5
  8. hello,i = 6
  9. hello,i = 7
  10. hello,i = 8
  11. hello,i = 9
  12. $

那么我们可以看到,这个是可以正常运行的。

继续研究

那么我们来看看upx可以带哪些选项吧,

  1. $ upx
  2. Ultimate Packer for eXecutables
  3. Copyright (C) 1996 - 2017
  4. UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017
  5. Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..
  6. Commands:
  7. -1 compress faster -9 compress better
  8. -d decompress -l list compressed file
  9. -t test compressed file -V display version number
  10. -h give more help -L display software license
  11. Options:
  12. -q be quiet -v be verbose
  13. -oFILE write output to 'FILE'
  14. -f force compression of suspicious files
  15. -k keep backup files
  16. file.. executables to (de)compress
  17. Type 'upx --help' for more detailed help.
  18. UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io
  19. $

命令:

有1到9的压缩等级;

-d 不压缩;

-l 列出压缩的文件;

-t 测试压缩文件;

-h 显示帮助文档

-V 显示版本号

-L 显示软件许可证

选项:

-q 安静模式

-v 详细模式

-o 大家都懂,输出到文件

-f 强制压缩可以的文件

-k 保持备份文件

嗯, 好像没有什么值得深究的功能, 这个压缩等级大家可以按照自己的需要去调整。

好,就这样。

总结

最后我们来总结一下

首先这个upx之后的东西,嗯,它的时间戳还是保留之前的

然后呢,upx操作之后呢,这个sections会变得面目全非。所以再去strip呢,就不行了

所以我们需要采取反向操作先strip然后再upx

然后呢就是压缩的等级,-1是优先速度,-9是优先质量。那么中间的按照这个去推断。

好了,本文到这里就结束啦,如果喜欢这篇文章,记得点赞。谢谢

Linux下的upx命令学习的更多相关文章

  1. Linux下的strip命令学习

    strip strip是Linux下的一个命令.可以用于给应用脱衣服,帮助我们抹除一些调试信息.(虽然不知道具体是什么,但是会用就好了) 在嵌入式开发领域用到的应该比较多 首先,先写一个示例看看 // ...

  2. linux下文件搜索命令学习笔记

    1. locate:按照文件名搜索文件 locate filename 与find在整个操作系统中遍历搜索不同,locate命令在/var/lib/mlocate这个后台数据库中按照文件名搜索,所以优 ...

  3. Linux下使用mail命令发送邮件

    因为需要经常备份网站的数据,所以了解并学习了下linux下如何通过shell来发送邮件,这里以CentOS为例,使用mail命令来进行外部邮件的发送.mail命令的语法如下: Usage: mail ...

  4. Linux下的Make命令实例详解

    众所周知在Linux系统下的make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.下面这 篇文章我们将用一 ...

  5. linux下显示dd命令的进度:

    linux下显示dd命令的进度: dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比 ...

  6. [转] 关于linux下通过shell命令(自动)修改用户密码

    关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自 ...

  7. linux下安装7z命令及7z命令的使用

    本文主要介绍了在linux下安装7z命令的方法,同时介绍了7z命令的使用.7z压缩格式拥有众多优点,具有极高的压缩比率,如果你还不了解,请看文章:7z格式.LZMA压缩算法和7-Zip详细介绍. re ...

  8. 将linux下的rm命令改造成移动文件至回收站【转】

    转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移 ...

  9. linux下常用FTP命令

    linux下常用FTP命令 1. 连接ftp服务器 1. 连接ftp服务器格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1b)服 ...

随机推荐

  1. Day3 【Scrum 冲刺博客】

    每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 开始人员管理页 搭建与后台对接的相关配置 方子茵(Laa-L) 完成车辆查询接口 黄芯悦(Sheaxx) 完善社区通知页面 完善社区活动页面 ...

  2. Scrum冲刺_Day03

    一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...

  3. 从.NET转GO了

    前言 近几个月刚从.NET转到GO,入职了一个使用GO微服务的互联网公司.因为需要熟悉公司的微服务架构和适应新公司的节奏,所以最近没时间写博客,现在简单做个总结. 转GO的经历 自学GO 上一年的八月 ...

  4. 【题解】Generator(UVA1358)

    感觉我字符串和期望都不好-- 题目链接 题意 有 \(n\) 种字符,给定一个模式串 \(S\) ,一开始字符串为空,现在每次随机生成一个 1~n 的字符添加到字符串末尾,直到出现 \(S\) 停止, ...

  5. hive的调优策略

    hive有时执行速度很慢,若hive on spark 的话,在sparkUI上可以清楚看到是否数据倾斜 优化方法: 1.增加reduce数目 hive.exec.reducers.bytes.per ...

  6. 使用HBase Shell命令

    使用HBase Shell命令 或 使用HBase Java API完成: 列出HBase所有的表的相关信息,例如表名: 在终端打印出指定的表的所有记录数据: 向已经创建好的表添加和删除指定的列族或列 ...

  7. 我们为什么选择VUE来构建前端

    很多使用过VUE的程序员,对VUE的评价是"Vue.js 兼具angular.js和react.js的优点,并剔除了它们的缺点". 那么,他真的值得这么高的评价嘛? Vue.js的 ...

  8. 豆瓣读书top250数据爬取与可视化

    爬虫–scrapy 题目:根据豆瓣读书top250,根据出版社对书籍数量分类,绘制饼图 搭建环境 import scrapy import numpy as np import pandas as p ...

  9. ASP.NET Core 3.1使用Swagger

    一.什么是Swagger 随着技术的不断方法,现在的网站开发基本都是使用前后端分离的模式,这样使前端开发者和后端开发者只需要专注自己擅长的即可.但这种方式会存在一种问题:前后端通过API接口的方式进行 ...

  10. Windows锁定屏幕然后关闭显示器,可执行程序

    有时候我们需要关闭屏幕来休息一下或者在本上写东西,但是屏幕亮着的时候会分心,但是关闭显示器又太麻烦了,所以直接来一个小程序(非微信小程序).还有一种情况,有时候晚上要离开电脑旁了,但是电脑还在做事情, ...