ELF中的Section 和 segment
-
Section 和 segment的概念
20170601180629601.pngELF文件如上图所示segment 和 section。其实就是对于elf文件中一部分相同内容的不同描述映射而已,就是上图红框中标出的内容,就好比一个学院的学生,有人喜欢用一班的学生,二班的学生去描述,也有人用女同学,男同学去描述
Section 和 segment两者的作用
首先需要了解一下程序编译链接过程如下图
屏幕快照 2018-08-26 下午4.13.58.png
- 一个源程序最终是要转成汇编程序最后才能生成一个可执行目标文件,汇编每一段开头都有不同的声明,表示接下来这一段的内容是什么,也就是说section本身的作用就是来自于汇编中声明
- segment的作用是什么呢? 多个可重定向文件最终要整合成一个可执行的文件的时候,链接器吧目标文件中相同的 section 整合成一个segment,在程序运行的时候,方便加载器的加载
- 参考博客:https://blog.csdn.net/w1300048671/article/details/72833835?fps=1&locationNum=10
防止静态分析篇——section加密
1.实现逻辑
在要加密的函数后面加上 attribute((section(".testSection"))):将函数定义在我们自己的section中。
编写加密程序:解析so文件,找到section中.mytext段的起始地址和大小,然后进行加密,可进行简单的异或,也可以自己想要的其他加密手段,最后写入文件
在自己的so代码中,编写解密函数。属性用__attribute((constructor))申明,这样就可以在so被加载的时,在main之前将我们的节解密。
参考博客:http://www.cnblogs.com/aliflycoris/p/5880195.html
-
效果(使用ida解析)
- 加密前可以看到.testSection 段
- 加密后已经找不到.testSection了。
-
缺点:
- 无法防止动态调试:后续将补上解决方案
-
Android7.0做了.dynamic字段完整性的检测,暂没找到解决方案后续博客将介绍具体解决逻辑。####
Android自动化加密的实现
1.克隆https://github.com/aguai1/SoProtect.git java加密程序
2.根据Test.java生成可执行跨平台的jar包。
3.新建python文件。先进行gradle assemble命令生成aar。
然后定义函数:
def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
if shell:
cmdstring_list = cmdstring
else:
cmdstring_list = shlex.split(cmdstring)
if timeout:
end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE, shell=shell, bufsize=4096)
while sub.poll() is None:
time.sleep(0.1)
if timeout:
if end_time <= datetime.datetime.now():
raise Exception("Timeout:%s" % cmdstring)
return str(sub.returncode)
4.通过python执行函数 完成so自动化加密
common.execute_command("java -jar " + "./core/encodeSection.jar " + libTrackeraarPath, None,
None, True)