中秋假期转眼已经过去两天了,我们的学习也在不断向前,经过前面三篇文章的学习,我们已经可以做出来一个简单的反编译apk的工具了。

为了更方便的使用我们自己编写的工具,所以我们对于第三篇文章中的search_file button来进行处理,我们使用拖拽文件到QLineEdit控件上面来显示文件路径,而不用打开window来选择了,这样对我们的操作来说更加方便一点。

0x1:拖拽事件的处理

拖拽事件,经过一晚上的查询以及翻看Java已经写好的工具,终于找到dragEnterEvent和dropEvent两个事件。关于这两个事件的详细介绍,自行google搜索一下即可。

要想使用这个事件,我们需要重写一下QLineEdit控件,并且在其init方法里面设置setAcceptDrops为True来接收拖拽事件。

所以现在的问题就是我们如何来获取得到拖入文件的路径呢?

经过查询mimeData有一些方法可以参考,经过测试,urls()属性还是比较贴近我们所需的,但是还需要对其进行处理得到文件路径。

详细代码如下:

def dropEvent(self, event):###获取拖放过来的文件的路径st=str(event.mimeData().urls())print(st)###这里没发现好的api,所以用mimeData()的urls属性了,text()不好用,所以下面就是字符串截取,来还原路径a='///'b=')]'num2=st.index(b)-1num=st.index(a)+3st=st[num:num2]##这里定义全局变量,拖入文件或者文件夹的路径global APK_STRAPK_STR=stself.setText(st)

0x2:重新做一下布局文件

详细代码如下,有详细注释,这里不再多说:

 QWidget.__init__(self, parent)self.setWindowTitle('Android_APK')###第一行self.apk_decode=QPushButton("Apk_Decode")self.apk_path_edit = MyEditText(self)###第二行,三个按钮,这里第三个按钮的点击事件还没写self.apk_build=QPushButton("Apk_Build")self.apk_build_edit = MyEditText()###第三行self.sign = QPushButton("Apk_Sign")self.apk_sign_edit = MyEditText()##第四行self.shootcut=QPushButton("Shoot_Cut")self.shootcut_text=QLabel("please keep moile with usb")###布局文件的编写,四行两列grid = QGridLayout()grid.setSpacing(10)grid.addWidget(self.apk_decode, 1, 0)grid.addWidget(self.apk_path_edit, 1, 1)grid.addWidget(self.apk_build, 2, 0)grid.addWidget(self.apk_build_edit, 2, 1)grid.addWidget(self.sign,3,0)grid.addWidget(self.apk_sign_edit, 3,1)grid.addWidget(self.shootcut,4,0)grid.addWidget(self.shootcut_text, 4,1)###设置窗口的高宽,将gridview放入大布局中self.setLayout(grid)self.resize(450, 300)

效果图如下:

0x3:整合相关按钮的点击事件

前面一篇文章已经将反编译的按钮事件做好,所以这里我们照着写一下回编译和签名以及最后的截屏事件即可。

def apkD(self):###上面openFIle方法中定义的全局变量,打印一下路径,看看是否正确#####print(APK_STR)###apktool的命令使用#####apkToD='java -jar apktool.jar d '+APK_STR###调用os的system命令来执行cmd的相关命令###os.system(apkToD)def apkB(self):###上面openFIle方法中定义的全局变量,打印一下路径,看看是否正确#####print(APK_STR)###apktool的命令使用#####apkToD='java -jar apktool.jar b '+APK_STR###调用os的system命令来执行cmd的相关命令###os.system(apkToD)def apkS(self):apkSign='java -jar signapk.jar testkey.x509.pem testkey.pk8 '+APK_STR+' Signed_apk.apk'print apkSign###调用os的system命令来执行cmd的相关命令###os.system(apkSign)def shootCut(self):pre_com='adb wait-for-device'os.system(pre_com)###将截图保存到local下fir_com='adb shell screencap -p /data/local/tmp/tmp.png'print (fir_com)os.system(fir_com)###当前时间,精确到秒,来保存图片命名timestamp = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))path=os.getcwd()###将其导出来sec_com='adb pull /data/local/tmp/tmp.png '+path+'\\'+timestamp+'.png'print(sec_com)os.system(sec_com)thi_com='adb shell rm /data/local/tmp/tmp.png'os.system(thi_com)

0x4:完整的代码

下面附上完整的代码,有兴趣的朋友,直接测试即可。记得先配置好pyqt相关开发环境。

# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import os
import timeclass MainLayout(QWidget):def __init__(self, parent=None):QWidget.__init__(self, parent)self.setWindowTitle('Android_APK')###第一行self.apk_decode=QPushButton("Apk_Decode")self.apk_path_edit = MyEditText(self)###第二行,三个按钮,这里第三个按钮的点击事件还没写self.apk_build=QPushButton("Apk_Build")self.apk_build_edit = MyEditText()###第三行self.sign = QPushButton("Apk_Sign")self.apk_sign_edit = MyEditText()##第四行self.shootcut=QPushButton("Shoot_Cut")self.shootcut_text=QLabel("please keep moile with usb")###反编译按钮的点击事件self.connect(self.apk_decode,SIGNAL('clicked()'),self.apkD)###回编译按钮的点击事件self.connect(self.apk_build,SIGNAL('clicked()'),self.apkB)###签名按钮的点击事件self.connect(self.sign,SIGNAL('clicked()'),self.apkS)###截屏按钮的点击事件self.connect(self.shootcut,SIGNAL('clicked()'),self.shootCut)###布局文件的编写,四行两列grid = QGridLayout()grid.setSpacing(10)grid.addWidget(self.apk_decode, 1, 0)grid.addWidget(self.apk_path_edit, 1, 1)grid.addWidget(self.apk_build, 2, 0)grid.addWidget(self.apk_build_edit, 2, 1)grid.addWidget(self.sign,3,0)grid.addWidget(self.apk_sign_edit, 3,1)grid.addWidget(self.shootcut,4,0)grid.addWidget(self.shootcut_text, 4,1)###设置窗口的高宽,将gridview放入大布局中self.setLayout(grid)self.resize(450, 300)''''def openFile(self):##调用QfileDialog的相关方法来打开文件选择框s=QFileDialog.getOpenFileName(self,"Open file dialog","/","Apk files(*.apk)")##定义全局变量,用于接收需要反编译的apk的路径global APK_STRAPK_STR=str(s)self.apk_path_edit.setText(APK_STR)'''def apkD(self):###上面openFIle方法中定义的全局变量,打印一下路径,看看是否正确#####print(APK_STR)###apktool的命令使用#####apkToD='java -jar apktool.jar d '+APK_STR###调用os的system命令来执行cmd的相关命令###os.system(apkToD)def apkB(self):###上面openFIle方法中定义的全局变量,打印一下路径,看看是否正确#####print(APK_STR)###apktool的命令使用#####apkToD='java -jar apktool.jar b '+APK_STR###调用os的system命令来执行cmd的相关命令###os.system(apkToD)def apkS(self):apkSign='java -jar signapk.jar testkey.x509.pem testkey.pk8 '+APK_STR+' Signed_apk.apk'print apkSign###调用os的system命令来执行cmd的相关命令###os.system(apkSign)def shootCut(self):pre_com='adb wait-for-device'os.system(pre_com)###将截图保存到local下fir_com='adb shell screencap -p /data/local/tmp/tmp.png'print (fir_com)os.system(fir_com)###当前时间,精确到秒,来保存图片命名timestamp = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))path=os.getcwd()###将其导出来sec_com='adb pull /data/local/tmp/tmp.png '+path+'\\'+timestamp+'.png'print(sec_com)os.system(sec_com)thi_com='adb shell rm /data/local/tmp/tmp.png'os.system(thi_com)class MyEditText(QLineEdit):def __init__(self,parent=None):super(MyEditText,self).__init__(parent)#这里在init初始化,接受拖入事件self.setAcceptDrops(True)###重写两个拖入文件的操作方法def dragEnterEvent(self,event):event.accept()def dropEvent(self, event):###获取拖放过来的文件的路径st=str(event.mimeData().urls())print(st)###这里没发现好的api,所以用mimeData()的urls属性了,text()不好用,所以下面就是字符串截取,来还原路径a='///'b=')]'num2=st.index(b)-1num=st.index(a)+3st=st[num:num2]##这里定义全局变量,拖入文件或者文件夹的路径global APK_STRAPK_STR=stself.setText(st)###程序的主入口
if __name__ == "__main__":       app = QApplication(sys.argv)qb = MainLayout()qb.show()sys.exit(app.exec_())

效果图,前面几篇基本都有了,这里不再贴出了。

注意:

1.反编译采用的是apktool.jar的命令,所以得将其放到.py文件对应目录

2.签名采用google的公钥来过的,所以其文件也必须在同目录下

3.截屏动作,得保证手机正常连接usb,adb进程不被占用,所以如果读者有自己编译的adb是最好的,若此功能不好用,直接做个cmd脚本将上述方法中的命令放入即可

4.这四篇文章,仅记录一下PyQt的相关学习过程,读者可以随意对其进行扩展开发,做一个IDE工具集合搜索,修改,保存以及一些自动化工具

结束语:

虽然中秋几天假期没有出去玩,不过从头开始学习PyQt还是有一些进步的。代码方面编写肯定是有很多疏漏,其对应功能方面也可以做更多优化,有兴趣的朋友,请继续加油。

仅以一句话勉励自己:

勤能补拙是良训,一分辛苦一分才。

相关附件之类的,我就上传到百度网盘了:

http://pan.baidu.com/s/1o6sONoQ

跟着鬼哥学PyQtPart.4相关推荐

  1. 跟着鬼哥学PyQtPart.2

    <span style="font-family: Arial, Helvetica, sans-serif;">0x1:</span><span s ...

  2. 跟着鬼哥学PyQtPart.3

    本文我们主要是创建一个window选择文件,从而来确定apk的路径,然后点击反编译按钮来对其进行反编译. 0x1:寻找相关api代码 QFileDialog类提供了类似的其他静态函数,如下表,通过这些 ...

  3. 跟着鬼哥学爬虫-10-python微信-5-加上了人工智能回复!

    跟着鬼哥学爬虫-10-python微信-5-加上了人工智能回复! 其实人工智能回复,现在网上有很多开源的机器学习,AI学习的框架,但是最重要的一点就是没有语料,也就是没有相互回答的数据内容. 所以这个 ...

  4. 跟着鬼哥学爬虫-5-更新妹子图库质量,提高微信群聊发图速度

    跟着鬼哥学爬虫-5-更新妹子图库质量,提高微信群聊发图速度 第三篇中的图库,群里大家都说质量稍微次一点,现在重新爬了个网站更新一下. 比上一篇的代码也优化了一点,对于自动保存的文件名,采用数字方式直接 ...

  5. 跟着鬼哥学so改动,二,进行篇

    图/文  听鬼哥说故事 继续上文的内容---------------------------------- 0x1:測试文件的编写 经过上一篇文章的基础学习,如今我们開始进行是用的部分. 既然我们能够 ...

  6. 跟着鬼哥学so改动,一,准备篇

    图/文 听鬼哥说故事 闲话少说,so的改动,重要性大家都知道,这里从头编写so文件,分析so文件,改动so文件,打算做一个系列的教程,当然,主要是看时间同意. android的sdk配置以及ndk环境 ...

  7. 跟着鬼哥学so修改,一,准备篇

    图/文 听鬼哥说故事 闲话少说,so的修改,重要性大家都知道,这里从头编写so文件,分析so文件,修改so文件,打算做一个系列的教程,当然,主要是看时间允许. android的sdk配置以及ndk环境 ...

  8. 跟着鬼哥学爬虫-3-美女图片!!!

    这一节课,是群里很多娃在等待的课程. 通过前面两篇文章的学习,我们对BeautifulSoup4的简单使用有了了解. 了解了使用这个爬虫的核心是熟悉分析清楚html标签,一些css的简单知识,找准了标 ...

  9. 跟着鬼哥学PyQt Part.1

    中秋几天不出去玩了,留在家里把PyQt的相关资料学习一下,这里仅记录一下学习的相关记录,留下存档,便于以后翻阅.主要的目的是编写一个反编译和回编译的工具,稍后可以慢慢随着需求补充上一些搜索和修改的功能 ...

最新文章

  1. AtCoder Regular Contest 061
  2. Windows Phone 7 开发 31 日谈——第25日:外部API
  3. (90)常见伪路径约束情景
  4. 代理模式(Proxy)--静态代理
  5. 计算机中存储单位的换算
  6. Elasticsearch个人学习笔记
  7. 参加计算机培训典型材料,计算机应用专业典型学员事迹材料
  8. rabbitmq遇到的一些坑
  9. 打怪小游戏 勇者打恶龙1.1
  10. 查看服务器操作系统版本信息,查看服务器操作系统版本信息
  11. java.security.egd 作用
  12. python中的arange函数,Python中的arange是什么?和range有什么不同?
  13. 使用HMM隐式马尔科夫链实现基于拼音的文本纠错
  14. MDK5怎么查看GPIO
  15. 利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)
  16. android的searchview焦点,Android how to focus ActionBar searchView
  17. Windows10家庭版安装MySQL(无法启动服务问题和卸载教程)
  18. ESPRESSIF ESP32 开发环境搭建
  19. 程序员专属精美简历合集——第二弹
  20. 积性函数和完全积性函数

热门文章

  1. 信息技术的新潮流:云计算与大数据
  2. 屏幕距离和坐便转换工具_地图经纬度坐标与屏幕坐标的转换(android版)
  3. thinkpaidE450 win10 进入bios
  4. Perl、PHP、Python、Java和Ruby的比较
  5. Bonjour Network设备之间通讯的理解
  6. 概率检索模型+模糊k近邻+粒子群优化算法(PSO)
  7. 2023.3.17 | Goby红队版可利用漏洞更新
  8. 南大通用GBase8s 常用SQL语句(234)
  9. tensorflow NAN常见原因和解决方法
  10. [Linux]根据条件或查找日志命令cat,tail,vim,grep