0 目录
1 简易开发环境
2 Hello world(GUI)
3 Hello world(CMD)
4 访问DEX内容
5 访问DEX反编译内容
6 访问JAVA语法树内容
7 访问Native反汇编内容
8 访问Native语法树内容9 其他常用操作
(1)DEX交叉引用查询
(2)Native调用查询
(3)Native交叉引用查询
(4)Native地址所属查询
(5)内容搜索
(6)访问xml
(7)异步任务
(8)操作ADB
(9)接收用户输入
(10)列表框
(11)为某一脚本绑定快捷键
(12)NativeIR中间码
(13)反混淆/字节串解密用例
(14)脚本中使用三方JAR包
1 简易开发环境
(1)安装IDEA
(2)在IDEA中插件市场搜索Python插件并安装
https://plugins.jetbrains.com/plugin/631-python
(3)在Jython官网下载Jython并安装
https://www.jython.org/download
(4)打开IDEA创建简单一个Java工程,并勾选python模块
将安装的Jython设置为该工程解释器路径
将’Jeb根目录\bin\app\’下的jeb.jar文件拷贝到工程中,并右键设置将该jar设置为库
最后在工程src中创建一个hello.py文件,开始 编写代码
2 Hello world(GUI)
参考如图所示格式,run函数为执行入口,这里注意py的文件名和类名要一致,像图中都为”hello”,
然后在JEB中通过”脚本-执行脚本”,执行hello.py文件
输出会出现在JEB的日志窗口中
3 Hello world(CMD)
也可以脱离图形界面,使用终端执行py脚本
java -jar “jeb根目录\bin\app\jeb.jar” —srv2 —script=hello.py
(可在脚本中通过ctx.open(path)载入一个apk文件)
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/SampleScript.py
4 访问DEX内容
常见操作
DEX字节码层面操作,关注IDexUnit部件,常见操作如:
- (1)访问DEX与Class
https://github.com/acbocai/jeb_script/blob/main/samples/11%20IDexUnit-DEX%20Class.py - (2)遍历Field / Method
https://github.com/acbocai/jeb_script/blob/main/samples/12%20IDexUnit-Field%20Method%20.py - (3)访问某个Method
https://github.com/acbocai/jeb_script/blob/main/samples/13%20IDexUnit-SingleMethod.py - (4)访问指令
https://github.com/acbocai/jeb_script/blob/main/samples/14%20IDexUnit-Insn.py - (5)访问基本块
https://github.com/acbocai/jeb_script/blob/main/samples/15%20IDexUnit-BasicBlock.py - (6)访问控制流数据流
https://github.com/acbocai/jeb_script/blob/main/samples/16%20IDexUnit-CFG.py
总结JEB脚本中的DEX访问
如果了解DEX结构,应该不会对class_def_item / code_item等感到陌生,JEB对这些结构进行了抽象,每个结构都可以在定义中找到对应的类.
具体看一下com.pnfsoftware.jeb.core.units.code.android.dex包的文档,它们都在这里.
其中有一部分实现了IDexItem ICodeItem接口,如IDexClass和IDexMethod,这个接口的含义后面再说.
需要特别关注的是IDexCodeItem,指令相关内容(CFG/BLOCK等),都在IDexCodeItem这个类中.
JEB对编程概念的抽象(ICodeItem)
常见编程语言中必不可少的概念,如class method field package call等概念.
JEB中通过ICodeItem这个顶层接口来概括他们(DEX层面为IDexItem),像类对应的IDexClass,方法对应的IDexMethod,都直接或间接implements了ICodeItem和IDexItem接口
总结几个常用的类
DEX类———————IDexClass
DEX方法——————IDexMethod
方法指令序列————-IDexCodeItem
指令————————IDalvikInstruction
基本块———————BasicBlock
控制流———————CFG
5 访问DEX反编译内容
DEX反编译层面操作,关注IDexDecompilerUnit部件
反编译一个Class
参考:
https://github.com/acbocai/jeb_script/blob/main/samples/21%20IDexDecompilerUnit-decompile.py
如何获取IDexDecompilerUnit?
若要获取Class反编译后内容(像IDA的F5),仅使用IDexUnit不够啦,还需要获取IDexDecompilerUnit部件.
如何获取IDexDecompilerUnit?
一般通过DecompilerHelper类,给它传入一个IDexUnit作为输入,得到对应的IDexDecompilerUnit实例.
对类/方法/属性执行反编译
IDecompilerUnit的API很容易理解,执行反编译的目标可以是整个文件,也可以是某个class method等,如:
decompile()
decompileAllClasses()
decompileAllMethods()
decompileClass()
decompileMethod()
decompileField()
参考:
之后通过getDecompiled*Text(),获取到反编译后的源代码(String文本).
个性化配置
在反编译前,还可以通过DecompilationOptions和DecompilationContext等,进行一些配置.
6 访问JAVA语法树内容
常见操作
- (1)遍历某Method所有AST元素
https://github.com/acbocai/jeb_script/blob/main/samples/31%20IJavaSourceUnit-DisplayAstTree.py - (2)解析if…else元素
https://github.com/acbocai/jeb_script/blob/main/samples/32%20IJavaSourceUnit-IJavaIf.py - (3)解析call元素
https://github.com/acbocai/jeb_script/blob/main/samples/33%20IJavaSourceUnit-IJavaCall.py - (4)解析try元素
https://github.com/acbocai/jeb_script/blob/main/samples/34%20IJavaSourceUnit-IJavaTry.py - (5)解析for元素
https://github.com/acbocai/jeb_script/blob/main/samples/35%20IJavaSourceUnit-IJavaFor.py
访问JAVA语法树
如果打算访问DEX中方法对应的AST内容,需要关注IJavaSourceUnit部件.
通过它可以拿到某个CLASS的AST(IJavaClass),接着访问Class内的其他内容.
访问JAVA语法树元素
如果访问某个具体的AST元素,要进一步关注IJavaElement,IJavaElement是对AST元素的顶层抽象,每个AST元素都是一个IJavaElement.
比如IJavaClass/IJavaIf/IJavaFor/IJavaNew,这些元素都实现了IJavaElement接口.
获得IJavaSourceUnit或者IJavaElement
需要先执行反编译的步骤,参考这几个API
ISourceUnit IDecompilerUnit.decompile(…)
IJavaClass IDexDecompilerUnit.getClass(sign)
IJavaClass IJavaSourceUnit.getClassElement()
IJavaElement的层次关系
元素细分成表达式/语句等,语句又分复合语句/终结语句,比如for和if是复合语句,return和throw是终结语句,具体关注com.pnfsoftware.jeb.core.units.code.java包的文档.
参考:
用一张图表达它们的层次关系:
总结几个Unit的层次关系
DEX方面
字节码层面 IDexUnit
反编译层面 IDexDecompilerUnit
语法树层面 IJavaSourceUnit
Native方面类似,可参考DEX,层次和过程是类似的.
字节码层面 INativeCodeUnit
反编译层面 INativeDecompilerUnit
语法树层面 INativeSourceUnit
参考:
https://www.pnfsoftware.com/jeb/apidoc/reference/com/pnfsoftware/jeb/core/units/package-summary.html
7 访问Native反汇编内容
常见操作
原生库反汇编层面操作,关注INativeCodeUnit部件,常见操作如:
- (1)遍历函数
https://github.com/acbocai/jeb_script/blob/main/samples/41%20INativeCodeUnit-Function.py - (2)访问指令
https://github.com/acbocai/jeb_script/blob/main/samples/42%20INativeCodeUnit-Insn.py - (3)访问基本块
https://github.com/acbocai/jeb_script/blob/main/samples/43%20INativeCodeUnit-BasicBlock.py - (4)访问控制流
https://github.com/acbocai/jeb_script/blob/main/samples/44%20INativeCodeUnit-CFG.py
8 访问Native语法树内容
常见操作
过程和DEX类似,IJavaSourceUnit换成了INativeSourceUnit.
IJavaElement换成了ICElement.
- (1)遍历某函数所有AST元素
https://github.com/acbocai/jeb_script/blob/main/samples/51%20INativeSourceUnit-DisplayAstTree.py - (2)解析if…else元素
https://github.com/acbocai/jeb_script/blob/main/samples/52%20INativeSourceUnit-ICIfStm.py
ICElement的层次关系
具体关注com.pnfsoftware.jeb.core.units.code.asm.decompiler.ast包的文档.
参考:
9 其他常用操作
(1)DEX交叉引用查询
查询DEX中方法的交叉引用信息,使用ActionXrefsData和ActionContext
https://github.com/acbocai/jeb_script/blob/main/samples/61%20Dex-QUERY_XREFS.py
(2)Native调用查询
查询一个函数被谁调用了,或查询它内部调用了谁,关注:
INativeCodeAnalyzer
INativeCodeModel
ICallGraphManager
ICallGraph
https://github.com/acbocai/jeb_script/blob/main/samples/62%20Native-Callees%20Callers.py
(3)Native交叉引用查询
查询一个Function的交叉引用情况 或查询一个Block入口指令的引用交叉引用情况
INativeCodeAnalyzer
INativeCodeModel
IReferenceManager
IReference
https://github.com/acbocai/jeb_script/blob/main/samples/63%20Native-CrossReference.py
(4)Native地址所属查询
获取一条指令的地址,所属Function或Block.
https://github.com/acbocai/jeb_script/blob/main/samples/64%20Native-Contain.py
(5)内容搜索
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/SearchAll.py
(6)访问XML
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/ApkManifestView.py
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/AndroidXrefResId.py
(7)异步任务
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/AsyncTask.py
(8)操作ADB
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/AdbDemo.py
(9)接收用户输入
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/RequestUserInput.py
(10)列表框
参考:
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/WidgetList.py
通过输入对话框和列表框,实现书签列表
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/BookmarkSet.py
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/BookmarkList.py
(11)为某一脚本绑定快捷键
在脚本文件首行添加#?shortcut=Mod1+Mod3+?
可在GUI中通过该组合快捷键触发脚本的执行,其中Mod1代表CTRL,Mod3代表ALT
参考官方用例:
(12)NativeIR中间码
除了代码的语法树形态以外,Jeb还支持一种中间码的形态,IEStatement
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/PrintNativeRoutineIR.py
(13)反混淆/字节串解密用例
参考官方用例:
https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/analysis/TriadaStringDecryptor.py
(14)脚本中使用三方JAR包
Jython可以理解为通过Python语法来调用Java类和方法,所以在某些场景如果不满足于JEB官方文档中提供的API,可使用反射等手段加载其他jar包,增强解析能力.
(另外也可通过Jython pip扩展python类)
例如在Jeb中使用soot flowDroid类库
参考文档:
Scripting for Android Reversing
https://www.pnfsoftware.com/jeb/manual/dev/android-scripting/
pnfsoftware/jeb2-samplecode/scripts/
https://github.com/pnfsoftware/jeb2-samplecode/tree/master/scripts
JEB API Documentation
https://www.pnfsoftware.com/jeb/apidoc/reference/packages.html
Author: acbc@Vulpecker