# zkm **Repository Path**: xdnice/zkm ## Basic Information - **Project Name**: zkm - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 10 - **Created**: 2022-02-20 - **Last Updated**: 2022-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zkm #### 介绍 **本代码仅为概念型测试代码,功能简单,不要抱有太大期望。** #### 软件说明 获取class代码,通过asm扫描**指定方法**的运行代码,获取到INVOKEDYNAMIC指令,解析指令用途,是加密字符串还是调用其他方法。 一般可以根据指令的**owner**来区分,具体可以看代码,代码有注释。根据对应类型去解析INVOKEDYNAMIC指令。 解析指令用到了arthas的ognl指令,解密字符串直接是调用内部方法,解析调用方法用到了自己写的一个方法,这个方法放入asm.jar中了。 #### 注意事项 1. ZKM.jar是15.0试用版,未做任何修改的。asm.jar过掉了反调试功能,以及时间限制,作用仅是让zkm可以运行,以便可以用arthas调试,不然过期就自动退出了。自己用于解析方法的TOOl也放到这里了。 2. 只是针对单个方法,而且还需要一个long值,这个long值需要自己拦截,能力厉害的可以破解long值的算法,能自己计算就破解这个限制了。这个long值就是INVOKEDYNAMIC指令前入栈的值。 3. 解密字符串对于"(IJ)Ljava/lang/String;"类型的通用,比如idea中个别包。对于其他变形,还是要自己分析。解析出来的字符串就可以用LDC指令替换INVOKEDYNAMIC指令了。 4. 解析调用方法了自己写的方法,肯定不通用,主要作用是为了区分调用方法类型,以便可以构造字节码指令,替换掉INVOKEDYNAMIC指令。 如果不想再写代码 可以调用(JJ)Ljava/lang/reflect/Field;和(JJ)Ljava/lang/reflect/Method;根据上下文判断是什么操作,是属性的getter、setter还是方法调用, 这个直观看可以分析,但是如果转换为字节码指令就复杂了,不如写段代码返回方便区分了。 5. 这种调式方法最好的地方就是不修改原jar包,不需要修改原jar文件,对于idea等其他zkm混淆的方法也适用。 6. 这只是概念验证代码,对于其他jar还是需要自己分析,没有通用的方法,都需要自己的分析。 #### 使用说明 1. 运行ZKM:`java -javaagent:asm.jar -jar ZKM.jar` 2. 启动arthas,选择zkm进行调试:`java -jar d:\tool\arthas\arthas-boot.jar` 3. 运行analyClass类 `com.zelix.analy.Test` #### 存在问题 1. 已替换对应字符串和方法指令,需大量数据测试稳定性. 2. 未使用代理transform去动态修改是因为方法调用中的long值是调用的时候才得到,不是在类加载的时候 [演示](https://gitee.com/googlewell/zkm/blob/master/file/aotu.gif)