vii 发表于 2015-10-13 09:54:07

百度云签名验证破解教程

本帖最后由 vii 于 2015-10-13 09:57 编辑

  现在大家对android安全越来越重视了,逆向变得不那么简单,要想逆向一个app,首先要解决的便是签名验证,现发一个百度云的签名验证破解教程,供新手参考。
  我也只是个菜鸟,能破解这个验证也算是巧合吧,本教程纯属投机取巧,大牛轻喷。
  此教程适合最新版本7.11.1,后面的就不知道了。

  教程开始:
  首先用AK或者其他同类工具反编译百度云,这里我用的是AK,百度云版本为最新版。看过一些教程的应该都知道,一般的签名验证是搜索pm/signature关键词,于是我照例搜索,但是搜出来的结果略多:

  我是个懒人,看到这么多结果,不太想每个都打开看。想到之前逆向百度音乐的时候,验证成功和验证失败执行的是不同的函数,但有一个特点是成功的函数名是onVerifyOK,失败的函数名是onVerifyFail,同样是百度家的产品,百度云会不会也是这样呢?搜索试试就知道了:

  如我所料,确实是这样的,略有不同的是,百度云的onVerifyOK是在函数里的,不是函数名。不过这个不重要,重要的是我们找到了关键位置,随便点一个进去看看,代码是这样的:
.method public a()V
    .locals 3

    .prologue
    .line 77
    const-class v0, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-virtual {v0}, Ljava/lang/Class;->getSimpleName()Ljava/lang/String;

    move-result-object v0

    const-string v1, "onVerifyOK"

    invoke-static {v0, v1}, Lcom/baidu/netdisk/kernel/a/e;->a(Ljava/lang/String;Ljava/lang/String;)V

    .line 79
    iget-object v0, p0, Lcom/baidu/netdisk/ui/launch/e;->a:Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    new-instance v1, Lcom/baidu/netdisk/ui/launch/g;

    iget-object v2, p0, Lcom/baidu/netdisk/ui/launch/e;->a:Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-direct {v1, v2}, Lcom/baidu/netdisk/ui/launch/g;-><init>(Lcom/baidu/netdisk/ui/open/IAuthenticatorView;)V

    # setter for: Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->mPresenter:Lcom/baidu/netdisk/ui/launch/g;
    invoke-static {v0, v1}, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->access$002(Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;Lcom/baidu/netdisk/ui/launch/g;)Lcom/baidu/netdisk/ui/launch/g;

    .line 81
    :try_start_0
    iget-object v0, p0, Lcom/baidu/netdisk/ui/launch/e;->a:Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    # getter for: Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->mPresenter:Lcom/baidu/netdisk/ui/launch/g;
    invoke-static {v0}, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->access$000(Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;)Lcom/baidu/netdisk/ui/launch/g;

    move-result-object v0

    iget-object v1, p0, Lcom/baidu/netdisk/ui/launch/e;->a:Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-virtual {v1}, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->getIntent()Landroid/content/Intent;

    move-result-object v1

    invoke-virtual {v0, v1}, Lcom/baidu/netdisk/ui/launch/g;->a(Landroid/content/Intent;)V
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

    .line 85
    :goto_0
    return-void

    .line 82
    :catch_0
    move-exception v0

    .line 83
    const-class v1, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-virtual {v1}, Ljava/lang/Class;->getSimpleName()Ljava/lang/String;

    move-result-object v1

    const-string v2, "initView"

    invoke-static {v1, v2, v0}, Lcom/baidu/netdisk/kernel/a/e;->c(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V

    goto :goto_0
.end method

.method public a(I)V
    .locals 2

    .prologue
    .line 71
    const-class v0, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-virtual {v0}, Ljava/lang/Class;->getSimpleName()Ljava/lang/String;

    move-result-object v0

    const-string v1, "onVerifyFail"

    invoke-static {v0, v1}, Lcom/baidu/netdisk/kernel/a/e;->a(Ljava/lang/String;Ljava/lang/String;)V

    .line 72
    iget-object v0, p0, Lcom/baidu/netdisk/ui/launch/e;->a:Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;

    invoke-static {v0}, Lcom/baidu/netdisk/ui/launch/AuthenticatorActivity;->popupAlertDialog(Landroid/app/Activity;)V

    .line 73
    return-void
.end method
  可以看到,成功的函数是a()V,失败的函数是a(I)V,成功的函数是没有参数的。凭感觉,我知道这里一定就是签名验证后要执行的代码,怎么证明我的猜测呢?修改代码重打包安装到手机里一试便知。
  一般来说,破解签名验证主要就是修改跳转,但是这里我找不到调用这两个函数的地方,应该是在so里或者百度用其他的手段隐藏了。庆幸的是,由于上面说的原因,我们不需要再去反汇编so文件或者研究加密算法等,一样可以破解这个验证。
  这里我的修改方法是最简单的一种(毕竟我懒),就是将成功和失败的函数名互换,这样无论app是在哪里验证,我们都不需要关心,因为换了签名验证肯定是失败的,我们只要让验证失败后执行成功的代码就行了。互换完成后是这样的:
验证成功的函数名是a()V,代码是验证失败的代码
验证失败的函数名是a(I)V,代码是验证成功的代码
  上面说过,app运行后执行的一定是a(I)V函数,这个函数里的代码是不需要参数的,因此我多给它一个参数也无所谓,反正又不会用到。而a()V里的代码虽然需要参数,但既然换了签名,肯定就不会验证成功,那么这个代码永远也不会被执行,所以虽然代码里用到参数,但函数名没有参数也没关系。
  前面看到搜索结果有5个,依次打开用同样的方法修改就可以了。还有一种修改方法就是将验证成功的函数代码复制到验证失败的函数里,效果是一样的,只是操作起来略微麻烦一点。
  修改好了就重新打包,反编译工具会自动签名,签名完成后安装到手机里,果然不闪退了(原本换了签名就会闪退),并且可以正常使用,说明签名验证已经成功破解了。
  教程大概就是这样,如果有看不懂的,可以回帖提问,如果哪里说的不对,还请路过的大牛指点一二。至于VIP,就不是我等菜鸟能破的了,发此教程也是想抛砖引玉,期待大牛来破吧。

txc1223 发表于 2015-10-13 10:01:45

来学习一下。

tomcnc 发表于 2015-10-13 10:04:35

围观一下下呢。

听鬼哥说故事 发表于 2015-10-13 10:09:18

支持一下楼主~~~

cxqdly 发表于 2015-10-13 10:10:15

支持楼主Vii

datecf123456 发表于 2015-10-13 10:10:51

支持楼主

水波摇曳 发表于 2015-10-13 10:13:50

膜拜 赞一个,不过我的工具 也秒杀。。

---
群里私聊下我呗,帮我测试下工具

sirbra 发表于 2015-10-13 10:14:17

思路非常地有意思。。。点个赞~~~

都同学 发表于 2015-10-13 10:14:24

支持一个~

越狱 发表于 2015-10-13 10:17:40

牛x 支持楼主
页: [1] 2 3 4 5 6 7
查看完整版本: 百度云签名验证破解教程