Android逆向之旅—基于对so中的section加密技术实现so加固 这篇文章写得真心好,建议先阅读一下原著,这里只是自己的实践过程(纸上得来终觉浅,绝知此事要躬行),和一些更细节的解释罢了。

一. 拆分section

这个demo的目的是为了将native函数getString()给保护起来(实际应用场景就是自己业务中的核心代码)。为了保护getString(),用到了gcc的Attributes特性:

__attribute__((section ("xxx")))

上述的文档中提到,给变量或者方法增加这个修饰后,编译器将把对应的代码或者数据放到你指定的section中。

我们的demo中做了示例:

__attribute__((section (".encrypt"))) jstring getString(JNIEnv* env) {

static const char* txt __attribute__((section (".encrypt2"))) = "Str from native";

return (*env)->NewStringUTF(env, txt);

};

我们同时给getString()函数和txt变量添加了这个属性,分别指定了不同名称。我们看一下编译后的so:

Paste_Image.png

Paste_Image.png

Paste_Image.png

可以看到新增了我们自定义的section: encrypt、encrypt2,encrypt中存放getString()的代码,因此被映射为可执行,encrypt2中存放txt的数据,因此被映射为可写。

ok,到这里我们已经找到拆分核心代码到单独section的方法了。后续我们只要对这些section做加密即可保护核心代码。

二. 寻找解密时机

假设我们已经加密了这些section,运行的时候总是需要解密还原的,什么时机解密最好呢,当然是越早越好,最早可以在load so之后,执行JNI_Onload之前,这里也是需要gcc的另外一个Attributes特性:

__attribute__((constructor (n)))

文档中指出,constructor (priority)可以在后面指定一个优先级,数字越小,优先级越高,越先被执行。

关于这点我们在demo中也做了验证:

void init_1() __attribute__((constructor (3)));

void init_getString() __attribute__((constructor (2)));

void init_2() __attribute__((constructor (1)));

我们申明了3个函数,优先级从低到高,按照规则,执行顺序应该是:init_2、init_getString、init_1,我们看一下so:

Paste_Image.png

已经按照优先级调整好了顺序。

我们看下日志:

Paste_Image.png

的确也是这个顺序。

ok,这样我们就可以在这个特性的修饰下,尽早能做解密逻辑了。

三. 加密逻辑

先说一下加密,作者的加密算法很简单:字节取反。在misc/encrpt.c中,我们可以发现其核心逻辑是寻找叫做 encrypt 的 section,然后字节取反写回,同时计算将一些值计算了写入ehdr.e_entry(这个对于正常的so是0值)和ehdr.e_shoff(这个是section表的偏移量,修改这个值将导致找不到section,后面会看到加密效果),这些值在解密的时候需要。

demo的misc下有编译后的脚本encrpt,需要在linux环境下执行,libencrypt.so是没有加密前的so,libencrypt2.so是加密后的so。你可以自行使用beyond compare比较差异。

四. 解密逻辑

回到最重要的解密逻辑了,我们在__attribute__((constructor (n)))修饰的方法init_getString()中实现了解密逻辑,其原理是,通过读取/proc/pid/maps中的内容,找到so被映射到内存中的地址,然后通过ehdr.e_entry和ehdr.e_shoff中的内容还原出decrypt section 的地址,字节取反恢复,内存写回。这样就做到了动态解密了。

五. 加密效果

使用ida打开misc/libencrypt2.so

Paste_Image.png

提示这个是因为修改了ehdr.e_shoff,破坏了第一个section 类型为SHT_NULL的规则。

Paste_Image.png

下一步直接解析section 报错。

Paste_Image.png

正常的section都看不到了,看到的都是program sections(上一个图的提示)。

而apk可以正常运行(加密后的apk为misc/signed.apk):

Paste_Image.png

android中的so加固,so加固-加密特定section中的内容相关推荐

  1. 实现Android APK加固:代码加密隐藏、资源加密隐藏、so库加密隐藏。兼容unity引擎。附加固工具链接。

    1.为什么做加固 因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子. 所以需要将原包的一些核心东西进行加密影藏. 市面上比较好的解决方案就是进行加固,能提升apk安全性. 2.怎么加固 ...

  2. 【Android 安全】使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保护配置 | 设置 SO 防盗用文件配置 | 反编译验证加固效果 )

    文章目录 一. 购买加固服务 二. 设置资源加固 三. 设置 SO 文件保护配置 四. 设置 SO 防盗用文件配置 五. 反编译验证加固效果 本博客用于记录下 360 加固保 加固应用流程 ; ( 上 ...

  3. 【Android 安全】使用 360 加固宝加固应用 ( 加固工具准备 | 生成签名 APK | 加固操作 | 反编译验证加固效果 )

    文章目录 一. 加固工具准备 二. 生成签名 APK 三. 加固操作 四. 反编译验证加固效果 本博客用于记录下 360 加固保 加固应用流程 ; ( 上一次加固还是一年前 , 过程全忘了 o(╥﹏╥ ...

  4. 【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )

    文章目录 一. APK 加固原理 1. Android 应用反编译 2. ProGuard 混淆 3. 多 dex 加载原理 4. 代理 Application 开发 5.Java 工具开发 6.Ap ...

  5. Android逆向与安全——360 dex加固与脱壳

    前言 现在市面上对APP的安全合规管控越来越严格了,也就要求了APP在上架之前一定要做合规检测和加固处理.对APP就是加固的好处,可以提高APP的安全性,提高APP被逆向分析破解的门槛,同时通过加固保 ...

  6. Android逆向之脱掉“360加固”的壳

    转载自:https://blog.csdn.net/jiangwei0910410003/article/details/51769447 此处仅作为学习记录一用.至于评论问答环节,请去上面地址翻阅四 ...

  7. android APK内存多少字节,Android apk安全测评、应用加固、字节对齐、二次签名(有这一篇就够了)...

    本文将通过前言.apk安全测评.应用加固.字节对齐.二次签名.总结共6大版块来阐述 一.前言 评判一个App是否出色,除了看它的性能.体验外,本人认为最为重要的是它的安全性.市面上apk安全评测.加固 ...

  8. Android apk安全测评、应用加固、字节对齐、二次签名(有这一篇就够了)

    本文将通过前言.apk安全测评.应用加固.字节对齐.二次签名.总结共6大版块来阐述 一.前言 评判一个App是否出色,除了看它的性能.体验外,本人认为最为重要的是它的安全性.市面上apk安全评测.加固 ...

  9. Android热更新Tinker + 多渠道打包 + 加固的流程详解

    一.Tinker热修复 关于热修复的作用,不用多说了,一句话概括就是通过让用户无感的方式来修复线上应用的bug.这里介绍的是微信Tinker. 下面的接入方式都是参考自Tinker官方文档来.我这里主 ...

最新文章

  1. 2020年,大火的Python和JavaScript是否会被取而代之?
  2. 【VMware虚拟化解决方案】VMware VSphere 5.1配置篇
  3. 如何接地气地接入微前端?
  4. 【MFC】工具栏按钮追加显示文本
  5. UVA12107Digit Puzzle数字字谜(迭代加深搜索)
  6. 第八课-第二讲 08_02_bash脚本编程之七 case语句及脚本选项进阶
  7. mac启动mysql,apache,php
  8. SQLAlchemy ORM教程之二:Query
  9. Centos 云服务器磁盘占用率90%以上的排查解决
  10. 用linux命令清空文件夹,技能包!Linux 下清空或删除大文件内容的 5 种方法
  11. igmpproxy_IGMP proxy开发笔记 | 学步园
  12. TensorFlow工作笔记002---Centos7.3下TensorFlow使用python创建计算图案例
  13. C#调用新浪微博API生成RSS资源文件
  14. 高分屏笔记本,如何处理程序提示“文本缩放比率要求为100%”
  15. 上市公司频推高送转 年报预告掘金“白马股”(名单)
  16. Maven项目插件飘红解决方案
  17. 《看不见的森林:林中自然笔记》书摘一
  18. css3橙色球形_CSS3橙色的星球绕轨道公转动画_html/css_WEB-ITnose -
  19. PHP开发API接口代码展示
  20. JSON对象_JSON.parse()方法

热门文章

  1. 三层交换机配置实例及说明
  2. 时间序列异常检测机制的研究
  3. sscanf 实现_中国实现全球首个5G独立组商网,5G还没铺完6G重磅方案已经出台!...
  4. 继承AppCompatActivity的Activity无法隐藏标题栏
  5. 在Linux环境下mysql的root密码忘记解决方法 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 2.修改MySQL的登录设置: # vi /etc/my.c
  6. 记录一下PHP数组数据分页的方法 array_slice() 函数的使用
  7. Docker操作补充
  8. 框架页面中,从子页面刷新父页面问题解决
  9. Libvirt虚拟机的Qos与Cgroup
  10. 消息队列解耦是骗小孩儿的