Reverse Engineering - Aldes B200-FAN_T.Flow® Hygro+

Pour l’instant je mets de côté l’interception car j’ai ouvert le boîtier hier soir et ça semble assez prometteur :

  • un STM32 avec un bornier Dupont 6 broches qui est l’UART j’imagine ; il gère sûrement la partie USB
  • un HF-LPB-100-1 pour le WiFi, aussi avec un bornier Dupont 6 broches, aussi pour UART je suppose
  • un dernier bornier Dupont 6 broches, pas eu le temps de voir à quoi il pouvait être relié

Potentiellement on peut via l’UART obtenir un root shell sur le STM32 où on est en terrain plus connu que sur le HF-LPB-100-1. Comme je suppose qu’il gère l’USB avec la machine, si on arrive au firmware et à sa source alors on a le protocole USB et il n’y a plus qu’à concevoir une passerelle DIY.

Je vous mets une photo ce soir et j’essaye de passer root peut-être ce week-end.

2 « J'aime »

L’union fait la force et grâce à ça mon espoir d’arriver au bout de ce dev est ravivé :wink:

Merci à tous pour vos contributions car en plus d’avancer cela me permet d’apprendre la démarche à adopter.

un STM32 avec un bornier Dupont 6 broches qui est l’UART j’imagine ; il gère sûrement la partie USB

Vous êtes chanceux, le STM32 s’est fait trouer il y a un ou deux ans, on peut dumper une partie de sa mémoire via l’interface debug :smiley: J’ai pas le détail, mais a priori, c’est très documenté

Normalement, ce genre de manipulation ne doit pas griller quoi que ce soit, vu que les courants générés par les sorties de progammateurs sont minimes, mais on est jamais à l’abri.

Après, une fois le firmware extrait, on doit pouvoir faire des choses avec ghidra, le décompilateur de la NSA.

1 « J'aime »

J’ai fait ça pour avoir une passerelle sonoff à l’époque. La technique est pas trop compliqué. L’idée est d’envoyer le device wifi sur un réseau wifi où tu controle tout, y compris les DNS, et de rediriger le cloud du constructeur sur ton serveur perso avec du code qui récupère toutes les requetes HTTP. En général, le device fait du HTTPs, mais il arrive souvent que le device valide que c’est du HTTPs, mais ne check pas l’émetteur du certificat. Donc il suffit de présenter un certificat SSL valide pour que avoir le droit de parler avec le device.

Après, l’idée, c’est de transférer les requêtes en faisant un gros Man in the middle avec les serveurs du constructeur et de récupérer toutes les choses qui circulent pour déduire le protocole, et ensuite, s’en passer.

Un bon résumé : projects:sonoff [Brain Dump]

1 « J'aime »

On peut pas extraite le firmware de la PAC tant qu’on y est, on pourrait encore mieux la contrôler et activer la clim :innocent:

@Neuvidor Voilà!

Je suppose :

  • En haut, l’UART du STM32, pour sa programmation / debug
  • A droite, celui du HF-LPB-100-1, qui lui sert à dialoguer avec le STM32 pour lui fournir le WiFi
  • A gauche, je ne sais pas, ni au milieu où il n’y a pas de pins

@mgre Merci pour les ressources !

1 « J'aime »

Bon, c’est pas si facile. Aucun des groupes de pins ne semble en fait se connecter en UART. Il y a de l’USART, mais de toute façon aucun groupe de pins ne contient un ensemble cohérent de RX, TX et Ground.

Voici ce à quoi ils sont reliés sur le STM32:

J3

1 => rien
2 => 31 = PA10 / USART1_RX, TIM1_CH3, TIM17_BKIN, I2C1_SDA
3 => 22 = PB11 / USART3_RX, EVENTOUT, I2C2_SDA
4 => 23 = VSS
5 => 2 = PC 13 / WKUP2, RTC_TAMP1, RTC_TS, RTC_OUT
6 => ground

J8

1 => ground
2 => 7 = NRST / RST (reset)
3 => 6 = PF1-OSC_OUT, I2C1_SCL, OSC_OUT
4 => 9 = VDDA
5 => 12 = PA2 / USART2_TX, TIM15_CH1, ADC_IN2, WKUP4

J9

Pas de ground

1 => 40 = PB4 / SPI1_MISO, TIM17_BKIN, TIM3_CH1, EVENTOUT
2 => 39 = PB3 / SPI1_SCK, EVENTOUT
3 => 38 = PA15 / SPI1_NSS, USART2_RX, USART4_RTS, EVENTOUT
4 => 37 = PA14 / USART2_TX, SWCLK
5 => 34 = PA13 / IR_OUT, SWDIO, USB_NOE
6 => 33 = PA12 / USART1_RTS, TIM1_ETR, EVENTOUT / USB_DP

J10

Pas de ground

1 => 12 = PA2 / USART2_TX, TIM15_CH1, ADC_IN2, WKUP4
1 => 21 = PB10 / SPI2_SCK, USART3_TX
1 => 36 = VDD
1 => 48 = VDD
2 => 16 = PA6 / SPI1_MISO, TIM3_CH1, TIM1_BKIN, TIM16_CH1, EVENTOUT, USART3_CTS / ADC_IN6
3 => 27 = PB14 / SPI2_MISO, I2C2_SDA, TIM1_CH2N, TIM15_CH1, USART3_RTS
4 => 28 = PB15 / SPI2_MOSI, TIM1_CH3N, TIM15_CH1N, TIM15_CH2 / WKUP7, RTC_REFIN

J11 (pas de pins)

1 => 19 = PB1
2 => 46 = PB9
3 => ground
4 => 1 = VDD
5 => 48 = VDD

Je suis donc bloqué pour l’instant sur cette piste.

Mince, c’est pas une bonne nouvelle ça.

Du côté du composant 3, c’est pas une mémoire ?

Si, une 26f0648. Y’a une méthode pour récupérer son contenu ?

Tu es sur de la référence car je ne trouve rien avec cette ref.
Ce ne serait pas une 26VF064B ?

je dirais que oui vu que c’est une mémoire mais je ne m’avancerai pas car pas assez de connaissance.

De mon coté je vais regarder ce soir si je peux voir à quoi sont relier les PIN de la carte mère du chauffe eau.

@Neuvidor ça peut être un B mais y’a pas de V

@mgre Suite au branchement de la box sur PC en USB:

[300161.390849] usb 1-2: new full-speed USB device number 9 using xhci_hcd
[300161.541031] usb 1-2: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00
[300161.541038] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[300161.541042] usb 1-2: Product: STM32 Virtual ComPort
[300161.541045] usb 1-2: Manufacturer: STMicroelectronics
[300161.541047] usb 1-2: SerialNumber: 00000000001A
[300161.575392] cdc_acm 1-2:1.0: ttyACM0: USB ACM device
[300161.575673] usbcore: registered new interface driver cdc_acm
[300161.575674] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

On dirait que la box ne sert strictement que de modem et que toute « l’intelligence » est dans la carte-mère de la PAC, non ?

Bon visiblement c’est une mémoire de chez MICROCHIP, le marquage correspond.

  • image

Quand on voit le log, ça semble bien parti vu qu’une interface série est détecté.
Reste à savoir quoi demander.

Je ne sais pas comment faire pour espionner l’ USB de la box quand elle est connecté mais visiblement @djtef avait suivie des gars qui on réussi à le faire pour les clim réversibles midea. Ils ont réussi à remplacer la box d’origine par un module ESPHOME.

Effectivement, j’avais suivi comment ils avaient fait, il existe des circuits sur étagère qui font ça, j’essaierai de retrouver tous les liens.
Pour le cas précis de la clim réversible, ils avaient commencé avec ça :

Et comme expliqué dans la description, c’est basé sur ESP LINK

Vous verrez que ça ressemble énormément à ce qu’on essaie de faire

~Oui, ca sent pas très bon :/~

En fait, un ACM, c’est une liaison série… Donc il y a moyen que la carte principale communique juste avec un protocole série, ce qui serait compatible avec le postulat de départ à propos du bus :thinking:

D’ailleurs, un google des idVendor fait tomber sur une issue github : [USB] CDC ACM not working with 1.7.0 · Issue #791 · stm32duino/Arduino_Core_STM32 · GitHub

Du coup, potentiellement, avec une carte de dev STM32 et le framework arduino, ce serait assez simple de reproduire le comportement de midea-uartsniffer en faisant :

aldesConnect <-> ordinateur <-> une carte de dev STM32 qui fait proxy en implementant les memes interfaces USB <-> la PAC

Et sur l’ordi, on transmet tout ce que la carte de dev reçoit à l’aldes connect et vice-versa, tout en loggant :tada:

Tu as de la doc là-dessus, un exemple ? Et sur l’USB OTG ?

Pour le coup, je pense qu’il suffit d’un sketch basique sur le STM32 avec les bon ids USB. Un programme pour récupérer ça côté ordinateur et le renvoyer sur le ttyACM.
Le seul hic, c’est que la carte STM32 a que un port USB, du coup, il faut un module pour sortir les infos vers l’ordinateur. Une UART et un module USB-série serait parfait

Après, c’est dans les grandes lignes, il va y avoir le souci du baudrate et autres configurations, et plein de détails à la noix, mais c’est la dessus que je partirai, c’est globalement que du logiciel, et à mon sens, le moins dangereux :sweat_smile:
Édit: je dis sûrement des bêtises, le STM32 se programme avec un USB-série, c’est probablement encore plus simple de faire le bridge vers l’ordinateur

Edit2: @guix77 je crois que ça a plus ou moins déjà été fait : GitHub - ayushgaud/USB_Serial_Bridge: USB Serial Bridge for STM32F103C8Tx based ARM modules

Salut,

Du coup j’ai viré l’optocoupleur et j’ai mis un pont diviseur de tension (20kOhm + 5,1kOhm) pour avoir mon 5V compatible avec l’analyseur logique et j’ai refait un scan du BUS de la carte mère.

Voici l'export du signal obtenu sous Saleae Logic 2 (v2.4.6)
Time [s],Channel 0
-0.050000042,1
0.000000000,0
0.000395083,1
0.001249417,0
0.002061125,1
0.002915292,0
0.004143667,1
0.004581125,0
0.004976667,1
0.008330042,0
0.008725250,1
0.009163042,0
0.010391333,1
0.011245375,0
0.012057333,1
0.012494750,0
0.012890333,1
0.013744167,0
0.014139875,1
0.014993542,0
0.015805875,1
0.016659667,0
0.017888458,1
0.018326000,0
0.019971000,1
0.020824833,0
0.022470042,1
0.022907167,0
0.027051583,1
0.027488708,0
0.027884667,1
0.028321958,0
0.029550667,1
0.030404292,0
0.031216583,1
0.032070000,0
0.032882750,1
0.033319542,0
0.035798333,1
0.036651500,0
0.037464375,1
0.037901375,0
0.038713833,1
0.039150958,0
0.039963417,1
0.041233292,0
0.041629417,1
0.042899125,0
0.044961417,1
0.045814458,0
0.046627500,1
0.047064250,0
0.049543083,1
0.050396458,0
0.050792583,1
0.051229375,0
0.051625625,1
0.052062333,0
0.052458667,1
0.054144667,0
0.054541125,1
0.054977542,0
0.055374167,1
0.055810583,0
0.056207250,1
0.056643750,0
0.057040250,1
0.057477042,0
0.058289792,1
0.058726792,0
0.059122708,1
0.059559750,0
0.059955792,1
0.060392625,0
0.060788833,1
0.061642042,0
0.062871375,1
0.063307875,0
0.063704375,1
0.064140792,0
0.064953833,1
0.065806708,0
0.066203458,1
0.067473208,0
0.067869458,1
0.068723000,0
0.070368500,1
0.070805250,0
0.071201500,1
0.071638167,0
0.072867542,1
0.073304000,0
0.073700583,1
0.074553417,0
0.074950083,1
0.075386333,0
0.075783125,1
0.077052750,0
0.077449125,1
0.077886042,0
0.082030750,1
0.082467250,0
0.082863750,1
0.083300167,0
0.083696750,1
0.084549500,0
0.084946250,1
0.085799042,0
0.086195833,1
0.087048875,0
0.091193917,1
0.091630333,0
0.095775542,1
0.096211625,0
0.100357083,1
0.100793542,0
0.104938667,1
0.105374625,0
0.106188208,1
0.107457625,0
0.107854250,1
0.108707500,0
0.109103750,1
0.109956875,0
0.114101833,1
0.114537875,0
0.115351417,1
0.115787375,0
0.118266958,1
0.119120125,0
0.123265083,1
0.123701042,0
0.127846667,1
0.128283125,0
0.129929167,1
0.131614958,0
0.132428250,1
0.132864333,0
0.134510708,1
0.136196250,0
0.137009833,1
0.137446208,0
0.138259333,1
0.138696000,0
0.139092375,1
0.140778417,0
0.141174917,1
0.142027792,0
0.146173042,1
0.146609167,0
0.147006042,1
0.147859042,0
0.148672125,1
0.149525167,0
0.149921583,1
0.151191042,0
0.151587583,1
0.152023958,0
0.152837167,1
0.153689875,0
0.154086667,1
0.154522750,0
0.155336208,1
0.155772208,0
0.157835250,1
0.158688542,0
0.159917833,1
0.160354375,0
0.164499375,1
0.164935292,0
0.165332417,1
0.166601583,0
0.168247917,1
0.168684625,0
0.169081000,1
0.169517542,0
0.169914000,1
0.171183458,0
0.172829458,1
0.173265708,0
0.173662583,1
0.174098625,0
0.174495625,1
0.174931583,0
0.175328583,1
0.175764583,0
0.178244167,1
0.178680833,0
0.179077167,1
0.180346708,0
0.180743250,1
0.181179667,0
0.182825792,1
0.183261875,0
0.184075250,1
0.184511292,0
0.185324833,1
0.186177292,0
0.186990500,1
0.187843875,0
0.189073417,1
0.189926458,0
0.190322958,1
0.192425333,0
0.193654958,1
0.195757083,0
0.196154042,1
0.197006958,0
0.197403625,1
0.198256875,0
0.199486125,1
0.201588708,0
0.202401625,1
0.202838083,0
0.205317292,1
0.206169875,0
0.210315292,1
0.210751833,0
0.214896917,1
0.215332833,0
0.219478500,1
0.219915000,0
0.224060125,1
0.224496000,0
0.224893000,1
0.225745417,0
0.226559083,1
0.228245250,0
0.228641667,1
0.229078250,0
0.229474667,1
0.229911167,0
0.230307750,1
0.233659500,0
0.234056292,1
0.234492417,0
0.235722292,1
0.236158375,0
0.236555375,1
0.236991583,0
0.237388333,1
0.238241667,0
0.238637917,1
0.239491083,0
0.239887417,1
0.240323958,0
0.241969958,1
0.242822750,0
0.246968042,1
0.247404417,0
0.251549625,1
0.251985875,0
0.256131208,1
0.256567250,0
0.260712833,1
0.261149083,0
0.262795417,1
0.264064333,0
0.264461375,1
0.264897167,0
0.265294417,1
0.265730208,0
0.266127500,1
0.267396750,0
0.267793500,1
0.270312542,0
0.270709042,1
0.271145458,0
0.271958542,1
0.272394833,0
0.272791583,1
0.273227750,0
0.273624708,1
0.274060708,0
0.274457667,1
0.274893625,0
0.279039250,1
0.279475750,0
0.283620792,1
0.284056792,0
0.288202333,1
0.288638917,0
0.292783958,1
0.293219958,0
0.297365583,1
0.297801833,0
0.298615083,1
0.299051542,0
0.300697667,1
0.301133792,0
0.301947250,1
0.302383167,0
0.306528708,1
0.306964708,0
0.311110333,1
0.311546417,0
0.315691917,1
0.316127542,0
0.320273542,1
0.320709625,0
0.324855167,1
0.325290500,0
0.329436708,1
0.329872750,0
0.334018292,1
0.334453792,0
0.338599875,1
0.339036042,0
0.343181500,1
0.343616958,0
0.344430958,1
0.344866375,0
0.345680542,1
0.346532625,0
0.347346583,1
0.348199250,0
0.348596125,1
0.349032292,0
0.349429125,1
0.349865208,0
0.351511708,1
0.500000042,1

Avec pour paramétrage :

@guix77, @mgre, le format de la trame vous parle ?

Bon voilà j’ai profité de la gastro de ma fille pour démonter la carte mère du chauffe eau . Visiblement les Pin de J13 sont uniquement en lien avec le PIC24FJ256GB106

Connecteur J13 :

  • Pin 1 => Pin 7 du PIC via une résistance de 100 Ohm => MCLR (RESET ?)
  • Pin 2 => Pin 38 du PIC => 3.3V
  • Pin 3 => Pin 41 du PIC => GND
  • Pin 4 => Pin 12 du PIC => USBOEN (module OTG ?)
  • Pin 5 => Pin 11 du PIC => VUSBON (module OTG ?)
Extrait de la doc concernant le Pinout du PIC24FJ256GB106
Extrait de la doc du Module USB OTG du PIC24FJ256GB106

Visiblement cela permet de dialoguer avec le PIC via son module OTG
Cela vous parle ? Est-ce utile à nos besoins ?