so文件混淆与修复

一、对section header进行混淆

由于linker不会对section header进行加载,所以对section header进行改动,不会影响so文件正常加载到内存,因此有些程序对section header进行了混淆,导致IDA无法正常进行静态分析。

在这里插入图片描述

混淆方法:
1.将section header table中的addr、offsize等字段值清0,如果清空的是dynsym段,就会使IDA无法找到函数符号
2.对section header中的name字段进行修改,可以更改段名

二、对Program header进行混淆

linker在加载so文件的时候会用到LOAD段,但是没有直接用到其他段的数据,比如说Dynamic段中的数据,在linker源码中会通过switch的方式对Dynamic中的字段进行赋值,也就是说如果对Dynamic中的字段进行复制混淆一样不会影响linker进行加载,因为同样的字段,后面的会覆盖前面的,但这样的静态混淆有个明显的缺陷,同字段的值,一定是最后一个是有效的。

在这里插入图片描述

三、so文件的修复

3.1 最简单的修复方式

如果elf header中的section header offset是一个异常的值,IDA加载时会报错,并且无法正常的静态分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最简单的修改方法是将以下几个值清0,这样IDA就不会报错,但是修复的程序非常有限

在这里插入图片描述
在这里插入图片描述

3.2 手动修复

虽然section header的addr完全清0了,但是恢复并不是没有办法

在这里插入图片描述
section header的0段addr和off永远是0。
sectioin header的1段size是0x13,对比Program header的INTERP段可以看出,它的size也是13,就可以猜测对应的是INTERP段,所以section header的1段addr和offset是0x134
在这里插入图片描述

有了1段的addr和offset就可以根据size和align计算出下一个段的addr和offset
在这里插入图片描述
计算到段13的时候,发现0x8b88+340=0x8ec8,这时候根据LOAD段,可以得知它的地址其实应该包含到第二个LOAD段中了,它的offset是9da8,addr是ada8

在这里插入图片描述

当修正到段[23]时,修改值是45da4,第二个LOAD段的offset+filesize=45da4,所以下面的段[24]的修正需要采用另一种方法

在这里插入图片描述
注意到这个段的类型是NOBITS,它的段名应该是.bss,而bss的后面的段是comment段

在这里插入图片描述
可以看到comment段和bss段的offset是一样的
在这里插入图片描述
所以修改如下
在这里插入图片描述

对address的修正
在这里插入图片描述
最后几个address为0
在这里插入图片描述

在010中找到对应的字段全部修正,保存,再用IDA打开。
修复前

在这里插入图片描述

修复后

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 混淆SO文件是指对Android native执行文件(.so文件)中的函数和数据进行加密和混淆,以保护代码的安全性和隐私性。与Java代码混淆不同的是,SO文件混淆是在编译阶段完成的,而不是在打包和发布阶段。 在Android开发中,NDK(Native Development Kit)是一款可用于编写本地代码的工具集。使用NDK开发的应用程序使用SO文件来提供C/C++函数和库。由于NDK代码不会在应用程序中进行编译,因此它们没有类似于Java代码的混淆和加密工具。因此,为了加强SO文件的安全性,需要使用其他的工具来进行混淆。 现在有许多开源的SO混淆工具可供使用。例如,Android NDK提供了一个名为LLVM混淆器的工具,它使用一些与Java代码混淆器不同的技术来优化指令流和掩盖代码逻辑。此外,其他SO混淆工具如YASC、MOVfuscator、O-LLVM等也可以用于混淆SO文件。 SO文件混淆可以通过多种方式实现。例如,针对代码文件进行重命名或修改,删除未引用的函数和数据,加密和混淆重要内容等。此外,也可以通过将硬编码的值替换为映射的值,使用一些外部定义的数据结构来防止反汇编和静态分析等技术来实现混淆。无论采用何种方法,SO文件混淆对于保护代码的安全性和隐私性都具有重要意义。 ### 回答2: 使用Android Studio中的ProGuard工具可以对一个应用程序的Java class文件进行混淆,但是它并不支持对Native代码的混淆。由于so文件是编译后的二进制文件,没有人可读的,对so文件进行混淆通常都是为了防止逆向工程而不是优化程序的运行或缩小它的大小。 现在有一些第三方工具可以用来对so文件进行混淆,比如Bangcle、Qihoo 360、Baidu和信鸽。这些工具通过改变so文件的代码结构、函数名称和变量名等方法来混淆so文件,使之更加难以阅读和理解。 混淆so文件是有一定风险的,因为这可能会导致应用程序的崩溃和功能异常。此外,混淆so文件可能会和某些平台实现产生不兼容的问题。但是如果您确实担心你的so文件受到攻击,那么混淆so文件可能是一个值得考虑的安全策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值