Last active
November 8, 2019 04:35
-
-
Save dev-zzo/48d337b8398b61afdb57 to your computer and use it in GitHub Desktop.
pattern_create.rb in Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
"""Utility functions to work with character patterns.""" | |
__lower_alpha = 'abcdefghijklmnopqrstuvwxyz' | |
__upper_alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | |
__numeric = '0123456789' | |
def pattern_create(length, charsets=None): | |
"""Generates a unique, nonrepeating pattern of a given length. | |
length: | |
the resulting pattern's length, in characters | |
charsets: | |
if given, must be a tuple/list containing 3 strings. The pattern | |
will be generated using the given sets. | |
""" | |
if charsets is None: | |
charsets = (__upper_alpha, __lower_alpha, __numeric) | |
if length <= 0: | |
return '' | |
state = [0, 0, 0] | |
output = [] | |
count = (length + 2) // 3 | |
while count > 0: | |
output.append(charsets[0][state[0]] | |
+ charsets[1][state[1]] | |
+ charsets[2][state[2]]) | |
state[2] += 1 | |
if state[2] >= len(charsets[2]): | |
state[2] = 0 | |
state[1] += 1 | |
if state[1] >= len(charsets[1]): | |
state[1] = 0 | |
state[0] += 1 | |
if state[0] >= len(charsets[0]): | |
state[0] = 0 | |
# print 'WARNING: the sequence has started over.' | |
count -= 1 | |
return ''.join(output)[:length] | |
# Handy command-line usage | |
if __name__ == '__main__': | |
import sys | |
op = sys.argv[1] | |
if op == 'make': | |
length = int(sys.argv[2]) | |
print pattern_create(length) | |
elif op == 'find': | |
value = sys.argv[2] | |
max_len = int(sys.argv[3]) | |
print 'Value provided: %s' % value | |
if len(value) == 8: | |
print 'Considering the value to be a hex register data' | |
value = value.upper() | |
chars = [chr(int(value[0:2], 16)), | |
chr(int(value[2:4], 16)), | |
chr(int(value[4:6], 16)), | |
chr(int(value[6:8], 16))] | |
elif len(value) == 4: | |
print 'Considering the value to be a string' | |
chars = value | |
pat = pattern_create(max_len) | |
pos = pat.find(''.join(chars)) | |
if pos == -1: | |
chars = chars[::-1] | |
pos = pat.find(''.join(chars)) | |
if pos == -1: | |
print 'Not found (tried both BE and LE)' | |
else: | |
print 'Found (LE order) at offset %d' % pos | |
else: | |
print 'Found (BE order) at offset %d' % pos |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment