-
Notifications
You must be signed in to change notification settings - Fork 56
/
pattern.py
executable file
·119 lines (93 loc) · 2.91 KB
/
pattern.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python
import sys
try:
import clipboard
except ImportError:
pass
from string import ascii_uppercase, ascii_lowercase, digits
MAX_PATTERN_LENGTH = 20280
class MaxLengthException(Exception):
pass
class WasNotFoundException(Exception):
pass
def pattern():
for upper in ascii_uppercase:
for lower in ascii_lowercase:
for digit in digits:
yield upper + lower + digit
def pattern_gen(length):
"""
Generate a pattern of a given length up to a maximum
of 20280 - after this the pattern would repeat
"""
if length > MAX_PATTERN_LENGTH:
raise MaxLengthException(
"ERROR: Pattern length exceeds maximum of {0}".format(MAX_PATTERN_LENGTH)
)
result = ""
for p in pattern():
if len(result) < length:
result += p
else:
return result[:length]
# If we end up here we've exhausted all characters so truncate the pattern
return result[:length]
def pattern_search(search_pattern):
"""
Search for search_pattern in pattern. Convert from hex if needed
Looking for needle in haystack
"""
needle = search_pattern
try:
if needle.startswith("0x"):
# Strip off '0x', convert to ASCII and reverse
needle = needle[2:]
needle = bytearray.fromhex(needle).decode("ascii")
needle = needle[::-1]
except (ValueError, TypeError) as e:
raise
haystack = ""
for p in pattern():
haystack += p
found_at = haystack.find(needle)
if found_at > -1:
return found_at
raise WasNotFoundException(
"Couldn`t find {0} ({1}) "
"anywhere in the pattern.".format(search_pattern, needle)
)
def print_help():
print("Usage: {0} [LENGTH|PATTERN]\n".format(sys.argv[0]))
print("Generate a pattern of length LENGTH or search for PATTERN and ")
print("return its position in the pattern.\n")
if __name__ == "__main__":
if len(sys.argv) < 2:
print_help()
sys.exit(0)
if sys.argv[1] == "-h" or sys.argv[1] == "--help":
print_help()
sys.exit(0)
if sys.argv[1].isdigit():
try:
pat = pattern_gen(int(sys.argv[1]))
try:
clipboard.copy(pat)
print("Pattern copied to clipboard: \n")
except NameError:
pass
print(pat)
except MaxLengthException as e:
print(e)
else:
try:
found = pattern_search(sys.argv[1])
print(
"Pattern {0} first occurrence at "
"position {1} in pattern.".format(sys.argv[1], found)
)
except WasNotFoundException as e:
print(e)
sys.exit(1)
except (ValueError, TypeError):
print("Unable to convert hex input for searching. Invalid hex?")
sys.exit(1)