在JEB里找到保存文件的方法后,接下来往往要追问:谁传入了文件名,数据在哪里处理过,又是什么操作触发了保存?只读方法体,很难回答这些问题。JEB Decompiler怎么查看方法调用链JEB Decompiler调用关系显示不完整如何排查,可以围绕具体业务路径展开。以下以Android APK为例,结合交叉引用、调用图和字节码逐段核对。
一、JEB Decompiler怎么查看方法调用链
从已经确认的方法出发,沿着参数和返回值推进,不容易被无关分支带走。向上找调用者、向下查看处理过程,可以交替进行。
1、从目标方法寻找调用者
①打开APK,等待解析完成,在代码视图定位目标方法,检查所属类、参数和返回类型。
②把光标放在方法名上,按X打开交叉引用,双击一条记录进入引用位置。
③核对调用语句及传入参数,再定位当前调用者的方法名,继续按X寻找上一层。
④返回时按Alt+左方向键,或通过【Navigation】菜单回到此前位置。
假设保存方法接收字节数组,上一层负责压缩,再上一层负责读取内容,逐层记录这些用途,比只抄下方法名更便于理解数据的处理过程。
2、沿方法内部继续向下看
要找某个返回值在哪里生成,可以从当前方法进入被调用方法,追踪它依赖的数据。
①选中调用语句中的方法名,按Enter进入定义,核对参数与返回值。
②回到调用者,检查返回值参与了哪个判断、赋值或后续调用。
③辨认执行条件时,在反汇编视图按空格查看控制流图,找到调用所在的分支。
3、用调用图辅助定位
①在默认工作区找到【Callgraph】区域,点击生成调用图。
②单击节点查看相关连接,双击节点跳转到反汇编位置,再用X核对引用。
Callgraph显示经过裁剪的调用关系,适合辅助导航。控制流图描述一个方法内部的分支,两种图不能当作同一份结果使用。
二、JEB Decompiler调用关系显示不完整如何排查
路径中断时,先回到最后一处已确认的指令。它指向普通方法、接口、反射API还是native方法,会决定接下来查哪里。
1、只有调用图缺少连接
①从【Callgraph】返回代码视图,对目标方法按X,检查交叉引用是否存在。
②双击引用记录,核对实际调用指令中的类名、方法名和签名。
图中没画出的边,如果能在字节码里找到,就按已确认的引用继续分析。缩放图形不能让裁剪图成为完整的执行路径。
2、目标实现不在已导入文件中
①检查输入的是完整APK还是单个DEX,核对其他DEX中是否包含目标类。
②重新打开完整APK时,在处理选项中检查【Merge multi-dex】,确认多DEX合并设置。
③检查应用是否还有拆分安装包、插件或动态下载的模块,取得相关代码后再查找实现。
④搜索目标类完整名称,区分只有外部方法声明,还是确实存在方法体。
合并功能不会补齐未提供的模块。代码不在当前分析范围内时,空引用列表也不能说明整个应用没有调用它。
3、调用停在接口、回调或反射入口
接口调用与运行时对象有关,回调又可能由框架触发,未必存在从业务入口到实现方法的一串直接调用。
①在类名或接口名上按H查看类型层级,在相关方法上按O查看重写关系。
②返回调用位置,追查对象的创建和赋值,缩小可能执行的实现范围。
③分析回调时,查找监听器注册位置与回调实现,分别记录注册关系和直接调用。
④遇到反射时,追踪类名、方法名字符串及参数类型,保留无法确定的取值。
⑤遇到native方法时,转向对应SO,核对JNI关联和本地实现。
一个接口存在多个实现时,重写列表只能提供候选项。结合对象来源或运行记录,才能确认某次操作进入了哪个方法。
4、反编译代码省略了中间层
①在反编译视图右键打开【Rendering Options】,勾选【Generate synthetic methods】。
②涉及合成字段时,勾选【Generate synthetic fields】,查看代码呈现是否变化。
③对照反汇编中的调用指令,检查中间访问器等内容是否被整理为简化表达。
显示选项影响代码呈现,不会恢复缺失模块。反编译结果存在疑问时,可以回到字节码逐项核对。
三、JEB Decompiler如何继续追踪中断的调用路径
沿着引用追到接口、反射或异步任务时,代码中的直接调用可能暂时接不上。此时可以保留当前位置,围绕对象来源和触发动作继续查找。
1、给断开的位置留下线索
①在调用位置按斜杠添加注释,记录当前已知的参数、对象来源,以及下一步需要确认的目标。
②对已经读懂的方法,点击【Action】→【Rename】,设置便于辨认的名称,同时在记录中保留原始签名或地址。
混淆代码中相似的方法名较多,隔一段时间回来,很容易忘记当时追到了哪里。注释可以直接写“接收压缩后的数据,文件名来自上一层”,比只标记“保存相关”更方便继续分析。
2、围绕具体动作检查运行情况
静态分析得到几个候选实现后,可以选一个明确操作进行验证,例如点击保存按钮,观察程序是否进入预想的方法。
①在具备调试条件的测试环境中连接应用,在候选方法入口设置断点。
②执行选定操作,断点命中后检查参数、接收对象的实际类型和当前线程栈帧。
③将观察结果补充到原有注释中,注明应用版本、测试输入及触发方式。
④如果没有命中,检查操作是否触发了对应业务,再更换条件测试其他候选位置。
3、遇到异步回调时回查注册位置
①从回调实现返回相关代码,查找监听器注册、任务提交或消息发送的位置。
②将任务携带的数据与回调收到的参数对照,记录两端的关联依据。
异步任务开始执行时,提交任务的方法可能已经退出,当前线程栈中未必还能看到它。这种情况下,注册位置、任务对象和传递数据可以帮助补充业务路径,但应与直接调用分别记录。
总结
处理JEB Decompiler怎么查看方法调用链JEB Decompiler调用关系显示不完整如何排查,往往需要在几处代码之间反复核对。图中的连线能帮助定位,参数和对象来源则能解释这些方法为什么联系在一起。遇到暂时无法确定的目标,留下疑点和已有证据,之后取得新模块或运行记录时,就能接着往下查。希望这些内容能帮助大家减少重复翻找,让调用链分析更顺手,也让整理出的结果经得起复查。如果有JEB Decompiler相关需求,欢迎联系我们咨询。
