shadowbrokers-exploits/windows/CreateReplay.py

158 lines
4.4 KiB
Python
Raw Normal View History

import glob
import os
import shutil
import sys
import xml.dom.minidom
#------------------------------------------------------------------------------------------
# DOM helper functions
#------------------------------------------------------------------------------------------
def getMatchingChildNodes(node, name):
l = list()
for item in node.childNodes:
if (item.nodeType == node.ELEMENT_NODE) and (item.nodeName == name):
l.append(item)
return l
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
#------------------------------------------------------------------------------------------
def copyFiles(files):
for item in files:
src = item[0]
dst = item[1]
#print "%s -> %s" % (src, dst)
try:
os.makedirs(os.path.dirname(dst))
except:
pass
shutil.copy2(src, dst)
return True
#------------------------------------------------------------------------------------------
def handleDir(dirName, dstDir, root, recursive=False):
#print "handleDir: ENTER (%s)" % dirName
fileList = list()
fileNodes = getMatchingChildNodes(root, "File")
for fileNode in fileNodes:
name = getText(fileNode.childNodes)
if (fileNode.getAttribute("name")):
newName = fileNode.getAttribute("name")
else:
newName = None
files = glob.glob("%s/%s" % (dirName, name))
for item in files:
item = os.path.basename(item)
dstName = newName
if (dstName == None):
dstName = item
if (len(dirName) > 0):
if (os.path.isfile("%s/%s" % (dirName, item))):
fileList.append(("%s/%s" % (dirName, item), "%s/%s/%s" % (dstDir, dirName, dstName)))
else:
if (os.path.isfile(item)):
fileList.append((item, "%s/%s" % (dstDir, dstName)))
# handle any sub-dirs
if (recursive):
dirNodes = [root]
else:
dirNodes = getMatchingChildNodes(root, "Dir")
for dirNode in dirNodes:
if (recursive):
ignoreNodes = list()
if (len(dirName) > 0):
subDirName = "%s/*" % dirName
else:
subDirName = "*"
else:
ignoreNodes = getMatchingChildNodes(dirNode, "Ignore")
if (len(dirName) > 0):
subDirName = "%s/%s" % (dirName, dirNode.getAttribute("name"))
else:
subDirName = dirNode.getAttribute("name")
subRecursive = recursive
if (not subRecursive):
rStr = dirNode.getAttribute("recursive")
if ((rStr != None) and (rStr == "true")):
subRecursive = True
#print "RECURSIVE (%s)" % subDirName
#print "Checking for '%s'" % subDirName
names = glob.glob("%s" % subDirName)
for name in names:
if (os.path.basename(name) == ".svn"):
continue
# make sure it's not ignored
ignore = False
for ignoreNode in ignoreNodes:
ignoreName = getText(ignoreNode.childNodes)
#print "<----------------Checking '%s' for ignored '%s'" % (os.path.basename(name), ignoreName)
if (ignoreName == os.path.basename(name)):
ignore = True
if (ignore):
#print "IGNORING %s" % name
continue
if (os.path.isdir(name)):
dirList = handleDir(os.path.normpath(name), dstDir, dirNode, subRecursive)
for item in dirList:
fileList.append(item)
return fileList
#------------------------------------------------------------------------------------------
def main(argv):
# rootDir = os.path.dirname(argv[0])
# if (len(rootDir) == 0):
# rootDir = "."
# xmlName = "%s/replay.xml" % rootDir
rootDir = "."
xmlName = "%s/replay.xml" % rootDir
dom1 = xml.dom.minidom.parse(xmlName)
root = dom1.getElementsByTagName("ReplayFiles")
dstDir = None
while (dstDir == None):
dstDir = os.path.normpath("%s/../ReplayDisk" % rootDir)
sys.stdout.write("Enter the replay destination directory [%s]:" % dstDir)
dir = sys.stdin.readline().rstrip('\r\n')
if (len(dir) > 0):
dstDir = dir
fileCopyList = list()
rootList = handleDir(rootDir, dstDir, root[0])
for item in rootList:
fileCopyList.append(item)
if (not copyFiles(fileCopyList)):
return False
print "\n-----------------------------"
print "Replay disk creation complete"
print "-----------------------------"
return True
#------------------------------------------------------------------------------------------
if __name__ == '__main__':
if (main(sys.argv) != True):
sys.exit(-1);