JVMTI加密的jar包字节码逆向分析 —- 之前的笔记了, 整理一下备份
0x1 加密原理:
通过-agentpath
参数指定插件路径, 在jvm初始化时加载插件解密class并load
详细右转: JVMTI加密
0x2 分析解密过程
插件文件有so和dll两种, 在linux和windows环境都可以跑, 通过上文对原理的分析发现插件会在 Agent_OnLoad
中注册事件回调, 然后在回调事件中进行解密并load, 下图回调类型就是cbVMInit
, 回调类型可以从jvmti.h的jvmtiEventCallbacks查看
进入函数分析可以清晰的发现解密函数…, 上x64dbg看看jvm, 调试分析发现是先解密类名, 在解密class文件
0x3 dumpclass
当然可以分析完解密算法, 再编写解密工具, 但我这边就粗暴的直接对解密的内存dump了(懒癌晚期), 总结就是对new解密内存的时候记录addr和size, 在解密完成时候对之前记录的地址和大小进行dump, 本来想自己写dll去注入dump, 找了下没有好用的x64的inline框架(太久没搞win = =), 所以直接上frida了, 代码很简单
关键代码:
1 | var addr = 0; |
hook的时机也比较蛋疼, 因为是java带参启动的, 并且在初始化时就会调用, 没法用frida启动时hook…所以我选择了比较麻烦的方式
- x64dbg 文件->改变命令行, 带参载入目标程序, 选项->选项 设置在dll入口断下
- 在目标dll断下后, 找到需要Hook的地址, 在frida代码中修改
- frida指定进程方式注入代码, frida -p [PID] -l dump.js
- 在F9正常跑起来就可以dump出加密的class拉, 后续替换的没尝试, 不过应该重建jar直接load就行了, 不用在通过-agentpath方式启动了
emm… 反正也能看逻辑了… 就这样分析吧 哈哈哈哈