はんだごおのハッキング方法

フレヌズは少し奇劙に聞こえたすか 技術的な進歩のおかげで-それほど昔ではないが、「電話で写真を撮る」こずはそれほど奇劙ではなかった。



画像






昚幎の終わりに、すでに「フォヌク」ずいうラベルを取埗したはんだ付けステヌションを賌入したした。 その利点䟿利なT12チップカヌトリッゞ、たずもな電力理論的には最倧72W、高速加熱秒単䜍、䜎䟡栌。 このシックなレビュヌで駅に慣れるこずができたす 



最新バヌゞョンのハヌドりェア2.1を賌入したしたが、ファヌムりェアが叀いこずを知っお少し気が動転したした。 もちろん、圌の手はcombかれお曎新されたした。 はんだ付けステヌションの「心臓郚」がSTM32F103C8STMicroelectronics補の人気のARM Cortex-M3マむクロプロセッサであるこずを知っおいる-掘り䞋げるのがもっず面癜かった STM32F4DiscoveryのLEDを䞀床点滅させたした。



その埌、SWDむンタヌフェヌスの4本のワむダヌがはんだ付けされ、プログラマヌが接続され、ファヌムりェアがアップロヌドされたした。

そしお...ステヌションはアクティベヌションを芁求したした



わかりやすくするために、このステヌションの開発者に぀いおいく぀かの蚀葉を話したす。 すべおの情報はむンタヌネットから取埗されたす䞀郚はファヌムりェア自䜓から取埗されたす。 鉄ずファヌムりェアは、2014幎頃に䞭囜の特定の友人ZhongGuoxin38827251@qq.comによっお開発されたした。 いく぀かの䞭囜のフォヌラムの非公開グルヌプで掻発に開発が行われおいたした。 圌の「カントリヌマン」によるクロヌン化から開発を保護する詊みの無益さを認識しおいるように、圌はファヌムりェアで保護を行いたした。 ファヌムりェアはバむナリモゞュヌルの圢匏で配垃され、だれでもそれをはんだ付けしたばかりのクロヌンで埋めるこずができたした。



なぜそうですか 結局、既にフラッシュされたMKを配垃し、暗号化されたBLOBで曎新する、はるかに信頌性の高いスキヌムがありたす。 知りたせん どうやら時間、利䟿性、人気ず収入の間の埮劙なバランス。 起動時に、ファヌムりェアはコヌドID1ずID2を生成し、䜜成者は、9元〜80ルヌブルの象城的な量のアクティベヌションキヌRG1ずRG2ず亀換したす。



しかし、攻撃者がアクセスできる堎合、どうすればファヌムりェアを保護できたすか 今、私たちは芋぀けたす。



残念ながら、デバむスでアクティベヌションコヌドを正盎に賌入するこずはできたせんでした。 今埌、これらのコヌドは、曎新に加えお、マむクロプロセッサ脚を火傷した堎合たたはEEPROMを亀換するこずで再はんだ付けできたす。 そしお、そのようなケヌスはすでに繰り返し発生しおいたす。



なぜなら 私は自分のコピヌを正圓に所有し、その埌アヌトに完党に埓っおいたす。 ロシア連邊民法兞1280幎、「プログラムの機胜に必芁な行動を実行できる」



最初のパンケヌキはゎツゎツしおいる



ファヌムりェアがIDAにダりンロヌドされたした。 アクティベヌションコヌドが入力された堎所を非垞にすばやく芋぀けたした。 私が正しい軌道に乗っおいるこずを確認するために、DisplayStringずいう関数の匕数にパッチを適甚したした。 パッチを圓おたバヌゞョンを埋めたした。 始たらない



たあ、それは倧䞈倫です、私はおそらく機胜の目的を誀解したした。 倉曎をロヌルバックしたす。 衚瀺されたテキストにパッチを適甚したす。 始たらない



すごい 敎合性チェックがありたす。 デバッガが必芁です。 そしお、ハヌドりェアブレヌクポむントで圌女をキャッチしたす デバッガヌずしおいく぀かのオプションを分類し、IDA gdb + OpenOCDの束に決めたした。 IDAデバッガヌ自䜓は䞍䟿でバグがありたすが、デバッガヌで盎接disasmをむンタラクティブに線集する機胜は、デバッガヌを䞊回りたした。



OpenOCDを起動し、倉曎されたコヌドのバむトを読み取るようにりォッチポむントを蚭定したす。 私はそれを始めおいたす。 りォッチポむントが機胜しない...どうしお 結局、完党な敎合性チェックが存圚したす

そしお、ここで私は本圓に興味がありたす。



デヌタを調査したす



ファヌムりェアのフルサむズは75,512バむトです。 これはかなりたくさんありたす。 デヌタのコヌドはすでにIDAによっお分離されおいたす。 ARM Thumbの機胜である、関数間のコヌドにあるロヌカルデヌタの小さなスポットを陀く、48128バむトのコヌドず27384バむトのデヌタが刀明したした。



ここで、このデヌタの意味を理解しおおくずいいでしょう。



最も単玔なのはテキストデヌタです。 メニュヌ項目の名前、ヒント、著䜜暩。 圌らは6kb以䞊であるこずが刀明したした。 メニュヌテキストの䞭に、FLASHセグメントの32ビットアドレスに非垞に類䌌したバむトが芋぀かりたした。 これらのアドレスには、以前に芋぀かったDisplayStringぞの呌び出しを含む倧量のルヌチンがありたした。 したがっお、これらはメニュヌ項目ハンドラヌです。 適切な量​​のコヌドが認識されたす。



続けたす。 ステヌション画面はモノクロであるため、グラフィックデヌタはビットモノクロ圢匏で衚瀺されるず想定するのが論理的です。 ZX-Spectrumの子䟛時代を思い出しお-列にバむトを衚瀺するこずが決定されたした。90幎代にゲヌムでグラフィックを探しおいたしたが、デヌタやコヌドずは著しく異なりたした。



Viewbinはpythonで曞かれおいたす。 䟿宜䞊、256バむトの各ブロックは隣接するブロックから分離されおいたす。 合蚈で、正確に1キロバむト4ブロックが1列に垂盎に配眮されたす。 次の列は、次のキロバむトを指したす。



画像






グラフィックの波線が右偎にはっきりず芋えたす。 しかし、写真では圌らはひどく合算したす。 そしお、頭を右に傟けるず 最初に、フォント8 * 16x * yに気付くこずができたす。最初の8バむトは文字の䞊半分を圢成し、2番目はその䞋半分を圢成したす。



画像






残りのキャラクタヌは同じ原理で構築されおいたす。 倧きなフォントサむズは16 * 32、象圢文字のグリフは16 * 16



画像






さらに、さらにいく぀かのサヌビスシンボル摂氏アむコン、枩床蚈、矢印、チェックボックスがありたす。 合蚈で玄16 kbがグラフィックで占められおいたす。



27 kbのデヌタのうち、22 kbがすぐに認識されたした。 悪くない。



コヌドに移りたしょう-48キロバむトのタむトなTHUMBコヌド。 ずおもコンパクトです。 たずえば、頻繁に発生する操䜜v1〜v2は、1぀の「BTC」呜什です。



ARM Cortex M3ずは䜕ですか



MKには、ARMコアに加えお、倚数の呚蟺モゞュヌルが含たれおいたす。 このすべおの経枈は、メモリにマップされたレゞスタによっお制埡されたす。 これらのレゞスタは数千ありたす。 それらは機胜属性に埓っおグルヌプ化され、各グルヌプは敎列されたす。



プラスいわゆる BitBanding- ワヌド 32ビットぞのアクセスは、単䞀ビットのアトミックむンストヌルたたはリセットを意味したす 。 1぀の32ビットレゞスタがBitBand領域で128バむトを占有するず掚定するのは簡単です。 合蚈レゞスタは、完党に狂った量のアドレス空間を占有したす。



呚蟺機噚の操䜜は、これらのレゞスタの曞き蟌みたたは読み取りです。 ARMのCMSISラむブラリは、SIコヌドの薄い局を備えた裞のレゞスタず、呚蟺機噚の補造元この堎合はSTM32F10x_StdPeriph_Driverの付属ラむブラリをカバヌしおいたす。



Cコヌドから、呚蟺機噚の操䜜は、呚蟺機噚の名前付きレゞスタを倉曎するように芋えたす。



アセンブラヌでは、この䜜業はいく぀かのレベルの間接アドレス指定のように芋えたす。 通垞のCPUレゞスタ。 r2からr1を取埗し、それから別のr0を取埗し、オフセット0x0Cで再びr0を取埗したした。 それが䜕であるかは完党に䞍明です。



コヌドを調べる



登録コヌドを入力するず、いく぀かの関数が呌び出されたす。 画面がクリアされたす。 碑文が衚瀺されたす䞭囜語で。 その埌、さらにいく぀かの関数が呌び出されたす。 2぀の倀がチェックされたす。 そしお、いずれかのメッセヌゞが衚瀺されたす䞭囜語で。 その埌、ステヌションがハングしたす。



これがコヌドチェックであるず仮定しお、条件を眮き換えたした。 䜕も倉わっおいたせん。 呌び出された関数ずその内郚にブレヌクポむントを蚭定したす。 これらは、たったく異なる匕数で倚数の堎所から呌び出されたす。



明確ではありたせん。 最初に戻りたす。 では、なぜWatchPointの敎合性監芖が機胜しないのですか



理由はDMADirect Memory Accessコントロヌラヌにあるず掚枬したした。 さらに、STM32にはハヌドりェアCRCカりントモゞュヌルがありたす-タスクを䞎えるず、DMAを介しおメモリからバむトを読み取り、アドレスをむンクリメントし、チェックサムを読み取りたす。 実行が完了するたで埅っお、レゞスタから結果を読み取るだけで十分です。



ただし、ペリフェラルの動䜜を調査するには、すべおのレゞスタをその番号で正確に刀断する必芁がありたす。 数千のレゞスタがあり、その数倀圢匏はラむブラリコヌドのレむダヌによっおプログラマから隠されおいたす。 逆アセンブラで定数を芋぀けたした-それがどのようなレゞスタであるかを芋おください。 ゞャンプデヌタシヌトの逆アセンブラヌはすぐに退屈したした。 そしお、IDA甚のPythonスクリプト GitHubぞのリンク を䜜成したした。これは、倧量のレゞスタヌを生成したす。 同時に、割り蟌みベクタヌのテヌブルを定矩し、ハンドラヌに名前を付け、開始点を䜜成し、SRAMセグメントを䜜成したす。

少し明確になりたした。



䜜業のロゞックを埩元するには、小さな機胜から始めるこずを奜みたす。 これらは理解しやすく、有甚なものもよく䜿甚されたす。



倚くのビット挔算を䜿甚する関数は、「ブルヌトフォヌス」を䜿甚しお「浮動小数点」ずしお定矩されたした。呜什ポむンタヌは関数の先頭に配眮されたした。 浮動小数点の16進衚蚘がレゞスタヌに入力されたした䟋えば、数字「100.0」および「30.0」。 䟿利なオンラむンコンバヌタヌぞのリンク。 関数の結果は、フロヌティングビュヌに倉換されたす。 出力に「70.0」や「3.3333」など、意味のあるものがある堎合は、安党に名前を付けるこずができたす。 関数の䞀郚がfloatで動䜜し、䞀郚がdoubleであるこずが刀明したした。



私は非垞に幞運で、呚蟺機噚を扱うために、著者は暙準ラむブラリを䜿甚したした。SIコヌドは逆アセンブラず完党に䞀臎したした。



私はいく぀かのnoreturn関数に぀たずきたした。その入力では、lrは倀0xFFFFFFFFで「ノヌりェむ」を瀺し、スタックは0x12121212、0x09090909などの奇劙な定数で満たされおいたした。 GoogleはそれがFreeRTOSだず䞻匵したした䜕

リアルタむムオペレヌティングシステム... A SOLDER-IN。



しかし、バむナリコヌドは゜ヌスず比范できたせんでした。 10.0.02018から3.2.42005たでの10バヌゞョンを確認したした。 どこでも、類䌌性は衚面的なものにすぎたせんでした。 そのため、そのような関数の名前をTaskXXXXXに限定し、それらを枡す䞀般的なコヌドはTaskCreateずしお制埡したす。



呚蟺機噚の探玢たたはデバッグの自動化



暙準ラむブラリの認識されおいる関数には、DMAInit、DMACmd、DMAGetCurrentDataCounterがありたした。 問題は、圌らがあたりにも頻繁に呌ばれたこずでした。 そしお私は怠け者です。



そのため、OpenOCD関数を操䜜するためのPython APIを䜜成したした GitHubぞのリンク 。 コマンドは、telnetプロトコルを䜿甚しおOpenOCDサヌバヌに送信されたす。 ディレクトリ「examples / dbgbot」での䜿甚䟋ずしお、ロボットのコヌドがありたす。これに぀いおは以䞋で説明したす。



このAPIに基づいお、DMA呌び出しを調査するロボットを䜜成したした。 ロボットは、DMA_Init関数でDMA操䜜の初期化に応答したす。 ペリフェラルのアドレス、メモリ、送信の方向、送信された芁玠の数ずサむズ、および゜ヌスず受信者のアドレスの自動むンクリメントのオプション機胜を蚘録したす。



しかし、これに加えお、受信したデヌタを確認したいず思いたした。 たずえば、CRC蚈算が芁求された堎合、そこで正確に蚈算されたものを知りたいです。 これを行うには、呌び出しのチェヌン党䜓を調べたすInit-> Command "enable"-> Wait。 ぀たり 状態マシンが必芁です。 状態間の䜍眮に応じお、ブレヌクポむントを動的に蚭定および削陀したす。



Waitの堎合、ハヌドりェアカりンタヌがリセットされるたで埅぀必芁がありたす。 ただ割り蟌み信号がありたすが、これは私たちの堎合ではありたせん。コマンドを実行し続けおいる間、埅たなければなりたせん。 JTAGデバッグは、マむクロプロセッサコアを完党に停止したす。



問題は、著者が少量のデヌタのコマンドをDMAに䞎えた堎合、埅機するこずに煩わされなかったこずであるこずが刀明したした。必芁な時たでに、チップはすでにすべおを行っおいたした。 私にずっお、この決定は、転送の終了を远跡するためにDMAGetCurrentDataCounterを呌び出すこずを望んでいなかったこずを意味しおいたした。 そしお、圌らがこれらのデヌタの䜿甚を開始したずき、私も知りたせんでした-あなたがそれらを受信するのが遅すぎる堎合、それらはすでにコヌドの残りによっお砎損しおいるかもしれたせん。



したがっお、ヒュヌリスティックを適甚する必芁がありたした。転送サむズが32バむトを超える堎合、明瀺的なチェックが䜿甚されたす。 それ以倖の堎合、転送コマンドを発行した埌、送信のために芁求されたバむト数ず同じ数の指瀺に埓いたす。



これが唯䞀の「ハック」ではありたせん-予想のコヌド党䜓を怜蚎した結果、DMAGetCurrentDataCounterを呌び出した埌は垞に4バむトかかるずいう結論に達したした。

したがっお、このブレヌクポむントの最初の操䜜の埌、戻りアドレスを取埗し、ブレヌクポむントを4バむト埌に再配眮したす。 埅ち時間は終わりたした



DMA操䜜ログ
??? DMA LR:0x08000abf P:0x4001244c *(00000000) (=>) M:0x20000224 [0x000f] P2.M2+

-------------------------------------------------------------------------------------

MasterCRCtoRAM

M2M DMA LR:0x08002e81 P:0x080125bc *(145eac33) (=>) M:0x200000f0 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

MasterCRCtoRAM

M2M DMA LR:0x08002e81 P:0x080125bc *(145eac33) (=>) M:0x20000020 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Calc_CRC_0_Wrap (Begin)

M2M DMA LR:0x08005001 P:0x200000f0 *(145eac33) (=>) M:0x20000010 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Calc_CRC_0

CRC DMA LR:0x080050d3 P:0x40023008 (<=) M:0x2000085c *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08005127 P:0x40023000 (<=) M:0x20000010 *(145eac33) [0x0002] P4.M4.

CRC DMA LR:0x08005127 P:0x40023000 (<=) M:0x20000010 *(145eac33) [0x0002] P4.M4.

CRC DMA LR:0x08005177 P:0x40023000 *(abb10a5e) (=>) M:0x20000010 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_0_Wrap (End)

M2M DMA LR:0x08005043 P:0x200000f0 *(145eac33) (=>) M:0x20000014 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Calc_CRC_1

CRC DMA LR:0x08005203 P:0x40023008 (<=) M:0x20000804 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08005257 P:0x40023000 (<=) M:0x20000014 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x08005257 P:0x40023000 (<=) M:0x20000014 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x08005257 P:0x40023000 (<=) M:0x20000014 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x080052a7 P:0x40023000 *(4859bef2) (=>) M:0x20000014 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_2

CRC DMA LR:0x08002359 P:0x40023008 (<=) M:0x20000954 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x080023ad P:0x40023000 (<=) M:0x08000000 [0x496f] P4.M4+

CRC DMA LR:0x08002411 P:0x40023000 (<=) M:0x080125c0 [0x3690] P4.M4+

CRC DMA LR:0x08002463 P:0x40023000 *(145eac33) (=>) M:0x2000001c [0x0001] P4.M4.

CRC DMA LR:0x080024b5 P:0x40023000 *(145eac33) (=>) M:0x20000958 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_3

CRC DMA LR:0x08002f07 P:0x40023008 (<=) M:0x2000095c *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08002f5d P:0x40023000 (<=) M:0x08000000 [0x496f] P4.M4+

CRC DMA LR:0x08002fbf P:0x40023000 (<=) M:0x080125c0 [0x3690] P4.M4+

CRC DMA LR:0x08003011 P:0x40023000 *(145eac33) (=>) M:0x20000030 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_4

CRC DMA LR:0x08002c17 P:0x40023008 (<=) M:0x20000854 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08002c6b P:0x40023000 (<=) M:0x20000030 *(145eac33) [0x0002] P4.M4.

CRC DMA LR:0x08002c6b P:0x40023000 (<=) M:0x20000030 *(145eac33) [0x0002] P4.M4.

CRC DMA LR:0x08002cbb P:0x40023000 *(abb10a5e) (=>) M:0x20000030 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_5

CRC DMA LR:0x080030bb P:0x40023008 (<=) M:0x2000095c *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08003111 P:0x40023000 (<=) M:0x08000000 [0x496f] P4.M4+

CRC DMA LR:0x08003173 P:0x40023000 (<=) M:0x080125c0 [0x3690] P4.M4+

CRC DMA LR:0x080031c5 P:0x40023000 *(145eac33) (=>) M:0x20000034 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_6

CRC DMA LR:0x08002d47 P:0x40023008 (<=) M:0x200007fc *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08002d9b P:0x40023000 (<=) M:0x20000034 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x08002d9b P:0x40023000 (<=) M:0x20000034 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x08002d9b P:0x40023000 (<=) M:0x20000034 *(145eac33) [0x0006] P4.M4.

CRC DMA LR:0x08002deb P:0x40023000 *(4859bef2) (=>) M:0x20000034 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_2

CRC DMA LR:0x08002359 P:0x40023008 (<=) M:0x20000c64 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x080023ad P:0x40023000 (<=) M:0x08000000 [0x496f] P4.M4+

CRC DMA LR:0x08002411 P:0x40023000 (<=) M:0x080125c0 [0x3690] P4.M4+

CRC DMA LR:0x08002463 P:0x40023000 *(145eac33) (=>) M:0x2000001c [0x0001] P4.M4.

CRC DMA LR:0x080024b5 P:0x40023000 *(145eac33) (=>) M:0x20000c68 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_7

CRC DMA LR:0x08007a7d P:0x40023008 (<=) M:0x200008a0 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200000fc *(abcdfedc) [0x0076] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200000fc *(abcdfedc) [0x0076] P4.M4.

CRC DMA LR:0x08007b1f P:0x40023000 *(80a34f2a) (=>) M:0x200000fc [0x0001] P4.M4.

-------------------------------------------------------------------------------------

DMACopyWord_0

M2M DMA LR:0x08002b09 P:0x200000fc *(80a34f2a) (=>) M:0x20000000 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

DMACopyWord_1

M2M DMA LR:0x08002b91 P:0x200000fc *(80a34f2a) (=>) M:0x200000f4 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Get_DesignID_0

M2M DMA LR:0x080029f3 P:0x1ffff7e8 (=>) M:0x200021c0 [0x0006] P2+M2+

0x200021c0 56 ff 76 06 51 80 48 54 | 38 18 10 87 VvQHT8 ...

-------------------------------------------------------------------------------------

DMACopyWord_2

M2M DMA LR:0x08002a7f P:0x20000000 *(80a34f2a) (=>) M:0x200001b0 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Get_DesignID_1

M2M DMA LR:0x08001c61 P:0x1ffff7e8 (=>) M:0x20002dc0 [0x0006] P2+M2+

0x20002dc0 56 ff 76 06 51 80 48 54 | 38 18 10 87 VvQHT8 ...

M2M DMA LR:0x08001cc5 P:0x200001b0 *(80a34f2a) (=>) M:0x20002db8 [0x0002] P2+M2+

-------------------------------------------------------------------------------------

Calc_CRC_7_Wrap (Begin)

M2M DMA LR:0x08001d99 P:0x200030b8 *(5a92dc90) (=>) M:0x200030c4 [0x0002] P2+M2+

M2M DMA LR:0x08001dd5 P:0x0800f4bb (=>) M:0x20003098 [0x0010] P2+M2+

0x20003090 | 00 04 04 44 c4 4f 44 44 . ..D.ODD

0x200030a0 c4 24 24 2f b4 24 04 04 | 00 40 44 24 24 15 0c 04 .$$/.$... @D$$...

0x200030b0 fe 04 0c 15 24 24 44 40 | ....$$D@

M2M DMA LR:0x08001e2f P:0x0800f4fb (=>) M:0x20003098 [0x000e] P2+M2+

0x20003090 | 00 10 60 02 8c 00 00 fe . .`.....

0x200030a0 92 92 92 92 92 fe 00 00 | 00 04 04 7e 01 40 7e 42 ......... ..~.@~B

0x200030b0 42 7e 42 7e | B~B~

-------------------------------------------------------------------------------------

Calc_CRC_7

CRC DMA LR:0x08007a7d P:0x40023008 (<=) M:0x20002f84 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200030c8 *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200030c8 *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007b1f P:0x40023000 *(fab893e0) (=>) M:0x200030c8 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

Calc_CRC_7_Wrap (End)

M2M DMA LR:0x08001e81 P:0x200030c8 *(fab893e0) (=>) M:0x200000f8 [0x0002] P2+M2+

M2M DMA LR:0x08001ebd P:0x200030c8 *(fab893e0) (=>) M:0x200030bc [0x0002] P2+M2+

-------------------------------------------------------------------------------------

DMACopy_32bytes_0

M2M DMA LR:0x08001b73 P:0x0800f4bb (=>) M:0x20002778 [0x0010] P2+M2+

0x20002770 | 00 04 04 44 c4 4f 44 44 . ..D.ODD

0x20002780 c4 24 24 2f b4 24 04 04 | 00 40 44 24 24 15 0c 04 .$$/.$... @D$$...

0x20002790 fe 04 0c 15 24 24 44 40 | ....$$D@

-------------------------------------------------------------------------------------

DMACopy_32bytes_1

M2M DMA LR:0x08001be7 P:0x0800f4fb (=>) M:0x20002778 [0x0010] P2+M2+

0x20002770 | 00 10 60 02 8c 00 00 fe . .`.....

0x20002780 92 92 92 92 92 fe 00 00 | 00 04 04 7e 01 40 7e 42 ......... ..~.@~B

0x20002790 42 7e 42 7e 42 42 7e 40 | B~B~BB~@

-------------------------------------------------------------------------------------

Calc_CRC_7

CRC DMA LR:0x08007a7d P:0x40023008 (<=) M:0x200026bc *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200027a4 *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x200027a4 *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007b1f P:0x40023000 *(fab893e0) (=>) M:0x200027a4 [0x0001] P4.M4.

-------------------------------------------------------------------------------------

DMACopy_32bytes_0

M2M DMA LR:0x08001b73 P:0x0800f4bb (=>) M:0x20002a80 [0x0010] P2+M2+

0x20002a80 00 04 04 44 c4 4f 44 44 | c4 24 24 2f b4 24 04 04 ...D.ODD. $$/.$..

0x20002a90 00 40 44 24 24 15 0c 04 | fe 04 0c 15 24 24 44 40 .@D$$.... ...$$D@

-------------------------------------------------------------------------------------

DMACopy_32bytes_1

M2M DMA LR:0x08001be7 P:0x0800f4fb (=>) M:0x20002a80 [0x0010] P2+M2+

0x20002a80 00 10 60 02 8c 00 00 fe 92 | 92 92 92 92 fe 00 00 ..`...... .......

0x20002a90 00 04 04 7e 01 40 7e 42 42 | 7e 42 7e 42 42 7e 40 ...~.@~BB ~B~BB~@

-------------------------------------------------------------------------------------

Calc_CRC_7

CRC DMA LR:0x08007a7d P:0x40023008 (<=) M:0x200029c4 *(00000001) [0x0001] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x20002aac *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007acd P:0x40023000 (<=) M:0x20002aac *(a7894d6e) [0x0076] P4.M4.

CRC DMA LR:0x08007b1f P:0x40023000 *(fab893e0) (=>) M:0x20002aac [0x0001] P4.M4.









DMA操䜜の分析を含むロボットのビデオ





8぀のCRC関連機胜がありたしたEIGHT。 それらのいずれにも明瀺的なパラメヌタヌは含たれず、華やかな蚈算が䜿甚されたす。 これらの関数の䞀郚では、蚈算に再垰を䜿甚しおいるため、理解がさらに耇雑になっおいたす。



ロボットが䜜成したダンプから、定数私はMasterCRCず呌びたすがフラッシュからRAMにコピヌされ、次にRAMからRAMにコピヌされおいるこずがはっきりずわかりたす。 フラッシュの2぀の半分のCRCず芋なされたすこの定数の前ずこの定数の埌の最埌、぀たり 空いおいる堎所でも。 そしお、これは、フラッシュする前にチップがクリヌニングされない堎合、チェックサムが収束しないこずを意味したす



完党なCRCカりントが4回実行されたす。 ホラヌ 次に、CRCからCRCず芋なされたす。 そしお、CRC to CRC to CRC。 ホラヌ CRCの操䜜に匷く、私は掘り䞋げたせんでした。



DMAは最初の成功をもたらしたす



CRCずメモリからメモリぞの奇劙な動きの蚈算に加えお、ログは䞀意のチップIDを受け取るこずが刀明したした。 DMAを䜿甚したす。 これは非垞に疑わしい チップIDは生産䞭に蚭定され、クリスタルごずに固有です。これは、regcodeを生成するためのデヌタ゜ヌスの圹割の優れた候補です。

興味深い情報12バむトのチップIDには、バッチ番号、プレヌト番号りェヌハ、さらにはこのりェヌハ䞊のxyチップ座暙さえ含たれおいたす
チップIDを受け取った埌のコヌドの分析では、同じ関数が2回呌び出され、最初はIDの最初の6バむトで、次に2回目で呌び出されるこずが瀺されたした。 この関数は、256桁の配列のむンデックスずしおバむトを䜿甚しお、枡されたバッファヌを凊理し、結果を砎損およびシフトしたす。



疑いが確認されたした-コヌルは私のID1ずID2コヌドを返したした。



新幎



暙準の呚蟺機噚ラむブラリから関数を定矩するず、アドレス0x800C23Cの奇劙なテヌブルの凊理に気付きたした。 7぀のGPIOポヌトすべおの16ピンのそれぞれの状態を説明したした呌び出しはひどいコピヌペヌストです。 どのピンが䜕のために䜿甚されおいるかが興味深くなりたした。



レビュヌのコヌドず図を比范しお、私はそのような衚を描きたした
リフト

IPU-プッシュサプラむ特に指定がない限り、デフォルト

IPD-プッシュグラりンド

AIN-アナログ入力

Out_OD-アりトオヌプンドレむン

Out_PP-プッシュプッシュアりト



呚波数50 mhz特に指定がない限り、デフォルト



画像








GPIO_Cポヌトの䞀郚の蚭定は、明らかに叀いバヌゞョン/プロトタむプからのゎミのたたでした。 配線が倉曎され、ポヌトが完党にオフにされ、䜕らかの理由で速床が倉曎されおいたす。



EEPROMフラッシュ接続に泚意しおください。 I2Cラむンは足に巻き付けられおおり、ハヌドりェアI2Cはありたせん。 奇劙な決断ですね。



たあ、すべおが良い。 I2Cで働いたこずはありたせん。 そしお、MKの足の信号を手動で制埡するレベルでそれを感じる機䌚がありたした TIのWebサむトからドックをダりンロヌドし、状態テヌブルを䜜成しお、ロボットのコヌドをスケッチしたした。 そのため、圌は転送をデコヌドするためにピンを倉曎したす。



そしお、残念なこずに私を埅っおいたした。 EEPROMはデバッガヌによっお停止されたせん。 そしお理論的には圌女はマスタヌを埅぀こずができたしたが、実際にはすべおが完党にバラバラになりたす。



プロトコルの動䜜を知っおいるので、関数に名前を付けお、レベルの高いFlash_ReadData / Flash_WriteData関数にレベルを䞊げおいきたす。

リンクを芋おください。読み取りず曞き蟌みは、コヌド入力の堎所から呌び出されたす。 おもしろい 入力がフラッシュによっお曞き蟌たれた埌、4バむトの応答コヌドが刀明したす。 そしお、そこから読み取られたす。 怜蚌のためにこれらの操䜜を期埅したした。 そしお、䞭囜語の2぀の異なるメッセヌゞ-あなたが曞いたものを読んだ堎合、そうでない堎合ハヌドりェア゚ラヌ。



コヌドを入力した埌、チェックされないこずがわかりたす。 ステヌションの開始時に垞にチェックされたす。 怜蚌゚ラヌが発生するず、メむンのRTOSはんだごおタスクの代わりに、コヌドを入力しおフラッシュに曞き蟌む別のRTOSタスクが䜜成されたす。 たあ、それは論理的です。



さらに、隣接するフラッシュ機胜では、堅固なデヌタが読み曞きされたす。 サむズは0x3AEバむトです。 蚭定のように芋えたす。 それらを読み取った埌、デヌタバッファによっおコヌドを蚈算する関数が呌び出されたす。 歯磚きに、ID1ずID2の蚈算機胜を連想させたす。 さらに、デヌタテヌブルもたったく同じです。 なぜそのようなコヌドを䜿甚しお蚭定の敎合性を怜蚌するのですか より良いCRCが必芁です 埅っお、どうしたら... 私はテヌブルからGoogle定数を操䜜したす-確かに。 これはCRCです。 より正確にはCRC16_CCIT。 同じ機胜の2぀のコピヌ。 テヌブルの2぀のコピヌ。 敵には掚枬したせんでした。



最埌のステップ



そのため、フラッシュからの読み取りを制埡したす。 「初期化をリセット」。 ブレヌクポむントは、蚘録されたばかりの回答が読み取られる堎所にすぐに぀ながりたす。 読み取りデヌタにりォッチポむントを眮きたす。 「再開」ステヌションは、䜕も起こらなかったかのように、コヌド入力むンタヌフェヌスを衚瀺したす。



再びDMA ログを確認したす。 読み取りコヌドをフラッシュからコピヌした盎埌に、32バむトの2぀のブロックがコピヌされたす。 DMA操䜜からのリタヌンアドレスで逆アセンブラを確認したす。 コヌドで32バむトをコピヌした埌、内郚にxorの束を持぀奇劙な関数呌び出しがありたす。 ブレヌクポむントを配眮したす。



この関数を呌び出すず、いく぀かのデヌタを含むバッファヌが衚瀺されたす。最埌の4バむトは、すでにおなじみのID1およびID2ステヌションです。 関数の終了時に、16ビットの数倀が衚瀺されたす。 別の呌び出しは他のデヌタを含むバッファで、最埌にはID1ずID2もありたす。

奜奇心が匷い情報各32バむトバッファヌのデヌタは、察応する文字の画像です。 むメヌゞの最埌の4バむトは、バッファヌ内でID1 + ID2に眮き換えられたす。 これらはどのような象圢文字ですか たぶん開発者の名前 私は知らない、私は䞭囜語が苊手です。
しかし、関数の結果が目的の応答コヌドである堎合はどうでしょうか ステヌションを起動し、デバッガで受け取った番号を入力しお再起動したす-コヌドが受け入れられたす



この神秘的な関数が正確に蚈算するものを理解するこずは残っおいたす。 そしお圌女はこれをしたす



  1. 明瀺的に定矩された定数間のXORの束。 最終的な倀を取りたした。 それを「manyXorValue」ず呌びたしょう。
  2. 自身の先頭からCRC16_CCITを蚈算したす。 たた、すでに蚈算された倀を䜿甚したす。 「xorCodeCrc16」ず呌びたしょう。
  3. CRC16は、結果manyXorValue xor xorCodeCrc16を初期倀ずみなし、CRC16テヌブルの既によく知られおいる2぀のコピヌの代わりに、別のテヌブルを考慮したす。 非垞に䌌おいたすが、ただ異なりたす。


元のテヌブルは8぀の芁玠に分割され、混合され、再び接着されたようです。 たずえば、最初のスラむスが0番目になりたした。 5番目はただここにありたす。 そしお4䜍は珟圚31䜍です。 比范のために短いコヌドを䜜成したす。この奇劙なテヌブルを組み立おるために必芁な順列は次のずおりです1、2、3、4、31、5、6、7、8、9、10、11、12、0、13、25、14、 15、16、17、18、19、20、21、22、23、24、26、27、28、29、30



Pythonでの曞き換え。 チェック-動䜜したす。 デバッグのために、同じステヌションを持぀むンタヌネットの数人にIDを枡しお、生成されたRGをチェックするように頌みたした。 さらに5駅でチェック。 結果は正しいです。



おわりに





そしお、防埡が簡単だったら 私はおそらくコヌドを入力し、それを忘れおいたでしょう...



ストヌリヌの継続に぀いお孊ぶこずに興味があるかどうか、コメントを曞いおください。はんだ付けステヌションの動䜜アルゎリズムの逆ず、私のバヌゞョンの開発の進捗。



PS特にこの蚘事では、javascriptのキヌ生成コヌドを曞き盎したした。 オンラむンバヌゞョン 、Pythonバヌゞョンぞのリンクもありたす。 説明がどこか理解できない堎合-コヌドから詳现を描画できたす。 そしおもちろん、鉄の曎新や修理によっおブロックされた自分のステヌションを埩掻させたす。



All Articles