首页
社区
课程
招聘
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
2020-10-27 15:17 10869

[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)

2020-10-27 15:17
10869

代码地址:

https://github.com/acbocai/jeb_script

目录

.

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部件)

  • 常见操作

    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接口
    ICodeItem

.

  • 几个常用的类

    DEX类--------------IDexClass
    DEX方法-----------IDexMethod
    方法指令序列-----IDexCodeItem
    指令-----------------IDalvikInstruction
    基本块--------------BasicBlock
    控制流--------------CFG

.
.

DEX反编译层面(IDexDecompilerUnit部件)

  • 反编译一个Class

    反编译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文本).

.

  • 个性化配置

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

.
.

JAVA语法树层面(IJavaSourceUnit部件)

  • 常见操作

    (1)遍历某Method所有AST元素
    (2)解析if...else元素
    (3)解析call元素
    (4)解析try元素
    (5)解析for元素
    .
  • (1)遍历某Method所有AST元素

.

  • (2)解析if...else元素

.

  • (3)解析call元素

    .
  • (4)解析try元素

.

  • (5)解析for元素

.

  • 访问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
    用一张图表达它们的层次关系:
    IJavaElement

.

  • 总结这几个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
    Unit

.

Native反汇编层面(INativeCodeUnit部件)

  • 常见操作

    原生库反汇编层面操作,关注INativeCodeUnit部件,常见操作如:
    (1)遍历函数
    (2)访问指令
    (3)访问基本块
    (4)访问控制流

.

  • (1)遍历函数

.

  • (2)访问指令

.

  • (3)访问基本块

.

  • (4)访问控制流

.

Native AST层面(INativeSourceUnit部件)

  • 常见操作

    (1)遍历某函数所有AST元素
    (2)解析if...else元素
    (过程和DEX类似,
    IJavaSourceUnit换成了INativeSourceUnit.
    IJavaElement换成了ICElement.)
    .
  • (1)遍历某函数所有AST元素

.

  • (2)解析if...else元素

.

  • 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.html

.

参考文档:

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


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-2-6 16:01 被kanxue编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (6)
雪    币: 3954
活跃值: (2033)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Umiade 2020-10-27 15:39
2
0
先膜后看
雪    币: 1486
活跃值: (1990)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huluxia 2020-10-27 19:25
3
0
顶楼主
雪    币: 21875
活跃值: (3612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangyalei 2020-10-27 20:26
4
0
图片都看不到
雪    币: 3671
活跃值: (3848)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2020-11-5 17:09
5
0
牛逼
雪    币: 44
活跃值: (1142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lqfcugo 2023-9-13 10:16
6
0
好文。
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
linna_bare 2023-11-28 22:57
7
0
感谢大佬的博客!
游客
登录 | 注册 方可回帖
返回