• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Улучшение Python кода генератора ключа для crackme

ROP

Red Team
27.08.2019
324
647
BIT
116
Здравствуйте!

Хочется знать, как улучшить код, написанный на Python. Давно не писал на python. Многое позабыл.
Генератора ключа для от Касперского.

Код
:

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final

def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final

def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x

def check_key(key):
    i = 0
    while i != 4:
        first = 0 + i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            return False
        if int(key[first]) == int(key[second]):
            return False
        if int(key[second]) == int(key[third]):
            return False
        if int(key[third]) == int(key[four]):
            return False
        i += 1

def generate_key():
    key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() # Генерация ключа

    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        if check_key(key) == False:
            key = gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part() + '-' + gen_key_part()
            print('false')
        else:
            print('True key ' + key)
            break


generate_key()
 
Решение
А ключ должен находится ? Если он не найдётся, что делать? Неопределённость какая-то
Я б переписал генерацию ключа вот в таком варианте:
Python:
def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4)))  for _ in range(4))
Разложение ключа на части можно сделать при помощи split, разложение на цифры составляющей ключа list.
В целом получается где-то так:
Python:
import random
import string


def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4))) for _ in range(4))

def sum_ord(key_part):
    nums = list(key_part)
    # Алгоритм сложения в crackme
    sum = ord(nums[0]) + ord(nums[1]) + ord(nums[2]) + ord(nums[3])*3
    return ord(nums[3]) +...

Pernat1y

Well-known member
05.04.2018
1 443
135
BIT
0
Я не гуру питона, поэтому могу ошибаться, но:

if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]), sum_ord(key[15:19])]:
вместо
if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):

Это
if int(key[first]) == int(key[second]):
можно заменить этим:
if key[first] == key[second]:

if not check_key(key):
вместо
if check_key(key) == False:
или, что ещё лучше, поменять на if check_key(key):

Проверки можно в одну собрать:
if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:

Ну и довольно странный алгоритм брутфорса в целом - рандом вместо последовательного перебора.

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final


def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final


def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            i += 1
            continue
        if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:
            i += 1
            continue
        else:
            return True


def generate_key():
    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        key = f'{gen_key_part()}-{gen_key_part()}-{gen_key_part()}-{gen_key_part()}'  # Генерация ключа
        if check_key(key):
            print('True key ' + key)
            break
        else:
            print(key)
            print('false')


generate_key()
 
Последнее редактирование:

ROP

Red Team
27.08.2019
324
647
BIT
116
Я не гуру питона, поэтому могу ошибаться, но:

if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]), sum_ord(key[15:19])]:
вместо
if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):

Это
if int(key[first]) == int(key[second]):
можно заменить этим:
if key[first] == key[second]:

if not check_key(key):
вместо
if check_key(key) == False:
или, что ещё лучше, поменять на if check_key(key):

Проверки можно в одну собрать:
if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:

Ну и довольно странный алгоритм брутфорса в целом - рандом вместо последовательного перебора.

Python:
import random

def gen_key_part():
    num1 = str(random.randint(0, 9))
    num2 = str(random.randint(0, 9))
    num3 = str(random.randint(0, 9))
    num4 = str(random.randint(0, 9))

    # Генерация части ключа
    final = num1 + num2 + num3 + num4
    return final


def sum_ord(key_part):
    num1 = key_part[0]
    num2 = key_part[1]
    num3 = key_part[2]
    num4 = key_part[3]

    # Алгорит сложения в crackme
    sum = ord(num1) + ord(num2) + ord(num3) + ord(num4) + ord(num4) + ord(num4)
    sum_final = ord(num4) + sum - 336
    return sum_final


def shr(key):
    print(key)
    a = key[0:4]
    b = key[5:9]
    c = key[10:14]
    d = key[15:19]

    # Алгоритм сдвига по битам в crackme
    x = sum_ord(a) + sum_ord(b) + sum_ord(c) + sum_ord(d)
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = i
        second = 5 + i
        third = 10 + i
        four = 15 + i

        # Проверка ключа
        if sum_ord(key[0:4]) != shr(key) or sum_ord(key[5:9]) != shr(key) or sum_ord(key[10:14]) != shr(key) or sum_ord(key[15:19]) != shr(key):
            i += 1
            continue
        if key[first] == key[second] or key[second] == key[third] or key[third] == key[four]:
            i += 1
            continue
        else:
            return True


def generate_key():
    # Проверяем ключ и печатаем true или false
    n = 1
    while n != 9999:
        key = f'{gen_key_part()}-{gen_key_part()}-{gen_key_part()}-{gen_key_part()}'  # Генерация ключа
        if check_key(key):
            print('True key ' + key)
            break
        else:
            print(key)
            print('false')


generate_key()
Спасибо за указание на мои ошибки :)
В следующих keygen'ах буду стараться лучше.
 

Andr0G3n

One Level
12.04.2020
6
2
BIT
1
А ключ должен находится ? Если он не найдётся, что делать? Неопределённость какая-то
Я б переписал генерацию ключа вот в таком варианте:
Python:
def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4)))  for _ in range(4))
Разложение ключа на части можно сделать при помощи split, разложение на цифры составляющей ключа list.
В целом получается где-то так:
Python:
import random
import string


def gen_key():
    digs = string.digits
    return '-'.join((''.join(random.choice(digs) for _ in range(4))) for _ in range(4))

def sum_ord(key_part):
    nums = list(key_part)
    # Алгоритм сложения в crackme
    sum = ord(nums[0]) + ord(nums[1]) + ord(nums[2]) + ord(nums[3])*3
    return ord(nums[3]) + sum - 336

def shr(key):
    subparts = key.split('-')
    # Алгоритм сдвига по битам в crackme
    x = sum_ord(subparts[0]) + sum_ord(subparts[1]) + sum_ord(subparts[2]) + sum_ord(subparts[3])
    x = x >> 2
    return x


def check_key(key):
    i = 0
    while i != 4:
        first = 0 + i
        second = 5 + i
        third = 10 + i
        four = 15 + i
        if shr(key) not in [sum_ord(key[0:4]), sum_ord(key[5:9]), sum_ord(key[10:14]),
                            sum_ord(key[15:19])]:
            return False
        if key[first] == key[second]:
            return False
        if key[second] == key[third]:
            return False
        if key[third] == key[four]:
            return False
        i += 1

def generate_key():
    key = gen_key()
    for n in range(99999):
        if check_key(key):
            print(f'Found key: {key}')
            break
        else:
            print(f'Key {key} is invalid.')
            key = gen_key()

generate_key()
 
Решение
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!