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.
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.
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.
#!/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)
Raz dostarczony kalkulator może być wielokrotnie wykorzystywany lub zamieszczony w innym oprogramowaniu drastycznie zmniejszając koszty usług samochodowych.
Szacunkowy czas wykonania usługi zależy od stopnia skomplikowania zadania i nie można go określić bez wstępnej analizy.
Koszty ustalane są indywidualnie po wstępnej analizie z uwzględnieniem dodatkowych prac, które mogą pojawić się w przypadku niestandardowych rozwiązań.
Jeśli chcesz zlecić tą usługę — napisz do mnie, z miłą chęcią odpowiem na wszystkie Twoje pytania.