JEB Decompiler中文网站 > 使用教程 > JEB Decompiler控制流图怎么打开 JEB Decompiler条件分支和循环路径怎么看
教程中心分类
JEB Decompiler控制流图怎么打开 JEB Decompiler条件分支和循环路径怎么看
发布时间:2026/11/11 11:21:59

  一个函数有几处分支、哪些判断会提前返回,单看反汇编地址不太容易串起来。JEB Decompiler的控制流图可以把函数内部的代码块和跳转关系放在同一视图里,适合用来整理这类逻辑。图形只是阅读代码的辅助,框的位置、连线的走向,都不能代替指令本身的含义。读图时保留地址,再结合反编译代码核对,分析过程会清楚一些。

  一、JEB Decompiler控制流图怎么打开

 

  控制流图以当前方法或例程为对象。打开图之前,先进入目标代码,确认光标所在的函数,避免切换后看到的是相邻例程。

 

  1、从方法体进入图形视图

 

  JEB默认使用空格键在完整反汇编和当前例程的控制流图之间切换。若正在查看反编译代码,可以先返回底层指令。

 

  ①在【Project Hierarchy】中展开代码单元,找到需要查看的【方法】或【函数】。

 

  ②双击目标,或选中后按【Enter】,进入定义位置。

 

  ③当前显示反编译代码时,按【Tab】返回【反汇编视图】,核对函数名称和地址。

 

  ④点击一条有效指令,按【Space】打开【控制流图】。

 

  ⑤记录关注块的地址,再按【Space】返回反汇编,对照块中的具体指令。

 

  2、切换无效时检查焦点和对象

 

  ①退出【搜索框】或正在输入文字的编辑状态,重新点击【反汇编视图】。

 

  ②选取一个具有实际代码的【方法体】,避开字符串、导入声明和数据区域。

 

  ③核对当前【分析模块】及快捷键设置,确认图形操作是否受到自定义设置影响。

 

  ④换到同一代码单元中结构较短的【函数】,再次按【Space】检查。

 

  代码分析模块不同,可用操作也可能不同。一个没有方法体的声明,无法像普通函数那样显示内部路径。用短函数检查操作,可以区分是视图没有获得焦点,还是目标代码尚未具备可查看的控制流信息。

 

  二、JEB Decompiler条件分支和循环路径怎么看

 

  图中的节点表示基本块,箭头连接可能继续执行的位置。阅读时可以先挑一个关心的判断,把两条去向读清楚,再向前找数据来源、向后找处理结果。

 

  1、条件跳转看指令,不按左右位置判断

 

  ①找到末尾包含【条件跳转指令】的基本块,记录判断对象和目标地址。

 

  ②沿【跳转目标】查看后继代码,记录其中的赋值、调用和返回。

 

  ③查看另一条【后继路径】,确认条件不满足时执行的内容。

 

  ④回到判断之前,查找参与比较的【寄存器】或变量最近在哪里被赋值。

 

  以Dalvik指令if-eqz为例,它表示被检查的值等于零时跳转。至于零代表空引用、布尔假值还是某个返回码,要看这个值从哪里来。目标块放在右侧,也不能直接叫作“失败分支”,更不能凭连线颜色下业务结论。

 

  2、把公共处理与提前结束区分开

 

  两条分支可能在后面汇合,也可能各自返回。判断路径范围时,应该跟到实际的控制转移位置,不能看见两个框靠在一起就认为它们会顺序执行。

 

  ①沿两条【分支路径】向后查看,找出是否存在共同进入的【基本块】。

 

  ②遇到【return】时,记录返回值及其所在路径。

 

  ③遇到异常抛出指令时,检查相关【异常处理路径】,保留无法确认的去向。

 

  ④对【switch】结构逐项核对分支目标,并查看默认处理位置。

  3、循环要连同变量更新一起读

 

  ①沿疑似循环的【后继路径】移动,查找返回已访问基本块的连接。

 

  ②定位【计数器】【指针】或状态变量,记录进入循环前的初始值。

 

  ③检查【循环体】内的更新指令,确认更新发生在条件判断之前还是之后。

 

  ④沿【退出分支】查看后续代码,另行记录提前返回及其他离开循环的位置。

 

  ⑤切换到【反编译视图】,对照循环结构,核对条件、更新和循环体范围。

 

  例如,一个索引从零开始,每次加一,并在达到长度时退出,判断次数仍要看比较与更新的先后顺序。回返箭头可能经过多个块,continue也可能进入更新位置。仅凭“有一条线向上绕回去”,还不足以说明源码采用哪种循环写法。

 

  三、JEB Decompiler读图记录怎样保留才方便复查

 

  读长函数时,不妨围绕一个返回值或一处数据修改分段整理。把确认过的含义写回工程,下次打开时就不用重新猜变量和分支的用途。

 

  1、名称写用途,注释写依据

 

  ①选中用途已经明确的【变量】【字段】或【方法】,按【N】,也可以选择【Action】→【Rename】修改名称。

 

  ②将光标放在有效指令地址,按【/】添加注释,填写判断条件和后继地址。

 

  ③对循环入口、公共返回段等位置设置【Favorites】,按【F12】核对收藏列表。

 

  ④选中影响判断的【字段】或【方法】,按【X】查看交叉引用,追查赋值和调用位置。

 

  ⑤使用【Alt+Left】返回先前位置,继续补充尚未确认的路径。

 

  名称不用一步到位。只确认某个值来自函数返回,就先按返回值记录;确认含义后再改名。注释里写“此值等于零时进入某地址”,比直接写“验证通过”更便于复查,也能避免后面的分析沿用一个未经证实的解释。

 

  2、图与伪代码不一致时回到地址核对

 

  反编译器会整理条件和代码结构,编译后的指令也可能合并多个源码分支。因此,图里的基本块数量不必与伪代码中的语句段落一一对应。

 

  ①在【反编译视图】中选中存在疑问的判断,按【Tab】返回对应指令。

 

  ②核对【条件跳转】及前面的数据计算,记录条件实际使用的值。

 

  ③检查【函数边界】和目标地址,标记当前无法确定的间接跳转去向。

 

  ④把已知输入代入【路径条件】,检查连续判断能否同时成立。

 

  ⑤需要确认实际执行路线时,在支持目标的【调试器】中观察分支前后的数据变化。

 

  静态图说明的是分析得到的连接关系,某条路径在给定输入下是否可达,还要结合程序状态。对于没有识别完整的间接目标,应在记录中留下限制,不能把图上暂时没有显示的路径直接判为不存在。

  总结

 

  控制流图能帮助读者掌握函数结构,具体含义仍藏在指令、变量来源和更新顺序里。使用JEB分析时,能够说清一处判断为何进入、一个循环如何退出,就可以据此继续展开,不必急着给整张图下结论。把地址和证据留下来,也方便同事接着核查。希望这些方法能帮助大家减少来回翻找代码的时间,逐步读清复杂函数的执行逻辑。

176 5129 0128