-
-
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
-
发表于:
2020-10-27 15:17
12711
-
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
https://github.com/acbocai/jeb_script
.
(1)访问DEX与Class
(2)遍历Field / Method
(3)访问某个Method
(4)访问指令
(5)访问基本块
(6)访问控制流数据流
反编译一个Class
(1)遍历某Method所有AST元素
(2)解析if...else元素
(3)解析call元素
(4)解析try元素
(5)解析for元素
(1)遍历函数
(2)访问指令
(3)访问基本块
(4)访问控制流
(1)遍历某函数所有AST元素
(2)解析if...else元素
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
.
DEX字节码层面(IDexUnit部件)
(1)访问DEX与Class
(2)遍历Field / Method
(3)访问某个Method
(4)访问指令
(5)访问基本块
(6)访问控制流数据流
DEX反编译层面(IDexDecompilerUnit部件)
反编译一个Class
JAVA语法树层面(IJavaSourceUnit部件)
(1)遍历某Method所有AST元素
(2)解析if...else元素
(3)解析call元素
(4)解析try元素
(5)解析for元素
Native反汇编层面(INativeCodeUnit部件)
(1)遍历函数
(2)访问指令
(3)访问基本块
(4)访问控制流
Native AST层面(INativeSourceUnit部件)
(1)遍历某函数所有AST元素
(2)解析if...else元素
.
-
常见操作
DEX字节码层面操作,关注IDexUnit部件,常见操作如:
(1)访问DEX与Class
(2)遍历Field / Method
(3)访问某个Method
(4)访问指令
(5)访问基本块
(6)访问控制流数据流
- (1)访问DEX与Class
.
- (2)遍历Field / Method
.
- (3)访问某个Method
.
- (4)访问指令
.
- (5)访问基本块
.
- (6)访问控制流数据流
-
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
-
反编译一个Class
.
-
如何获取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文本).
-
个性化配置
在反编译前,还可以通过
DecompilationOptions和DecompilationContext等,
进行一些配置.
-
常见操作
(1)遍历某Method所有AST元素
(2)解析if...else元素
(3)解析call元素
(4)解析try元素
(5)解析for元素
.
- (1)遍历某Method所有AST元素
- (2)解析if...else元素
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-2-6 16:01
被kanxue编辑
,原因: