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

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

    目前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和端口,试试效果吧。

目录
相关文章
|
1天前
|
安全 数据安全/隐私保护 Android开发
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
102 75
|
1月前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
2月前
|
JavaScript C++ 容器
【Azure Bot Service】部署NodeJS ChatBot代码到App Service中无法自动启动
2024-11-12T12:22:40.366223350Z Error: Cannot find module 'dotenv' 2024-11-12T12:40:12.538120729Z Error: Cannot find module 'restify' 2024-11-12T12:48:13.348529900Z Error: Cannot find module 'lodash'
48 11
|
3月前
|
计算机视觉 Python
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
这篇文章是关于如何使用Flask框架结合OpenCV库,通过电脑摄像头实现视频流在网页上的实时显示,并提供了单摄像头和多摄像头的实现方法。
138 2
Flask学习笔记(六):基于Flask的摄像头-web显示代码(可直接使用)
|
2月前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
51 1
|
3月前
|
机器人 Shell Linux
【Azure Bot Service】部署Python ChatBot代码到App Service中
本文介绍了使用Python编写的ChatBot在部署到Azure App Service时遇到的问题及解决方案。主要问题是应用启动失败,错误信息为“Failed to find attribute 'app' in 'app'”。解决步骤包括:1) 修改`app.py`文件,添加`init_func`函数;2) 配置`config.py`,添加与Azure Bot Service认证相关的配置项;3) 设置App Service的启动命令为`python3 -m aiohttp.web -H 0.0.0.0 -P 8000 app:init_func`。
|
4月前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
3月前
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
174 0
|
4月前
|
XML JSON 安全
Web安全-代码注入
Web安全-代码注入
31 6
|
4月前
|
监控 前端开发 Java
Java里的过滤器和拦截器是什么原理,如何选择?
Java里的过滤器和拦截器是什么原理,如何选择?
40 0