本帖最后由 淡然出尘 于 2015-2-3 19:22 编辑
因帖子去除安卓程序自动发短信权限 与天天跑你妹的另类破解有感,所以特意提出来讨论下。
原帖楼主在查找方法“a(ILjava/lang/String;)V”的调用时,直接搜索“a(ILjava/lang/String;)V”,找到了很多无用结果。
按常理查找方法的调用时,是搜索这样形式的关键字“Lpackage/name/ObjectName;->MethodName(III)Z”。
“Lpackage/name/ObjectName;”的具体代码,由当前smali文件的第一行代码给出“.class final Lpackage/name/ObjectName;”。“MethodName(III)Z”就是方法名。
照格式,查找上面提到的方法“a(ILjava/lang/String;)V”的调用时,应在原代码中搜索“Lcom/luyougame/pay/a/b;->a(ILjava/lang/String;)V”。
但是很快会发现,这样查找没有任何结果,是不是就说明这个方法没有被调用过呢?答案是否定的。如果细心点,可以发现当前类的前面部分有这样的代码。
[Java] 纯文本查看 复制代码 .class final Lcom/luyougame/pay/a/b;
.super Ljava/lang/Object;
# interfaces
.implements Lcom/uucun/pay/c;
这里要重点关注这个“.implement”,implements是一个类实现一个接口用的关键字,它是用来实现接口中定义的抽象方法。
至于什么是抽象方法,自行脑补。
“.implements Lcom/uucun/pay/c;”,表明当前类实现了“Lcom/uucun/pay/c;”中定义的抽象方法。
我们查看“Lcom/uucun/pay/c;”的代码,如下:
[Java] 纯文本查看 复制代码 .class public interface abstract Lcom/uucun/pay/c;
.super Ljava/lang/Object;
# virtual methods
.method public abstract a()V
.end method
.method public abstract a(ILjava/lang/String;)V
.end method
.method public abstract b()V
.end method
.method public abstract b(ILjava/lang/String;)V
.end method
看到了“.method public abstract a(ILjava/lang/String;)V”,这里的“a(ILjava/lang/String;)V”是抽象方法。
到这里,大家应该有所悟了吧?为什么之前搜索“Lcom/luyougame/pay/a/b;->a(ILjava/lang/String;)V”找不到结果。
搜索下“.implements Lcom/uucun/pay/c;”,只找到了一个结果,也就是说“Lcom/uucun/pay/c;”的虚拟方法只有一个实现接口。
回到上面说的,查找方法“a(ILjava/lang/String;)V”的调用。我们应该修改下搜索关键字,改为查找“Lcom/uucun/pay/c;->a(ILjava/lang/String;)V”。
很快找到了5处调用。
上面说的是单一实现接口虚拟方法的调用。还有其他特殊方法的调用,有空待续。如onPostExecute(Ljava/lang/Object;)V、run()V、JNI方法。
|