JDI自动代码审计分析的可能性

Java Debug Interface(JDI)调试多线程应用程序 项目中遇到500多个线程并发执行,并将线程执行所生成的数据插入MySql数据库,按设想,500个线程,数据库中应有序号连续的500条记录。然而,郁闷的是数据库中的记录在第450条左右就开始不连续,部分记录缺失。500多个线程几乎是独立的,它们之间存在的资源竞争已经做好同步了,因此,由于资源而阻塞的情况排除。再者,500个线程间优先级均等同,我中间做了sleep操作,让线程sleep时间与序号成正比 阅读详情

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了
github: https://github.com/kyo-w/router-router

我经常对半自动化代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:

public class TestMain{
public void Testmain(HttpServletRequest req, HttpServletResponse resp){
String id = req.getParameter(“info”);
Runtime.getRuntime().exec(id);
}
}
理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。只有这样,我觉得在配合像Codeql这样的工具时,可以避免很多多余的告警或者没有意义的结果。所以我从去年的漏洞挖掘中已经在做这么一个事情了,当前做这个事情有很多的解决方案:
● 静态分析配置文件: 这个方案很糟糕,比如Filter或者Serlvet的注入是有可能在代码运行中才注入(jersey这样无配置可分析的,将是个无解的方案)
● Java Agent: 技术实在难度大, 难点在怎么增强字节码(类和路由的注册时间不一样的)、项目兼容问题
● JDWP的调试方案: 接口调用简单,难点在对象分析

静态代码分析路由配置文件

以下路由都不在配置文件的范畴:
● Spring的注解路由
● Jersey的注解路由
● @Servlet
● 代码层面的路由修改(动态增加war/动态添加servlet/动态增加Spring路由等等)
可见,效果极差

Java Agent

Java Agent本质是字节码增强,方案比较推荐AOP某个方法:在注册路由和处理类时,加一个记录功能。但是有些坑爹的地方:
● Java Agent开发过程中如果引入了一个依赖包,这个依赖包和生产的依赖包发生冲突怎么办?
● Java Agent版本可能和目标产品的JVM是有不兼容的问题,比如Java Agent编译的版本过高了怎么办?
基于以上两点,我并没有采用。我相信世界这么多产品,你不可能都能完美避免

JDWP

也许经常用IDEA做调试吧,我开始关注起JDI的相关技术了,至少在以下情况,它能做得更好:
● 独立运行,意味着它不存在和产品兼容性绑定的问题
● 独立运行,依赖完全自由控制,甚至在一个SpringBoot项目中存在
● 由于是调试技术,可以不用像静态分析那样做些反编译的工作
花小部分时间学习一些API能解决我的问题,我觉得不算什么

模拟调试

如果做调试的,经常会在目标产品中添加这么一个启动参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
那么作为调试器该如何连接调试端口5005呢?
答案是SocketAttachingConnector

SocketAttachingConnector socketAttachingConnector = new SocketAttachingConnector();
Map<String, Connector.Argument> argumentHashMap = socketAttachingConnector.defaultArguments();
argumentHashMap.get(“hostname”).setValue(“127.0.0.1”);
argumentHashMap.get(“port”).setValue(“5005”);
argumentHashMap.get(“timeout”).setValue(“3000”);
VirtualMachine attach = socketAttachingConnector.attach(argumentHashMap);
在完成上面的代码时,你将获得一个VirtualMachine的对象,这是一个目标JVM的一个引用,此时你可以对目标做以下操作:
● 添加断点
● 搜索目标加载的类/类对象
● 对目标加载的类做一些操作:比如调用Runtime.getRuntime().exec(‘’)(出于安全考虑,工具默认IP限制127.0.0.1)
这里先从以下几个方面分析究竟哪种方式更加有利于分析

添加断点

这是我最开始的想法,但很快得到了痛击,为什么?你要知道,添加断点意味着首先你要等待一个断点调试的事件,我的天啊,这意味着你要发送请求去触发断点。我举个例子:在这里插入图片描述

http://127.0.0.1:8080是一个基于tomcat的java web服务。你发送http://127.0.0.1:8080时,你是一定能触发org.apache.catalina.mapper.Mapper的internalMap方法,因为你一定会触发tomcat寻找路由这一件事情。但是很可惜的是,SpringMvc/Jersey/struts呢?怎么确保能触发他们各自的寻找路由的请求呢?很显然,困难摆在你的面前了。也许你会说我发送一个http://127.0.0.1:8080/spring/api请求不就行了吗?我们再看看以下的示例图吧
在这里插入图片描述

工具太难构造出这样的请求。如果没有正确的token,你根本到不了Spring的路由分析调试点,所以这意味着你的工具要一直处于一个连接调试的状态,把每一个功能点都走完,才算分析完成。这其实是有点失败的,因为这一点都不智能。而且还有一个很大的问题:这种基于断点的调试,在大一点的项目还很容易卡死!(原因很简单,你卡着一个断点然后花了一秒钟的时间做处理,但是你在浏览器访问时,经常会在一个时间发送大量的请求,这意味剩下的断点都卡着等你,一等你,浏览器觉得卡了也会发送尝试的请求过来,导致越来越多的请求)所以在router-router中经常会崩溃。

致命弱点

需要一个调试事件的到来,没有调试事件就无法分析路由
通过JDI调试的断点是只能在一个类中下断点的。注意,当你调试一个父类时,子类触发的方法,父类是跟踪不到的!所以如果目标产品继承了org.springframework.web.servlet.DispatcherServlet,工具就是个摆设。
无法单线程完成一个断点调试事件的分析,必须多线程处理每一个调试事件

目标JVM搜索类与类对象

这是我觉得现今最稳妥的方案了。因为此时工具已经不再等待调试信息了,你可以直接通过JDI接口调用的形式获得某个类对应的所有实例对象:

VirtualMachine attach;
List refs = attach.classesByName(“org.apache.catalina.mapper.Mapper”);
List instances = refs.get(0).instances(0);
此时你就拿到目标JVM所有的org.apache.catalina.mapper.Mapper对象,当然有时候你会获取很多的org.apache.catalina.mapper.Mapper,因为存在对象销毁重新创建的可能。还有那些游离还未被gc处理的对象,你也会在这时刻一起拿到。虽然存在重复分析的可能,但是至少能完美达到我想要的结果。
那么Spring/Jetty/Jersey/Struts/tomcat要分析哪些对象呢?

//spring
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping
org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

//jetty
org.eclipse.jetty.webapp.WebAppContext
org.eclipse.jetty.servlet.ServletContextHandler

//jersey
org.glassfish.jersey.servlet.ServletContainer //1.x
com.sun.jersey.spi.container.servlet.ServletContainer //2.x

//struts
org.apache.struts.config.impl.ModuleConfigImpl //1.x
com.opensymphony.xwork2.config.impl.DefaultConfiguration //2.x

//tomcat
org.apache.catalina.mapper.Mapper // Tomcat8/9
org.apache.tomcat.util.http.mapper.Mapper // Tomcat 6/7

致命弱点

目标搜索的对象,你将失去方法调用的权利,因为JDI在调用方法时是一定要在一个线程环境中运行的,然而通过内存搜索的方式,你是没有设置断点,没有断点事件就意味着你得不到一个线程环境,所以你只能分析对象的结构,无法调用对象的任何方法,这也是为什么Router4.x版本中只有tomcat有version(Tomcat可以不用调用方法获得版本号), 所以在使用IDEA做调试时,如果没有到断点的时候,你压根没法执行表达式的原因。

思考的问题

基本的思路已经确定,我们是不是可以继续延申:

既然断点调试不适用做路由分析,我们可不可以让断点调试做一些监控工作,我们可不可在IO/Runtime.getRuntime()这样的类上下断点,是不是继续扩展了JDI强大的功能?这样我们得到了一个类似于污染点分析工具,这样更加准确地捕捉哪些API会触发IO读写的操作,哪些API会触发命令执行的操作,哪些API会触发SQL查询。
既然能执行方法,我们能不能获取某个类的字节码做一些反编译的工作,这样我们就不用自己dump内存的字节码了
最后,我觉得JDI还是有发挥空间。

Rust+Tauri 调用系统原生能力完全指南:桌面 / Android / iOS / HarmonyOS 本文深入探讨了Tauri框架如何通过Rust内核与系统WebView实现跨平台开发,打通H5与系统能力的交互链路。文章从Tauri的四层架构(前端、WebView、Rust内核、原生层)入手,详细解析了JS与Rust的IPC通信原理,并横向对比了桌面、Android、iOS、HarmonyOS四端的实现差异。核心结论包括:Tauri采用Rust作为唯一系统能力持有者,通过统一IPC通道连接前端与底层;移动端官方支持Android/iOS,鸿蒙需社区扩展;开发者可保持同一套H5代码和Rust业务逻辑,仅通过条 阅读详情

相关推荐

GitHub开源项目日报 · 2026年8月17日 · AI工具主导开源热榜

本期开源热榜几乎被AI项目包揽,覆盖短视频生成、求职自动化、渗透测试、本地模型推理等多个方向。超过一万星的项目有九个,其中MoneyPrinterTurbo用AI一键生成短视频,星数破十万;自托管照片管理工具Immich同样超过十一万星;AI求职助手career-ops、AI渗透测试工具Strix、下载管理器Motrix等也都稳定在五万星以上。增速方面,career-ops以日均476星的成绩领跑,能自动筛选职位并生成定制简历;llmfit可根据硬件推荐可运行的大模型,Anthropic-Cyb

老孙正经胡说 170

JDI自动代码审计分析的可能3

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了我经常对半自动代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。

luoxiayan的博客 119

ios快捷指令进行钉钉打卡

首先 1、打开快捷指令 2、自动化 3、创建个人自动化-特定时间 4、添加操作-搜索“随机数” 5、最小值和最大值填充 6、添加操作-搜索“等待” 7、长按“1秒钟”,选择魔法变量,选择上一步的随机数 6、添加操作-搜索“钉钉” 7、选择钉钉-随便一个聊天窗口。 8、添加操作-搜索“等待”,这次将等待时间设为10秒 9、添加操作 “搜索天气” ,选择显示天气。 注意点: 1、此操作依赖于钉钉极速打卡,只是帮忙唤起钉钉。 2、保存自动化时有个运行前询问,务必关掉。 3、手机不能设

blaze_jack 5万+

JDI自动代码审计分析的可能

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了我经常对半自动代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。

stopys6的博客 180

JDI自动代码审计分析的可能23

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了我经常对半自动代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。

Y7472821的博客 104

JDI自动代码审计分析的可能332424324

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了我经常对半自动代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。

stopluox的博客 104

JDI自动代码审计分析的可能232424

最近更新项目差不多了,感觉项目的大部分问题总算得到一个总体的解决。对象分析真的太要命了我经常对半自动代码审计的工具会有个小小的问点,无论是现今所谓的静态代码分析还是自动化代码分析工具,他们的注重点永远的都是挖掘源代码的漏洞。但是很多情况下会有到这样的问题:理论上来说,这个类一定会被工具分析出来的,但是问题来了,产品的某个API节点会调用TestMain.test方法吗?这显然要打个问号?所以我觉得首先必须要把哪些类才是API节点的入口都统一整理出来。

stopluox的博客 89

JDI Light:下一代UI测试自动化框架

JDI Light:下一代UI测试自动化框架 项目介绍 JDI Light 是 JDI UI 测试自动化框架的全新升级版本,专为现代软件开发团队设计。它不仅继承了前代框架的优点,更在性能、易用性和扩展性方面进行了全面提升。无论您是初学者还是经验丰富的自动化测试工程师,JDI Light 都能为您提供高效、可靠的测试解决方案。 项目技术分析 JDI Light 基于 Java 开发,采用了最新的测试...

gitblog_00325的博客 730

jdi屏幕斜纹_解读手机屏幕的斜纹是什么

最近关于jdi屏幕竖纹的问题越来越厉害。其实我们以前评测的时候,就用显微镜观察到过。最近的就是索尼小米。索尼xz1c我只告诉观众有斜纹,但是没有解释原因,是因为日常一般不影响使用,而且相机拍不出来,拍的是摩尔纹,必须用显微镜才能展示,就说不清楚具体的影响。而且供应链的朋友也不太清楚,估计要找屏幕工艺设计的工程师,这样的核心人物很难接触到。于是我还是用屏幕构成自己分析。液晶屏幕无非是正负液晶,几种贴...

weixin_39907316的博客 1238

把 cc-switch 搬上鸿蒙 PC 的那些天:一个 Tauri 应用的移植笔记

本文记录了将Tauri应用移植到鸿蒙PC的真实过程。作者选取GitHub热门项目cc-switch(12万+星标)作为移植对象,该工具采用Tauri v2架构(React+Rust)。移植面临三大挑战:1)依赖解析冲突需通过patch机制解决;2)交叉编译问题包括openssl、rquickjs等库的适配;3)构建系统细节如Windows环境下的manifest误判。最终方案基于社区OpenHarmony版Tauri fork,通过NAPI桥接+ArkWeb渲染实现。文章特别指出鸿蒙开发需要NDK与完整SD

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 362

Rust 语言完整解读

Rust 是,Mozilla 发起,现在由 Rust 基金会维护,2010 年诞生,近十年崛起,StackOverflow 连续十多年被评为。。

赵星海 370

ESP32-S3 Rust 呼吸灯实战:从编译报错到平滑缓动

本文记录了使用Rust为ESP32-S3开发板实现WS2812呼吸灯功能时遇到的三个关键问题及解决方案。首先,Xtensa架构需配置build-std从源码构建标准库;其次,esp-backtrace的println特性不包含通信通道,需单独指定;最后,esp-println需禁用默认特性避免通道冲突。通过正确配置依赖和工具链(esp-hal 1.0生态),最终用约100行Rust代码实现了6秒周期的红色呼吸灯效果,验证了纯Rust开发ESP32固件的可行性。文章提炼了嵌入式Rust开发的版本对齐要点,并提

2601_96158891的博客 319

Rust 语言的实际应用案例

分为:国际大厂、国内大厂、知名开源项目、浏览器 / Wasm、操作系统内核、区块链、CLI 工具。每个案例写清楚。

赵星海 234

两台电脑传 30GB:macOS 到 Win11,用 Rust + webrpc 怎么走

macOS 与 Win11 用 Rust + webrpc SendFile 传约 30GB:SDK 底层每 10MB 一片,接收端收一片立刻写盘,不必整文件进内存。官网 https://www.webrpc.cn/

So straw? 448

社区版 Dart macros?一个可以解决 JSON 序列化的Fluter “宏编程”第三方包

dart它定位自己叫做 “Dart macros”,,项目提供的本质也只是一个普通 annotation,主要靠的还是外部的 dmx generator。比如比如平时 Flutter 写 mode 大概类似:});​​email;而常见的 Freezed 做法是定义注解,然后@freezed...然后 dmx 的想法就简单粗暴很多,比如下面的注解,你只需要 Ctrl+S,然后它自己就直接生成或者修改user.dart​​});​​email;,没有比如。

恋猫de小郭的博客 228

Project Trust 不是 Sandbox:Pi Agent 的安全边界怎样补齐

文章摘要 本文分析了Pi Agent的安全边界问题,指出Project Trust机制仅控制项目资源加载,而非进程隔离。作者将安全边界拆分为四层:资源加载、动作授权、操作系统隔离和供应链治理,强调任何单层都无法替代其他层的保护作用。文章具体探讨了Permission Gate的局限性、路径保护被绕过的可能性、供应链风险的直接性,以及容器隔离的价值与局限。核心观点是:有效的安全设计需在各层建立独立强制边界,而非依赖单一机制或模型承诺。建议采用最小权限原则,结合运行时检查、操作系统隔离和供应链审查,形成纵深防御

谢谢你的喜欢 我们一起无限进步 462

给 AI Agent 的 Rust 浏览器、4.3M ops/s 的嵌入式 KV 库、Polonius 借用检查器进 nightly

Rust生态本周动态聚焦于基础设施革新与新兴工具涌现。Polonius Alpha借用检查器进入nightly阶段,预计年底稳定,将解决NLL的流敏感问题。新兴工具方面,moli无头浏览器(⭐414)专为AI Agent设计,提供轻量级渲染方案;lkv嵌入式KV库(⭐92)强调读性能优化,实测达430万次查询/秒;cinder(⭐79)作为Cargo加速器采用安全优先策略。生态数据显示基础设施crate下载量持续领先(如hashbrown达5.93亿次),而AI相关工具增长迅猛,反映Rust在底层优化与前沿

ygn12的博客 346

GitHub今日热榜 | 2026-08-19:开源相控阵雷达空降

硬件走 CERN 开源硬件许可,软件走 MIT,作者是摩洛哥一个小工作室,README 里写"从一个小工作间开始,现在有 1.9 万工程师星标"。Apple Silicon 上的 LLM 推理服务器,昨天第 8 今天掉到第 10,但日增星从 78 涨到 370,翻了 4.7 倍。今天空降第二的新面孔,定位是"本地多智能体编排器"——把你在终端里跑的 Claude Code、Codex、Grok 等 CLI 变成一屋子"你的克隆",让一个叫 GOD 的编排者给它们分派任务。

m0_68631449的博客 830

避开STM32中断优先级配置的坑:HAL_NVIC_SetPriority()参数你真的用对了吗?

本文深入解析STM32中断优先级配置中的关键问题,重点剖析HAL_NVIC_SetPriority()函数的正确使用方法。通过实际案例揭示优先级分组设置、抢占优先级与子优先级的区别,提供多中断系统中的优化策略和调试技巧,帮助开发者避免常见配置错误,提升系统稳定性。

weixin_42532938的博客 390

AltiumDesigner ZH1.5封装库 PcbLib文件 含3D

AltiumDesigner制作的ZH1.5封装库,PcbLib文件,含3D

上一篇: Rust免杀 Shellcode加载与混淆4223
下一篇: 23物联网固件逆向工程基础客
学习网络安全的小猿同学
博客等级 码龄3年 3098粉丝 · 117原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值