首页
社区
课程
招聘
[原创]某相安全平台jar加密逆向
发表于: 2023-10-8 09:42 10536

[原创]某相安全平台jar加密逆向

2023-10-8 09:42
10536

某相安全平台加密,除Main类外,其他class文件均被加密,熵值非常高

图片描述

除jar外,还有一个.so文件。在启动时,需要指定-agentpath:./.so命令行参数。由于未确定其加固方案(比如xjar),于是手动逆向其流程。

jvm在指定-agentpath:./.so后,会先加载此so文件,然后运行此入口函数:

参考:Java Agent机制 · 攻击Java Web应用-[Java Web安全]
容易推测,jvm会先通过此入口函数进行初始化,包括实现一个Loader,其在运行时会对Class文件进行解密。

拖入IDAPro对so文件进行分析,从导出表进入查看其代码,发现被加密,其他函数也是加密状态:

图片描述

很明显so本身也加壳,并且未能确定so壳类型。由于so在加载时,操作系统会调用其_init_proc函数。于是查看此函数,发现未被加密:

图片描述

可推测此函数进行了so的解密流程。于是手动编写加载程序test.c

编译后通过ida进行远程调试,待so被加载后查看其内存段:

图片描述

进入可执行段,修复ida的函数声明。其中解密后的函数相对段基址的偏移不变,因此可以对照原so对虚拟基址的偏移确定解密后段中函数的位置。
由于dump(参考Android so层怎么去脱壳)后需要修复虚拟地址等,于是直接在此进程中进行分析。为方便分析应使用ctrl+F9导入jni.h头文件(参考ida导入jni.h

分析Agent_OnLoad函数:

图片描述

通过分析发现so会先注册两个Native函数:

图片描述

其中参数class_objAgent_OnLoad通过使用MethodID获取后传递。后面进行分析发现就是org.springframework.asm.ClassReader

然后会使用RegisterNatives进行注册:

图片描述

其中JNINativeMethod结构体在jni.h中有声明,需要在IDA中Structures窗口中添加:

图片描述

查看两个结构体地址,发现一个是isCipher函数,一个是decrypt函数

图片描述

查看方法签名发现接受一个字节数组作为参数,并返回一个布尔值。后者则接受一个字节数组,返回一个字节数组。

进一步分析isCipher函数:

图片描述

发现会检查输入的字节数组前四个字节是否为0BAh, 0BEh, 0CAh, 0FEh,可以发现加密的class文件头就是如此:

图片描述

另外正常的class文件头是CAFEBABE。由此可知此函数用于判断是否为一个加密的class文件
再分析decrypt函数。发现解密时会使用一个全局16长度字节数组加密class生成aes keyvi

图片描述

通过交叉引用发现global_bytes_16Agent_OnLoad结尾处进行了初始化,通过一个初始keyvi对一个长度0xA150的密文进行解密并转换提取16个字节生成。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 2787
活跃值: (30801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-10-9 09:26
1
雪    币: 2037
活跃值: (3339)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

目前有一个类似的文件加密,不过是通过自定义classload实现,楼主能不能帮看下。网址如下https://bbs.kanxue.com/thread-280146.htm

最后于 2024-1-10 22:40 被学习班编辑 ,原因:
2024-1-10 22:37
0
游客
登录 | 注册 方可回帖
返回
//