三分钟上手JEB脚本开发

 

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部件,常见操作如:

 

总结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()

参考:

https://www.pnfsoftware.com/jeb/apidoc/reference/com/pnfsoftware/jeb/core/units/code/IDecompilerUnit.html

之后通过getDecompiled*Text(),获取到反编译后的源代码(String文本).

 

个性化配置

在反编译前,还可以通过DecompilationOptionsDecompilationContext等,进行一些配置.

 

6 访问JAVA语法树内容

常见操作

 

访问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包的文档.

参考:

https://www.pnfsoftware.com/jeb/apidoc/reference/com/pnfsoftware/jeb/core/units/code/java/package-summary.html

用一张图表达它们的层次关系:

 

总结几个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部件,常见操作如:

 

8 访问Native语法树内容

常见操作

过程和DEX类似,IJavaSourceUnit换成了INativeSourceUnit.

IJavaElement换成了ICElement.

 

ICElement的层次关系

具体关注com.pnfsoftware.jeb.core.units.code.asm.decompiler.ast包的文档.

参考:

https://www.pnfsoftware.com/jeb/apidoc/reference/com/pnfsoftware/jeb/core/units/code/asm/decompiler/ast/package-summary.htmll

 

9 其他常用操作

(1)DEX交叉引用查询

查询DEX中方法的交叉引用信息,使用ActionXrefsDataActionContext

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

参考官方用例:

https://github.com/pnfsoftware/jeb2-samplecode/blob/a313e4962fd535d0f70ad284bb0062ce84e5809e/scripts/BookmarkList.py

(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

https://github.com/pnfsoftware/jeb2-samplecode/blob/master/scripts/analysis/WhatsAppStringDecryptor.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

(完)