android APK反编译及混淆学习总结


前言

老夫也开始进行博客之旅了,2016年新的一年新的开始,之前想过各种做笔记的方式,网盘、写demo,感觉还是博客更加的实用,既能记录学习脚步,也能共享学习成果。
之前为了使用公司的业务需求,使用的友盟的平台管理及渠道管理,后来为了更好的做推广和地推,弄了一个调整渠道的方式,但是很麻烦,也有很大的局限性,在这里就不多做阐述了。
读了郭霖郭大师的博客,加上自己的实践,又了自己一些新的想法。


写一个简单的DEMO,一个按钮,点击谈一个test123的Toast,就不贴代码了,没什么技术含量。

反编译

  • apktool ,下载好apktool.jar和apktool.bat或者去官网去下载,下载玩之后本地最好新建一个专门的目录(我个人是在D:\apktool),将其拷贝进去。

  • 将个人待反编译的APK也拷贝至该目录

  • 在cmd下进入该目录

  • 执行反编译指令
    apktool d zxcv.apk,如出现错误,请参考郭大师的博客
    见到如图即为反编译成功

  • 展开文件,目录如下

    其中,original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。具体结构如下:

    .class Lcom/lpf/demo/MainActivity$1;
    .super Ljava/lang/Object;
    .source "MainActivity.java"
    
    
    # interfaces
    
    .implements Landroid/view/View$OnClickListener;
    
    
    
    # annotations
    
    .annotation system Ldalvik/annotation/EnclosingMethod;
        value = Lcom/lpf/demo/MainActivity;->onCreate(Landroid/os/Bundle;)V
    .end annotation
    
    .annotation system Ldalvik/annotation/InnerClass;
        accessFlags = 0x0
        name = null
    .end annotation
    
    
    
    # instance fields
    
    .field final synthetic this$0:Lcom/lpf/demo/MainActivity;
    
    
    
    # direct methods
    
    .method constructor <init>(Lcom/lpf/demo/MainActivity;)V
        .locals 0
    
        .prologue
        .line 1
        iput-object p1, p0, Lcom/lpf/demo/MainActivity$1;->this$0:Lcom/lpf/demo/MainActivity;
    
        .line 18
        invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    
        return-void
    .end method
    
    
    
    # virtual methods
    
    .method public onClick(Landroid/view/View;)V
        .locals 3
        .param p1, "v"    # Landroid/view/View;
    
        .prologue
        .line 23
        iget-object v0, p0, Lcom/lpf/demo/MainActivity$1;->this$0:Lcom/lpf/demo/MainActivity;
    
        const-string v1, "test123"
    
        const/4 v2, 0x1
    
        invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
    
        move-result-object v0
    
        .line 24
        invoke-virtual {v0}, Landroid/widget/Toast;->show()V
    
        .line 25
        return-void
    .end method
    

修改、调整

  • 简单对代码做一些个修改
    以上代码中“test123”为一个Toast,我们将这个Toast的内容修改为“test321”,然后保存。同时将res文件下测试应用的主图标(ic_launcher.png)全部更换为另外一张图片。

打包

  • 将调整好的代码打包成一个APK
    在cmd下执行:apktool b zxcv -o zxcv123.apk(其中b是build的意思,表示我们要将zxcv文件夹打包成APK文件,-o用于指定新生成的APK文件名,这里新的文件叫作zxcv123.apk。),如下图:

    见到上图说明已经打包成功了,我们再查看目录,会发现多了一个zxcv123.apk。

  • 到这里就完了?NO!NO!NO!
    这里得到的zxcv123.apk是没有办法使用的,因为还没有对这个apk进行签名。那么下面来详细的讲讲如何进行签名。

签名

签名对每一个做app开发的码畜来说,应该是不陌生的,那么就不对理论进行说明了,咱来实际的,怎么做?

  • 生成签名文件
    通常我们使用的keystore文件都是使用工具去生成的,下面我开说一下如何使用keytool.exe去生成一个新的签名文件。

  • 安装jdk
    作为一个java、android的码畜,jdk及环境变量就不做重复了

  • 在cmd下进入jdk的bin目录
    执行:keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
    解析:keytool -genkey -alias 要生成的文件名称 -keyalg RSA -validity 有效时间 -keystore 文件名称(和前面的名称最好保持一致),更过详细的说明,请点击传送门

    执行为出现如下效果:

    创建成功会在bin目录下生成一个test.keystore文件

  • 签名APK
    为了将少错误的概率,我们将上面打包那一步生成的zxcv123.apk文件拷贝只jdk的bin补录下。
    执行:jarsigner -verbose -keystore test.keystore -signedjar zxcv_.apk zxcv123.apk test.keystore
    解析:jarsigner -verbose -keystore 签名文件名称 -signedjar 签名后的apk名称 要签名的APK的名称 签名文件名称

    执行会出现如下效果:

    到这里,那么可以阿弥陀佛了,新的包已经签名完成,一个完整的、修改过后的apk就此诞生了。

到这里,我们可能会突然发现,哦….!原来,曾经的汉化是这么来的、曾经的游戏bug版是出现的。但是我们作为一个有素质、有教养、有良知的码畜,坏事我们是不要干滴!

好!到此,人生的第一篇博客算是完了。磨蹭了几个小时,总算是有了一些结果,但愿是一个好的开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一行Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值