Android逆向基础知识Smali

当筵意气临九霄,星离雨散不终朝。这篇文章主要讲述Android逆向基础知识Smali相关的知识,希望能为你提供帮助。
什么是Smali:
我们用工具反编译一些APP的时候,会看到一个smali文件夹,里面其实就是每个java类所对应的smali文件。android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言
JAVA和Smali数据类型对比:

JAVASmali
Vvoid Zboolean Bbyte Sshort Cchar Iint Jlong Ffloat Ddouble引用类型 L对象 [数组

语法:
.field定义变量.method方法.parameter方法参数.prologue方法开始.line 12此方法位于第12行invoke-super调用父函数const/high16v0, 0x7fo3把0x7fo3赋值给v0invoke-direct调用函数return-void函数返回void.end method函数结束new-instance创建实例iput-object对象赋值iget-object调用对象invoke-static调用静态函数

smali跳转语句“if-eq vA, vB, :cond_**” 如果vA等于vB则跳转到:cond_**“if-ne vA, vB, :cond_**” 如果vA不等于vB则跳转到:cond_**“if-lt vA, vB, :cond_**” 如果vA小于vB则跳转到:cond_**“if-ge vA, vB, :cond_**” 如果vA大于等于vB则跳转到:cond_**“if-gt vA, vB, :cond_**” 如果vA大于vB则跳转到:cond_**“if-le vA, vB, :cond_**” 如果vA小于等于vB则跳转到:cond_**“if-eqz vA, :cond_**” 如果vA等于0则跳转到:cond_**“if-nez vA, :cond_**” 如果vA不等于0则跳转到:cond_**“if-ltz vA, :cond_**” 如果vA小于0则跳转到:cond_**“if-gez vA, :cond_**” 如果vA大于等于0则跳转到:cond_**“if-gtz vA, :cond_**” 如果vA大于0则跳转到:cond_**“if-lez vA, :cond_**” 如果vA小于等于0则跳转到:cond_**

DEMO:
java代码 private boolean show(){ boolean tempFlag = ((3-2)==1)? true : false; if (tempFlag) { return true; }else{ return false; } }转换smali代码 .method private show()Z .locals 2.prologue//方法开始 .line 22 const/4 v0, 0x1// v0赋值为1.line 24 .local v0, tempFlag:Z if-eqz v0, :cond_0// 判断v0是否等于0, 不符合条件向下走, 符合条件执行cond_0分支.line 25 const/4 v1, 0x1// 符合条件分支.line 27 :goto_0 return v1:cond_0 const/4 v1, 0x0// cond_0分支goto :goto_0 .end method

【Android逆向基础知识Smali】参考:
http://blog.csdn.net/lostinai/article/details/48975661
http://blog.csdn.net/sjim_/article/details/50443860


    推荐阅读