Apktool 和 Jeb 给出的不同的smali语法

  今天发现用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版本不同罢了。

posted @ 2014-09-21 21:52  LarryLawrence  阅读(1523)  评论(0编辑  收藏  举报