Обратная битовая операция - PullRequest
       5

Обратная битовая операция

2 голосов
/ 06 февраля 2020

Так что я застрял

Я недавно купил устройство Bluetooth, которое хорошо взаимодействует с моим телефоном, будучи мной, я хотел написать контроллер с P C, поэтому начал реверс-инжиниринг BT-трафика c. (Для этого нет SDK, компания, которая делает это устройство явно, я могу с этим смириться)

Теперь устройство BT выдает 28 шестнадцатеричных символов в качестве «значения», и декодирование было достаточно простым ( код ниже)

Что я хочу сделать сейчас, так это отменить эту процедуру и кодировать мою собственную, вот где я терплю неудачу.

Как я уже говорил, устройство выдает 28-символьную шестнадцатеричную строку. Декодировать это просто:

import pandas as pd
from data import codes, lookup
pdcolumns = ['a','b','c','d','e','f','g','h']

def mask(string):
    struct = {
        'a': None,
        'b': None,
        'c': None,
        'd': None
    }
    nibbles = [2,4,4,6]

    code = string[12:] # slice off the first 12 bits, these are an application ID and seemingly irrelevant
    offset = 0
    for i, key in zip(range(0, len(nibbles)), list(struct.keys())):
        current_byte = nibbles[i]
        partial = code[offset:(offset + current_byte)]
        struct[key] = int(partial, 16) & 0xFF
        if key == 'd':
            struct['h'] = int(partial, 16) # copy, no mask
        offset += current_byte
    struct['e'] = struct['d'] - (struct['d'] ^ ((struct['a'] * struct['c'])) & 0xFF)

    # breakdown columns
    struct['f'] = (struct['d'] ^ (struct['a'] * struct['c']))
    struct['g'] = struct['f'] & 0xFF
    return struct

transcribed = []
for code in codes:
    transcribed.append(mask(code))
df = pd.DataFrame(transcribed, columns=pdcolumns)

ОК, поэтому первые 5 столбцов просты:

  1. идентификатор последовательности в диапазоне (1 126)
  2. Контроллер
  3. Параметр 1
  4. Параметр 2 (значение)
  5. Результат

Столбец h - это необработанный результат из шестнадцатеричного столбца, немаскированные столбцы f и g - это столбцы разбивки из уравнение, которое генерирует результат в e.

пример вывода

|      |   a |   b |   c |   d |   e |    f |   g |      h |
|-----:|----:|----:|----:|----:|----:|-----:|----:|-------:|
|  924 |  21 |   1 |   0 |  51 |   0 |   51 |  51 | 589107 |
|  795 |  19 |   1 |   0 | 190 |   0 |  190 | 190 | 531646 |
|  491 | 111 |   3 |  48 | 249 | 208 | 5161 |  41 | 413945 |
| 1810 |  18 |   2 |   0 |  96 |   0 |   96 |  96 | 548960 |
| 1209 |  52 |   1 |   0 |  67 |   0 |   67 |  67 | 546115 |
| 1054 |  24 |   2 |   0 | 230 |   0 |  230 | 230 | 549606 |
| 1545 |   7 |   1 |   0 | 162 |   0 |  162 | 162 | 539042 |
|   68 |  69 |   3 |  34 | 238 |  42 | 2500 | 196 | 706542 |
|  242 | 116 |   3 |  76 | 220 |  48 | 8876 | 172 | 862684 |
| 1169 |  12 |   3 |  13 | 234 | 116 |  118 | 118 | 626410 |

пример ввода

243c08001812150101100008fd33
243c080018121301011000081cbe
243c080018126f010310300650f9
243c080018121201021000086060
243c080018123401011000085543
243c0800181218010210000862e6
243c0800181207010110000839a2
243c0800181245010310220ac7ee
243c08001812740103104c0d29dc
243c080018120c0103100d098eea

Учитывая, что происходит двоичное маскирование, как можно Я перевернуть это уравнение? Это, вероятно, просто, но я слишком долго смотрел на это.

Примечания:

Столбцы c & d по модулю 4096, поэтому это допустимая замена для 0 Столбец e может быть (не показан) отрицательным числом до -256 - df.sample не выбрал ни одного в этом раунде

Любой из d, g, h будет приемлемым, особенно если вы можете объяснить шаги

Это не домашний проект или рабочий проект, это побочный проект, где я бью кирпичную стену и мне нужно понять.

Уточнить

Я хочу изменить столбец e, учитывая только e, a и c, чтобы сделать h, хотя я приму любой из f, g или d как эти должен быть обратимым

...