利用java代码和web拦截器轻松实现一个app抓包工具

    目前app测试时我们需要对接口数据进行抓包,对于app的抓包,我们可以使用很多现成的工具,比如fiddler、wireshark、charles等,基本上可以满足要求,但是对于一些定制化的需求,比如说:我们需要将抓包的数据进行篡改后再发送到服务器,或者对请求的数据新增标志字段以便定位问题,或者更多需要更改数据的需求,传统抓包工具已经很难实现,需要我们探索新的方式方法。

    我们知道,一般的抓包工具都是使用代理的方式来截取请求,然后以ui的方式展现出来,我们本次也直接使用这种代理的方式来实现抓包,然后对抓取的包进行数据的重组和处理后再发送到原本请求的服务器获取结果返回给app即可。整个流程如下(此流程仅适用于http、https协议):

说明:代理服务器抓取到app到服务器之间的包,进行解包之后,对数据进行处理(更改或者新增)后再次进行数据封包,将封包后的数据发送到原服务器之后将数据返回给app即可,这期间我们在解包之后可以看到数据的具体信息。

   整个系统最核心的内容无疑为代理服务器,甚至有些人对数据的解包和封包和再次发送感觉实现起来很难。如果app的请求为http协议,其实我们可以使用现成的工具,最直接的就是将代理服务器伪装成一个web服务器,app发送给web服务器的数据可以直接被web服务器解包,之后可以使用httpclient再次模拟客户端做封包操作发送给app:

数据拦截:web拦截器

数据解包:servlet(request)

数据处理:自助java类

数据再封包和发送:httpclient

数据的接收:httpclient

数据返回app:servlet(response)

整个流程变为:

下面我们从代码层面来说明整个过程:

1.搭建一个web的服务器环境

2.写一个拦截器

3.代理服务器代码

packagecom.pingan.testcloud.units;

/**

* ClassName:LoginFilter

*

* @Description:过滤器,白名单里所有接口都要先经过此过滤器,白名单请在web.xml中设置

* @author dingjingjing058

* @date 2016年5月13日

*/

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.net.URLDecoder;

importjava.net.URLEncoder;

importjava.util.ArrayList;

importjava.util.Enumeration;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;

importjavax.servlet.Filter;

importjavax.servlet.FilterChain;

importjavax.servlet.FilterConfig;

importjavax.servlet.ServletException;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.HttpSession;

importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

importcom.pingan.testcloud.httphelper.BasicParameter;

import com.pingan.testcloud.httphelper.HttpClientHelper;

importcom.pingan.testcloud.httphelper.ResponseParameter;

public classLoginFilter implements Filter {

publicLogger logger = LoggerFactory.getLogger(this.getClass());

@Override

public void destroy() {

// TODO Auto-generated method stub

}

@SuppressWarnings("rawtypes")

@Override

public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain)

throws IOException,ServletException {

HttpServletRequest request =(HttpServletRequest) req;

HttpServletResponse response =(HttpServletResponse) res;

request.setCharacterEncoding("UTF-8");

//获得用户请求的URI,并进行截取

String url= request.getRequestURI();

String[] path =url.split("/");

// System.out.println(path);

Enumerationenu=request.getParameterNames();

String paraString="";

while(enu.hasMoreElements()){

StringparaName=(String)enu.nextElement();

paraString=paraString+paraName+":"+request.getParameter(paraName)+"";

}

logger.info("用户请求地址为:"+url+"请求参数为:"+paraString);

if(ConfigReader.getWhiteListMap().get(path[path.length-1])==null){//如果不在白名单,则进行如下校验

String method=request.getMethod();

if(method.equals("POST"))

method="post";

elseif(method.equals("GET"))

method="get";

BasicParameter bp1 = newBasicParameter(url,"get","FILTER");

enu=request.getParameterNames();

while(enu.hasMoreElements()){

String paraName=(String)enu.nextElement();

bp1.addParamters(paraName,request.getParameter(paraName));

Enumerationen=request.getHeaderNames();

Map headers=newHashMap();

while(en.hasMoreElements()){

//取出信息名

String name=(String)en.nextElement();

//取出信息值

String value=request.getHeader(name);

headers.put(name, value);

}

bp1.setHeaders(headers);

}

List rps= new ArrayList();

try {

HttpClientHelper client=newHttpClientHelper(request.getServerName(),request.getServerPort(),"http");

client.addHttpRequest(bp1);

rps=client.run();

} catch (Exception e1) {

// TODO Auto-generatedcatch block

e1.printStackTrace();

}

for(Map.Entryen:rps.get(0).getHeaders().entrySet())

{

response.addHeader(en.getKey(),en.getValue());

}

response.setContentType("text/html");

response.setCharacterEncoding("UTF-8");

PrintWriter out =response.getWriter();

out.print(rps.get(0).getRespdata());

out.flush();

out.close();

//response.sendRedirect("./login.html");

//chain.doFilter(request,response);

//已经登陆,继续此次请求

}

else

{

//在白名单里,继续此次请求

chain.doFilter(request,response);

}

}

@Override

public void init(FilterConfig config)throws ServletException {

}

}

注意:

1.代码中使用了httpclient,具体代码封装请参加技术文档。

2.对于解包后的数据操作未做详细讲解,可以参考sevlet技术文档。

最后,对手机设置网络代理,代理指向web服务器的ip和端口,试试效果吧。

时间: 2024-10-31 13:33:25

利用java代码和web拦截器轻松实现一个app抓包工具的相关文章

web应用中利用java代码重启tomcat遇到的问题

问题描述 如题,利用Runtime的exec可以执行cmd命令,来执行tomcat服务器的shutdown和startup批处理,来实现利用java代码实现服务器的重启(关闭与启动),我把shutdown和startup卸载一个bat文件中,然后执行来实现,这样的做法,在普通类的main方法实验中是可以的,但是在web程序中,来调用这个方法,服务器也会重启,但是重启了的服务器,无法访问,也不报错,这个问题很困扰,求大神解决!是不是在服务器的应用下去执行让服务器重启的方法是死循环?还是什么端口被占

可以利用java代码实现图片切割再重组么?

问题描述 可以利用java代码实现图片切割再重组么? 可以利用java代码实现图片切割再重组么?如何实现?求案例讲解或者思路! 解决方案 图片存储 java代码 解决方案二: 不知道JAVA有没有提供相关的类 有一种方法肯定可以,使用图片文件结构,自己编码图片 解决方案三: 图片文件分为头+数据,将文件分为头+数据1,头+数据2,头+数据3...等,之后重组为完整数据

如何通过java代码直接打开自己主机上的一个Excel表格

问题描述 如何通过java代码直接打开自己主机上的一个Excel表格,不是表格中的一些数据而是整个Excel表格都要打开! 解决方案 不知道是不是这个意思,看下面的代码import java.io.*;public class ExecuteCommandBean {private String command;private Process process;private String responseText;private InputStream is;private InputStrea

利用chromium核心浏览器的抓包工具清除恶意代码

中介交易 SEO诊断 淘宝客 云主机 技术大厅 去年大约12月份曾有朋友提醒打开我网站后有广告弹出.因为以前做站曾有首页文件被插入恶意代码的情况发生,所以我特意的打开网站仔细翻看源码中是否有可疑代码,但是无果.我问朋友是不是每次都弹出来呢,朋友说不是每次都有,就是偶尔会有,然后我得出的结论是电信运营商做的dns劫持广告.不久后远在北京的团队伙伴鹏鹏问我为什么打开网站首页有时候会有游戏广告弹出来,这次我确定网站一定被放了恶意代码.再次仔细翻看网页源码,这次终于找到了蛛丝马迹,恶意代码的确存在,但是

利用Java技术开发Web网络课件浅议

随着计算机技术的飞速发展,教育信息化.网络化的进程不断深入,特别是采用TCP/IP协议的Internet/Intranet的不断普及,利用计算机技术和网络技术已成为现代教育的一个重要发展方向,基于网络的教学软件由于在现代教育中可以最大限度地利用教育资源,因而得到迅速的发展. 教学课件是指具有教学功能的计算机软件,在某种程度上能代替或辅助教师实施教学.基于Web的教学软件以Internet/Intranet网络为基础,将教学内容用Web页面来表示,这种教学课件,具有远程教学的开放性.灵活性.交互性

XP下设备管理器中不能是识别USB设备的厂商号,但是用抓包工具可以抓到,问题出现在哪里?

问题描述 具体情况是这样:我用PPC架构下提供的USB从设备功能的处理器,将其配置成大容量存储器,然后接在XP下,能找到设备,但是无法使用,查看设备属性硬件ID中厂商号和设备号都为0,但是用USB抓包工具可以看出设备号和厂商号,请问一下这是怎么回事?是哪部分出了问题?驱动这边?还是XP这边INF文件没弄好?

Java的Struts2框架中拦截器使用的实例教程_java

1.拦截器小介 拦截器的功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制.拦截器是在Struts-core-2.2.3.jar中进行配置的,原始的拦截器是在struts-default.xml中配置的,里面封存了拦截器的基本使用方法. Struts2拦截器功能类似于Servlet过滤器.在Action执行execute方法前,Struts2会首先执行struts.xml中引用的拦截器,如果有多个拦截器则会按照上下顺序依次执行,在执行完所有

Java的Struts框架中Action的编写与拦截器的使用方法_java

Struts2 Action/动作动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能力.首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果.二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回. 创建动作:在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象,必

java MyBatis拦截器Inteceptor详细介绍_java

有许多java初学者对于MyBatis拦截器Inteceptor不是很了解,在这里我来为各位整理下篇关于java中MyBatis拦截器Inteceptor详解, 本文主要分析MyBatis的插件机制,实际就是Java动态代理实现的责任链模式实现. 根据官方文档.Mybatis只允许拦截以下方法,这个决定写拦截器注解签名参数.  代码如下  Executor (update, query, flushStatements, commit, rollback, getTransaction, clo