照顧沒有接觸過Python編程的同學(xué),行文可能會(huì)有些啰嗦。
廢話少說,我們進(jìn)入正題。
2.1準(zhǔn)備基本材料
在 /home/ziptest/目錄下 ,我創(chuàng)建了兩個(gè)文件,一個(gè) test.zip ,是一個(gè)設(shè)置了密碼的zip包,密碼為456789。
dict.txt文件 是一個(gè)字典文件,簡單的配置了幾個(gè)密碼。
下面我們打開開發(fā)工具,開始編寫測試代碼。
?
2.2 ZIPFILE
在python中操作zip文件,最簡單的方式就是使用zipfile模塊,使用該模塊可以用來判斷一個(gè)文件是否是壓縮文件,創(chuàng)建、解壓文件,獲取zip文件的元數(shù)據(jù)信息。可以使用python的help方法查看該模塊的使用方法。
?
這里我們首先關(guān)注下 ZipFile類 。
?
該類用來打開,讀取,修改,解壓zip文件 。我們想要操作一個(gè)zip文件,第一步就是 初始化ZipFile實(shí)例 。下面我們打開我們準(zhǔn)備好的text.zip文件。
import? zipfile
?
zFile?=?zipfile.ZipFile("/HOME/TEST.ZIP");
我們只傳了一個(gè)路徑參數(shù)進(jìn)去,從幫助文檔我們可以看到,后面三個(gè)參數(shù)都有默認(rèn)值,這里我們使用默認(rèn)值就夠了。
下面我們關(guān)注下ZipFile類的 extractall 方法。
?
?
extractall方法 ,是把壓縮包里面的內(nèi)容都解壓出來,三個(gè)參數(shù),path是解壓的路徑, members 是需要解壓出來的文件,pwd是密碼。
現(xiàn)在我們可以測試下文件解壓了。
import? zipfile
?
zFile?=?zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
zFile.extractall("/HOME/",pwd="456789");
運(yùn)行這個(gè)腳本。
?
?
密碼正確的話,會(huì)正常解壓文件。如果密碼不正確會(huì)出現(xiàn)什么情況呢?我們在代碼中輸入一個(gè)錯(cuò)誤的密碼。
import? zipfile?
?
zFile?=?zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
zFile.extractall(path="/HOME/ZIPTEST",pwd="4567890");
結(jié)果如下:
?
程序會(huì)拋出 “bad password” 的異常。
我們可以通過捕獲異常,測試多個(gè)密碼。
2.3? 讀取字典文件
在Python中打開文件,使用 open方法 ,這是一個(gè)內(nèi)置方法,查看open的幫助文檔,可以看到該方法的參數(shù)說明。
open方法返回一個(gè)file對象, 利用file對象 ,我們可以讀取文件的具體內(nèi)容。下面我們在代碼中測試一下。
import? zipfile
?
passFile?=?open('/HOME/ZIPTEST/DICT.TXT');
for?line?in?passFile.readlines():
password?=?line.strip('N');
print(password);
運(yùn)行結(jié)果如下:
?
下面我們利用讀取到的密碼來暴力測試zip文件。
import? zipfile
?
zFile?=?zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
passFile?=?open('/HOME/ZIPTEST/DICT.TXT');
for?line?in?passFile.readlines():
password?=?line.strip('N');
try:
zFile.extractall(path="/HOME/ZIPTEST",pwd=password);
print("PASSWORD?IS:"+password);
exit(0);
except:
pass;
在上面的代碼中,我們使用try—except進(jìn)行異常捕獲,密碼不正確的時(shí)候,程序跳過繼續(xù)執(zhí)行。密碼正確的時(shí)候打印密碼,終止程序。運(yùn)行結(jié)果如下:
?
到目前為止,我們的腳本已經(jīng)具備了暴力破解zip文件的功能,大家可以看到只有十幾行的代碼。下面我們?yōu)榱颂嵘绦虻目捎眯裕貥?gòu)一下這個(gè)腳本,利用函數(shù)劃分功能。
2.4? 重構(gòu)? 用函數(shù)劃分功能
首先定義一個(gè) extractFile 函數(shù) ,該函數(shù)接收三個(gè)參數(shù),一個(gè) zipfile對象 ,解壓的目標(biāo)路徑,密碼,如果解密成功則返回密碼。
def?extractFile(toPath,zFile,password):
try:
zFile.extractall(path=toPath,pwd=password);
return?password;
except?Exception,e:
return;
下面我們再聲明一個(gè) main方法 。
def?main():
zFile?=?zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
passFile?=?open('/HOME/ZIP/TEST/DICT.TXT');
for?line?in?passFile.readlines():
password?=?line.strip('N');
guess?=?extractFile("/HOME/",zFile,password);
if?guess:
print('SCUCESS'+password);
exit(0);
在 main方法 中,首先初始化了 zipfile對象 ,然后打開字典文件,循環(huán)讀取密碼,傳給 extractFile方法 調(diào)用。
分離 了兩個(gè)方法之后,我們需要在程序的入口處調(diào)用 main方法 ,完整代碼如下:
import? zipfile
?
def?extractFile(toPath,zFile,password):
try:
zFile.extractall(path=toPath,pwd=password);
print('SCUCESS'+password);
return?password;
except?Exception,e:
return;
def?main():
zFile?=?zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
passFile?=?open('/HOME/ZIPTEST/DICT.TXT');
for?line?in?passFile.readlines():
password?=?line.strip('N');
guess?=?extractFile("/HOME/",zFile,password);
if?guess:
print('SCUCESS'+password);
exit(0);
if?__name__=='__MAIN__':
main();
這樣一來,代碼清晰了很多,但是我們更換zip文件和字典文件的時(shí)候,還是需要修改代碼,很不方便,正常的程序都應(yīng)該可以傳遞參數(shù)的,ok,下面我們引入 optparse庫 。
2.5 OPTPARSE
Python 有兩個(gè)內(nèi)建的模塊用于處理命令行參數(shù):
一個(gè)是 ?getopt ,《Deep in python》一書中也有提到,只能簡單處理 命令行參數(shù);
另一個(gè)是? optparse ,它功能強(qiáng)大,而且易于使用,可以方便地生成標(biāo)準(zhǔn)的、符合 Unix/Posix規(guī)范的命令行說明。
首先先引入 optparse模塊 ,然后強(qiáng)制添加兩個(gè)參數(shù), zip文件名和字典文件名 。先看代碼:
def?main():
parser?=?optparse.OptionParser("usage%prog?"+
"-f?
?-d?
");
parser.add_option('-f',dest='zname',type='string',help='specify?zip?file');
parser.add_option('-d',dest='dname',type='string',help='specify?dict?file');
(options,args)=parser.parse_args();
if(options.zname==None)|(options.dname==None):
print?parse.usage;
exixt(0);
else:
zname=options.zname;
dname=options.dname;
zFile?=?zipfile.ZipFile(zname);
passFile?=?open(dname);
for?line?in?passFile.readlines():
password?=?line.strip('?');
guess?=?extractFile("/home/",zFile,password);
if?guess:
print('scucess'+password);
exit(0);
首先初始化一個(gè) OptionParser對象 ,然后添加兩個(gè)選項(xiàng)—— “-f”和“-d” 。之后在程序運(yùn)行的時(shí)候通過 parse_args方法 獲取輸入的參數(shù),如果參數(shù)為空,則打印使用方法,退出程序。
下面使用終端來測試這個(gè)程序。
無參數(shù)情況下:
?
輸入?yún)?shù):
?
2.6 小結(jié)
這個(gè)程序本身并沒有什么難點(diǎn),但是通過這個(gè)入門案例,我們可以體驗(yàn)Python編程的基本方法,如何查看幫助文檔,如何引入模塊,初始化對象,操作zip文件,打開本地文件,命令行參數(shù)設(shè)置。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

