首页
社区
课程
招聘
[分享]UraniumPacker-你见过这样的合并壳吗
发表于: 2021-5-3 11:12 3573

[分享]UraniumPacker-你见过这样的合并壳吗

2021-5-3 11:12
3573

常见的压缩包有iOS的ipa,Android的apk,它们在安装的时候就会把运行资源释放出来放在对应的文件系统位置。
常见的压缩壳有UPX,Windows平台用得最多,它是压缩后在运行时内存中动态释放真正的执行文件。但是对移动平台的支持并不是很好。
UraniumPacker是一种压缩壳,但它诞生的真正目的是作为一种MachO/ELF合并壳,也即将多个二进制文件打包合并为一个,然后运行时自解压自连接至内存中,类似于UPX。合并是它的核心价值所在,那么,哪些场景需要这样的合并壳呢?
比如,你想隐藏真正的二进制文件,抵制一部分人的分析,因为多一道内存Dump就可以劝退一大部分人了。如果再配合其他自定义反动态分析方案,那么想要Dump也是不容易的。
又如,你的二进制文件依赖零零散散的若干文件,而它们的依赖关系会暴露你的设计架构和目的,合并在一起那就是一个黑盒了,很难被人理清它们之间的关系,毕竟调试内存模块难于上青天。
再如,像我们PhoneVMP这样的黑盒VMP虚拟机,处理完了二进制文件,会得到2个文件,再加上VMP自身的运行时一共三个独立的文件,而它们必须合并在一起才能运行。UraniumPacker用于这样的场景的工作流程图如下:
图片描述
还如,你的底层框架使用的是LLVM、LLDB、Clang这样的超级大块头,我们既想压缩又想合并,那这时UraniumPacker也是合适的。合并之后它们分别的导出符号依旧会合并保留在最终的合并壳里面,如果你有其他模块依赖于这些符号,你只需要创建一个同名软连接指向合并壳即可,像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
upacker % upacker --packer-input=../lib/libclang-cpp.dylib --packer-input=../lib/libclang.dylib --packer-input=../lib/liblldb.dylib --packer-input=../lib/libLLVM.dylib --packer-output=./libLLVM.dylib.upacker
*
* UraniumPacker v1.0.0 [Preview0 May  3 2021], A MachO/ELF Compress & Pack Tool.
*
* Powered by yunyoo.cn, all rights reserved.
*
*
+> Packing libclang-cpp.dylib (1/4)...
+> Packing libclang.dylib (2/4)...
+> Packing liblldb.dylib (3/4)...
+> Packing libLLVM.dylib (4/4)...
-> Symbol _ZN4llvm3Any6TypeIdIPKNS_13LazyCallGraph3SCCEE2IdE has already been encoded in another file.
-> Symbol _ZN4llvm3Any6TypeIdIPKNS_8FunctionEE2IdE has already been encoded in another file.
+> libclang-cpp.dylib : 40758304 B, 39803.0 KB, 38.87lf MB
+> libclang.dylib : 22130464 B, 21611.8 KB, 21.11lf MB
+> liblldb.dylib : 15841712 B, 15470.4 KB, 15.11lf MB
+> libLLVM.dylib : 74727760 B, 72976.3 KB, 71.27lf MB
-> SUM : 153458240 B, 149861.6 KB, 146.35 MB
-> libLLVM.dylib.upacker : 59732946 B, 58333.0 KB, 56.97 MB
-> Compression rate : 38.92%
-> Success.
 
upacker % ln -s libLLVM.dylib.upacker libclang-cpp.dylib
upacker % ln -s libLLVM.dylib.upacker libclang.dylib   
upacker % ln -s libLLVM.dylib.upacker liblldb.dylib
upacker % ln -s libLLVM.dylib.upacker libLLVM.dylib
upacker % ls -l
 
total 116672
lrwxr-xr-1  staff        21  5  3 10:47 libLLVM.dylib -> libLLVM.dylib.upacker
-rwxr-xr-1  staff  59732946  5  3 10:47 libLLVM.dylib.upacker
lrwxr-xr-1  staff        21  5  3 10:47 libclang-cpp.dylib -> libLLVM.dylib.upacker
lrwxr-xr-1  staff        21  5  3 10:47 libclang.dylib -> libLLVM.dylib.upacker
lrwxr-xr-1  staff        21  5  3 10:47 liblldb.dylib -> libLLVM.dylib.upacker

一共146MB的LLVM运行时,合并之后只有57MB,真香。当然,UraniumPacker的使用场景远不限于此,期待你的挖掘。
Have fun~

1
https://gitee.com/yunyoo/UraniumPacker

UraniumPacker

Description

A macho/elf compression shell that can make multi-binary into one.

Android iOS macOS
arm Yes No No
arm64 Yes Yes Yes
x86 Yes No No
x86_64 Yes No Yes

License

UraniumPacker is developed by YunYoo(云铀子), all rights reserved.

  • A.Dynamic use (liburaniumpacker.dylib/liburaniumpacker.so) is free;
  • B.Static use (liburaniumpacker.a) should pay for a license;
  • 1.动态连接(liburaniumpacker.dylib/liburaniumpacker.so)免费;
  • 2.静态连接(liburaniumpacker.a)请购买授权;

Instructions

1
2
3
4
5
6
7
8
9
10
11
$ ./mac-x64/upacker
OVERVIEW: UraniumPacker v1.0.0 , A MachO/ELF Compress & Pack Tool.
 
USAGE: upacker [options] <input files>
 
OPTIONS:
  --help                   - Display available options (--help-hidden for more)
  --packer-input=<string>  - UraniumPacker input macho/elf file
  --packer-libdir=<string> - UraniumPacker library search directory
  --packer-output=<string> - UraniumPacker output result file
  --version                - Display the version of this program

Version History

2021/4/30:

  • 发布V1.0.0[preview0];
  • 1.支持Android arm/arm64/x86/x86_64;
  • 2.支持macOS arm64/x86_64;
  • 3.支持iOS arm64;

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//