利用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月前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
76 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
6天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
144 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
1月前
|
人工智能 前端开发 API
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Gemini Coder 是一款基于 Google Gemini API 的 AI 应用生成工具,支持通过文本描述快速生成代码,并提供实时代码编辑和预览功能,简化开发流程。
139 38
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
|
1月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
239 11
|
2月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
265 17
Selenium:强大的 Web 自动化测试工具
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
97 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
74 3
|
2月前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
78 2
|
2月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
137 5

热门文章

最新文章

  • 1
    MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    微信小程序 app.json 配置文件解析与应用
  • 4
    【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
  • 5
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    【Azure Function】Function App出现System.IO.FileNotFoundException异常
  • 7
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
  • 8
    【Azure Logic App】使用MySQL 新增行触发器遇见错误 :“Unknown column 'created_at' in 'order clause'”
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 10
    阿里云APP备案流程图以及备案所需材料整理,跟着教程一步步操作