miketwais

work up

反编译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目录中。

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

在里面新增: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包的反编译及修改,再次打包的工作。

 

posted @ 2018-08-24 16:26  MasonZhang  阅读(1262)  评论(0)    收藏  举报