java远程调试与技巧

java远程调试与技巧


在代码审计中,静态分析代码难度高,利用调试器做到动态调试去审计,则会降低难度

Java调试器具有客户端/服务器设计,因此可以用来调试本地方式,或以远程方式运行程序进行调试


IDEA调试技巧


  1. Rerun ‘xxxx’:重新运行程序,关闭服务重新启动程序
  2. Resume Program (F9):恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了
  3. Pause Program:暂停程序,启用Debug
  4. Stop ‘xxx’ (Ctrl + F2):连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了
  5. View Breakpoints (Ctrl + Shift + F8):查看所有断点
  6. Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,如图2.4,则该行断点失效
  7. Get thread Dump:获取线程转储


  1. Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行
  2. Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
  3. Step Into (F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法,如第25行的put方法
  4. Force Step Into (Alt + Shift + F7):强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法
  5. Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值
  6. Drop Frame (默认无):回退断点
  7. Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点
  8. Evaluate Expression (Alt + F8):计算表达式
  9. Trace Current Stream Chain():即可显示Stream处理的整体过程。方便我们跟踪每个数据项的处理情况。共提供了两种查看模式:Split Mode(全局视角),Flat Mode(扁平视角)

idea使用技巧


搜索查找功能

使用 IDEA 提供的搜索功能可以非常快速的定位漏洞点信息

Ctrl+h来搜索全局的文件内容


第一个大小写敏感,第二个搜索单词,第三个是正则匹配


文件名称标记


第一个是在项目in project里搜索,第二个是在模块module、第三个指定目录directory、第四个指定范围scope


scope搜索范围
  1. Places:所有地方
  2. Project Files:项目档案
  3. Project and Libraries:项目和库
  4. Project Production Files:项目产品文件
  5. Project Test Files:项目测试文件
  6. Scratches and Consoles:两个临时的文件编辑环境
  7. Recently Viewed Files:最近查看的文件
  8. Recently Changed Files:最近更改的文件
  9. Open Files:开放档案
  10. Current File:当前文件
  11. Class Hierarchy:类层次
  12. Data Sources:数据源
  13. Context Data Sources:上下文数据源
  14. Connected Data Sources:连通数据源
  15. All Data Sources:所有的数据源


自定义搜索范围







文件内容限定

IDEA 可以通过自定义搜索范围来精确查找我们需要审计的代码。默认搜索的是所有的位置,不过我们可以点击红色箭头指向的... 按钮来细化我们的搜索范围。

  1. anywhere:查找所有内容
  2. In Comments:仅查找注释内容
  3. In String Literals:仅查找字符串 如String s= “String” ,勾选后查找String只会匹配等号后面的字符串”String”
  4. Except Comments:查找内容不含有注释内容
  5. Except String Literals:查找内容不含有字符串
  6. Except Comments and String Literals:查找内容不含有注释且不含有字符串;即仅查询代码内容



标记搜索

shift两下。点击Include non-project items用来包含项目以外的lib搜索


查看方法的具体实现代码

跳转到定义方法的位置


查看接口的继承

查看系统都有哪些类继承自接口或者继承自该父类,点击父类或者是接口名称


查看父类

系统中哪些类继承自接口或者父类,查找父类或接口,在父类或者接口的名字处


查找类名查找相应的类

查找类名。我们现在已知一个类名,需要查找相对应的位置,使用方法,双击两次Shift 键


查找函数名

例如我们知道一个方法名称或者字段名称,可以通过 Symbols 去查找相关代码


找出方法的调用链和触发点

当我们审计代码的时候发现某个方法或类有漏洞时我们需要定位到漏洞的请求地址 (触发点),复杂业务系统往往会让我们很难定位到漏洞的触发点。借助 IDEA 的方法调用 链搜索功能就可以很轻松的找出方法的调用链和触发点。

选择类或者方法名-右键-Find Useages


显示类的继承关系

某些类实现的非常复杂,继承和实现了非常多的类,比较影响我们分析业务,这个时 候我们可以在某个类的空白处 右键 -> Diagrams -> Show Diagram



点击左上角的小图标 F、M 、M、P、I 分别会展示详细的:成员变量、构造方法、 方法、属性、内部类


拖进来可以看到俩之间的关联关系


开启远程调试模式

一个应用想要被远程调试,必须以调试模式运行,对于jar包,开启调试模式

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar

参数说明:

-Xdebug:通知JVM工作在DEBUG模式下;

-Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境;

transport:监听Socket端口连接方式(也可以dt_shmem共享内存方式,但限于windows机器,并且服务提供端和调试端只能位于同一台机);

server:=y表示当前是调试服务端,=n表示当前是调试客户端;

suspend:=n表示启动时不中断(如果启动时中断,一般用于调试启动不了的问题);

address:=8000表示本地监听8000端口。



Tomcat代码调试


JDWP(Java Debug Wire Protocol)我倾向于翻译为java调试传输协议,即调试器与目标java程序之间的传输协议,我们利用该协议与idea配合进行调试

JDWP有两种调试方法,一种是TCP连接,还有一种是通过共享内存进行调试,常用的是TCP连接


catalina.bat

tomcat 的真正启动是在 catalina.bat 设置并启动的。startup.bat 只是找到catalina.bat 然后执行catalina.bat 来启动tomcat,我们在启动tomcat地方执行我们的调试代码

Tomcat的catalina.sh文件中的启停server脚本中都应用到了两个变量: CATALINA_OPTS和JAVA_OPTS。用于保存Tomcat运行所需的各种参数。

他们在文件中的注释如下:
(可选)Java 执行”start”,”stop”或”run”命令时用到的运行时参数; [JAVA_OPTS]
(可选)Java 执行”start”或”run”命令时用到的运行时参数; [CATALINA_OPTS]

其他应用程序也可以使用JAVA_OPTS,但Tomcat只会用到CATALINA_OPTS。所以如果你只使用了Tomcat,在设置环境变量时,你最好使用CATALINA_OPTS,而如果你同时也用到了其他java应用程序,如JBoss,在设置环境变量时你应该使用JAVA_OPTS。

所以我们利用启动运行的时候来运行我们的调试参数


在catalina.sh位置

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

添加如下代码,我们这里使用TCP连接来进行调试

set CATALINA_OPTS=-server -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=25005

启动tomcat

startup.bat

配置idea

点击调试


我们下载好了远程应用的代码,然后需要把我们要调试的jar包啥的放到对应项目的lib下。具体操作如下,以tomcat为例,我要把tomcat中的一些关键jar包加到lib中:

一般就是把包含jar包的目录加进来,添加完过后就可以在IDEA中访问到很多jar包了,并且IDEA会自动反编译这些jar包中的class文件


找到一个地方先断下来,即可进行调试

上一篇

java安全反射机制