本文我們主要是建立一個window選擇檔案,進而來确定apk的路徑,然後點選反編譯按鈕來對其進行反編譯。
0x1:尋找相關api代碼
QFileDialog類提供了類似的其他靜态函數,如下表,通過這些函數,使用者可以友善地定制自己的檔案對話框。
靜态函數 說明
getOpenFileName 獲得使用者選擇的檔案名
getSaveFileName 獲得使用者儲存的檔案名
getExistingDirectory 獲得使用者選擇的已存在的目錄名
getOpenFileNames 獲得使用者選擇的檔案名清單
0x2:按鈕事件的總結
按鈕的點選事件,經過一下午的分析,果斷抛棄上一課的總結使用的滑鼠點選事件,而直接對按鈕的響應事件作出處理。也可以說通過今天下午的學習,比上午進步了一點點。。。
self.connect(decode,SIGNAL('clicked()'),self.apkD)
然後就是下午對布局檔案的繼續熟悉,感覺寫布局代碼越來越像寫安卓代碼的布局了,好了,下面我貼上全部代碼,裡面已經寫了比較詳細的注釋了,相信有編碼基礎的讀者是可以看懂的:
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import os
class GridLayout2(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setWindowTitle('Android_APK')
###第一行
self.apk_path = QLabel('APk Path')
self.apk_path_edit = QLineEdit()
###第二行,三個按鈕,這裡第三個按鈕的點選事件還沒寫
file_search=QPushButton("Search_File")
decode = QPushButton("Apk_Decode")
build = QPushButton("Apk_Build")
###尋找檔案按鈕的點選事件
self.connect(file_search,SIGNAL('clicked()'),self.openFile)
###反編譯按鈕的點選事件
self.connect(decode,SIGNAL('clicked()'),self.apkD)
grid = QGridLayout()
grid.setSpacing(10)
grid.addWidget(self.apk_path, 1, 0)
grid.addWidget(self.apk_path_edit, 1, 1)
grid.addWidget(file_search,2,0)
grid.addWidget(decode, 2,1)
grid.addWidget(build, 2,2)
self.setLayout(grid)
self.resize(350, 300)
def openFile(self):
##調用QfileDialog的相關方法來打開檔案選擇框
s=QFileDialog.getOpenFileName(self,"Open file dialog","/","Apk files(*.apk)")
##定義全局變量,用于接收需要反編譯的apk的路徑
global APK_STR
APK_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)
app = QApplication(sys.argv)
qb = GridLayout2()
qb.show()
sys.exit(app.exec_())
0x3:效果截圖
Search_file的點選事件:
Apk_Decode的點選事件:
0x4:總結
上面的大家可以看到,我們已經可以實作兩個功能了,即打開window找檔案,然後進行反編譯,但是在反編譯完成以後,我們需要對裡面的smali檔案進行操作,然後再回編譯檔案,簽名,才能對手機進行安裝,是以下一篇文章,我們就主要是編寫回編譯的方法以及對apk簽名的方法。