工具安装还是不写了。
1.JVM、Dalvik、ART
JVM是JAVA虚拟机,运行JAVA字节码程序
Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable)
Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异
.dex文件是一种打包的 Java 字节码文件格式,它主要用于在 Android 系统中的 Dalvik 虚拟机或 ART 虚拟机上运行。从 Android 5.0 版本开始,ART 虚拟机取代了 Dalvik 虚拟机成为 Android 系统默认的运行时环境。
2.smali
smali语法就是dex反编译后的语言。不得不感慨和windows上的逆向也有异曲同工之妙,有点像汇编语言的说。
寄存器
先说一下寄存器。在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法)
部分smali知识
关键字
名称 注释 .class 类名 .super 父类名,继承的上级类名名称 .source 源名 .field 变量 .method 方法名 .register 寄存器 .end method 方法名的结束 public 公有 protected 半公开,只有同一家人才能用 private 私有,只能自己使用 .parameter 方法参数 .prologue 方法开始 .line xxx 位于第xxx行 数据类型对应
smali类型 java类型 注释 V void 无返回值 Z boolean 布尔值类型,返回0或1 B byte 字节类型,返回字节 S short 短整数类型,返回数字 C char 字符类型,返回字符 I int 整数类型,返回数字 J long (64位 需要2个寄存器存储) 长整数类型,返回数字 F float 单浮点类型,返回数字 D double (64位 需要2个寄存器存储) 双浮点类型,返回数字 string String 文本类型,返回字符串 Lxxx/xxx/xxx object 对象类型,返回对象 常用指令
关键字 注释 const 重写整数属性,真假属性内容,只能是数字类型 const-string 重写字符串内容 const-wide 重写长整数类型,多用于修改到期时间。 return 返回指令 if-eq 全称equal(a=b),比较寄存器ab内容,相同则跳 if-ne 全称not equal(a!=b),ab内容不相同则跳 if-eqz 全称equal zero(a=0),z即是0的标记,a等于0则跳 if-nez 全称not equal zero(a!=0),a不等于0则跳 if-ge 全称greater equal(a>=b),a大于或等于则跳 if-le 全称little equal(a<=b),a小于或等于则跳 goto 强制跳到指定位置 switch 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置 iget 获取寄存器数据
3.jadx-gui
有点像ida呀!首先注意,在反编译的时候,该工具有可能会将字符串反编译为unicode编码,到时候搜索的时候一定要注意。
解决方法也比较简单,在首选项里面。

4.总结
感觉和CTF的逆向有一点出入,但是我认为基础都是差不多的。同时,假如作为开发者,也要注意做好防护,如混淆和方法名起名注意一点。
要反复看Smali语法,提升相关水平。

1479

被折叠的 条评论
为什么被折叠?



