首页 > 代码库 > 跟着鬼哥学PyQtPart.2

跟着鬼哥学PyQtPart.2

<span style="font-family: Arial, Helvetica, sans-serif;">0x1:</span><span style="font-family: 宋体;">简述</span>

经过第一篇的简单布局以后,我们来考虑是否可以放上一个按钮,来执行相关的动作呢?答案是肯定可以的,经过测试,已经简单整理一个按钮的点击事件响应,来执行反编译动作。这里将学习过程记录一下。


0x2:思考过程

我们想要做反编译的动作,首先是要准备反编译所需要的相关东西。所以我们下载apktool.jar来执行相关动作,我这里采用的是一个朋友编译的1.5版本的apktool,相关网址为:

http://bbs.chinaunix.net/thread-4096302-1-1.html

使用apktool.jar的命令即可,我们可以用Python来执行cmd的命令的,所以这个是可以实现的。

这个方法处理好以后,就是需要跟按钮点击事件关联起来即可。那么下面我们就分开实现这个。


0x3:反编译方法的实现


import os

#####设置apk路径,我们这里先使用固定路径#####

apk_path=os.getcwd()+"\\aa.apk"

def apkD(apk_path):

    ###打印一下路径,看看是否正确#####
    print(apk_path)

    ###apktool的命令使用#####
    apkToD='java -jar apktool.jar d '+apk_path

    ###查看一下命令,是否正确,有写错###
    print(apkToD)

    ###调用os的system命令来执行cmd的相关命令###
    os.system(apkToD)

apkD(apk_path)


代码中已经写清楚了详细的注释,这里我们可以看一下截图,证明我们的方法是有效的:









我们现在已经可以实现这个功能了,即使用apktool.jar的命令,在命令行下来实现,也是比较简单的,只要配置好java的环境变量即可,那么下一步我们就开始编写一个按钮,实现简单的鼠标点击事件。

 

0x4:鼠标点击事件的实现



import sys
import os
from PyQt4 import QtGui
from PyQt4 import QtCore

###apk的位置,当前类下,我们这里先放到当前文件所在目录###
apk_path=os.getcwd()+"\\aa.apk"

################################# 自定义窗口类 #####################################
class MyWindow(QtGui.QWidget):
    '''自定义窗口类'''
    ############################# 构造、析构函数 #################################
    def __init__(self,parent=None):
        '''构造函数'''
        # 调用父类构造函数
        super(MyWindow,self).__init__(parent)
        # 设置窗口固定尺寸
        self.setFixedSize(QtCore.QSize(800,600))
        # 创建主控件
        bodyWidget = QtGui.QWidget(self)
        # 创建主布局
        mainLayout = QtGui.QVBoxLayout(bodyWidget)

        # 创建自定义按钮
        button = MyButton(self)
        # 设置文本内容
        button.setText("Apk_Decode")
        # 添加控件
        mainLayout.addWidget(button)
        # 设置按钮点击连接槽函数
        button.clicked.connect(self.OnClick)
    ############################### 命令 ########################################
    def OnClick(self):
        '''响应点击'''
        QtGui.QMessageBox.about(self,"apk_d","apk is decoding")

        
    ################################ 事件 ########################################
    def mousePressEvent(self,event):
        '''鼠标按下事件'''
        # 判断是否为鼠标左键按下
        if event.button() == QtCore.Qt.LeftButton:
            # 设置窗口背景颜色
            self.setStyleSheet('''''')

            

        
        
################################## 自定义按钮类 ####################################
class MyButton(QtGui.QToolButton):
    '''自定义按钮类'''
    ############################## 构造、析构函数 ##################################
    def __init__(self,parent=None):
        '''构造函数'''
        # 调用父类构造函数
        super(MyButton,self).__init__(parent)
        # 设置按钮尺寸
        self.setFixedSize(QtCore.QSize(800,120))
        # 设置按钮背景颜色
        self.setStyleSheet('''background-color:red;''')
    ################################ 事件 #########################################
    def mousePressEvent(self,event):
        '''鼠标按下事件'''
        # 判断是否为鼠标左键按下
        if event.button() == QtCore.Qt.LeftButton:
            # 发射点击信号
            self.clicked.emit(True)
            # 传递至父窗口响应鼠标按下事件
            self.parent().mousePressEvent(event)
        
################################## 主函数 ##########################################
if __name__ == "__main__":
    '''主函数'''
    # 声明变量
    app = QtGui.QApplication(sys.argv)
    # 创建窗口
    window = MyWindow()
    # 设置窗口显示
    window.show()
    #应用程序事件循环
    sys.exit(app.exec_())




代码中有详细的注释,这里是效果截图:







点击apk_decode按钮,会弹出一个对话框提示正在反编译,说明我们已经将按钮的点击事件写上了,然后下一步我们就是将反编译的方法加上,并且对应放到按钮的点击事件里面。

 

0x5:整合两处代码

 

详细代码如下:



import sys
import os
from PyQt4 import QtGui
from PyQt4 import QtCore

###apk的位置,当前类下,我们这里先放到当前文件所在目录###
apk_path=os.getcwd()+"\\aa.apk"

################################# 自定义窗口类 #####################################
class MyWindow(QtGui.QWidget):
    '''自定义窗口类'''
    ############################# 构造、析构函数 #################################
    def __init__(self,parent=None):
        '''构造函数'''
        # 调用父类构造函数
        super(MyWindow,self).__init__(parent)
        # 设置窗口固定尺寸
        self.setFixedSize(QtCore.QSize(800,600))
        # 创建主控件
        bodyWidget = QtGui.QWidget(self)
        # 创建主布局
        mainLayout = QtGui.QVBoxLayout(bodyWidget)

        # 创建自定义按钮
        button = MyButton(self)
        # 设置文本内容
        button.setText("Apk_Decode")
        # 添加控件
        mainLayout.addWidget(button)
        # 设置按钮点击连接槽函数
        button.clicked.connect(self.OnClick)
    ############################### 命令 ########################################
    def OnClick(self):
        '''响应点击'''
        QtGui.QMessageBox.about(self,"apk_d","apk is decoding")

    ############################### 反编译方法 ########################################
    def apk_decode(self,path):
        print(path)
        apkToD='java -jar apktool.jar d '+path
        print(apkToD)
        os.system(apkToD)
        
    ################################ 事件 ########################################
    def mousePressEvent(self,event):
        '''鼠标按下事件'''
        # 判断是否为鼠标左键按下
        if event.button() == QtCore.Qt.LeftButton:
            # 设置窗口背景颜色
            self.setStyleSheet('''''')
            self.apk_decode(apk_path)
            

        
        
################################## 自定义按钮类 ####################################
class MyButton(QtGui.QToolButton):
    '''自定义按钮类'''
    ############################## 构造、析构函数 ##################################
    def __init__(self,parent=None):
        '''构造函数'''
        # 调用父类构造函数
        super(MyButton,self).__init__(parent)
        # 设置按钮尺寸
        self.setFixedSize(QtCore.QSize(800,120))
        # 设置按钮背景颜色
        self.setStyleSheet('''background-color:red;''')
    ################################ 事件 #########################################
    def mousePressEvent(self,event):
        '''鼠标按下事件'''
        # 判断是否为鼠标左键按下
        if event.button() == QtCore.Qt.LeftButton:
            # 发射点击信号
            self.clicked.emit(True)
            # 传递至父窗口响应鼠标按下事件
            self.parent().mousePressEvent(event)
        
################################## 主函数 ##########################################
if __name__ == "__main__":
    '''主函数'''
    # 声明变量
    app = QtGui.QApplication(sys.argv)
    # 创建窗口
    window = MyWindow()
    # 设置窗口显示
    window.show()
    #应用程序事件循环
    sys.exit(app.exec_())











看到这个截图,可以发现我们已经成功实现了点击按钮实现反编译的功能了。

0x6:总结

上面我们已经可以简单实现按钮的反编译了,毕竟没有白白浪费时间,证明我们是可以做一个反编译工具的,那么平时操作中,我们肯定不会是在代码中写死apk的路径的。常用的方法是加一个选择apk路径的window,然后选定apk,这样来确定apk所在的路径的。那么下一篇我们就一起来探索如何实现这个功能。

中秋第二天,下午就在探索中度过了。。。

祝福大家中秋愉快~~~

上面代码都是完整代码,所以本篇不再上传到网盘了,大家直接复制代码测试使用即可,欢迎有兴趣的大神交流指导~~~

 

破解群:,爱鬼哥

爱破解,爱鬼哥 :377724636



跟着鬼哥学PyQtPart.2