当前位置:网站首页 > 技术博客 > 正文

.so文件格式



一道so文件动态加解密的CrackMe,运行时解密要执行的函数,且在执行后立马加密

  • CrackMe:dex文件加的数字壳,so文件无壳,因为反调试,所以so文件采用全静态分析
  • 分析环境:
    • 脱壳工具:FART
    • GDA
    • IDA
    • Frida
    • PyCharm
    • VSCode

2.1 脱壳

拿到FART定制ROM下跑,得到想要的dex文件,数字壳抹去了前八个字节的dex文件魔数,需要填充一下,才能用GDA进行解析

2.2 定位校验函数

从上图可知,校验函数为文件中的函数

2.3 分析so文件

首先分析so文件提前加载的三处函数()

用查看是否有

发现只有,用IDA查看数组中的函数

函数的作用是解密字符串

接着分析函数,导入头文件,用于解析JNI函数

接着分析函数

函数的内容如下:

其中函数的作用是获取so文件的加载基址,如下:

获取so文件的加载基址的方法是,通过读取CrackMe进程的内存映射文件,然后通过搜索切割字符串得到的,文件的内容如下:

函数接着调用了函数用于获取函数的相对虚拟地址和大小,如下:

其中步骤5——通过计算,得到xxoo函数在符号表中的索引中使用的算法和文章:简单粗暴的so加解密实现中第四部分——基于特定函数的加解密实现介绍的查找函数的算法完全一致,可以导入头文件解析ELF文件的结构体

在函数中,根据上面得到的so文件的加载基址、函数的相对虚拟地址和大小等信息,接着就是修改内存属性,解密函数,还原内存属性,最后刷新指令缓存,分析完成后的函数如下:

其中解密用到的密钥存储在中,是在bss段,在文件中是未初始化的,所以我们需要在运行时,从内存中dump下来

3.1 解密需要的数据

使用打开文件的方式进行解密,而不是运行时解密,所以需要以下数据

  • 函数的文件偏移():
  • 函数的大小()
  • 密钥()

获取函数的文件偏移()

段的文件偏移和段的相对虚拟地址在的区段头中,函数的相对虚拟地址在符号表中,如下:

所以 = 0x8dc5

获取函数的大小()

如上图, = 584

获取密钥()

  • 密钥在内存中的起始地址:so文件的加载基址 + 0x1C180
  • 密钥的大小:xxoo_size - 61 - 59 = 464

根据上述信息,通过frida脚本dump内存即可得到密钥,脚本如下:

 

3.2 解密脚本

 

解密过后的函数:

flag即是

版权声明


相关文章:

  • mysql触发器详解2025-04-16 22:30:05
  • java集合视频教程2025-04-16 22:30:05
  • 网络安全设备有什么2025-04-16 22:30:05
  • microsoft visual c 20102025-04-16 22:30:05
  • l298n怎么接2025-04-16 22:30:05
  • linux wait函数头文件2025-04-16 22:30:05
  • 指针数组与数组指针的用法2025-04-16 22:30:05
  • debian镜像下载2025-04-16 22:30:05
  • vue2.0教程2025-04-16 22:30:05
  • linux桌面是什么样子2025-04-16 22:30:05