之前的笔记搬运
try cat
什么是try catch表
在哪个函数写的try catch, 在其函数下面就会有生成对应的try catch表,
IDA与JEB生成的表格式不同, 这里只说JEB的;
不加finally的try catch
java函数例子代码:
1 | public void Mytest1() |
jeb反编译的smali代码:
不加finally的结构很简单, 一般根据try块标号可以确定catch块的数量,之后可以细看每个块中的实现 (嵌套的依旧是很坑的);
JEB异常表结构:
.catch [异常类型] { [try块开始标号], [try块结束标号] } :[catch代码开始处标号]
加finally的try catch
finally语句块作用:执行一些必要代码。即不管出现异常与否,在finally中的代码都会被执行
执行时机:针对所有catch语句之后,退出方法之前将被执行;
调试的java函数代码:
1 | public void Mytest() |
JEB里异常表名称catchall代表是有finally块语句,
但可不是有几个cathall就有几个finally哦
其结构为:
.catchall { [catch代码开始标号], [catch代码结束标号]} } :[统一处理块代码标号]
jeb反编译的smali代码:
通过以上图自己的理解:
1 | 1. 代码生成过程中会编译器会把finally块内代码在每个catch内拷贝一份, 以达到一定能执行finally块中的代码的目的; |
内部类与匿名类
1) 内部类的文件是 “[外部类]\$[内部类].smali” 的形式来命名的, 匿名内部类文件以
“[外部类]\$[数字].smali”来命名。
如: MainActivity\$MyTestClass
内部类文件头部会说明
2) 内部类访问外部类的私有方法和变量时,都要通过编译器生成的“access\$xx”来间接访问。
在多层类嵌套时, 每个内部类都会创建一个“access\$xx”函数,
用于获取外部类的this指针, xx根据内部类的层数决定;
当内部类想要跨层数调用或使用外部类的函数与字段时,
就可以通过多次调用access函数来获取想要的外部类的this指针
3) 编译器会把外部类的引用作为第一个参数插入到会内部类的构造器参数列表。
就是在初始化内部类时, 会把外部类的this指针传进内部类,
4) 内部类的构造器中是先保存外部类的引用到一个“合成变量”,再初始化外部类,最后才初始化自身。
在内部类或匿名类, 编译器会定义一个变量用于存放外部类的this指针, 在构造时初始化