python黑客入門
2.1準備基本材料
在 /home/ziptest/目錄下 ,我創建了兩個文件,一個 test.zip ,是一個設置了密碼的zip包,密碼為456789。
dict.txt文件 是一個字典文件,簡單的配置了幾個密碼。
下面我們打開開發工具,開始編寫測試代碼。
2.2 ZIPFILE
在python中操作zip文件,最簡單的方式就是使用zipfile模塊,使用該模塊可以用來判斷一個文件是否是壓縮文件,創建、解壓文件,獲取zip文件的元數據信息。可以使用python的help方法查看該模塊的使用方法。
如果你在學習Python的過程當中有遇見任何問題,可以加入我的python交流學習qq群:487526820,多多交流問題,互幫互助,群裡有不錯的學習教程和開發工具。學習python有任何問題(學習方法,學習效率,如何就業),可以随時來咨詢我.
這裡我們首先關注下 ZipFile類 。
該類用來打開,讀取,修改,解壓zip文件 。我們想要操作一個zip文件,第一步就是 初始化ZipFile實例 。下面我們打開我們準備好的text.zip文件。
import zipfile
zFile= zipfile.ZipFile("/HOME/TEST.ZIP");
我們隻傳了一個路徑參數進去,從幫助文檔我們可以看到,後面三個參數都有默認值,這裡我們使用默認值就夠了。
下面我們關注下ZipFile類的 extractall 方法。
extractall方法 ,是把壓縮包裡面的内容都解壓出來,三個參數,path是解壓的路徑, members 是需要解壓出來的文件,pwd是密碼。
現在我們可以測試下文件解壓了。
import zipfile
zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
zFile.extractall("/HOME/",pwd="456789");
運行這個腳本。
密碼正确的話,會正常解壓文件。如果密碼不正确會出現什麼情況呢?我們在代碼中輸入一個錯誤的密碼。
import zipfile
zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
zFile.extractall(path="/HOME/ZIPTEST",pwd="4567890");
結果如下:
程序會抛出“bad password”的異常。
我們可以通過捕獲異常,測試多個密碼。
2.3 讀取字典文件
在Python中打開文件,使用 open方法 ,這是一個内置方法,查看open的幫助文檔,可以看到該方法的參數說明。
open方法返回一個file對象, 利用file對象 ,我們可以讀取文件的具體内容。下面我們在代碼中測試一下。
import zipfile
passFile =open('/HOME/ZIPTEST/DICT.TXT');
forlineinpassFile.readlines():
password = line.strip('N');
print(password);
運行結果如下:
下面我們利用讀取到的密碼來暴力測試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進行異常捕獲,密碼不正确的時候,程序跳過繼續執行。密碼正确的時候打印密碼,終止程序。運行結果如下:
到目前為止,我們的腳本已經具備了暴力破解zip文件的功能,大家可以看到隻有十幾行的代碼。下面我們為了提升程序的可用性,重構一下這個腳本,利用函數劃分功能。
2.4 重構 用函數劃分功能
首先定義一個 extractFile 函數 ,該函數接收三個參數,一個 zipfile對象 ,解壓的目标路徑,密碼,如果解密成功則返回密碼。
defextractFile(toPath,zFile,password):
try:
zFile.extractall(path=toPath,pwd=password);
returnpassword;
exceptException,e:
return;
下面我們再聲明一個 main方法 。
defmain():
zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
passFile = open('/HOME/ZIP/TEST/DICT.TXT');
forlineinpassFile.readlines():
password = line.strip('N');
guess = extractFile("/HOME/",zFile,password);
ifguess:
print('SCUCESS' password);
exit(0);
在 main方法 中,首先初始化了 zipfile對象 ,然後打開字典文件,循環讀取密碼,傳給 extractFile方法 調用。
分離 了兩個方法之後,我們需要在程序的入口處調用 main方法 ,完整代碼如下:
import zipfile
defextractFile(toPath,zFile,password):
try:
zFile.extractall(path=toPath,pwd=password);
print('SCUCESS' password);
returnpassword;
exceptException,e:
return;
defmain():
zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");
passFile = open('/HOME/ZIPTEST/DICT.TXT');
forlineinpassFile.readlines():
password = line.strip('N');
guess = extractFile("/HOME/",zFile,password);
ifguess:
print('SCUCESS' password);
exit(0);
if__name__=='__MAIN__':
main();
這樣一來,代碼清晰了很多,但是我們更換zip文件和字典文件的時候,還是需要修改代碼,很不方便,正常的程序都應該可以傳遞參數的,ok,下面我們引入 optparse庫 。
2.5 OPTPARSE
Python 有兩個内建的模塊用于處理命令行參數:
一個是 getopt ,《Deep in python》一書中也有提到,隻能簡單處理 命令行參數;
另一個是 optparse ,它功能強大,而且易于使用,可以方便地生成标準的、符合 Unix/Posix規範的命令行說明。
首先先引入 optparse模塊 ,然後強制添加兩個參數, 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):
printparse.usage;
exixt(0);
else:
zname=options.zname;
dname=options.dname;
zFile = zipfile.ZipFile(zname);
passFile = open(dname);
forlineinpassFile.readlines():
password = line.strip(' ');
guess = extractFile("/home/",zFile,password);
ifguess:
print('scucess' password);
exit(0);
首先初始化一個 OptionParser對象 ,然後添加兩個選項—— “-f”和“-d” 。之後在程序運行的時候通過 parse_args方法 獲取輸入的參數,如果參數為空,則打印使用方法,退出程序。
下面使用終端來測試這個程序。
無參數情況下:
輸入參數:
2.6 小結
這個程序本身并沒有什麼難點,但是通過這個入門案例,我們可以體驗Python編程的基本方法,如何查看幫助文檔,如何引入模塊,初始化對象,操作zip文件,打開本地文件,命令行參數設置。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!