Python 实现自动化批量重打包Android Apps

写在前面的话

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian



基本步骤

  1. 反编译
  2. 修改Android 的 apps 的代码
  3. 重打包
  4. 为重打包的Android的apps 签名
  5. 安装测试

反编译 和重打包可以使用apktool 工具实现

反编译的时候的命令是:

apktool d apkname.apk

重新编译app 的命令是:

apktool b apkname

这个会在反编译得到的文件夹下面有一个dist 的文件,里面存有我们的重新编译出来的apk.

我们在重新打包我们的apk之后需要对我们的app 重新签名这个app 才能正常运行, 签名就是数字签名的简称.在这里我们是对每一个文件都要计算它们的信息摘要.

根据之前的文章讲的数字签名, 我们知道我们需要一个密钥,这个密钥可以用JDK提供的工具 jarsigner 或者Android studio 提供的工具apksigner进行签名.这里的不同可以在 Android APK的签名–笔记版 V1 签名和V2签名总结 找到.
在这里我们的代码,用V1 签名来实现.

我们生成的密钥,存在 我们 .keystore 这个文件里, 这里的 你可以按照自己的喜好取任何你喜欢的名字,遵循一下一般的命名规则就可以了.

之后用我们生成的密钥对我们的app 进行签名. 具体的计算步骤就是用某个hash 算法对app 的每一个文件计算一个hash 值, 之后在对这些 信息摘要计算用我们的密钥加密.

Android 的模拟器或者手机之前如果安装过这个非重打包的 app , 如果对比这两个app 的签名不一样,这个app 是不能被正确安装到手机上的.如果这个手机之前没有安装过这个app, 那么这个app 能够被正确的安装.

签名的时候可以生成一个存储自己开发信息的密钥,之后对重打包的apps 全部重新签名


签名的具体步骤如下所示:

命令:

keytool -genkey -v -keystore android.keystore -alias android kwyalg RSA -validity 30000

方法的说明:

keytool -genkey -v keystore (生成的密钥名称) -alias (密钥别名) -keyalg (加密的算法,可以选择,RSA,sha1,sha256)

一般选择sha256 会出现一般问题, Android 4.2 之前开发的app 只 支持 sha1,用sha256 会出现错误.现在不知道版本对RSA 会不会有问题.

给密钥重新起一个别名不是必须的, 如果你用了别名,在之后用我们的密钥加密的时候, 你就必须要用这个别名,否者就回报错. 后面举例子

在这里我们的密钥就是 android.keystore. 这个密钥的别名就是android
使用的加密算法是RSA

-validity 后面跟的是我们的app 的有效的天数

Android Market强制要求全部应用程序数字证书的有效期要持续到2033年10月22日以后

运行这个命令之后,系统会让你自己输入一堆个人信息,你的名字,你的公司,国家,等等一些信息,以及你的密码.这个密码在之后签名会要使用到,所以你要记录下来.

签名的命令:
jarsigner -verbose -keystore (上面生成的密钥名称) -signedjar (签名后的APK路径) (签名前的APK路径) (密钥android.keystore的别名)

这里就须要上面设置的password



实现的代码

#!/usr/bin/env python
# coding=utf-8
# Author   :  Chicho
# Date     :  2019-07-10
# function :  1. decompile apks 2. modify the AndroidManifest.xml file
#          :  3. recompile the apks 4. sign the apks 


import os
import xml.dom.minidom
from  xml.dom.minidom import parse
#import time
import sys
import pyautogui
import subprocess


appPath = "/home/chicho/workspace/assibility/apks/"

apkPath = "/home/chicho/workspace/assibility/apktoolOut/"

keyPath = "/home/chicho/workspace/assibility/repackage/coolapk.keystore"

repackagedAppPath = "/home/chicho/workspace/assibility/repackage/repackagedapp/"

if not os.path.exists(apkPath):
    os.makedirs(apkPath)

def decompile():

    appList = os.listdir(appPath)

    for app in appList:
        eachappPath = os.path.join(appPath,app)
        apkname = app.split(".")[0]
        apktoolPath = os.path.join(apkPath,apkname)

        cmd = "apktool -r d {0} -o {1}".format(eachappPath,apktoolPath)
        try:
            os.system(cmd)
        except:
            cmd = "echo {0}>>{1}".format(app,"wrongDecompile")
            os.system(cmd)
            continue



def recompile():

    apkList = os.listdir(apkPath)

    for apk in apkList:
        eachapkPath = os.path.join(apkPath,apk)

        cmd = "apktool b {0}".format(eachapkPath)
        try:
            os.system(cmd)
        except:
            cmd = "echo {0}>>{1}".format(apk,"wrongRecompile")
            os.system(cmd)
            continue



def modifyapp():
	pass

  

            


def  sign_apk():
    
    repackappList = os.listdir(apkPath)

    for repackapp in repackappList:
        repackName = repackapp + ".apk"
        resign_appName = repackapp + "_sign" + ".apk"
        repackAppPath = os.path.join(apkPath,repackapp,"dist",repackName)
        sign_apk = os.path.join(repackagedAppPath,resign_appName)
        
        
        read, write = os.pipe()
        os.write(write,'123456')
        os.close(write)
        
        cmd = "jarsigner -verbose -keystore {0} -signedjar {1} {2} {3}".format(keyPath,sign_apk,repackAppPath,"coolapk")
#        subprocess.call(cmd,stdin=read)    
        cmd1 = "echo '123456\r'|{0} ".format(cmd)
        try:
            os.system(cmd1)
        except:
            cmd = "echo {0} >>{1}".format(repackapp,"wrongSign")
            continue 

        
#        os.system(cmd)
#        pyautogui.typewrite('123456')
    



def rename():

    appList = os.listdir(repackagedAppPath)

    for app in appList:

        oldNamePath = os.path.join(repackagedAppPath,app)
        appName = app.split("_")[0] + ".apk"
        newNamePath = os.path.join(repackagedAppPath,appName)

        os.rename(oldNamePath,newNamePath)

decompile()
modifyapp()
recompile()
sign_apk()
rename()


print "all work is done!"  


在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值