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

目录
打赏
0
0
0
0
3
分享
相关文章
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
104 1
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
58 6
Java 面试资料中相关代码使用方法与组件封装方法解析
一行代码搞定禁用 web 开发者工具
在如今的互联网时代,网页源码的保护显得尤为重要,特别是前端代码,几乎就是明文展示,很容易造成源码泄露,黑客和恶意用户往往会利用浏览器的开发者工具来窃取网站的敏感信息。为了有效防止用户打开浏览器的 Web 开发者工具面板,今天推荐一个不错的 npm 库,可以帮助开发者更好地保护自己的网站源码,本文将介绍该库的功能和使用方法。 功能介绍 npm 库名称:disable-devtool,github 路径:/theajack/disable-devtool。从 f12 按钮,右键单击和浏览器菜单都可以禁用 Web 开发工具。 🚀 一行代码搞定禁用 web 开发者工具 该库有以下特性: • 支持可配
106 22
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
56 0
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
4月前
|
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
156 5
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
232 0
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
java WebService CXF Spring 自定义拦截器 附实例源码
263 0
java WebService CXF Spring 自定义拦截器 附实例源码
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问