首页
社区
课程
招聘
[原创]so文件动态加解密的CrackMe
发表于: 2021-3-19 19:40 13265

[原创]so文件动态加解密的CrackMe

2021-3-19 19:40
13265

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

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

从上图可知,校验函数为libnative-lib.so文件中的test函数

首先分析so文件提前加载的三处函数(init、init_array、JNI_OnLoad

readelf -d查看是否有init、init_array

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

datadiv_decode4192348989750430380函数的作用是解密字符串

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

接着分析ooxx函数

sub_8930函数的内容如下:

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

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

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

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

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

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

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

获取xxoo函数的文件偏移(xxoo_offset)

xxoo函数的文件偏移 = .txt段的文件偏移 + xxoo函数相对于.txt段的文件偏移
xxoo函数相对于.txt段的文件偏移 = xxoo函数的相对虚拟地址 - .txt段的相对虚拟地址

通过上面两个公式可得
xxoo函数的文件偏移 = .txt段的文件偏移 + xxoo函数的相对虚拟地址 - .txt段的相对虚拟地址

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

所以xxoo_offset = 0x8dc5

获取xxoo函数的大小(xxoo_size)

如上图,xxoo_size = 584

获取密钥(xor_array)

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

解密过后的ooxx函数:

flag即是kanxuetest

见附件

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//获取用于异或解密的密钥
Java.perform(function () {
    var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
    //1.获取app的文件目录files,/data/user/0/$package_name/files/
    var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
    //2.获取so文件信息
    var libso = Process.getModuleByName("libnative-lib.so");
    var byte_1C180_addr = 0x1C180
    //3.获取用于异或解密的密钥的起始地址
    var xor_array_base  = ptr(Number(libso.base) + byte_1C180_addr)
    //4.用于异或解密的密钥的大小
    var xor_array_size = 464;
    console.log("[xor_array_base]: ", xor_array_base);
    console.log("[xor_array_size]: ", ptr(xor_array_size));
    //5.拼接密钥文件路径
    var xor_array_path = dir + "/" + "xor_array" + "_" + xor_array_base + "_" + ptr(xor_array_size);
    //6.打开密钥文件
    var file_handle = new File(xor_array_path, "wb");
    if (file_handle && file_handle != null) {
        //7.修改密钥所在内存的属性为可读
        Memory.protect(xor_array_base, xor_array_size, 'r');
        //8.读取密钥到缓冲区
        var xor_array_buffer = xor_array_base.readByteArray(xor_array_size);
        //9.把缓冲区内容写入文件
        file_handle.write(xor_array_buffer);
        //10.刷新缓存
        file_handle.flush();
        //11.关闭文件
        file_handle.close();
        console.log("[dump]: ", xor_array_path);
    }
});
//获取用于异或解密的密钥
Java.perform(function () {
    var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
    //1.获取app的文件目录files,/data/user/0/$package_name/files/
    var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
    //2.获取so文件信息
    var libso = Process.getModuleByName("libnative-lib.so");
    var byte_1C180_addr = 0x1C180
    //3.获取用于异或解密的密钥的起始地址
    var xor_array_base  = ptr(Number(libso.base) + byte_1C180_addr)
    //4.用于异或解密的密钥的大小
    var xor_array_size = 464;
    console.log("[xor_array_base]: ", xor_array_base);
    console.log("[xor_array_size]: ", ptr(xor_array_size));
    //5.拼接密钥文件路径

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-3-19 20:13 被genliese编辑 ,原因:
上传的附件:
  • 1.apk (2.44MB,142次下载)
收藏
免费 6
支持
分享
最新回复 (9)
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
2
666,学习思路不错
2021-3-22 18:26
0
雪    币: 102
活跃值: (2150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
mark
2021-3-22 23:39
0
雪    币: 588
活跃值: (367)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享牛批
2021-3-24 08:51
0
雪    币: 1988
活跃值: (1916)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
膜拜大佬
2021-3-25 07:31
0
雪    币: 4953
活跃值: (19055)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2021-3-28 11:32
0
雪    币: 2479
活跃值: (3099)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
qyc 666,学习思路不错
感谢大佬的肯定
2021-3-28 12:13
0
雪    币: 2904
活跃值: (1337)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2021-3-28 17:26
0
雪    币: 248
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2021-3-30 15:08
0
雪    币: 334
活跃值: (392)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢分享
2021-4-1 15:14
0
游客
登录 | 注册 方可回帖
返回
//