Samochodowy algorytm generacji kluczy, immo pass code i pin code

Usługa inżynierii wstecznej w celu ekstrakcji, przekonwertowania lub przepisania algorytmów samochodowych typu seed / key dla każdej marki samochodowej. Inżynieria odwrotna algorytmów pass code i pin code kalkulatorów immo.

Algorytmy samochodowe

W dzisiejszych czasach samochód to nie tylko precyzyjna mechanika ale także zaawansowany komputer zarządzajacy każdym aspektem jazdy czy dowolną inną funkcjonalnością.

Specjalistyczne programy diagnostyczne pozwalające na aktualizację oprogramowania samochodu, programowanie nowych kluczy czy dowolne inne funkcje, niejednokrotnie wymagają podania kluczy dostępowych w celu wykonania konkretnej akcji.

Klucze te wymagane są każdorazowo i nie są one darmowe. Są one najczęściej generowane na podstawie numeru VIN samochodu.

Samochodowy algorytm generacji kluczy, immo pass code i pin code

Rozwiązanie

Nasza firma oferuje specjalistyczną usługę polegającą na wykonaniu inżynierii wstecznej dowolnego oprogramowania diagnostycznego i próbę ekstrakcji algorytmów potrzebnych do wygenerowania kluczy dostępowych oraz utworzenie kalkulatorów na ich podstawie lub dostarczenie kodów źródłowych algorytmów w dowolnym języku programowania.

Przykład. Odtworzony kod źródłowy algorytmu kalkulatora w języku Python.

#!/usr/bin/env python

crc_table_0 = [
    0x2A, 0xFD, 0xF3, 0x11, 0xBF, 0x83, 0x22, 0x21, 0x07, 0x33,
    0x18, 0x60, 0xFE, 0x7E, 0xA4, 0x42, 0x6B, 0xFD, 0x04, 0x75,
    ...
]

crc_table_1 = [
    0x47, 0x47, 0x45, 0x76, 0x37, 0x45, 0x59, 0x2E, 0x45, 0x2A,
    0x25, 0x1F, 0x00, 0x75, 0xFF, 0x78, 0x05, 0xF5, 0x3D, 0x98,
    ...
]

crc_table_2 = [
    0xB6, 0x96, 0x0A, 0x2A, 0xA9, 0x21, 0x41, 0x4B, 0x52, 0xE7,
    0x2E, 0x01, 0x01, 0x14, 0x61, 0x02, 0x6B, 0x6A, 0x05, 0x7E,
    ...
]


def calc(seed, param_flags):
    v8 = param_flags >> 12

    v6 = param_flags & 0xFF

    v7 = (param_flags >> 8) & 0xF

    if param_flags & 0xFF:

        for i in range(4):

            if v7 == 3:

                if v8 == 1:
                    crc_table = crc_table_0
                    crc_item_index = 13 * v6 + 1 + 3 * i
                    control_code = crc_table_0[13 * v6 + 3 * i]
                else:
                    crc_table = crc_table_1
                    crc_item_index = 13 * v6 + 1 + 3 * i
                    control_code = crc_table_1[13 * v6 + 3 * i]

            else:

                crc_table = crc_table_2
                crc_item_index = 13 * v6 + 1 + 3 * i
                control_code = crc_table_2[13 * v6 + 3 * i]

            #print "seed = " + hex(seed) + " control code = " + hex(control_code)

            if control_code == 5:
                seed = (seed >> 8) | (seed << 8)

            elif control_code == 0x14:
                seed += crc_table[crc_item_index + 1] + (crc_table[crc_item_index] << 8)

            elif control_code == 0x2A:
                seed = ~seed

                if crc_table[crc_item_index] < crc_table[crc_item_index + 1]:
                    seed += 1
                elif control_code == 0x37:
                    seed &= crc_table[crc_item_index] + (crc_table[crc_item_index + 1] << 8)

            elif control_code == 0x4C:
                seed = (seed >> (16 - (crc_table[crc_item_index] % 16))) | (seed << crc_table[crc_item_index] % 16)

            elif control_code == 0x52:
                seed |= crc_table[crc_item_index] + (crc_table[crc_item_index + 1] << 8)

            elif control_code == 0x6B:

                v2 = crc_table[crc_item_index + 1] % 16
                seed = (seed << (16 - v2)) | (seed >> v2)

            elif control_code == 0x75:
                seed += crc_table[crc_item_index] + (crc_table[crc_item_index + 1] << 8)

            elif control_code == 0x7E:
                seed = (seed >> 8) | (seed << 8)

                if crc_table[crc_item_index] >= crc_table[crc_item_index + 1]:
                    seed += crc_table[crc_item_index + 1] + (crc_table[crc_item_index] << 8)
                else:
                    seed += crc_table[crc_item_index] + (crc_table[crc_item_index + 1] << 8)

            elif control_code == 0x98:
                seed -= crc_table[crc_item_index + 1] + (crc_table[crc_item_index] << 8)

            elif control_code == 0xF8:
                seed -= crc_table[crc_item_index] + (crc_table[crc_item_index + 1] << 8)

            seed = seed & 0xFFFF

        return seed & 0xFFFF

    else:
        return ~seed & 0xFFFF


def finder(seed, expected):

    for i in range(0xFFFF):

        val = calc(seed, i)

        if val == expected:

            print "seed = " + hex(seed) + " expected = " + hex(expected) + " param_flags = " + hex(i)

            return i

    print "couldn't find param_flags param for the provided expected value!"


key = 0


# expected result 0xBD19
result = calc(0x34D6, 0x0028)
print hex(result)

# expected result 0x5703
result = calc(0x4A3C, 0x0028)
print hex(result)

# expected result 0x14E7
result = calc(0x667E, 0x0028)
print hex(result)

# expected result 0x17DC
result = calc(0x9126, 0x0392)
print hex(result)

# expected result 0x337B
result = calc(0x7587, 0x0392)
print hex(result)

# find the param for the seed & result pair
param_flags = finder(0x7587, 0x337B)

# expected result 0x337B
result = calc(0x7587, param_flags)
print hex(result)

Zalety

Raz dostarczony kalkulator może być wielokrotnie wykorzystywany lub zamieszczony w innym oprogramowaniu drastycznie zmniejszając koszty usług samochodowych.

Czas

Szacunkowy czas wykonania usługi zależy od stopnia skomplikowania zadania i nie można go określić bez wstępnej analizy.

Koszty

Koszty ustalane są indywidualnie po wstępnej analizie z uwzględnieniem dodatkowych prac, które mogą pojawić się w przypadku niestandardowych rozwiązań.

Masz pytania?

Jeśli chcesz zlecić tą usługę — napisz do mnie, z miłą chęcią odpowiem na wszystkie Twoje pytania.