序言:

可以利用Python来写一些工具来提高工作效率。把重复繁琐机械化的事情交给Python脚本去完成。
这里利用Python来写一个反编译和重签名的工具。

一、Python及工具的安装

工欲善其事必先利其器。首先下载并安装Python和对应的开发工具。
Python的安装
进入官网的Downloads下载界面选择对应的python版本。
其中executable表示可执行版,需要安装后使用。embeddable表示嵌入版,就是解压以后就可以使用的版本。推荐使用executable可执行版本,一直默认即可。
然后配置环境变量,在“电脑”–>“属性”–>“高级系统设置”–>“环境变量” -->“Path” 中新增Python的安装路径。路径一般如下:
Python:C:\Users\Administrator\AppData\Local\Programs\Python\Python37
pip:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts
最后,打开 cmd,输入python 测试是否安装成功,出现Python XXX 即安装成功

Python的开发工具
Python的开发工具有Pycharm、VS code。或者直接使用Notepad++硬敲。
Pycharm的安装
Pycharm的下载地址。Pycharm有专业版和社区版两种。专业版是收费的,需要破解。社区版是免费的,直接安装就完事了。专业版和社区版的区别: 专业版比社区版多了Web开发、Python Web框架、Python分析器、远程开发、支持数据库与SQL等功能。
安装时注意勾选下面两个选项,其他就一直Next就好了。

VS code开发工具
如果不想使用Pycharm,也可以使用VS code。官网下载地址。VS的安装非常便捷,只要点击确定,并选择你需要的语言即可。

二、反编译脚本

1、apktool工具

Android的反编译可以使用apktool工具。提取码:fcev
apktool的简单使用:
apktool d [apkFile] -f -o [outputDir]
d —— 代表操作是反编译解包(b 代表回编译)
[apkFile] —— 需要解包的apk路径, 例如C:\1.apk
-f —— 强制覆盖,若outputDir路径已经存在,会清空outputDir指向的文件夹内的所有内容
-o —— 指定输出目录为紧跟在-o后的路径, 即[outputDir]
[outputDir] —— 输出的路径,例如C:\output

2、Python反编译脚本

新建一个apktool.py,编写反编译、回编译和签名方法。
反编译:apktool d [apkFile] -f -o [outputDir]
回编译:apktool b [apkFile] -f -o [outputDir]
签名:可以使用jarsigner。
jarsigner是JDK提供的针对jar包签名的通用工具。
jarsigner -verbose -keystore [signFile] -signedjar [outputApk] [inputApk] [signAccount]
示例代码:

#coding: utf-8
#Created by yeliang23 on 2018/6/19.
import sys
import os
import subprocess
from base import handle_file#初始化
def init(root):global root_apktool,jdkroot #定义为全局变量root_apktool = root+"/base/apktool" #反编译工具apktool根目录jdkroot=root+"/base/jdk1.8.0" #JDK根目录global default_signFile,default_account,default_password #默认签名信息default_signFile=root_apktool+"/demo.keystore" #签名文件路径default_account="xxxxxx" #秘钥的账号default_password="xxxxxx" #秘钥的密码#反编译
def Dcode(input):output=input.split('.')[0]+'-file'ResultFile=os.system('java -jar '+root_apktool+"/apktool_bsf.jar" +' d -f '+input+" -o "+output)if ResultFile==0:return 'Success'else:return 'Fail'#回编译
def Code(input):ResultFile=os.system('java -jar '+root_apktool+"/apktool_bsf.jar" +' b -f '+input)if ResultFile==0:return 'Success'else:return 'Fail'#签名
#参数:
#jdkroot:JDK所在的位置
#inkeystore:秘钥的路径
#input:需要签名的APK路径
#output:生成的APK路劲
#account和password:秘钥的账号和密码
#详情:
#jarsigner.exe 为jdk自带的文件,通常在jdk安装目录的bin文件夹下
#例如:C:\Program Files\Java\jdk1.8.0_162\bin
#-verbose:签名/验证时输出详细信息
#-keystore:密钥的位置
#-storepass:秘钥的密码
def Sign(inkeystore,input,output,account,password):order=jdkroot+'/bin/jarsigner -verbose -keystore '+inkeystore+" -signedjar " +output+" "+input+" "+account+" -storepass "+passwordos.system(order)def Sign_haveback(input):output=input.split('.')[0]+'_sign.apk'order=jdkroot+'/bin/jarsigner -verbose -keystore '+default_signFile+" -signedjar " +output+" "+input+" "+default_account+" -storepass "+default_passwordResultFile=os.system(order)if ResultFile==0:return 'Success'else:return 'Fail'def test():#反编译输入APK和输出文件夹input="C:/Users/Administrator/Desktop/Decompile/test/apktool_test/Demo.apk"output="C:/Users/Administrator/Desktop/Decompile/test/apktool_test/Demo-file"#签名的各个参数signFile=default_signFile #签名文件路径signInput="C:/Users/Administrator/Desktop/Decompile/test/apktool_test/Demo.apk" #需要签名的apksignOutput="C:/Users/Administrator/Desktop/Decompile/test/apktool_test/s_Demo.apk" #签名完成的apkaccount=default_account #秘钥的账号password=default_password #秘钥的密码#测试Dcode(input,output) #反编译Code(output) #回编译Sign(signFile,signInput,signOutput,account,password) #签名if '__main__' == __name__:test()print('apktool')

然后再写MainTool.py作为主入口调用各种py脚本,虽然现在只有一个反编译的脚本。
通过 from base import apktool 导入base文件夹下的apktool.py。如果是同文件夹下的就只要import就可以了。
示例代码:

#coding: utf-8
#Created by yeliang23 on 2018/6/19.import sys
import os
from base import handle_file
from base import apktooldef init():root = os.getcwd() #文件夹根目录apktool.init(root)#测试各个模块
def moduletest(root):handle_file.test(root) #文件读写测试apktool.test() #反编译、回编译与签名测试if '__main__' == __name__:print("========Python Start========")init() #初始化in_temp=input("请输入指令:(F:反编译,H:回编译+签名,Q:签名)\n")if in_temp == "F":print("===正在执行反编译===")in_apk=input("请输入需要反编译的APK:\n")apktool.Dcode(in_apk)elif in_temp == "H":print("===正在执行回编译===")in_file=input("请输入需要回编译的文件夹:\n")apktool.Code(in_file)for file in os.listdir(in_file+'/dist'):apkname=fileprint('apkname='+apkname)apktool.Sign(in_file+'/dist/'+apkname)elif in_temp == "Q":print("===正在执行签名===")in_apk=input("请输入需要签名的apk:\n")apktool.Sign(in_apk)else:print("===请输入对应的指令===")print("========Python End========")input("=按任意键关闭=")

运行结果为:

三、反编译界面

反编译工具到此就可以使用,算完成了。但CMD界面看起来也太挫了,可以为反编译工具写个界面。
界面编写可以使用界面设计工具 Qt Designer。

1、Qt Designer的安装

使用pip安装:(打开CMD输入以下代码)
1)、安装PyQt5: pip install pyqt5
2)、安装Qt工具: pip install pyqt5-tools
3)、配置Qt工具系统环境变量: Path
路径一般在:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\pyqt5_tools 具体可以查看自己安装时的目录
4)、在cmd界面输入 designer 即可启动Qt Designer。

2、Qt Designer的基本使用

1)主界面不同区域的介绍

1、 控件工具箱
各种基本控件,可以把控件直接拖动到界面生成。
1)显示控件
Lable:文本标签,显示文本,一般用于标记控件。
Text Browser:显示文本控件。一般用于后台命令执行结果显示。
2)输入控件
Line Edit:单行文本框,输入单行字符串。
控件使用Text() 返回文本框内容。setText() 设置文本框显示内容。
Text Edit:多行文本框,输入多行字符串。
Plain Text Edit:
Combo Box:下拉列表框。

3)按钮控件
Push Button:命令按钮,一般用于确定,取消等普通按钮。
Tool Button:工具按钮,
arrowType :有五种类型,分别为上下左右(箭头)和更多(…)。
autoRaise :只有true和false,true隐藏按键背景,默认为false。
popupMode:用于设置点击按钮时弹出下拉菜单。 使用setMenu方法设置菜单。 三个参数, DelayedPopup 需要长按一段时间再弹出下拉菜单。 InstantPopup 无需长按立马弹出下拉菜单。MenuButtonPopup 在按键傍边生成下拉菜单按钮。
toolButtonStyle:有五种类型。 ToolButtonIconOnly 只显示图标,不显示文字。 ToolButtonTextOnly 只显示文字,不显示图标。 ToolButtonTextBesideIcon 文字显示在图标的旁边。 ToolButtonTextUnderIcon 文本显示在图标下边。 ToolButtonFollowStyle 根据QStyle::StyleHint进行设置。
Radio Button:单选框按钮。
Check Box:多选框按钮。
Command Link Button :命令链接按钮

2、创建窗口
用于创建窗口, 模板选项中最常用的就是Widget(通用窗口)和MainWindow(主窗口)。

3、对象查看器
用于查看主窗口放置的对象,并可以对对象进行重命名修改 和 删除。

4、属性编辑器
用于提供对窗口、控件、布局的属性编辑功能。比如修改控件的显示文本、对象名、大小等。

5、信号/槽编辑器
用于编辑控件的信号和槽函数,也可以添加自定义的信号和槽函数。

3、创建反编译界面

1)、 通过双击菜单栏的Type Here可以添加一级菜单。点击一级菜单中的+号,可以添加二级菜单。
示例:

2)、 使用 Lable 、Plain Text Edit 和 Push Button 组成反编译界面。
新建MainWindow,设置菜单,把对应的控件拖到界面上。重命名对应控件对象的名字,控件的名字需要使用有意义的名字,因为后续需要使用。
新建Widget,用于提示。
示例:

3)、 生成py文件
保存,此时会生成一个xxx.ui文件。需要使用 pyuic5 -o [xxx.py] [xxx.ui] 进行格式转换。
示例:
4)、 使用界面py文件
把主界面py文件和提示py文件放到ui文件夹下,修改MainTool.py。
示例代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication #导入PyQt5相关资源
from ui import decompile_mainUI #导入反编译的主界面def init():root = os.getcwd() #文件夹根目录#主界面UI
class decompile_mainUI_Desiger(QMainWindow, decompile_mainUI.Ui_MainWindow):def __init__(self, parent=None):super(decompile_mainUI_Desiger, self).__init__(parent)self.setupUi(self)if __name__ == "__main__":init() #初始化app = QApplication(sys.argv) #固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行decompile_main_ui = decompile_mainUI_Desiger()decompile_main_ui.show() #显示sys.exit(app.exec_()) #程序运行,sys.exit方法确保程序完整退出。
    这样就能显示界面了,但是这仅仅是一个界面,还不具备任何功能。还需要把反编译脚本加进来。示例代码:
#coding: utf-8
#Created by yeliang23 on 2018/6/19.import sys
import os
import threading
import time
from base import handle_file
from base import apktool
from PyQt5.QtWidgets import QMainWindow, QApplication #导入PyQt5相关资源
from PyQt5 import QtCore, QtGui, QtWidgets
from ui import decompile_mainUI #导入反编译的主界面
from ui import tipsUI #导入提示界面def init():root = os.getcwd() #文件夹根目录apktool.init(root)#提示语
def tipsUItxt(result,Success,Fail,Unknown):if result == 'Success':tips.setText(Success)elif result == 'Fail':tips.setText(Fail)else:tips.setText(Unknown)#反编译
def decompiles(address):result=apktool.Dcode_haveback(address)tipsUItxt(result,'反编译成功','反编译失败','遇到未知错误')#回编译
def compiles(address):result=apktool.Code_haveback(address)tipsUItxt(result,'回编译成功','回编译失败','遇到未知错误')#签名
def sign(address):result=apktool.Sign_haveback(address)tipsUItxt(result,'签名成功','签名失败','遇到未知错误')#提示界面
class tipsUI_Desiger(QMainWindow, tipsUI.Ui_Form):def __init__(self, parent=None):super(tipsUI_Desiger, self).__init__(parent)self.setupUi(self)def setText(self,txt):self.progress_tips_text.setText(txt)#主界面
class decompile_mainUI_Desiger(QMainWindow, decompile_mainUI.Ui_MainWindow):def __init__(self, parent=None):super(decompile_mainUI_Desiger, self).__init__(parent)self.setupUi(self)self.Decompile_Button.clicked.connect(self.decompileBut) #监听点击事件(反编译)self.Compile_Button.clicked.connect(self.compileBut) # 回编译self.Sign_Button.clicked.connect(self.signBut) # 签名def decompileBut(self): #点击事件(反编译)address = self.Decompile_Edit.toPlainText() #获取输入框内容if '///' in address: #拖拉进来的文件都带有“file:///”,要把它去掉address = address.split('///')[1]tips.setText('  请稍等......') #设置提示语tips.show() #弹出提示decompilesThread = threading.Thread(target=decompiles, args=(address,))decompilesThread.start() #新开一个线程 调用反编译方法#decompilesThread.join() #等待反编译结束def compileBut(self): #回编译address = self.Compile_Edit.toPlainText()if '///' in address:address = address.split('///')[1]tips.setText('  请稍等......')tips.show()CompilesThread = threading.Thread(target=compiles, args=(address,))CompilesThread.start()#decompilesThread.join()def signBut(self): #签名signfile_address = self.SignFile_Edit.toPlainText()if len(signfile_address) == 0:address = self.Sign_Edit.toPlainText()if '///' in address:address = address.split('///')[1]tips.setText('  请稍等......')tips.show()SignThread = threading.Thread(target=sign, args=(address,))SignThread.start()#decompilesThread.join()else:tips.setText('暂不支持更换签名')tips.show()  if __name__ == "__main__":init() #初始化app = QApplication(sys.argv) #固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行decompile_main_ui = decompile_mainUI_Desiger()tips = tipsUI_Desiger()decompile_main_ui.show()sys.exit(app.exec_()) #程序运行,sys.exit方法确保程序完整退出。

最终结果:(虽然还是有点挫)

四、打包成exe

打包成exe可以方便其他没有安装Python的小伙伴使用。
1、安装pyinstaller,打开cmd使用pip安装
pip install pyinstaller
出现 Successefully installed pip-xx.xx.xx 即安装成功
2、使用pyinstaller打包exe
pyinstaller [xxx.py]
只需要转换MainTool.py即可,因为pyinstaller会分析MainTool.py所依赖的其它依赖,然后进行查找、复制,把所有相关的依赖都收集起来并惊醒加密处理,包括python解释器,最后把这些文件放在一个目录下,或者打包到一个可执行文件。然后就可以直接运行所生成的可执行文件了。
常用参数:
-F : 表示生成单个可执行文件,常用。
-w :表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示可执行文件的图标。注意:图片后缀必须是.ico
-c :使用控制台,无窗口(默认)
-D:创建一个目录,包含EXE文件,但会依赖很多文件(默认选项)

示例:
打开cmd,输入(如果需要控制台窗口,可以把-w去掉)
cd C:\Users\Administrator\Desktop\DecompileToWin
pyinstaller.exe -F C:\Users\Administrator\Desktop\DecompileToWin\MainToolUI.py -w
成功后会生成dist文件夹,把dist文件夹中的资源复制到DecompileToWin(即根目录)即可。

Python制作反编译APK工具相关推荐

  1. 可视化反编译APK工具,查看部分JAVA代码与全部资源文件。

    ###前言 APK是安卓安装包,里面主要就是两大部分 资源文件,主要是图片与布局. dex文件,也就是各种代码转换成的Android可执行文件. 如果直接ZIP打开混淆打包过的APK的话,会出现dex ...

  2. APK反编译得工具总结(转载)

    Android反编译技术总结 转自UncleChen's Blog,作者:UncleChen 一.Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后 ...

  3. python防反编译_用Python和Smali模拟器搞定一个加混淆、防篡改的APK逆向

    这个周末我和好友聊天时,他向我求助修改一个他正在编写Python脚本.他试图通过解混淆一个APK,来理解该APK的混淆基址和防篡改保护机制.同我以往的APK逆向过程(dex2jar->jd-gu ...

  4. python脚本转换成apk_apktool反编译apk并回编译

    apktool反编译apk并回编译 下载apktool工具: apktool官方网站:https://ibotpeaches.github.io/Apktool/ 安装apktool并配置apktoo ...

  5. ubuntu下使用反编译apk,工具dex2jar和jd-gui

    ubuntu下使用反编译apk, 工具 1.首先使用dex2jar反编译 下载地址(建议下载最新版本,防止出现bug):http://code.google.com/p/dex2jar/downloa ...

  6. android 反编译 2017,反编译Apk入门工具合集

    反编译Apk入门工具合集,是小编自用的一套apk逆工程操作工具,它可以帮助用户快速进行apk的脱壳拆包,进行相关文件的浏览操作和修改,让用户可以轻松上手,完成apk逆工程处理! 使用说明: 1.反编译 ...

  7. Apktool工具 - 反编译apk和重新编译apk

    目录 1. 下载apktool.jar 2. 创建apktool.bat文件 3. 反编译apk 4. 编译apk 5. apk进行签名 1. 下载apktool.jar   Apktool官网:ht ...

  8. mac平台反编译apk,获取源码,androidmanifest和资源文件

    "提供一个反编译apk的工具" 在window上反编译apk是比较容易的事情,但是在mac上就需要稍微费力一些,这里为了方便大家,特意提供了一个python脚本,实现快速反编译ap ...

  9. 反编译 逆向工具集合

    Java & Jar (Android) jd-gui jar包浏览工具,对应的IDE插件,JD-Eclipse/JD-IntelliJ Luyten An Open Source Java ...

  10. 用apktool批量反编译apk文件

    写在前面的话 这个是一个十分简单的脚本,非常简单.为什么要写,因为我是来骗分数的. 应用场景 主机上有一堆APK文件,是按照类别分好的,现在用apktool 反编译它们,然后在按照类别和apk的名字来 ...

最新文章

  1. Docker镜像、容器数据卷和Dockerfile
  2. windows无法连接到打印机 操作失败,错误为0x00000002 解决方案
  3. 简单了解一下函数模板
  4. IIS Form 认证 保护HTML页面
  5. (筆記) 如何在字串中從指定字元抓到指定字元(pointer版)?
  6. P2580-于是他错误的点名开始了【Trie,字符串】
  7. ubuntu安装后需了解的基本操作
  8. 《Python 黑科技》10万粉丝头像千图成像(撩对象)
  9. TVM:通过Python接口(AutoTVM)来编译和优化模型
  10. Google数据集搜索神器上线,和搜索论文一样简单 | 还不去训练网络?
  11. BZOJ4407 :于神之怒加强版
  12. ORACLE 随机数 dbms_random
  13. java.io.Serializab接口
  14. CAD必备插件分享 快速提高工作效率
  15. 打包contrail-setup
  16. 家庭智能网络防盗及远程实时监控系统
  17. excel随机数_利用excel快速凭空制造大量随机数据?想要制造什么数据都可以
  18. twm配置文件.twmrc
  19. 【原创】自制操作系统知识储备(一)---流程篇
  20. C语言单元测试---cunit(一) ---- 博客经典;

热门文章

  1. MIT Scheme编译scm文件
  2. CMM3学习笔记二—工程类PA之需求管理(REQM)
  3. Android8.1 源码添加黑名单拦截电话和短信记录
  4. 【学习笔记】尚硅谷-AJAX
  5. 美团外卖返利小程序-饿了么外卖返利公众号系统– 程序侠
  6. 全国行政区划代码(json版)
  7. html360se,360浏览器发布SE版本
  8. 基于Python的信用评分卡模型分析(强烈推荐)
  9. 【正点原子MP157连载】第六章STM32Cube固件包-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  10. linux入门常用命令