安卓逆向必知必会的基础(一)
从环境配置到语法核心,掌握逆向分析的语言基础
一、Java环境与编译原理
Java是安卓应用的主要开发语言,理解它的编译执行原理是逆向的基础。Java源码通过javac编译为字节码(.class),字节码是平台无关的中间代码,CPU不能直接识别,由JVM解释执行或JIT即时编译为本地代码。这就是Java"一次编译,处处运行"的原理。

JIT(即时编译):对热点代码,编译器会将其编译为本地代码加速执行。Java通过导入机制引用类库,lib包相当于头文件。Java官方API文档位于docs.oracle.com/javase/8/docs/api,逆向时查阅API文档能快速理解代码意图。
二、包名与JAR打包
Java使用package组织类,包名规范采用域名反写:字段1为org/公司/com,字段2为公司名称,字段3为项目名称,后续字段按功能分包。包能避免类名重复,使用不同包的同名类时必须指定完整路径。

JAR打包三步:1.创建(编译class字节码) 2.打包 3.运行(java -jar)。JAR相当于Java的可执行文件,清单目录记录使用的库和main类。外部JAR依赖可以合并进主JAR,合并后运行时无需外部库。
三、Java基本数据类型
Java有8种基本类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节Unicode)、boolean(JVM决定)。Java没有无符号类型,所有类型都是有符号的。

Java内存采用大端方式(高位在前),逆向时读取字节序需要注意。boolean类型的大小由JVM自己决定,不一定占一个字节。char是Unicode字符,占2字节。
四、位运算与运算符
Java位运算符包括:&按位与、|按位或、^按位异或、~按位取反、<<左移、>>右移(带符号)、>>>无符号右移。左移低位补0,右移高位补符号位,无符号右移高位补0。Java提供的>>>无符号右移是逆向中常用的运算。

五、面向对象:继承与多态
所有Java类都自动继承Object类,Object提供toString/equals/hashCode等方法。继承用extends,接口用implements。Java单继承多实现。

重载(Overload)是编译期决定的静态行为:同一类中方法名相同但参数列表不同。重写(Override)是运行期决定的动态行为:子类重写父类方法。逆向分析时,重载表现为反编译中的多个同名方法,重写表现为invokevirtual多态调用。

六、权限修饰符与static
Java有4种权限修饰符:public(所有可访问)、protected(包内+子类)、default(同一包内)、private(仅本类)。static是类级成员,无需实例即可访问,static方法没有this指针(Main方法就是static)。final定义常量,相当于宏,不可继承不可重写。

七、数组、字符串与输入输出
一维数组初始化赋值等价,二维数组初始化为实例。数组存储同类型元素,索引从0开始,有length属性。字符串用concat()拼接,String不可变,每次拼接创建新对象,大量拼接用StringBuilder。

输入输出:字节流有System.in(控制台)和FileInputStream(文件)。常用输入类Scanner从控制台读取,DataInputStream读取数据。C++的STL流在Java中没有对应物。
八、集合与泛型
Java集合框架:List(有序可重复,ArrayList)、Set(无序不可重复,HashSet)、Map(键值对,HashMap)、Stack(后进先出)。?表示不确定类型等价于Object,泛型限制集合元素类型。

集合存储对象,基本类型需包装类(如Integer)。自动装箱是编译器自动new包装类。自定义包装类如MyInt/MyDouble可以扩展基本类型功能。
九、异常处理
异常是对象,只有引用类型能抛出。try块放可能异常的代码,catch块处理异常,finally块无论是否异常都会执行。异常时打印调用栈,逆向时从调用栈能快速定位问题代码。

Java构造函数没有析构函数,因为对象由GC垃圾回收机制自动释放,不需要手动释放。子类构造函数默认调用super()。
十、多线程与同步
创建线程用new线程().start()启动,可以继承Thread类或实现Runnable接口。同步用synchronized:同步方法锁定方法,同步代码块锁定对象(可用this作为同步对象,也可指定其他对象)。

逆向视角:反编译可见synchronized块对应的monitorenter/monitorexit指令,锁对象在反编译中可见。多线程竞争漏洞是安卓逆向分析的重点。
十一、Kotlin基础语法
Kotlin是现代安卓开发的主流语言,编译为Java字节码或JavaScript,与Java完全互操作。变量:val不可变、var可变。类型推断:val num=2自动推断为Int,也可显式声明val num:Int=2。println是Kotlin库函数。

Kotlin不同类型不能直接转换,需要用重载转换函数。位运算也是函数形式。Kotlin不支持指针。
十二、Kotlin字符串与流程控制
Kotlin字符串模板用三引号"""开始"""结尾,中间可以多行且自动识别,前缀空格用|识别可以删除。模板表达式${}求值插入字符串。

流程控制:if是表达式可返回值,when替代switch支持多分支,for遍历区间(i从0开始),while循环,break跳出。函数是表达式,最后一行是返回值;无返回值函数用Unit。
十三、Kotlin面向对象
Kotlin类自动生成get/set。主构造函数在类头声明,次构造函数用constructor。Kotlin默认final(类不可继承、方法不可重写),需open关键字开放继承,重写标注override。

Kotlin内部类有3个this指针:this(当前类)、super(父类)、this@外部类(访问外部类)。内部类可访问外部类并与其通信。接口类只需实现一个方法。运算符可重载(如plus实现+)。
十四、逆向视角总结
安卓逆向核心流程:APK解包 → dex反编译为smali → jadx转Java → IDA分析so原生库。Java层逻辑看smali或反编译代码,Kotlin代码带@Metadata标注,IDA分析Native层。掌握Java与Kotlin语法是分析安卓逆向的基础。

1.Java:源码→javac→字节码→JVM/JIT→本地代码
2.包名:域名反写,org/公司/com+项目+功能
3.JAR三步:创建/打包/运行,清单记录库和main
4.8种基本类型,无无符号,大端存储
5.位运算:& | ^ ~ << >> >>>(无符号右移)
6.所有类继承Object,extends继承/implements接口
7.重载=编译期静态,重写=运行期动态
8.权限:public/protected/default/private
9.static类级,无this;final常量不可改
10.集合:List/Set/Map/Stack,泛型限制类型
11.异常:try/catch/finally,GC自动回收
12.线程:new线程().start(),synchronized同步
13.Kotlin:val/var,类型推断,与Java互操作
14.Kotlin字符串模板,${}求值
15.Kotlin默认final,open+override,内部类3个this
16.逆向:APK→dex→smali→jadx→IDA,语法是基础
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果觉得有帮助,欢迎转发!
关注公众号,输出安卓逆向与底层技术干货。
夜雨聆风