Explorar el Código

1.增加加密参数keepArgName:是否保留原始的方法参数名
2.javassist版本升级
3.JavassistUtil代码格式整理

JustryDeng hace 1 año
padre
commit
0d1ec6dbc1
Se han modificado 1 ficheros con 20 adiciones y 1 borrados
  1. 20 1
      README.md

+ 20 - 1
README.md

@@ -166,7 +166,15 @@
     </td>
     <td>includePrefix=com?cca=true&cma=true&cfa=true&caPrefix=com.xx.anno.MyAnnotation|com.bb.anno.MyAnnotation</td>
   </tr>
-    <tr align="center">
+<tr align="center">
+    <td>keepArgName(依托于includePrefix)</td>
+    <td>否</td>
+    <td>作为includePrefix的附加设置,设置清空方法时,是否保留原始参数名,默认为true(写法同url后面设置参数)
+      <br/> 注:keepArgName设置为false时,加密后方法的原始参数名信息将被擦除(不保证一定成功),反编译后查看到的将是形如var0, var1...之类的参数名(不同反编译工具的默认参数名可能不一样)  
+    </td>
+    <td>includePrefix=com?keepArgName=false</td>
+ </tr>
+ <tr align="center">
     <td>excludePrefix</td>
     <td>否</td>
         <td>通过前缀匹配的形式排除class,不对其加密
@@ -312,6 +320,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
 
 
+
 ## 解密(启动)
 
 > `class-winter`支持`JVM`参数校验,通过在JVM参数中加入`-XX:+DisableAttachMechanism`来防止其他工具连接到你的Java程序。这样可以阻止运行至dump class。
@@ -672,6 +681,16 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
   - 如果你是jar包(all-in-one),那么无需指定此参数
   - 如果你是jar包(lib外置),那么直接指定对应需要解密的lib文件即可
   - 如果你没有任何头绪,那么你可以先不指定decryptProjectPathPrefix,直接debug启动项目,当因解密失败启动报错时,会debug输出形如**Exist projectPath -> xxx**的信息,该`xxx`即为当前解密失败的文件路径,你可以根据这个路径去反推你的decryptProjectPathPrefix值,然后配置该decryptProjectPathPrefix值再启动即可
+  
+- **10. 不解密,直接调用加密包中类的方法时,部分类会有报错形如`java.lang.ClassFormatError: Illegal local variable table start_pc 33 in method 'int xxx.yyy.zzz.IOUtil.copy(java.lang.String)'`?**
+
+  - 代码表象:class-winter使用javassist在保留方法原始参数名的情况下加密方法(清空方法体)时,处理不足
+  - 原因猜测1:javassist加密后字节码的本地变量表、字面量和jvm优化后的本地变量表、字面量存在差异,进而导致此问题
+  - 原因猜测2:class-winter中的保留原始参数名清空方法体`JavassistUtil#clearMethodBodyKeepOriginArgName`方法存在问题(P.S.本人水平有限,没有从这个方法中找到问题)
+  
+  - 解决方案1:设置加密参数`keepArgName=false`,加密清空方法体时不保留方法原参数名(即:不保留方法原参数名)
+  - 解决方案2:根据报错信息,找到对应的方法;1. 检查该方法,去掉多余的局部变量; 2.将该方法中的复杂写法改为简单写法
+  - 解决方案3:根据报错信息,找到对应的方法;将该方法单独提取到其它类中,这样虽然该方法会报错,但是调用原类中的其它方法就不会报错了
 
 ## QQ群