网上有篇 Android SO(动态链接库)UPX加固指南,详细介绍了如何使用UPX给Android SO加壳,尝试做了一下结果ok,这里只记录遇到的几个小问题。

1、40k以下so不能加壳

kiiim@ubuntu:~/src$ upx.out a.out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2011
UPX 3.08 Markus Oberhumer, Laszlo Molnar & John Reiser Dec 12th 2011 File size Ratio Format Name
-------------------- ------ ----------- -----------
upx.out: a.out: NotCompressibleException Packed 1 file: 0 ok, 1 error.

解决,添加下面代码


int const dummy_to_make_this_compressible[10000] = {1,2,3};

2、无INIT节区的so不能加壳

kiiim@ubuntu:~/src$ readelf -d a.out 

Dynamic section at offset 0xe28 contains 24 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400460
0x000000000000000d (FINI) 0x400694
0x0000000000000019 (INIT_ARRAY) 0x600e10
kiiim@ubuntu:~/src$ upx_diy.out libcmxsecd.so
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2016
UPX 1.02 Markus Oberhumer, Laszlo Molnar & John Reiser Mar 30th 2016 File size Ratio Format Name
-------------------- ------ ----------- -----------
upx_diy.out: libcmxsecd.so: UnknownExecutableFormatException Packed 0 files.

以上,没有(INIT)的so不能进行加壳,解决办法,通过编译选项加入:

首先定义一个函数,


void my_init(){}

编译时在Android.mk添加编译选项,


LOCAL_LDFLAGS += -Wl,-init=my_init

3、Android N版本更新

Android N-Preview 即 API24中,为了SO的完整性,加入了对ELF Section Header的校验,而UPX会抹去这块信息,导致SO在dlopen加载时失败

ChangeLog位置:http://android-developers.blogspot.hk/2016/06/android-changes-for-ndk-developers.html

想了两个办法,1.手工修复Section Header信息

http://bbs.pediy.com/showthread.php?t=192874

但一个必要条件,***直接移动到末尾读取到shstrtab section***无法满足。

2.查看Google的校验逻辑,针对性绕过;也完成不了,它的逻辑就是解析动态节区信息,与运行时的Segment做比对验证其完整性。而Dynamic节通过Section Header定位的,也就是Section Header信息必修复。

目前未解决此问题。

4、关注changelog

https://www.pysol.org:4443/hg/upx.hg/log

https://sourceforge.net/p/upx/bugs/

特别关注下这个讨论:https://sourceforge.net/p/upx/bugs/223/

最新文章

  1. 如何通过JQuery将DIV的滚动条滚动到指定的位置
  2. 【OpenCV】图像的遍历
  3. asynchronous vs non-blocking
  4. php的分页查询建立分页类
  5. C语言文件操作函数
  6. 基于VPN搭建混合云架构需要考虑的网络因素
  7. c++,模板函数的定义和使用【初探】
  8. Linux下给mysql创建用户分配权限
  9. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用
  10. django 静态css js文件配置
  11. android studio 添加get,set方法快捷方式
  12. Fedora 全局代理上网设置
  13. JS 对象(对象遍历,拷贝)
  14. list 转datatable
  15. Python模块调用方式详解
  16. eclipse 在Servers窗口创建一个Tomcat 6.0 Server失败
  17. 查找文本工具grep
  18. Ubuntu下载及安装
  19. Ubuntu下配置eclipse环境
  20. MooseFS及其高可用部署

热门文章

  1. 【转】jquery.validate.js表单验证
  2. 使用MongoDB数据库(1)(三十五)
  3. 把旧系统迁移到.Net Core 2.0 日记(9) -- T4 Template
  4. 把旧系统迁移到.Net Core 2.0 日记(7) Tag Helpers /ResponseCache
  5. 回声TCP服务器端/客户端
  6. 中国队再创佳绩,IOI2018喜获四金
  7. vue数据请求显示loading图
  8. el表达式原样输出,不被解析
  9. js 设置img标签的src资源无法找到的替代图片(通过img的属性设置)
  10. python笔记1-基础概念、python安装使用配置