今天发现用Apktool和Jeb反编译出来的smali在语法上有一定区别,比如一个Java函数:
private void packageNameCheck() { com.example.testfor360.MainActivity mm = new com.example.testfor360.MainActivity(); mm.packageNameCheck(); }
用Jeb反编译出来是这样的:
.method private packageNameCheck()V .registers 2 .prologue 00000000 new-instance v0, MainActivity 00000004 invoke-direct MainActivity-><init>()V, v0 .local v0, mm:Lcom/example/testfor360/MainActivity; 0000000A invoke-virtual MainActivity->packageNameCheck()V, v0 00000010 return-void .end method
而用Apktool反编译出来是这样的:
.method private packageNameCheck()V .locals 1 .prologue #代码起始指令 .line 80 new-instance v0, Lcom/example/testfor360/MainActivity; invoke-direct {v0}, Lcom/example/testfor360/MainActivity;-><init>()V .line 81 .local v0, mm:Lcom/example/testfor360/MainActivity; invoke-virtual {v0}, Lcom/example/testfor360/MainActivity;->packageNameCheck()V .line 82 return-void #返回空 .end method
仅仅这一小段看来,有这些区别:
1.Apktool的smali中所有的类都用了完整路径名(L打头),并且以分号结束,包括后面;-><init>的之前,也加了分号;而Jeb只写了类名,并且不带分号
2.方法调用指令invoke-direct中,Apktool把寄存器放到了前面,并且用open brace "{" 和 close brace"}"括起来了;Jeb把寄存器放到了后面,没有大括号
另外,Apktool里的.line在Jeb里也没有出现。
再另外,APKIDE反编译出来的和Apktool基本一致,不同的地方是new出来的对象mm他给加了双引号。看了下APKIDE目录下就有APKTOOL文件夹,基本确定就是用Apktool反编译的,只是Apktool版本不同罢了。