Хакінг рації Tekk NT-40

Опубліковано 18.04.2026, 17:06 в категорії YouTube

TEKK NT-40

Перед вами - портативна радіостанція Tekk NT-40.

Цій рації вже ось ось буде 30 років, про неї майже немає інформації в інтернеті, а ще вона запрограмована на зовсім непідходящі для України частоти. Тому в даній статті подивимось що дана рація має всередині, а також зареверсінжиніримо її пам'ять, та запишемо в неї необхідні нам частоти!

OLX

Одного дня, блукаючи просторами OLX, я натрапив на ось таке оголошення. В ньому, пан Іван за недорого продавав радіостанцію Tekk NT-40. Я дуже давно хотів собі в колекцію якусь стару рацію з супергетеродиновим приймачем, тому вона мене одразу зацікавила. Ну а додатковий челендж у вигляді відсутності інформації про те як і чим прошивати дану рацію ще сильніше підігрів мій інтерес до неї. Тому, після теплої розмови з паном Іваном, ця рація вирушила до мене.

Пакунок

Якщо спробувати пошукати інформацію про рацію в інтернеті, то окрім оголошень на eBay, а також магазинів де можна купити акумулятор для неї, інформації майже немає. Не кажучи вже про програмне забезпечення для взаємодії з рацією - в інтернеті навіть немає згадок що воно взагалі колись існувало. Тому єдине що залишається, це детально оглянути рацію, можливо на ній є якісь підказки.

FCC ID

Конкретно в даному випадку мені дуже пощастило - ця рація має FCC ID, а отже вона зареєстрована в Федеральній комісії зі зв'язку США. Якщо коротко, то ця комісія перевіряє та сертифікує пристрої, що можуть передавати радіосигнал, щоб вони працювали в дозволених діапазонах, та не створювали різних завад та перешкод. Наявність цього айдішника показує, що пристрій успішно пройшов сертифікацію та потрапив до бази даних FCC, що для нас дуже важливо, адже з цієї бази можна отримати дуже багато різної інформації.

fccid.io

Наприклад на ось такому сайті, fccid.io - достатньо просто ввести ID, і перед нами розгортається просто купа корисної інформації. Тут вам і інструкція з експлуатації, і фотографії плати, і навіть повноцінні схеми, прекрасно. Фотографії звісно дуже низької роздільної здатності, зважаючи на вік рації, але навіть це вже набагато краще ніж нічого. Тож тепер треба все це дослідити, і дізнатись про рацію побільше.


Почитавши інструкцію з експлуатації, я дізнався пару не дуже приємних моментів:

По перше - рація працює в діапазоні від 450 до 470 МГц - тобто вона не попадає ані в радіоаматорський діапазон в Україні, ані в безліцензійний PMR446. По друге - частоти та налаштування рації лежать на мікросхемі 93C66 - на перший погляд звичайна EEPROM мікросхема пам'яті, але в якості шини даних в ній використовується не звичні нам SPI або I2C, а MicroWire. Це додасть невеличких труднощів при роботі з нею.

Окисли

Гаразд, тепер маючи вдосталь інформації, рацію можна і розібрати. Час звісно не пощадив цю рацію - всюди окисли та іржа. Треба буде обов'язково цього позбутись, щоб метал не продовжував руйнуватись.

Плата

Внутрішній світ цієї рації просто вражає. Можу годинами роздивлятись подібні старі плати, де є купа мікросхем та компонентів, а не як зараз - одна мікросхема під компаундом і все.

Мікросхема пам'яті

А ось і мікросхема пам'яті. Саме звідсіля мікроконтролер дізнається, як і на яких частотах рація повинна працювати. До речі, навіть не маючи схеми, можна легко знайти мікросхему пам'яті - вона часто стоїть максимально близько до мікроконтролера, та зазвичай має мінімум обв'язки. Як я вже й казав, мікросхема пам'яті тут використовує шину MicroWire - це Three Wire шина даних, яка була попередником шини SPI. Вони були багато в чому схожі, але врешті решт шина SPI витіснила MicroWire, і стала таким собі умовним стандартом.

Тому, ані сучасні мікроконтролери та одноплатники, ані сучасні програматори, часто не мають хардварної підтримки даної шини. Через це, найлегшим способом взаємодіяти з мікросхемою є так званий Bit Banging, тобто імітування шини даних використовуючи звичайні GPIO піни.

Логічний аналізатор

Але перед цим я хотів би спробувати подивитись за допомогою логічного аналізатора, що там взагалі відбувається на цій шині даних, бо Bit Banging процес не самий надійний, і мати якісь референсні дані точно не завадить. Логічний аналізатор це дуже зручний прилад, який дозволить перехопити та проаналізувати якісь дані, не втручаючись при цьому в роботу самого пристрою. В даному випадку ми будемо перехоплювати комунікацію між мікроконтролером, та мікросхемою пам'яті.

Дротики

Для цього я підпаяв невеличкі дротики до основних пінів мікросхеми - Latch, Clock, Data Input, та Data output, а також підпаяв дріт до піна, по якому відбувається програмування рації з комп'ютера. Забігаючи на перед, скажу, що на цьому піні взагалі ніяких даних не було, схоже він чекає якусь команду від програми на комп'ютері чи типу того, тому сфокусуємось виключно на мікросхемі.

Для роботи з аналізатором я буду використовувати програму PulseView. Достатньо тут лише поставити кількість семплів побільше, та частоту вдвічі більшу за робочу. Конкретно ця мікросхема може працювати зі швидкістю 2 МГц, але я дуже сильно сумніваюсь що в рації вона читається з такою швидкістю, тому 1 МГц повинно вистачити з головою.

Налаштування PulseView

Тепер можна чіплятись до мікросхеми, запускати аналізатор, та подавати живлення на рацію. Я також попереключав по черзі всі канали, так як скоріше за все, мікроконтролер зчитує налаштування каналів динамічно, під час їх перемикання.

Дані

Як можете бачити, аналізатор успішно зчитав дані, які бігали між мікроконтролером та мікросхемою пам'яті. А щоб нам вручну не вираховувати, де тут нуль, а де одиниця, програма PulseView має цілу купу декодерів, які можна застосувати до отриманих даних. Серед декодерів є і декодер MicroWire, але він на жаль ламається, і не працює як слід. Він намагається декодувати лише першу команду, а далі застряє.

Помилки

Я дуже довго не міг зрозуміти чому - багато гуглив, та читав даташити, аж допоки не звернув увагу на наступне - для того щоб зчитати комірку пам'яті з мікросхеми, потрібно 20 Clock імпульсів. Я вирішив порахувати скільки їх в мене, і як виявилось - мікроконтролер в рації перед кожним читанням робив один зайвий Clock сигнал.

Зайвий clock імпульс

Мікросхемі на таке байдуже, це ніяк не впливає на її роботу, а от декодеру в програмі - як виявилось, не байдуже. Тому я трохи переписав код декодера, щоб він ігнорував цей перший імпульс, і після цього все запрацювало.

Декодовані дані

Як можете бачити, декодер успішно декодує команду, адресу пам'яті, та дані які звідтіля відправила мікросхема. Тепер кожен отриманий байт можна витягнути з програми для подальшого аналізу.

0000000000 00 55 00 55 00 55 00 55 00 21 00 99 00 06 00 28  |.U.U.U.U.!.....(|
0000000010 00 56 00 01 00 01 00 00 00 00 00 00 00 06 00 00  |.V..............|
0000000020 00 FF 00 0A 00 00 00 FF 00 D1 00 17 00 17 00 60  |...............`|
0000000030 00 82 00 56 00 08 00 25 00 D1 00 D1 00 17 00 17  |...V...%........|
0000000040 00 61 00 02 00 56 00 10 00 25 00 D1 00 D1 00 17  |.a...V...%......|
0000000050 00 17 00 62 00 15 00 06 00 21 00 50 00 D1 00 D1  |...b.....!.P....|
0000000060 00 17 00 17 00 67 00 50 00 06 00 75 00 00 00 D1  |.....g.P...u....|
0000000070 00 D1 00 17 00 17 00 67 00 35 00 06 00 73 00 50  |.......g.5...s.P|
0000000080 00 D1 00 D1 00 17 00 17 00 65 00 90 00 06 00 59  |.........e.....Y|
0000000090 00 00 00 90 

Неозброєним оком видно, що байт D1 розділяє налаштування каналів, тому я прибрав все зайве, прибрав зайві 00 байти які виникли через умовність декодера, посортував канали в рядок, і маємо наступну картину:

D1 17 17 60 82 56 08 25 D1 
D1 17 17 61 02 56 10 25 D1
D1 17 17 62 15 06 21 50 D1
D1 17 17 67 50 06 75 00 D1
D1 17 17 67 35 06 73 50 D1
D1 17 17 65 90 06 59 00 90

Чесно кажучи, я думав буде цікавіше. Тут явно видно, навіть в human readable форматі, частоту на якій повинна працювати рація - 4, 5, та 6 байти. Четвірка пропущена, так як рація вміє працювати лише в UHF, тобто 400 МГц, тож цю четвірку вирішили не вказувати. Якщо ж взяти якусь іншу рацію, наприклад Quansheng UV-K5, то в її пам'яті частота виглядає ось так - 0x30BAA402. Це 32-х бітне число, записане в little-endian форматі, тобто від молодшого байта до старшого. Переводимо його в big-endian, міняючи послідовність байтів, і отримуємо наступне число: 0x02A4BA30. Тепер його можна перевести в десяткову систему, і як можете бачити, ми отримали частоту каналу в рації - 44350000 кГц.

А в Tekk NT-40 навіть переводити нічого не треба - одразу бачимо частоту. Єдине що мені було незрозуміло, де тут зазначені CTCSS коди. Якщо згадати частоти з OLX оголошення, то на третьому каналі CTCSS тон відрізнявся від всіх інших. Тобто повинен бути якийсь байт, який однаковий на всіх шести каналах, крім третього, і такого байту я тут не бачу.

CTCSS

Тому я вирішив відкрити таблицю CTCSS тонів, та глянути, якою за номером йде частота 141.3 Гц. Вона двадцять друга. А якщо 22 перевести в шістнадцятковий формат, то вийде 17.

22 = 0x17

Тобто другий та третій байти як раз повинні вказувати на CTCSS тон для прийому та передачі. Але чому ж тоді на третьому каналі він не відрізняється?

Реальний CTCSS тон

Я вирішив перевірити третій канал за допомогою іншої рації, і дійсно виявилось, що CTCSS тон тут стоїть на 141.3 Гц. В оголошенні була помилка. Тож дуже зручно мати рацію типу Quansheng, адже вона дозволяє не лише подивитись частоту, а ще й CTCSS тони.

Випаювання мікросхеми

Гаразд. Тепер ми приблизно знаємо, який вміст повинна мати мікросхема пам'яті, тож можна сміливо її випаювати, та намагатись зчитати. Я випаяв мікросхему паяльником, додавши трохи нового припою, щоб мікросхема легше відпаялась. Після цього я запаяв мікросхему на DIP перехідник, щоб з нею було зручніше працювати.

Зробити Bit Banging можна будь яким мікроконтролером, але особисто я використаю Raspberry Pi, так як на ній вже є Linux, і не треба буде вигадувати як перенести дані з мікроконтролера в файл на комп'ютері.

До цього в інтернеті я знаходив пайтонівські скрипти для читання та запису схожих мікросхем - дякую користувачу з нікнеймом thierry81 за те що поділився!

Дані скрипти працють з мікросхемами 93C56, тобто з меншим обсягом пам'яті, і що дуже важливо - шістнадцятибітними словами.

Пін ORG

Якщо коротко, то мікросхеми цієї серії мають спеціальний пін, ORG (шостий), яким можна обирати організацію пам'яті на мікросхемі - в випадку моєї мікросхеми це або 256 слів по 16 біт, або 512 слів по 8 біт.

Якщо зазирнути в схему рації, то можна побачити, що даний пін в ній притягнутий до землі, а отже обрана конфігурація 512 слів по 8 біт, тож саме так мікросхему краще і читати. Тому я модифікував ці скрипти щоб по перше вони працювали з більшим обсягом пам'яті, та по друге - використовували команди для 8ми бітної організації пам'яті. Тепер залишилось лише підключити все до мікросхеми, і запустити скрипт.

Підключення

Чудово! Перед нами дамп пам'яті.

00000000  21 99 06 28 56 01 01 00  00 00 06 00 ff 0a 00 ff  |!..(V...........|
00000010  60 00 06 49 87 65 00 07  00 12 11 11 11 11 11 00  |`..I.e..........|
00000020  00 00 00 55 55 55 55 55  55 55 55 55 55 55 55 55  |...UUUUUUUUUUUUU|
00000030  d1 17 17 61 23 56 08 25  d1 17 17 46 00 26 10 25  |...a#V.%...F.&.%|
00000040  d1 17 17 62 15 06 21 50  d1 17 17 67 50 06 75 00  |...b..!P...gP.u.|
00000050  d1 17 17 67 35 06 73 50  d1 17 17 65 90 06 59 00  |...g5.sP...e..Y.|
00000060  90 00 00 ff ff ff ff ff  90 00 00 ff ff ff ff ff  |................|
00000070  90 00 00 ff ff ff ff ff  10 00 00 ff ff ff ff ff  |................|
00000080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000200

Можна побачити, що присутні деякі відмінності з тим що до цього показував логічний аналізатор - наприклад там було вдвічі більше D1 байтів. Але слід розуміти, що аналізатор лише перехопив те, що зчитував мікроконтролер, який, в даному випадку зчитував пам'ять не лінійно, а за своїми певними алгоритмами. Байт D1 дублювався, так як мікроконтролер схоже використовує цей байт як такий собі умовний маркер початку та кінця налаштувань каналу.

Тобто він бере цей байт за початок, і зчитує послідовно комірки пам'яті поки не зустріне ще один такий байт. І так кожного разу при перемиканні каналів, тому він і дублювався. Щож, а тепер час перевірити теорію, і подивитись, як рація відреагує на нові частоти. Для цього я модифікував дамп, віредагувавши пару каналів - по перше замінив частоту в межах робочого діапазону рації, і по друге - замінив частоту на частоту першого PMR каналу, тобто за межами її робочого діапазону.

Модифікований дамп

Тут я трохи промахнувся з PMR частотою, але не суть, перевірити ідею це не завадить. І тепер, вже іншим скриптом, я записав новий модифікований дамп назад на мікросхему. Залишилось тепер лише запаяти її, і перевірити.

Прийом першого PMR каналу

Іііі, неймовірно, рація почала приймати PMR канал, який на 4 мегагерци нижче за її заявлений робочий діапазон!

А от передача при цьому залишалась на попередніх частотах. Я дуже довго не міг зрозуміти як і чому, адже в налаштуваннях каналу залишилось зовсім мало байтів, і я все ніяк не міг зрозуміти що вони значать. Я витратив не один день, читаючи даташити мікросхем рації та розраховуючи частотні дільники синтезатора, адже саме так у ній задаються частоти прийому й передачі, аж допоки не помітив, що останній байт в усіх каналах співпадає з останніми цифрами в частоті.

Частота передачі

Ну і як виявилось частота передачі просто записана в цих байтах, в такому ж форматі як і частота прийому, яку я модифікував до цього. Просто через трохи іншу парність цифр, я цього взагалі не помітив одразу. Тож якщо у вас щось не виходить, слід перепочити, та подивитись на все свіжим поглядом.

Ну а маючи цю інформацію, я зробив новий дамп, де записав всі 8 PMR каналів:

Дамп з 8 каналами PMR

Звісно, на початку дампу є ще ціла купа байтів інформації, які скоріш за все налаштовують інші параметри рації - Time Out Timer, сканування каналів, Power Saving, ширину каналу, налаштування кнопок і тд. Але без програми, завересінжинірити їх буде вже набагато складінше, адже взагалі незрозуміло який байт за що відповідає, і які значення він може приймати.

У випадку налаштування частот, в нас хоча б було шість каналів, тобто шість повторюваних місць в пам'яті, де можна побачити якусь закономірність та зробити якісь висновки. В випадку інших байтів, такої розкоші ми не маємо, тож в рамках цієї статті обмежимось лише редагуванням частоти та субтонів.

А тим частом дамп вже готовий і записаний, і тепер рацію можна використовувати на безліцензійному діапазоні! Як на прийом, так і на передачу.


Старий акумулятор

До речі пару слів слід сказати і про акумулятор. Так як рація дуже стара, в акумуляторі тут використовувались Нікель-Кадмієві елементи. В наш час використовувати їх вже зовсім недоцільно, тому попередній власник переробив акумулятор на літій. Але як часто буває з акумуляторами від рацій, корпус після переробки виглядає дуже непрезентабельно.

FreeCAD

Тому я вирішив скористатись цим моментом, та опанував FreeCAD - дуже потужне open source CAD середовище для моделювання. Розібратись в ньому вийшло значно легше ніж я очікував, і я зміг нашвидкоруч спроєктувати ось такий простий корпус під акумулятор для цієї рації:

Новий акумулятор

До речі, дуже вдячний Штефану за чудову платку для зарядки 2S акумулятора!


Рація Tekk NT-40

Ось така по ітогу вийшла крута рація. Багато хто скаже, що все це недоцільно, і набагато легше просто купити нову сучасну рацію. Якщо потрібна саме рація, то так - я з цим цілком згоден.

Але для мене тут був цікавий саме процес. В ході подібного реверсінжинірінгу я завжди дізнаюсь щось цікаве, і покращую свої навички. Ну і бонусом тут я ще й отримав собі в колекцію таку унікальну рацію з крутою історією.

Щоправда, хоч вона тепер і працює за межами свого робочого частотного діапазону - але через це вона тепер значно менш чутлива до сигналів. Там де навіть Baofeng ловить якість слабкі сигнали, Tekk NT-40 мовчить навіть з вимкненим шумодавом, тобто весь прикол супергетеродину втрачається. Вся справа в тому, що робочий частотний діапазон рації визначається не просто так - хоч ми софтварно і розширили його, хардварно він не змінився - на платі залишились ті самі фільтри та компоненти, які розраховані на зовсім інші частоти. Чого вартує лише керамічний SAW фільтр на 465 МГц:

SAW фільтр

По схемі до речі мав стояти фільтр на 455 МГц, тобто в моїй ревізії плати він ще далі від 446 МГц. Такі фільтри зазвичай мають смугу шириною всього 10 МГц, а отже він точно глушить сигнали на новозаписаних в рацію частотах. Інші фільтрі рації я моделював в програмі Qucs-s, і наче вони не повинні заважати:

Програма Qucs-s

Тож якщо прибрати або замінити цей SAW фільтр, то ситуація повинна покращитись. Але, це ми вже сильно відійшли від теми статті.

Метою статті було показати, як можна за допомогою недорогих інструментів зареверсінжинірити прилад, про який майже немає інформації в інтернеті. Реверсінжиніринг це завжди дуже цікаве та пізнавальне заняття, і часто ще корисне, тож якщо у вас теж є подібні пристрої - раджу спробувати. Наприклад, я також реверсінжинірив свою комп'ютерну мишку - перехоплював USB пакети через Wireshark щоб зрозуміти як працює програма для її налаштування, і завдяки цьому я зміг написати пайтонівський скрипт, щоб налаштовувати мишу на Linux, бо під Linux виробник на жаль програму не робив.

Навряд чи серед тих хто читає цю статтю, є власники такої радіостанції, але про всяк випадок - все що було в статті, ви зможете знайти в кінці цієї статті в додатках: Дані з логічного аналізатора, дампи, скрипти, а також 3D моделі корпусу. Раптом комусь це колись знадобиться.

А на цьому в мене все!

Можливо колись таки ми з вами поговоримо про те, як вже повноцінно перетягнути рацію на інший частотний діапазон, та протестувати її чутливість.

А поки що - дякую що читали!

Post Scriptum

Це текстова версія мого відео, доступного за посиланням.


Додатки

3D моделі:

Скрипти для мікросхеми 93C66:

Файли для PulseView

  • Декодер: nt40_decoder.zip
  • Перехоплена комунікація між мікроконтролером та мікросхемою пам'яті: nt40.sr

Декодер треба помістити в директорію /usr/share/libsigrokdecode/decoders/ на Linux.

Дампи пам'яті:

  • Оригінальний дамп пам'яті: dump.bin
  • 8 PMR каналів: pmr.bin