反编译jar包,自定义修改后使用
们可能都会遇到这种情况:java工程中需要使用某个jar包,而且需要对其中的某个功能进行修改,或者重写某个方法。
面对这样的问题需要我们:
1.反编译jar包,得到java源代码。
2.修改,添加新代码。
3.将修改的java文件编译成class文件,然后再次打包成jar包,引用。
看一个实际应用的例子吧:
某司老系统安全检查发现,系统的struts2受到安全威胁,需要修补S2-016、S2-017漏洞。
网上有解决方案:
方案介绍:
  重写struts2 DefaultActionMapper的handleSpecialParameters方法,增加action、redirect、redirectAction等参数的过滤。此方法可修补S2-016、S2-017漏洞。
  操作步骤:
    2.1 新建com/website/struts2/MyDefaultActionMapper.java,代码如下:
    2.2 复制MyDefaultActionMapper.class 到 /com/website/struts2/目录。
    2.3 用struts.xml添加如下代码:
    2.4 重启服务器。
----------------------接下来我们开始实施-------------------------
解决方法:
1.使用jd-gui反编译工具,得到struts2-core-2.1.8.1.jar的源码。

file->save all resources,将源码保存到桌面上。

2.在myeclipse新建java工程取名为testPro
将上面 org文件夹拷贝到src目录中。
org文件夹拷贝到src目录中。

接下来,我们修改,添加代码:

在里面新增:MyDefaultActionMapper.java
package org.apache.struts2.dispatcher.mapper; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.config.Configuration; import com.opensymphony.xwork2.config.ConfigurationManager; import com.opensymphony.xwork2.config.entities.PackageConfig; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.RequestUtils; import org.apache.struts2.util.PrefixTrie; public class MyDefaultActionMapper extends DefaultActionMapper { public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) { Set uniqueParameters = new HashSet(); Map parameterMap = request.getParameterMap(); //for (Iterator iterator = parameterMap.keySet().iterator(); iterator.hasNext();) { for (Object o : parameterMap.keySet()) { //String key = (String) iterator.next(); String key = (String)o; if ((key.endsWith(".x")) || (key.endsWith(".y"))) { key = key.substring(0, key.length() - 2); } if ((key.contains("redirect:")) || (key.contains("redirectAction:")) || (key.contains("action:"))) { return; } if (!uniqueParameters.contains(key)) { ParameterAction parameterAction = (ParameterAction) this.prefixTrie.get(key); if (parameterAction != null) { parameterAction.execute(key, mapping); uniqueParameters.add(key); break; } } } } }
新增代码后发现一线飘红,接下来我们就给项目添加缺少的jar包(可以加在lib文件夹下,然后在Configure Build Path中引入),让代码不报错(不飘红),最终效果(不能有一个错,否则编译通过不了):

3.在myeclipse中编译项目,生成相应的class文件,然后添加到jar包中。
右键项目名->Build Project,然后在myeclipse的Workspaces中找到相应class文件:

用WinRAR打开struts2-core-2.1.8.1.jar包,找到相应目录:

然后将上面找到的MyDefaultActionMapper.class文件拖进去,生成新的jar包,引入到系统中即可。
至此为止,完成了对jar包的反编译及修改,再次打包的工作。


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号