John the Ripper 外部模式
定義外部模式。
要定義外部破解模式,需要創建一個名為[List.External:MODE ]的配置文件章節。其中模式是你分配給模式的任何名稱。這個部分應該包含一些用類c語言編寫的函數。如果您通過命令行啟用這種破解模式,John將編譯并使用這些函數。
外部函數。
以下是John目前使用的功能:
init() 在啟動時調用,應該初始化全局變量filter() 要求每個詞都要試一試,可以過濾掉一些詞generate() 在不使用其他破解模式時調用生成單詞restore() 恢復中斷的會話時調用
它們都是“void”類型,沒有參數,應該使用全局變量“word”(預定義為“int word[]”),除了init(),它是在“word”初始化之前調用的。變量”word”包含要嘗試的當前候選密碼,每個數組元素中有一個字符,以零結尾。
對于函數,如果定義它,應該做以下“word”:
filter():可以修改單詞,或使“word[0]”歸零并跳過它;
generate():應該將“word”設置為要嘗試的下一個單詞,或者當破解完成時將“word[0]”設為零(這會導致John終止);
restore():應該將全局變量從“word”設置為continue。
您可以單獨使用外部模式,也可以與其他破解模式一起使用,在這種情況下,只使用init()和filter()(并且只需要filter())。使用外部過濾器與所有其他破解模式和“–make-charset”命令行選項兼容。
建議您不要使用filter(),或者至少不要在使用外部模式和您自己的generate()時過濾掉太多的單詞。最好是修改generate(),而不是生成將被過濾掉的單詞。
預定義的變量
除了上面記錄的word變量,John the Ripper 1.7.9和更新版本還預先定義了兩個額外的變量:abort和status,都是int類型。當通過外部模式設置為1時,它們分別會導致當前破解會話中止或顯示狀態行(就像按鍵一樣)。在測試到目前為止處于外部模式的word中的至少所有候選密碼之后,將執行這些操作。換句話說,為了處理任何緩沖的候選密碼,可能會延遲操作。
語言
編譯器支持類C語言,它只包含C語言的一個基本子集,并且在許多方面與C語言不同。支持的關鍵字是:break, continue, else, if, int, return, void, while。
您可以定義John要調用的函數(上面描述的函數),定義全局和局部變量(包括一維數組),使用C中支持的所有整數操作,以及使用C和c++注釋。
以下的是在John的編譯器中缺失的C特性或特征:
短路求值(相反,完整的表達式目前正在求值,可能會有任何副作用);
函數調用(任何定義為外部模式的函數只能被John core調用,其他外部模式函數不能調用);
“do”和“for”循環(只有“while”);
除“int”以外的數據類型聲明、一維數組“int”和“void”;
“靜態”局部變量(所有的局部變量在默認情況下都是靜態的);
指針(數組名單獨指向第一個元素);
類型轉換(當我們只有“int”時,它是沒有用的);
逗號操作符;
可能會有更多吧……
您可以在John提供的默認配置文件中找到一些外部模式示例。
有限的可移植性和未定義的行為
“int”數據類型目前在John中使用系統的本地C“int”數據類型實現。因此,它的大小可以有所不同,但是在John支持的系統上,可以假設它至少是32位(通常正好是32位)。另外,作為有符號整數類型,它的溢出行為是未定義的(但在實踐中通常會是二的補充概括)。
從1.8.0版本開始,字面字符常量(用單引號表示,如’a’)被視為“無符號char”,并被轉換為“int”,因此產生的值在0到255之間。我們打算在未來的版本中保留這種行為。但是,在1.8.0之前的版本中,設置了8位的文字字符常量可能顯示為負的“int”值。
雖然目前的實現和John的所有舊版本到目前為止都缺乏短路計算,將局部變量視為“靜態”,僅將數組名視為對第一個元素的引用,但這些屬性將來可能會改變。
有限的健壯性和不安全性
雖然當前的實現在使用上相當健壯,但它缺乏數組邊界檢查。確保數組大小和索引正確是外部模式作者和用戶的責任。
目前沒有編譯時檢查被賦值或修改的表達式是否為有效的左值。試圖賦值或修改不是有效左值的表達式將導致John崩潰。
通常,外部模式程序(以及John配置文件)被視為可信輸入,就像您在John源樹中處理C文件一樣。惡意外部模式可以使用越界數組訪問來觸發任意機器代碼執行。
JOHN THE RIPPER安裝中文使用說明教程
推薦文章: