JEB Decompiler中文网站 > 新手入门 > JEB Decompiler调用图怎么查看 JEB Decompiler调用图节点过多怎么筛选
教程中心分类
JEB Decompiler调用图怎么查看 JEB Decompiler调用图节点过多怎么筛选
发布时间:2026/07/21 09:28:27

  关于JEB Decompiler的调用图要怎样查看,还有调用图里节点太多了应该怎样筛选,这两个问题在分析APK、DEX或者本地二进制文件的时候是会经常遇到的。调用图比较适合被先用来看看方法之间的大致联系,帮着把入口函数、核心业务方法还有关键调用链给定位出来,不过这个图并不是越完整就越好,项目只要稍微复杂一点,节点和连线的数量就会一下子多出来很多,JEB生成的那个Callgraph本身就是一种被裁剪过的调用关系图,会把一些比较重要的方法和调用重点呈现出来,分析的时候还是要跟反编译代码、交叉引用还有方法命名这些事结合到一块,去一步一步地把范围给缩小。

  一、JEB Decompiler调用图是怎么被查看的

 

  调用图跟单个方法的控制流图不是同一回事,控制流图主要被用来展示一个方法内部的分支和跳转,调用图关注的则是在不同方法之间到底是谁调用了谁,在查看之前,目标代码单元要先被定位到,接着才能用工作区里的调用图区域把关系给生成出来。

 

  1、调用图的生成

 

  文件分析被完成了以后,标准工作区右下角那个叫【Callgraph】的区域是要被查看一下的,调用图在默认的情况下并不会自动生成出来,所以需要去点击一下那片区域,等着JEB根据当前分析出来的结果把图形给建立起来,要是项目的分析还没有被做完,又或者是一部分DEX、SO文件还没有被处理掉,那么图里被显示出来的方法就有可能不全,碰到调用图显得过于简单的时候,要先确认项目树里的目标代码单元是不是已经成功被解析了,而不是在那里反反复复地去缩放图形。

 

  2、目标节点的定位

 

  调用图被生成出来之后,在某个方法的节点上单击一下,这个方法就可以被设成当前正在被关注的对象,它周围的那些连接关系也会被突出显示出来,要是在节点上双击,就可以跳转到对应方法的反汇编代码那里去了,图形支持用反斜杠键重新居中,方括号键也可以被拿来缩放,跳转到代码那边之后,可以按【Tab】去查看反编译的结果,再根据参数、返回值和实际的调用语句,来判断这条边是不是值得继续往下跟,不要只凭着方法的名字就去猜测它的用途,那些被混淆过的名称往往是没有多少直接参考价值的。

 

  3、配合着交叉引用去查看

 

  把光标放到方法、字段或者其他的代码对象上面,按下【X】键,交叉引用就可以被打开来,哪些位置对当前这个对象进行了引用就可以被查看出来,还可以双击其中一项跳到具体的那个调用位置上去,调用图在去看整体方向的时候是比较合适的,交叉引用则更适合被拿来核对具体的调用点,比如一个方法在图里有十几个调用者,就可以先通过交叉引用去把调用位置和引用类型看一看,再决定有哪些分支值得接着往下分析。

 

  二、JEB Decompiler调用图节点太多的时候要怎样筛选

 

  节点变得太多的时候,还在整张图里拖动和放大效率一般是不高的,一种更稳当的做法是先要把业务的入口给确定下来,然后再围着入口函数、敏感的API或者是目标数据一层一层地展开,把那些跟业务没关系的框架和通用的库代码暂时放到一边去。

 

  1、让入口方法被当成中心

 

  对Android项目进行分析的时候,是可以先从Activity、Service、Broadcast Receiver这类组件的生命周期方法开始着手的,就比如【onCreate】【onStartCommand】或者是用来处理广播的方法,目标节点被选中了以后,可以让调用图只把跟这个方法靠近的连接突出出来,之后再沿着那么一两层的调用继续往下去追踪,一开始不要就想着把整个应用的所有方法都看一遍,像登录、支付、网络请求、文件处理还有加解密这些通常都有着比较明确的入口,把问题拆成几条局部的链路比整理一张巨大的全局图要来得更实用一些。

  2、框架和通用调用要首先被排除掉

 

  在遇到了java.*、android.*、常见第三方SDK或者是有大量基础工具的方法的时候,可以先把自己的注意力放到应用自身包名下的类上面去,调用链进到系统API里面之后,通常只需要把它是调用了什么样的能力记录下来,不用把整个框架调用都继续往下展开,要是代码树本身也显得很挤,在【Edit】到【Options】这个前端设置里面,可以调整Code Hierarchy的分组方式,把名字相近的节点归到一个分组里,从类和包的层面去缩小范围就会方便一些。

 

  3、搜索和重命名被结合起来整理

 

  按【Ctrl+Q】组合键可以被用来快速地让搜索区域得到聚焦,类名、方法名、字符串或者一些已经被识别出来的业务关键词都是可以进行查找的,关键方法被找到以后,再回到调用图里去查看它的上游和下游关系,这样做往往比在大量节点里用肉眼去找要来得更快,对于a()、b()、c()这类混淆方法,可以根据它们实际起到的作用去进行重命名,比如改成requestToken、decryptPayload或者saveConfig这样的名字,名称被整理过了以后调用图的可读性就会明显变好,同一条链路也不容易被重复分析。

 

  三、调用图在被筛选完之后还有哪些问题要检查

 

  调用图说到底还只是一种静态分析出来的结果,反射、动态加载、接口派发还有本地方法调用这些东西不一定都能被完整显示出来,图上要是没有连线并不能直接认定那两个功能之间就一点关系都没有。

 

  1、动态调用是要被检查的

 

  假如代码里面用到了反射、invoke-custom、动态代理或者是在运行时加载DEX,普通调用图有可能没办法直接把完整的目标给恢复出来,这种时候就要接着去看看字符串、类名被构造出来的过程,还有反编译代码里的参数来源都是些什么。

 

  2、调用者和被调用者是要被区分开的

 

  分析节点的时候,入边和出边是要分清楚的,调用者数量多说明那个方法有可能是公共入口或者通用工具,被调用的方法数量多则可能处在业务编排层,这两种情况的筛选方向是不一样的,不能一看到连线多就全当成核心逻辑。

 

  3、关键位置上的标记是要做上的

 

  对于已经被确认好的入口、网络请求、校验函数还有用来处理数据的方法,是可以用【Favorites】或者高亮功能把位置留好的,JEB支持收藏代码位置,在交互式的代码视图里面也能够切换行高亮,后面要对着很多个方法来回切换的时候就不用每次都从整张调用图里重新去找目标了。

  总结

 

  关于JEB Decompiler调用图怎么查看,还有调用图节点过多的时候怎么筛选,最关键的还是不要把调用图给当成一张需要一次就看完整的地图,先在【Callgraph】区域把图形生成出来,靠着单击节点聚焦连接、双击节点进入代码,再用【X】查看交叉引用,节点太多的时候就应当围着组件入口、业务包名、敏感API和目标字符串逐步把范围收窄,同时排除掉系统框架和通用库调用,再配合搜索、重命名、收藏与高亮整理之后,复杂的调用关系就会比单纯缩放整张图要更加容易看清楚。

135 2431 0251