[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
发表于:
2020-10-27 15:17
12890
[原创]JEB脚本(一)(指令解析 反编译 抽象语法树)
c3dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2j5$3u0G2j5$3q4A6i4K6u0r3K9X3g2T1i4K6g2X3M7$3y4J5K9i4m8@1
.
(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 acbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3#2S2L8Y4g2S2L8q4)9J5c8X3c8W2N6W2)9J5c8X3q4F1k6s2u0G2K9h3c8Q4x3X3c8K6j5%4u0A6M7s2c8A6L8X3N6Q4x3V1j5`.
pnfsoftware/jeb2-samplecode/scripts/ af1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5c8X3A6W2j5U0u0Q4x3X3c8K6j5h3#2H3L8r3g2U0L8$3c8W2i4K6u0r3N6s2u0W2k6g2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8Y4y4U0M7X3W2H3N6s2x3`.
JEB API Documentation 06fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3L8X3k6K6L8$3k6@1N6$3q4J5k6g2)9J5k6h3y4G2L8g2)9J5c8X3A6W2j5W2)9J5c8X3q4H3K9h3c8G2j5#2)9J5c8Y4u0W2k6X3g2J5k6h3&6U0k6g2)9J5c8Y4m8S2j5$3E0S2k6$3g2K6i4K6u0W2K9s2c8E0L8l9`.`.
.
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() 参考:43bK9s2c8@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`. . 之后通过getDecompiled* Text(), 获取到反编译后的源代码(String文本).
个性化配置 在反编译前,还可以通过DecompilationOptions 和DecompilationContext 等, 进行一些配置.
常见操作 (1)遍历某Method所有AST元素 (2)解析if...else元素 (3)解析call元素 (4)解析try元素 (5)解析for元素 .
(1)遍历某Method所有AST元素
(2)解析if...else元素
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2021-2-6 16:01
被kanxue编辑
,原因: