Advertisement
Guest User

Muddywater

a guest
Mar 7th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.04 KB | None | 0 0
  1. # version 7 - 02272019
  2.  
  3. import random, sys, math
  4.  
  5. predefined = ['home', 'profile', 'pshome', 'host', 'psversiontable']
  6. predefined.extend(['true', 'false', 'null', '_', 'env', 'erroractionpreference'])
  7. predefined.extend(['args', 'myinvocation', 'input', 'pwd'])
  8. predefined.extend(['foreach', 'matches', 'lastexitcode', 'error'])
  9.  
  10. predefinedString = ['SilentlyContinue']
  11.  
  12. def isLower(ch):
  13.     return (ch >= 'a' and ch <= 'z')
  14.  
  15. def isUpper(ch):
  16.     return (ch >= 'A' and ch <= 'Z')
  17.  
  18. def isAlphabet(ch):
  19.     return isLower(ch) or isUpper(ch)
  20.  
  21. def isDigit(ch):
  22.     return ch >= '0' and ch <= '9'
  23.  
  24. def isValidVar(ch, isFunc = False):
  25.     funcVars = '-'
  26.     return isDigit(ch) or isAlphabet(ch) or ch == '_' or (isFunc and ch in funcVars)
  27.  
  28. def randomRename(name):
  29.     output = list()
  30.     for ch in name:
  31.         if isAlphabet(ch) and random.randint(0, 2) > 0:
  32.             if isLower(ch):
  33.                 ch = chr(ord(ch) - ord('a') + ord('A'))
  34.             else:
  35.                 ch = chr(ord(ch) + ord('a') - ord('A'))
  36.         output.append(ch)
  37.     return ''.join(output)
  38.  
  39. def randomName():
  40.     notStart = '_0987654321'
  41.     valids = notStart + 'qwertyuioplkjhgfdsazxcvbnmQAZXSWEDCVFRTGBNHYUJMKIOLP'
  42.     n = random.randint(6, 20)
  43.     res = valids[random.randint(len(notStart), len(valids) - 1)]
  44.     for _ in range(n):
  45.         res += valids[random.randint(0, len(valids) - 1)]
  46.     return  res
  47.  
  48. def navigateComment(inp, idx):
  49.     ch = ' '
  50.     if idx > 0:
  51.         ch = inp[idx - 1]
  52.     idx += 1
  53.     res = '#'
  54.     if(ch == '<'):
  55.         while idx < len(inp) and inp[idx - 1] != '#' or inp[idx] != '>':
  56.             res += inp[idx]
  57.             idx += 1
  58.         return res + '>'
  59.     else:
  60.         while idx < len(inp) and inp[idx] != '\n':
  61.             res += inp[idx]
  62.             idx += 1
  63.         return res + '\n'
  64.  
  65. def encodeString(inp):
  66.     if inp == '':
  67.         return ''
  68.     inp = inp.encode('hex')
  69.     r = random.randint(40, 76)
  70.     output = chr(r)
  71.     for ch in inp:
  72.         output += chr(int(ch, 16) + r)
  73.     return output
  74.  
  75. def navigateString(inp, idx):
  76.     ch = inp[idx]
  77.     res = ''
  78.     idx += 1
  79.     while idx < len(inp) and inp[idx] != ch:
  80.         res += inp[idx]
  81.         idx += 1
  82.     return res
  83.  
  84. def navigateVariable(inp, idx, isFunc = False):
  85.     res = ''
  86.     idx += 1
  87.     while idx < len(inp) and isValidVar(inp[idx], isFunc):
  88.         res += inp[idx]
  89.         idx += 1
  90.     return res
  91.  
  92. def parseTotal(inputString):
  93.     return inputString
  94.     # inputString = inputString.replace('\r', '').strip()
  95.     # inputString = inputString.split('\n')
  96.     # return inputString
  97.  
  98.  
  99. def dirtyInline(inputString):
  100.     inputString = inputString.replace('\r', '').strip()
  101.     result = list()
  102.     vars = dict()
  103.     for item in predefined:
  104.         vars[item] = item
  105.     idx = 0
  106.     while idx < len(inputString):
  107.         while idx < len(inputString):
  108.             if inputString[idx] == "'" or inputString[idx] == '"':
  109.                 temp = navigateString(inputString, idx)
  110.                 result.append(inputString[idx] + temp + inputString[idx])
  111.                 idx += len(temp) + 2
  112.             elif inputString[idx] == '#':
  113.                 temp = navigateComment(inputString, idx)
  114.                 if result[-1].endswith('<'):
  115.                     result[-1] = result[-1][:-1]
  116.                 while result[-1] == '' or result[-1] == ' ' or result[-1] == '\t' or result[-1] == ';':
  117.                     result = result[:-1]
  118.                 if result[-1] != '{' and result[-1] != '}':
  119.                     result.append(';')
  120.                 idx += len(temp)
  121.             elif inputString[idx] == '\n':
  122.                 while result[-1] == '' or result[-1] == ' ' or result[-1] == '\t' or result[-1] == ';':
  123.                     result = result[:-1]
  124.                 if result[-1] != '{' and result[-1] != '}':
  125.                     result.append(';')
  126.                 idx += 1
  127.             elif (inputString[idx] == ' ' or inputString[idx] == '\t') and (inputString[idx - 1] == ' ' or inputString[idx - 1] == '\t'):
  128.                 idx += 1
  129.             elif (inputString[idx] == ' ' or inputString[idx] == '\t') and (result[-1] == ';' or result[-1] == '{' or result[-1] == '}'):
  130.                 idx += 1
  131.             else:
  132.                 result.append(inputString[idx])
  133.                 idx += 1
  134.     result = ''.join(result)
  135.     return result.replace('}$', '};$').replace(';{', '{')
  136.  
  137. def dirtyFunction(inputString):
  138.     vars = dict()
  139.     idx = 0
  140.     while idx < len(inputString):
  141.         while idx < len(inputString):
  142.             if inputString[idx] == "'" or inputString[idx] == '"':
  143.                 temp = navigateString(inputString, idx)
  144.                 idx += len(temp) + 2
  145.             elif inputString[idx] == '#':
  146.                 temp = navigateComment(inputString, idx)
  147.                 idx += len(temp)
  148.             elif inputString[idx].lower() == 'f':
  149.                 temp = navigateVariable(inputString, idx)
  150.                 temp = temp.lower()
  151.                 if temp != 'unction':
  152.                     idx += 1
  153.                     continue
  154.                 idx += len('function')
  155.                 temp = navigateVariable(inputString, idx, True)
  156.                 temp = temp.lower()
  157.                 if not temp in vars:
  158.                     vars[temp] = randomName()
  159.                 idx += len(temp)
  160.             else:
  161.                 idx += 1
  162.     result = list()
  163.     idx = 0
  164.     while idx < len(inputString):
  165.         while idx < len(inputString):
  166.             if inputString[idx] == "'" or inputString[idx] == '"':
  167.                 temp = navigateString(inputString, idx)
  168.                 result.append(inputString[idx] + temp + inputString[idx])
  169.                 idx += len(temp) + 2
  170.             elif inputString[idx] == '#':
  171.                 temp = navigateComment(inputString, idx)
  172.                 result.append(temp)
  173.                 idx += len(temp)
  174.             elif inputString[idx] == '$':
  175.                 temp = navigateVariable(inputString, idx)
  176.                 result.append('$' + temp)
  177.                 idx += len(temp) + 1
  178.             elif isAlphabet(inputString[idx]):
  179.                 temp = inputString[idx] + navigateVariable(inputString, idx)
  180.                 if temp.lower() in vars:
  181.                     result.append(randomRename(vars[temp.lower()]))
  182.                 else:
  183.                     result.append(temp)
  184.                 idx += len(temp)
  185.             else:
  186.                 result.append(inputString[idx])
  187.                 idx += 1
  188.     comment = ''
  189.     for x, y in vars.items():
  190.         if not x in predefined:
  191.             comment += ('%-23s' % y) + 'was ' + x + '\n'
  192.     comment = '<#\n' + comment + '#>\n\n'
  193.     return comment + ''.join(result)
  194.  
  195. def dirtyVariable(inputString):
  196.     result = list()
  197.     vars = dict()
  198.     for item in predefined:
  199.         vars[item] = item
  200.     idx = 0
  201.     while idx < len(inputString):
  202.         while idx < len(inputString):
  203.             if inputString[idx] == "'" or inputString[idx] == '"':
  204.                 temp = navigateString(inputString, idx)
  205.                 result.append(inputString[idx] + temp + inputString[idx])
  206.                 idx += len(temp) + 2
  207.             elif inputString[idx] == '#':
  208.                 temp = navigateComment(inputString, idx)
  209.                 result.append(temp)
  210.                 idx += len(temp)
  211.             elif inputString[idx] == '$':
  212.                 temp = navigateVariable(inputString, idx)
  213.                 temp = temp.lower()
  214.                 if temp == 'true':
  215.                     pass
  216.                 if not temp in vars:
  217.                     vars[temp] = randomName()
  218.                 result.append('$' + randomRename(vars[temp]))
  219.                 idx += len(temp) + 1
  220.             else:
  221.                 result.append(inputString[idx])
  222.                 idx += 1
  223.     result = ''.join(result)
  224.     result = dirtyFunction(result)
  225.     comment = ''
  226.     for x, y in vars.items():
  227.         if not x in predefined:
  228.             comment += '$' + ('%-23s' % y) + 'was $' + x + '\n'
  229.     comment = '<#\n' + comment + '#>\n\n'
  230.     return comment + result
  231.  
  232. def dirtyNumber(inputString):
  233.     result = list()
  234.     idx = 0
  235.     while idx < len(inputString):
  236.         while idx < len(inputString):
  237.             if inputString[idx] == "'" or inputString[idx] == '"':
  238.                 temp = navigateString(inputString, idx)
  239.                 result.append(inputString[idx] + temp + inputString[idx])
  240.                 idx += len(temp) + 2
  241.             elif inputString[idx] == '#':
  242.                 temp = navigateComment(inputString, idx)
  243.                 result.append(temp)
  244.                 idx += len(temp)
  245.             elif not isDigit(inputString[idx]):
  246.                 result.append(inputString[idx])
  247.                 idx += 1
  248.             elif isDigit(inputString[idx]) and isValidVar(inputString[idx - 1]):
  249.                 while idx < len(inputString) and isDigit(inputString[idx]):
  250.                     result.append(inputString[idx])
  251.                     idx += 1
  252.             else:
  253.                 break
  254.         num = ''
  255.         while idx < len(inputString) and isDigit(inputString[idx]):
  256.             num += inputString[idx]
  257.             idx += 1
  258.         if num != '':
  259.             if random.randint(0, 2) > 0:
  260.                 num = int(num)
  261.                 r = random.randint(1, 4)
  262.                 if r == 1:
  263.                     i = random.randint(0, 2 * num) - num
  264.                     j = num - i
  265.                     result.append('(' + str(i) + ' + ' + str(j) + ')')
  266.                 elif r == 2:
  267.                     i = random.randint(num + 1, 2 * num + 1)
  268.                     j = i - num
  269.                     result.append('(' + str(i) + ' - ' + str(j) + ')')
  270.                 elif r == 3 and num > 2:
  271.                     i = random.randint(2, num)
  272.                     j = i * num
  273.                     result.append('([int](' + str(j) + ' / ' + str(i) + '))')
  274.                 elif r == 4 and num > 3:
  275.                     r = random.randint(2, int(math.sqrt(num)) + 1)
  276.                     for i in range(r, 0, -1):
  277.                         if num % i == 0:
  278.                             j = num // i
  279.                             result.append('(' + str(i) + ' * ' + str(j) + ')')
  280.                             break
  281.                 else:
  282.                     result.append(str(num))
  283.             else:
  284.                 result.append(num)
  285.     result = ''.join(result)
  286.     if random.randint(0, 2) == 0:
  287.         result = dirtyNumber(result)
  288.     return result
  289.  
  290. def getLastWord(inputString, idx):
  291.     base = idx
  292.     starts = ['$', '\n', '\r']
  293.     seps = ['=', '(']
  294.     while idx >= 0 and not inputString[idx] in starts:
  295.         idx -= 1
  296.     for item in seps:
  297.         if inputString[idx: base].find(item) > -1:
  298.             return 1
  299.     if inputString[idx: base].lower().startswith('$env:public'):
  300.         return -1
  301.     return 0
  302.  
  303. def permuteString(inputString):
  304.     if len(inputString) < 2:
  305.         return "'" + inputString + "'"
  306.     l = random.randint(1, len(inputString) // 2 + 1)
  307.     x = []
  308.     i = 0
  309.     while i < len(inputString):
  310.         x.append(inputString[i: i + l])
  311.         i += l
  312.     y = list(x)
  313.     random.shuffle(y)
  314.     t = list(enumerate(y))
  315.     t = {i: j for (j, i) in t}
  316.     f = ''
  317.     s = ''
  318.     for item in x:
  319.         f += '{' + str(t[item]) + '}'
  320.     for item in y:
  321.         s += "'" + item + "',"
  322.     result = "('" + f + "'-f" + s[:-1] + ")"
  323.     return result
  324.  
  325. def dirtyString(inputString):
  326.     decodeFunc = '''function [funcname]{
  327.    param($inp)
  328.    $r = [int]$inp[0]
  329.    $output = ''
  330.    for($i = 1; $i -lt $inp.length; $i += 2){
  331.        $output += [char](16 * ([int]$inp[$i] - $r) + ([int]$inp[$i + 1] - $r))
  332.    }
  333.    return $output
  334. }
  335.  
  336. '''
  337.     funcname = randomName() + randomName()
  338.     decodeFunc = decodeFunc.replace('[funcname]', funcname)
  339.     result = list()
  340.     idx = 0
  341.     while idx < len(inputString):
  342.         if inputString[idx] == "'" or inputString[idx] == '"':
  343.             temp = navigateString(inputString, idx)
  344.             h = getLastWord(inputString, idx)
  345.             if temp in predefinedString:
  346.                 rt = permuteString(temp)
  347.             elif inputString[idx - 1] != '.' and h == 1:
  348.                 rt = '(' + randomRename(funcname) + "('" + encodeString(temp) + "'))"
  349.             elif h == 0:
  350.                 rt = permuteString(temp)
  351.             else:
  352.                 rt = inputString[idx] + temp + inputString[idx]
  353.             result.append(rt)
  354.             idx += len(temp) + 2
  355.         elif inputString[idx] == '#':
  356.             temp = navigateComment(inputString, idx)
  357.             result.append(temp)
  358.             idx += len(temp)
  359.         else:
  360.             result.append(inputString[idx])
  361.             idx += 1
  362.     result = ''.join(result)
  363.     return decodeFunc + result
  364.  
  365. try:
  366.     inputAddress = sys.argv[1]
  367. except:
  368.     inputAddress = 'we.ps1'
  369. with open(inputAddress, 'r') as i:
  370.     with open(inputAddress + '.ps1', 'w') as o:
  371.         kkk = i.read()
  372.         # kkk = parseTotal(kkk)
  373.         kkk = dirtyString(kkk)
  374.         kkk = dirtyInline(kkk)
  375.         kkk = dirtyNumber(kkk)
  376.         kkk = dirtyVariable(kkk)
  377.         o.write(kkk)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement