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