# - * -コーディング:UTF-8 - * -
#USE:Pythonのfile_check.py ./
インポートOS
インポートhashlib
インポートshutil
インポートntpath
インポート時間
CWD = os.getcwd()
FILE_MD5_DICT} = {#MD5辞書ファイル
ORIGIN_FILE_LIST = []
#特殊ファイルパス文字列
Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'
bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'
LogString = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
webshellstring = 'webshell_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'
Special_string = 'drops_log' #Miansijinpai
UNICODE_ENCODING = "UTF-8"
INVALID_UNICODE_CHAR_FORMAT = R&LT "\?%02X "
#パス辞書ファイル
spec_base_path = os.path.realpath(os.path.join(CWD、Special_path_str))
Special_path = {
'BAK':os.path.realpath(os.path.join(spec_base_path、bakstring))、
'ログ':OS。 path.realpath(os.path.join(spec_base_path、logstring))、
'ウェブシェル':os.path.realpath(os.path.join(spec_base_path、webshellstring))、
'difffile':os.path.realpath(OS。 path.join(spec_base_path、difffile))
}
DEF isListLike(値):
リターンでisinstance(値、(リスト、タプル、セット))
#获取ユニコード编码
DEF getUnicode(値、コード=なし、noneToNull =偽):
noneToNullもしその値はNoneです:
リターン・ヌル
の場合isListLike(値):
値=(値の_のためgetUnicode(_、エンコード、noneToNull))リスト
戻り値
の場合でisinstance(値、ユニコード):
戻り値
でisinstanceのelif(値、basestring):
:真しばらく
試してみてください。
戻りユニコード(値、エンコードまたはUNICODE_ENCODING )
UnicodeDecodeError以外、例:
トライ:
戻りユニコード(値、UNICODE_ENCODING)
を除く:
値=値[:ex.start] + "" .join(INVALID_UNICODE_CHAR_FORMATの%のORD(_)_の値で[ex.start:ex.end ])+値[ex.end:]
他:
トライ:
戻りユニコード(値)
:UnicodeDecodeError除く
リターンユニコード(STR(値)、エラー= "無視")
#目录创建
デフmkdir_p(パス):
インポートのerrno
試し:
os.makedirs(パス)
EXCとしてOSErrorのを除い:
exc.errno == errno.EEXIST場合そしてos.path.isdir(パス):
渡す
他:昇給
#获取当前所有文件路径
デフgetfilelist(CWD):
ファイルリスト= []
os.walk(CWD)のルートのために、サブディレクトリ、ファイル:
ファイル内のファイルパスのために:
originalfile = os.path.join(ルート、ファイルパス)
Special_path_strない場合originalfileで:
filelist.append(originalfile)
戻りファイル一覧
#计算机文件MD5值
デフcalcMD5(ファイルパス):
試してみる:
:オープン(ファイルパス、 'RB')をfと
md5obj = hashlib.md5()
md5obj.update(f.read())
ハッシュ= md5obj.hexdigest()
の戻りハッシュ
例外、Eを除い:
'[!] getmd5_error:' Uを印刷+ getUnicode(ファイルパス)
印刷getUnicode(e)に
してみてください:
ORIGIN_FILE_LIST.remove(ファイルパス)
FILE_MD5_DICT.pop(ファイルパス、なし)
KeyError例外、Eを除く:
パス
#获取所有文件MD5
DEF getfilemd5dict(ファイル一覧= []):
filemd5dict = {}
ファイル一覧でori_file用:
Special_path_strないori_fileでIF:
MD5 = calcMD5(os.path.realpath(ori_file))
MD5 IF:
filemd5dict [ori_file] = MD5
戻りfilemd5dictの
すべてのファイルの#バックアップ
DEF BACKUP_FILE(ファイルリスト= []):
#lenをIF(os.listdir (Special_path [ 'BAK']))== 0:
:ファイルリストにファイルパスのための
ファイルパスにおけるIF Special_path_strなし:
shutil.copy2(ファイルパス、Special_path [ 'BAK'])
IF __name__ == '__main__':
Uを印刷「 -スタート------------ ------- "
Special_pathの値について:
mkdir_p(Special_path [値])
#GETすべてのファイルパス、および、すべてのファイルのMD5を取得するすべてのファイルをバックアップ
ORIGIN_FILE_LIST = getfilelist(CWD)
FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)
BACKUP_FILE(ORIGIN_FILE_LIST)#TODO备份文件可能会产生重名BUG
印刷のu '[*]前の作業終了!'
:真しばらく
file_listの= getfilelist(CWD)
#移除新上传文件
diff_file_list =リスト(セット(file_listの)^セット(ORIGIN_FILE_LIST))
:!len の場合(diff_file_list)= 0
pdb.set_trace();#インポートPDB
でのファイルパスについてdiff_file_list:
試してみてください
。F =オープン(ファイルパス、R '')(読み)
例外、Eを除く:
ブレーク
ないFでSpecial_string場合:
試してみてください。
+ getUnicode(ファイルパス):U '[*]を見つけるウェブシェル'印刷
shutil.move(ファイルパス、os.path.join(Special_path [ 'ウェブシェル']、ntpath.basename(ファイルパス)+ '.txtファイルを'))
のような例外を除きE:
Uを印刷'[!]移動ウェブシェルエラー、 "%s"は多分ウェブシェルです。' %getUnicode(ファイルパス)
の試行:
F =オープン(os.path.join(Special_path [ 'ログ'] 'のlog.txt' )、 '')
f.write( 'NEWFILE:' + getUnicode(ファイルパス)+ ':' + strが(time.ctime())+ '\ n')
f.close()
Eなどの例外を除いて:
Uを印刷"[ - ]ログのエラー:ファイルの移動エラー: '+ getUnicode(E)
#防止任意文件被修改、还原被修改文件
md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)
md5_dictでfilekeyのため:
もしmd5_dict [filekey] = FILE_MD5_DICT [filekey]:!
試してみてください
。F =オープン(filekey、R '')(読み取り)
例外を除いて、E:
ブレークは
Special_stringがFでない場合:
試みは:
Uを印刷'[*]ファイルを変更することでした:' + getUnicode(filekey)
(Special_path shutil.move(filekey、os.path.join [ 'difffile']、 ntpath.basename(filekey)+ 'の.txt '))
shutil.move(os.path.join(Special_path [' BAK']、ntpath.basename(filekey))、filekey)
:eと例外を除いて
Uを印刷'[!]移動ウェブシェルエラー、 "%s"は多分ウェブシェルです。' %getUnicode(filekey)
の試行:
F =オープン(os.path.join(Special_path [ 'ログ']、「ログ.TXT ')、 '')
f.write(' diff_file: '+ getUnicode(filekey)+' '+ getUnicode(time.ctime())+ '\ n')
f.close()
Eなどの例外を除い:
印刷U '[ - ]ログエラー:done_diff:' + getUnicode(filekey)
通過
time.sleepを(2)#
印刷'[*]' + getUnicode(time.ctime())
CTF専用ファイルシステム監視
おすすめ
転載: www.cnblogs.com/miansj/p/11808973.html
ランキング