首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
Android安全
发新帖
39
14
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
发表于: 2020-10-27 15:17
15536
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
爱吃菠菜
2
2020-10-27 15:17
15536
# 代码地址: <a href="elink@c42K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2j5$3u0G2j5$3q4A6i4K6u0r3K9X3g2T1i4K6g2X3M7$3y4J5K9i4m8@1"><mark class="encrypted">c93K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2j5$3u0G2j5$3q4A6i4K6u0r3K9X3g2T1i4K6g2X3M7$3y4J5K9i4m8@1</mark></a> # 目录 > . > ###### 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接口  . - #### 几个常用的类 DEX类--------------**IDexClass** DEX方法-----------**IDexMethod** 方法指令序列-----**IDexCodeItem** 指令-----------------**IDalvikInstruction** 基本块--------------**BasicBlock** 控制流--------------**CFG** . . # DEX反编译层面(IDexDecompilerUnit部件) - #### 反编译一个Class  .  . - #### 如何获取IDexDecompilerUnit? 若要获取Class反编译后内容(像IDA的F5), 仅使用IDexUnit不够啦, 还需要获取**IDexDecompilerUnit**部件 . 如何获取IDexDecompilerUnit? 一般通过**DecompilerHelper**类, 给它传入一个IDexUnit作为输入, 得到对应的IDexDecompilerUnit实例. . - #### 对类/方法/属性执行反编译 IDecompilerUnit的API很容易理解, 执行反编译的目标可以是整个文件, 也可以是某个class method等,如: decompile() decompileAllClasses() decompileAllMethods() decompileClass() decompileMethod() decompileField() 参考: <mark class="encrypted">593K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8X3y4G2L8g2)9J5c8Y4m8F1k6Y4y4G2k6Y4c8%4j5i4u0W2i4K6u0r3K9X3g2T1i4K6u0r3j5$3!0J5k6g2)9J5c8Y4g2F1K9i4c8K6i4K6u0r3j5$3!0V1k6g2)9J5c8V1W2p5k6h3y4G2L8i4m8A6L8r3g2J5g2h3&6A6N6q4)9J5k6h3S2@1L8h3H3`.</mark> . 之后通过getDecompiled***Text(), 获取到反编译后的源代码(String文本). . - #### 个性化配置 在反编译前,还可以通过 **DecompilationOptions**和**DecompilationContext**等, 进行一些配置. . . # 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**包的文档. 参考: <mark class="encrypted">6fbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8X3y4G2L8g2)9J5c8Y4m8F1k6Y4y4G2k6Y4c8%4j5i4u0W2i4K6u0r3K9X3g2T1i4K6u0r3j5$3!0J5k6g2)9J5c8Y4g2F1K9i4c8K6i4K6u0r3j5$3!0V1k6g2)9J5c8X3A6S2N6X3q4Q4x3V1k6H3j5h3y4C8j5h3N6W2i4K6u0V1M7%4g2E0L8h3q4J5P5g2)9J5k6h3S2@1L8h3H3`.</mark> 用一张图表达它们的层次关系:  . - #### 总结这几个Unit的层次关系 - DEX方面 字节码层面 IDexUnit 反编译层面 IDexDecompilerUnit 语法树层面 IJavaSourceUnit . - Native方面类似,可参考DEX,层次和过程是类似的. 字节码层面 INativeCodeUnit 反编译层面 INativeDecompilerUnit 语法树层面 INativeSourceUnit . - 参考: <mark class="encrypted">234K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8X3y4G2L8g2)9J5c8Y4m8F1k6Y4y4G2k6Y4c8%4j5i4u0W2i4K6u0r3K9X3g2T1i4K6u0r3j5$3!0J5k6g2)9J5c8Y4g2F1K9i4c8K6i4K6u0r3M7r3q4U0K9$3q4Y4k6g2)9J5k6s2y4#2L8h3#2S2M7Y4W2Q4x3X3g2Z5N6r3#2D9</mark>  . # 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**包的文档. 参考: <mark class="encrypted">5b7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8X3y4G2L8g2)9J5c8Y4m8F1k6Y4y4G2k6Y4c8%4j5i4u0W2i4K6u0r3K9X3g2T1i4K6u0r3j5$3!0J5k6g2)9J5c8Y4g2F1K9i4c8K6i4K6u0r3j5$3!0V1k6g2)9J5c8X3q4K6L8g2)9J5c8X3c8W2j5$3!0E0M7r3W2D9k6i4u0Q4x3V1k6S2M7%4c8Q4x3V1k6H3j5h3y4C8j5h3N6W2i4K6u0V1M7%4g2E0L8h3q4J5P5g2)9J5k6h3S2@1L8h3H3`.</mark>  . # 参考文档: **Scripting for Android Reversing** <mark class="encrypted">7a9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3#2S2L8Y4g2S2L8q4)9J5c8X3c8W2N6W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3X3c8K6j5%4u0A6M7s2c8A6L8X3N6Q4x3V1j5`.</mark> **pnfsoftware/jeb2-samplecode/scripts/** <mark class="encrypted">458K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5c8X3A6W2j5U0u0Q4x3X3c8K6j5h3#2H3L8r3g2U0L8$3c8W2i4K6u0r3N6s2u0W2k6g2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8Y4y4U0M7X3W2H3N6s2x3`.</mark> **JEB API Documentation** <mark class="encrypted">bf1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8Y4m8S2j5$3E0S2k6$3g2K6i4K6u0W2K9s2c8E0L8l9`.`.</mark>
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
最后于
2021-2-6 16:01 被kanxue编辑 ,原因:
收藏
・
39
点赞
・
14
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
mb_szzzborh
非常支持你的观点!
2026-1-11 05:00
mb_vrkpxsoe
谢谢你的细致分析,受益匪浅!
2025-12-22 17:29
東陽不列山
感谢你的贡献,论坛因你而更加精彩!
2025-6-28 02:28
飘零丶
为你点赞!
2025-5-14 02:31
一路南寻
感谢你的贡献,论坛因你而更加精彩!
2025-2-1 05:51
zxk1ng
你的帖子非常有用,感谢分享!
2024-11-1 22:47
心游尘世外
感谢你的贡献,论坛因你而更加精彩!
2024-8-27 01:06
QinBeast
看雪因你而更加精彩!
2024-8-26 04:36
ZDavy
为你点赞~
2024-3-28 02:03
PLEBFE
为你点赞~
2022-7-30 10:33
大帅锅
为你点赞~
2020-12-4 10:38
0x指纹
为你点赞~
2020-10-30 17:08
ccfer
为你点赞~
2020-10-29 10:30
Umiade
为你点赞~
2020-10-27 15:39
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
8
)
Umiade
雪 币:
4475
活跃值:
(3465)
能力值:
( LV4,RANK:50 )
在线值:
发帖
3
回帖
55
粉丝
16
关注
私信
Umiade
2
楼
先膜后看
2020-10-27 15:39
0
huluxia
雪 币:
1965
活跃值:
(3046)
能力值:
( LV2,RANK:10 )
在线值:
发帖
2
回帖
237
粉丝
3
关注
私信
huluxia
3
楼
顶楼主
2020-10-27 19:25
0
huangyalei
雪 币:
32659
活跃值:
(11838)
能力值:
( LV2,RANK:10 )
在线值:
发帖
3
回帖
397
粉丝
10
关注
私信
huangyalei
4
楼
图片都看不到
2020-10-27 20:26
0
caolinkai
雪 币:
3851
活跃值:
(4324)
能力值:
( LV2,RANK:10 )
在线值:
发帖
7
回帖
826
粉丝
1
关注
私信
caolinkai
5
楼
牛逼
2020-11-5 17:09
0
lqfcugo
雪 币:
244
活跃值:
(3805)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
53
粉丝
1
关注
私信
lqfcugo
6
楼
好文。
2023-9-13 10:16
0
linna_bare
雪 币:
202
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
1
粉丝
0
关注
私信
linna_bare
7
楼
感谢大佬的博客!
2023-11-28 22:57
0
mJqalJqN
雪 币:
16
能力值:
( LV1,RANK:0 )
在线值:
发帖
4
回帖
124
粉丝
4
关注
私信
mJqalJqN
8
楼
你那JEB脚本提示怎么搞的
2024-11-20 14:15
0
koflfy
雪 币:
102
活跃值:
(4136)
能力值:
( LV4,RANK:50 )
在线值:
发帖
8
回帖
483
粉丝
5
关注
私信
koflfy
1
9
楼
mark
2026-1-6 21:53
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
爱吃菠菜
2
19
发帖
192
回帖
180
RANK
关注
私信
他的文章
[原创] 60秒学会用eBPF-BCC hook系统调用 ( 2 ) hook安卓所有syscall
42487
[原创] 60秒学会用eBPF-BCC hook系统调用
27889
[原创] 某DEX_VMP安全分析与还原
50716
[原创]JEB脚本(二)(交叉引用 调用图)
9556
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
15536
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部