0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ollvm|Android字符串加密浅析

哆啦安全 来源:小道安全 作者:小道安全 2022-11-29 09:08 次阅读

背景

字符串加密是一个非常传统的代码保护方案,在Android的逆向过程中会涉及到Java代码和CC++代码,通常在对APP做逆向过程中第一步一般就是反编译后查看代码中是否有包含一些可以作为突破口分析的字符串信息

作为开发者一般应用中的字符串信息都是保存相对敏感的信息,字符串一般信息会保存着如客户端和服务端通信信息,操作文件相关信息。

04a97cec-6f71-11ed-8abf-dac502259ad0.png

(so部分的字符串加密)

04bbe418-6f71-11ed-8abf-dac502259ad0.png

(java部分的字符串加密)

由于字符串信息中存储着很多关键的信息,因此在做逆向的过程中从字符串入手可以猜测、分析定位出一些关键的加解密算法、关键的逻辑结构。因此字符串也是一种提高被静态逆向分析的一个很重要的门槛。

字符串信息的加密的影响只到静态的逆向分析这一步,字符串信息信息在实际业务运行过程中必然需要进行对字符串的操作,那这个就涉及到了对加密字符串的解密过程。这个运行态也就是在对app进行利用动态调试分析过程中都是赤裸裸的展现出来。这是时候字符串的加密就显得苍白无力了。因此可以通过反调试和字符串加密这两者的入门的动态和静态方式结合,稍微提高代码的安全性。

字符串加密算法基础

所谓字符串加密技术是指将一个信息(或称明文)经过加密钥匙及加密函数转换,变成无意义的密文,而接收方则将此密文经过解密函数、解密钥匙还原成原字符串。

字符串加密免不了采用加解密的算法,加解密算法的加解密方式和加解密强度直接决定了被攻破的时间成本。

字符串加密算法有简单的异或方式;通用的AES、DES、RSA、Base64、MD5散列函数等等;相对有难度的自实现加解密算法、冷门的加解密算法。

不过一般情况下,作为开发者一般不太可能自己去造轮子写加解密算法,一般都是直接就套用网络上稳定的、标准的加解密算法。其实如果从相对安全性来说,可以找那些冷门的加解密算法用于保护字符串。这样相对网络公开资料比较少,并且分析的人相对比较少,分析起来时间成本就相对比较高。

下面就分析下so文件加密用的比较多的字符串加密是怎么实现的。

ollvm字符串加密原理

Ollvm中字符串加密的公开版本有很多个版本,并且每个版本功能实现虽然大同小异,但是各个版本也各有缺点。

这些缺点有:

1.无法加密字符串数组;

2.无法加密unicode编码和非const的字符串数组;

3.无法加密全局char和wchar字符串常量和结构体变量。

基于以上原因,实现自己定制修改字符串加密功能代码就显得很重要了。

下面就分析下ollvm中基于某版本字符串加密的实现和调用

Ollvm项目中,字符串加密实现主要功能在项目存储在如下的路径中

声明和实现的代码

ollvmincludellvmTransformsObfuscationStringObfuscation.h

ollvmlibTransformsObfuscationStringObfuscation.cpp

初始化随机数因子和调用字符串加密

ollvmlibTransformsIPOPassManagerBuilder.cpp

添加编译StringObfuscation.cpp文件

ollvmlibTransformsObfuscationCMakeLists.txt

CMakeLists.txt配置要编译的StringObfuscation.cpp文件

04d610b8-6f71-11ed-8abf-dac502259ad0.png

下面的声明的静态全局变量,主要是为了实现编译时候识别 -mllvm -sobf指令的标识,全局开关通过参数来判断是否要开启字符串加密。

04e483b4-6f71-11ed-8abf-dac502259ad0.png

随机数因子的初始化。

050a5ea4-6f71-11ed-8abf-dac502259ad0.png

在populateModulePassManager 函数中,新增挂载新的pass代码,这样就可以根据全局开关来判断是否启用当前pass。

051e8636-6f71-11ed-8abf-dac502259ad0.png

StringObfuscation.h文件分析

这个函数就声明了createStringObfuscation函数,看起来非常简单,这个函数也就是这个字符串加密的关键函数。

05570c40-6f71-11ed-8abf-dac502259ad0.png

StringObfuscation.cpp文件分析(基于Armariris版本的字符串加密)

这个版本的加密效果:可加密所有类型的ANSI, UNICODE字符串常量, 但是无法加密字符串数组, 因为字符串数组的全局符号名不是.str开头。

这个文件中主要有字符串加密函数和字符串解密函数2个函数组成的。

0560ac1e-6f71-11ed-8abf-dac502259ad0.png

上文截图代码根据.str和.str.名称判断是否为字符串,并且过滤掉特定区段:Llvm.metadata,__objec_methname不进行字符串加密。

056f13da-6f71-11ed-8abf-dac502259ad0.png

上面截图中的代码,可以看到字符串加密的就是进行简单的字符串异或加密。

057dd30c-6f71-11ed-8abf-dac502259ad0.png

用于往字符串加密的程序插入以“.datadiv_decode+随机数”为结构的加密函数,用于实现对字符串进行加密处理。

防止破解者能够快速识别是基于ollvm实现的字符串加密,可以重点修改下这个函数的实现和“.datadiv_decode+随机数”的特征。

有了以上的关键调用和流程,那么就可以基于以上的流程和规则进行做字符串加密功能的定制实现了,可以通过添加一些逻辑代码加强字符串加密的强度。

ollvm字符串加密后表现

1.直接用标准的ollvm的字符串加密,在字符串信息和导出函数中和init_arrayq区段会存在.datadiv_decode,这种采用的是一个字节和一个字节进行随机异或的加密方式。

数据都存储在数据段中,程序运行前就是初始化的时候就将加密的字符串全部解密出来,等待着使用。

058ad692-6f71-11ed-8abf-dac502259ad0.png

05c1f83e-6f71-11ed-8abf-dac502259ad0.png

05cc03e2-6f71-11ed-8abf-dac502259ad0.png

2.通过基于ollvm的源代码,简单修改定制olllvm的源码,将解密函数名字修改成为非标准的,但是这种的字符串加密在init_array区段中依然会有展示,只不过展示的是非标准的函数信息。这种加密也是通过疑惑的方式进行加密。

字符串数据都存储在数据段中,程序运行起来后就是初始化时候,就一次性全部将字符串解密。

05d9687a-6f71-11ed-8abf-dac502259ad0.png

3.通过基于ollvm的源代码进行定制,字符串信息都存储在.bss区段中,程序运行初始化的时候并没有进行做解密,只有在程序运行使用到那里才会解密到那里。其它的没使用的字符串是没有进行解密的。

05e3a2cc-6f71-11ed-8abf-dac502259ad0.png

小结

从字符串成为破解者第一道门槛的的痛点,在到字符串加密仅是为了提高破解者静态分析的成本的大背景下进行,全文大篇幅的主要是以ollvm这个项目中的字符串加密为主线进行展开的,展开的方向主要以加密的实现原理和加密后的表现形式。

对ollvm字符串的解密相信是对大家来说比字符串加密是更感兴趣,篇幅有限先以字符串加密进行简单做下原理性的分析,后面再分享ollvm字符串解密

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3943

    浏览量

    127845
  • JAVA
    +关注

    关注

    19

    文章

    2974

    浏览量

    105078
  • 字符串
    +关注

    关注

    1

    文章

    585

    浏览量

    20592

原文标题:ollvm|Android字符串加密浅析

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++字符串string

    string是C++编程语言中的字符串。在C++中字符串处理可以使用c语言字符串形式char *,也可以使用string类格式。
    的头像 发表于 07-10 00:26 1376次阅读
    C++<b class='flag-5'>字符串</b>string

    字符串的表示

    字符串的表示  随着计算机在文字处理与信息管理中的广泛应用, 字符串已成为最常用的数据类型之一, 许多计算机中都提供字符串操作功能, 一些计算机还给出读写字
    发表于 10-13 17:11 3089次阅读
    <b class='flag-5'>字符串</b>的表示

    C语言教程之字符串加密和解密

    C语言教程之字符串加密和解密,很好的C语言资料,快来学习吧。
    发表于 04-25 15:49 0次下载

    什么是复制字符串?Python如何复制字符串

    连续几篇文章都在写 Python 字符串,这出乎我的意料了。但是,有的问题,不写不行,特别是那种灵机一动想到的问题,最后你发现,很多人根本不懂却又误以为自己懂了。那就继续刨根问底,探究个明白吧
    发表于 11-25 10:32 3049次阅读

    strtok拆分字符串

    大家好,我是惊觉,今天聊聊字符串字符串的使用场景非常之多,人机交互和双机通信都会用到。比如:通过串口向单片机发送指令,以执行操作或配置参数。单片机读取传感器数据,数据格式是字符串。一般GPS数据
    发表于 01-13 15:46 8次下载
    strtok拆分<b class='flag-5'>字符串</b>

    字符串函数重写练习

    字符串函数重写练习:字符串比较、字符串拼接、字符串查找、字符串拷贝、内存比较、内存拷贝、内存初始化、内存比较、二维数组定义及基本使用、位运算
    的头像 发表于 05-05 15:02 2029次阅读

    字符串操作

    labview字符串操作
    发表于 06-28 15:09 2次下载

    C语言总结_字符串全方位练习

    C语言字符串全方位练习,涉及知识点:字符串解析、大小写判断、字符串插入、字符串删除、字符串排序、字符串
    的头像 发表于 08-14 09:41 1545次阅读

    一文详解JavaScript字符串

    JavaScript字符串是原始值。此外,字符串是不可变的。这意味着如果你修改一个字符串,你总是会得到一个新的字符串。原始字符串不会被改变。
    的头像 发表于 12-08 16:36 1251次阅读

    python字符串有哪些特定方法

    python字符串序列操作也适用于列表和元组。 python字符串还有独有方法,即字符串对象的函数,其他对象不可调用,只有字符串对象可调用。
    的头像 发表于 02-23 15:02 756次阅读

    浅析python字符串模式匹配

    python字符串可以通过re模块的模式匹配来处理文本。
    的头像 发表于 02-23 15:04 2359次阅读

    C语言字符串的引用方式

    在C语言程序中,字符串是存放在字符数组中的。 2. 用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个
    的头像 发表于 03-10 14:57 1996次阅读

    字符串的相关知识

    TCL 中的数据类型只有一种:字符串。这些字符串可以是字母、数字、布尔值、标点符号等特殊字符的组合。在某些特殊命令的作用下,字符串可以向其他数据类型转换。下面将系统的讲解或回顾下
    的头像 发表于 03-29 11:41 1189次阅读

    labview字符串如何转换为16进制字符串

    在LabVIEW中,将字符串转换为16进制字符串是一个常见的需求,尤其是在处理数据通信和硬件接口时。LabVIEW提供了多种方法来实现这一转换,包括使用内置函数、编写VI(Virtual
    的头像 发表于 09-04 15:54 2963次阅读

    字符串字符数组的区别

    在编程语言中,字符串字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示 字符串 字符串
    的头像 发表于 01-07 15:29 269次阅读