APK反编译工具_exe反编译工具

APK反编译工具_exe反编译工具序言:可以利用Python来写一些工具来提高工作效率。把重复繁琐机械化的事情交给Python脚本去完成。这里利用Python来写一个反编译和重签名的工具。一、Python及工具的安装工欲善其事必先利其器。首先下载并安装Python和对应的开发工具。Python的安装进入官网的Downloads下载界面选择对应的python版本。其中executable表示可执行版,需要安装后使用。e…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

序言:

可以利用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 "+password
os.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_password
ResultFile=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" #需要签名的apk
signOutput="C:/Users/Administrator/Desktop/Decompile/test/apktool_test/s_Demo.apk" #签名完成的apk
account=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 apktool
def 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=file
print('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(即根目录)即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192238.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Git创建远程分支并提交代码到远程分支[通俗易懂]

    Git创建远程分支并提交代码到远程分支[通俗易懂]1、可以通过gitbranch-r命令查看远端库的分支情况如图所示,远程仓库只有一个master分支2、从已有的分支创建新的分支(如从master分支),创建一个dev分支但此时并没有在远程仓库上创建分支如图所示还是只有一个master分支3、建立本地到远端仓库的链接–这样代码才能提交上去使用命令行gitpush–set-…

  • 虚函数 inline函数

    虚函数 inline函数一、首先回顾下什么是虚函数及其作用,以便更好理解什么函数不能声明或定义为虚函数:1.定义:虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:  virtual函数返回值类型虚函数名(形参表)  {函数体}2.作用:虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合

  • Linux解压文件到指定目录

    Linux解压文件到指定目录tar在Linux上是常用的打包、压缩、加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数参数:-c:create建立压缩档案的参数;-x:解压缩压缩档案的参数;-z:是否需要用gzip压缩;-v:压缩的过程中显示档案;-f:置顶文档名,在f后面立即接文件名,不能再加参数举例:一,将整个/home/www/images目录下的文件全

  • sql注入orderby子句的功能_sql group by order by一起用

    sql注入orderby子句的功能_sql group by order by一起用uniqueidentifier全局唯一标识符(GUID)。注释uniqueidentifier数据类型的列或局部变量可用两种方法初始化为一个值:使用NEWID函数。将字符串常量转换为如下形式(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中

  • 和第三方接口对接总结

    和第三方接口对接总结接口对接分为两种形式:我方A公司提供接口给B公司,B公司进行一些操作时调用我们的接口进行实现。例:A开发会员等级同步接口,供B同步会员等级到B系统。B会员等级的变动需要调用A接口主动推送给A(即更新会员卡等级)。我们首先要做的就是按照对方的要求,在对方调用我们的接口,我方成功处理之后,按照对方所需要的返回数据以及格式反馈给他们信息。在写本接口中,因为我们会员卡等级的字段是不一样的,所…

  • 数据库建模工具有哪些(uml类图工具)

          SybasePowerDesigner -一个高端数据建模工具。你可以下载一个45天试用版。ERWin -一个高端数据建模工具。可下载试用版。RationalRoseEnterprise -一个高端UML工具,恰如其分的数据库建模支持。可下载试用版。VisioProfessional -一个价格低廉的绘图工具,可用来生成数据模型、UML图等。企业版还支持针…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号