README.md
Rendering markdown...
import subprocess
import os
import sys
import shutil
def runCalcProcesses(nProcess, salt, block, blockSize, bufferSize):
processList = []
for i in range(nProcess):
cmd = "python3 calc_hashes.py %s 0x%x 0x%x 0x%x" % (salt, block, blockSize, bufferSize)
p = subprocess.Popen(cmd.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
processList.append(p)
block += blockSize
return processList
def waitCalcProcesses(processList):
for i in range(len(processList)):
p = processList[i]
output = b''
errout = b''
while True:
output += p.stdout.read()
errout += p.stderr.read()
if output.strip().endswith(b"done"):
break
if errout != b'':
print("ERROR OCCURED")
print(errout.decode())
exit()
def runFindProcesses(nProcess, salt, value, offset, block, blockSize):
processList = []
for i in range(nProcess):
filePath = "%s/%s-%s.pickle" % (salt,'%08x'%block,'%08x'%(block+blockSize))
cmd = "python3 find.py %s %s 0x%x %s" % (salt, value, offset, filePath)
# print(cmd)
p = subprocess.Popen(cmd.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
processList.append(p)
block += blockSize
return processList
def waitFindProcesses(processList):
result = b''
for i in range(len(processList)):
p = processList[i]
output = b''
errout = b''
while True:
output += p.stdout.read()
errout += p.stderr.read()
if b"result: " in output:
break
if errout != b'':
print("ERROR OCCURED")
print(errout.decode())
exit()
result = output.split(b"result: ")[1]
if b'None' not in result:
break
return result
def main():
maxBlockSize = 0x100000000
nProcess = int(sys.argv[1], 16)
salt = sys.argv[2]
block = int(sys.argv[3], 16)
blockSize = int(sys.argv[4], 16)
bufferSize = int(sys.argv[5], 16)
values = sys.argv[6]
offsets = sys.argv[7]
valueList = values.split(',')
offsetList = offsets.split(',')
offsetList = list(map(lambda x: int(x,16),offsetList))
resultList = [None] * len(valueList)
assert(len(valueList) == len(offsetList))
print('values : %s' % valueList)
print('offsets: %s' % offsetList)
curBlock = block
while curBlock < maxBlockSize:
print("[+] calculating 0x%x-0x%x"%(curBlock, curBlock+blockSize*nProcess))
processList = runCalcProcesses(nProcess, salt, curBlock, blockSize, bufferSize)
waitCalcProcesses(processList)
for i in range(len(resultList)):
result = resultList[i]
if result == None:
value = valueList[i]
offset = offsetList[i]
print("[+] finding %s at 0x%x"%(value, offset))
processList = runFindProcesses(nProcess,salt,value,offset,curBlock,blockSize)
result = waitFindProcesses(processList).strip()
if b'None' not in result:
if result.startswith(b"b'"):
result = result.split(b"b'")[1].split(b"'")[0].decode()
resultList[i] = result
for i in range(nProcess):
block = curBlock + i*blockSize
if int(result,16) >= block and int(result,16) < (block+blockSize):
filePath = "%s/%s-%s.pickle" % (salt,'%08x'%block,'%08x'%(block+blockSize))
destPath = "%s/%x_%s.%s-%s.pickle" % (salt,offset,value,'%08x'%block,'%08x'%(block+blockSize))
shutil.copyfile(filePath,destPath)
print(' found: %s' % result)
for i in range(nProcess):
block = curBlock + i*blockSize
filePath = "%s/%s-%s.pickle" % (salt,'%08x'%block,'%08x'%(block+blockSize))
os.remove(filePath)
if None not in resultList:
print('resultList: %s' % resultList)
break
curBlock += blockSize*nProcess
if __name__ == '__main__':
main()