Protocol 문서가 없을 때 장비 통신 분석하는 방법: Packet Capture·Hex 분석·Command 추론
Protocol 문서가 없을 때 장비 통신 분석하는 방법: Packet Capture·Hex 분석·Command 추론#
1장 문서가 없다고 바로 Protocol을 추측하면 안 된다#
장비 연동 업무를 하다 보면 가장 난감한 상황 중 하나가 있습니다.
장비는 정상적으로 동작하고 있는데 Protocol 문서가 없습니다.
기존 프로그램과 장비는 서로 데이터를 주고받고 있지만 개발자가 받은 것은 다음뿐일 수 있습니다.
장비 본체
기존 Controller
통신 Cable
실행 중인 프로그램
몇 줄의 Log그리고 Packet을 확인하면 다음과 같은 HEX가 보입니다.
AA 55 01 10 04 00 64 00 C8 7A처음 보면 아무 의미가 없어 보입니다.
하지만 실제 Protocol도 결국 일정한 규칙을 가지고 있습니다.
예를 들어 위 데이터가 다음처럼 구성되어 있을 수 있습니다.
AA 55 | 01 | 10 | 04 | 00 64 00 C8 | 7A그리고 분석 결과:
AA 55
Header
01
Device Address
10
Command
04
Data Length
00 64 00 C8
Payload
7A
Checksum라는 사실을 찾아낼 수 있습니다.
문서 없는 Protocol 분석의 핵심은 HEX를 보고 직감으로 의미를 붙이는 것이 아니라, 반복되는 실제 동작과 Packet의 변화를 비교해 가설을 세우고 검증하는 것입니다.
전체 과정은 다음처럼 볼 수 있습니다.
장비 식별
↓
통신 경로 확인
↓
정상 Traffic 확보
↓
Packet 분리
↓
반복 Pattern 비교
↓
Field 후보 추론
↓
Request·Response 관계 분석
↓
Checksum·CRC 추론
↓
Simulator 검증
↓
Protocol 명세 작성2장 분석하기 전에 먼저 확보해야 할 정보가 있다#
문서가 없다고 해서 Packet Capture부터 시작하는 것은 좋은 방법이 아닙니다.
먼저 장비 자체 정보를 확보합니다.
장비 식별 정보#
가능하면 다음을 기록합니다.
Manufacturer
Product Name
Model
Hardware Revision
Firmware Version
Serial Number같은 모델이라도 Firmware가 다르면 Packet 구조나 Command가 달라질 수 있습니다.
통신 Interface#
다음도 확인합니다.
RS-232
RS-422
RS-485
Ethernet
CAN
USB
WirelessProtocol을 분석하려면 먼저 데이터가 어떤 경로를 통해 전달되는지 알아야 합니다.
기존 연결 구조#
예를 들어:
Sensor
↓
RS-485
↓
Controller
↓
Ethernet
↓
Server인지:
Device
↓
RS-232
↓
PC Application인지 확인합니다.
분석 지점을 잘못 선택하면 실제로 원하는 Protocol이 아니라 Gateway가 변환한 데이터를 분석하게 될 수도 있습니다.
3장 가장 가치 있는 데이터는 정상적으로 동작하는 Traffic이다#
Protocol 문서가 없다면 현재 정상적으로 동작하는 시스템 자체가 가장 중요한 참고 자료가 됩니다.
예를 들어 기존 프로그램에서 다음 작업이 정상적으로 수행된다고 하겠습니다.
장비 상태 조회
Sensor 값 읽기
Printer 상태 확인
Relay ON
Relay OFF각 동작을 수행하면서 송수신 데이터를 기록합니다.
예:
상태 조회
TX AA 55 01 10 00 7B
RX AA 55 01 90 01 00 2C
Relay ON
TX AA 55 01 20 01 01 91
RX AA 55 01 A0 01 00 4C
Relay OFF
TX AA 55 01 20 01 00 90
RX AA 55 01 A0 01 00 4C이런 데이터가 여러 개 쌓이면 비교를 통해 구조를 추론할 수 있습니다.
특히 중요한 것은 한 번의 Capture가 아닙니다.
동일 동작을 여러 번 반복합니다.
Status Read × 20
Sensor Read × 20
ON × 20
OFF × 20그래야:
항상 같은 Byte
실행할 때마다 변하는 Byte
상태에 따라 변하는 Byte를 구분할 수 있습니다.
4장 Packet Capture는 통신 방식에 따라 방법이 다르다#
Packet Capture라는 말을 흔히 Wireshark와 연결하지만 모든 장비 통신을 Wireshark로 볼 수 있는 것은 아닙니다.
Ethernet#
TCP·UDP 기반 통신은 다음 방식으로 Capture할 수 있습니다.
Wireshark
tcpdump
Switch Port Mirroring
Network TAP구조:
Device
┌── Analyzer
│
Switch ├── Server
│
└── Other DevicesManaged Switch의 Mirror Port를 이용하면 기존 통신에 개입하지 않고 Traffic을 관찰하기 좋습니다.
RS-232#
RS-232는 Point-to-Point 방식이므로 Serial Analyzer나 중간 Capture 구조를 사용할 수 있습니다.
Device
↓
Serial Analyzer
↓
Controller또는 기존 Application 자체의 TX·RX Log를 활용할 수도 있습니다.
RS-485#
RS-485는 Multi-drop Bus가 될 수 있으므로 분석 시 특히 조심해야 합니다.
Controller
│
├─ Device 01
├─ Device 02
├─ Device 03
└─ Analyzer잘못된 장비를 연결하면 Bus의 전기적 특성에 영향을 줄 수 있습니다.
가능하면 수동 수신 위주의 Analyzer를 사용하고 기존 Bus 동작에 영향을 최소화해야 합니다.
5장 HEX를 보면 먼저 고정 영역과 변화 영역을 나눈다#
다음 Packet을 여러 번 Capture했다고 하겠습니다.
AA 55 01 10 02 00 64 31
AA 55 01 10 02 00 65 32
AA 55 01 10 02 00 66 33
AA 55 01 10 02 00 67 34먼저 열을 맞춥니다.
AA 55 01 10 02 00 64 31
AA 55 01 10 02 00 65 32
AA 55 01 10 02 00 66 33
AA 55 01 10 02 00 67 34
─────────────────────
고정 변화 변화앞부분:
AA 55가 계속 같다면 Header 후보가 될 수 있습니다.
01이 장비마다 달라진다면 Address일 가능성을 생각할 수 있습니다.
10이 동작 종류에 따라 달라진다면 Command 후보입니다.
02뒤의 Payload가 항상 2 Byte라면 Length 후보가 될 수 있습니다.
마지막 Byte가 앞의 데이터 변화와 함께 계속 바뀐다면:
Checksum
CRC
LRC
Sequence등을 의심할 수 있습니다.
중요한 점은 이것들이 아직 후보라는 것입니다.
한두 개 Packet만 보고 확정해서는 안 됩니다.
6장 한 번에 하나의 조건만 바꿔야 Command를 찾을 수 있다#
문서 없는 Protocol 분석에서 매우 중요한 방법이 있습니다.
한 번에 하나의 변수만 변경합니다.
예를 들어 Sensor 설정값을 분석한다고 하겠습니다.
다음 조건으로 Capture합니다.
Test 1
Value = 10
Test 2
Value = 11
Test 3
Value = 12Packet:
AA 55 01 30 02 00 0A 92
AA 55 01 30 02 00 0B 93
AA 55 01 30 02 00 0C 94여기에서:
00 0A
00 0B
00 0C가 각각:
10
11
12와 연결될 가능성이 높아집니다.
반대로 한 번에 여러 조건을 바꾸면:
Address 변경
+
설정값 변경
+
동작 Mode 변경어떤 Byte가 무엇 때문에 변했는지 알기 어렵습니다.
분석 실험은 과학 실험과 비슷합니다.
하나 변경
↓
Capture
↓
차이 확인을 반복합니다.
7장 Command는 동작과 Packet을 시간으로 연결해서 찾는다#
Command를 추론하려면 Packet만 보는 것으로 부족합니다.
장비에서 실제로 어떤 일이 발생했는지 함께 기록합니다.
예:
14:20:10.000
Button 클릭
14:20:10.015
TX
AA 55 01 21 00 81
14:20:10.031
RX
AA 55 01 A1 01 00 34
14:20:10.120
Motor Start이런 기록이 있다면:
0x21이 Motor 동작 요청과 관련된 Command일 가능성이 높아집니다.
더 확실하게 하려면 같은 동작을 여러 번 반복합니다.
OPEN
OPEN
OPEN
OPEN그리고 다른 동작도 비교합니다.
CLOSE
CLOSE
CLOSE예:
OPEN
AA 55 01 21 00 81
CLOSE
AA 55 01 22 00 82처럼 특정 Byte만 바뀐다면:
21
OPEN 후보
22
CLOSE 후보라고 추론할 수 있습니다.
하지만 처음부터:
0x21 = OPEN이라고 확정하지 말고 반복 검증해야 합니다.
8장 Request와 Response를 묶으면 Protocol 구조가 빨리 보인다#
다음과 같은 Traffic이 있다고 하겠습니다.
TX
AA 55 01 10 00 71
RX
AA 55 01 90 02 00 64 D2이 패턴이 반복된다면:
Request Command
10
Response Command
90사이에 관계가 있을 수 있습니다.
다른 Command를 비교합니다.
TX Command
11
RX Command
91
TX Command
12
RX Command
92그렇다면:
Response Command
=
Request Command + 0x80이라는 가설을 세울 수 있습니다.
이처럼 Protocol 분석은 개별 Packet보다 Packet 사이 관계가 중요합니다.
Response 시간도 기록한다#
예:
Request
14:20:10.000
Response
14:20:10.035이면 약 35ms입니다.
여러 번 측정합니다.
32ms
34ms
36ms
31ms
220ms대부분 30~40ms인데 가끔 220ms가 나온다면 장비 내부 처리나 다른 조건이 있을 수 있습니다.
이 정보는 나중에 Timeout 설정의 근거가 됩니다.
9장 ASCII인지 Binary인지 먼저 판단한다#
Capture 데이터에서 다음 값이 보인다고 하겠습니다.
47 45 54 2C 53 54 41 54 55 53 0D 0AASCII로 변환하면:
GET,STATUS\r\n입니다.
이런 경우 Text 기반 Protocol일 가능성이 높습니다.
반대로:
AA 55 01 82 04 C7 21 00 FF 3A처럼 보인다면 Binary Protocol일 가능성이 높습니다.
ASCII Protocol 분석#
찾아야 할 요소:
Command 이름
Separator
Field 순서
숫자 표기
CR
LF
Encoding예:
GET,STATUS,01\r\nBinary Protocol 분석#
찾아야 할 요소:
Header
Address
Command
Length
Data Type
Byte Order
Flags
Checksum
CRCBinary 데이터 안에도 ASCII 문자열이 일부 포함될 수 있으므로 두 방식이 완전히 배타적인 것은 아닙니다.
10장 Length Field는 여러 Packet을 비교해 찾는다#
가변 길이 Packet을 Capture했다고 하겠습니다.
AA 55 01 10 02 11 22 XX
AA 55 01 10 04 11 22 33 44 XX
AA 55 01 10 06 11 22 33 44 55 66 XX다섯 번째 Byte가:
02
04
06으로 변하고 뒤의 Data 길이와 정확히 일치한다면:
Length일 가능성이 매우 높습니다.
하지만 Length가 항상 Byte 수를 의미하는 것은 아닙니다.
다음도 가능합니다.
전체 Frame Length
Payload Length
Word Count
Character Count
Register Count따라서 실제 Frame 크기를 여러 개 비교해야 합니다.
Length가 없을 수도 있다#
Frame 경계를 다른 방식으로 찾는 Protocol도 있습니다.
예:
STX
...
ETX또는:
CR LF또는 고정 길이:
항상 32 Byte일 수도 있습니다.
11장 Sequence Number와 Counter는 반복 Packet에서 드러난다#
다음처럼 동일 명령을 반복했는데 한 Byte만 계속 증가한다고 하겠습니다.
AA 55 01 10 01 ...
AA 55 01 10 02 ...
AA 55 01 10 03 ...
AA 55 01 10 04 ...다음 후보를 생각할 수 있습니다.
Sequence Number
Packet Counter
Transaction ID 일부이 값을 찾으면 Request와 Response를 연결하는 데 도움이 됩니다.
예:
Request
Sequence 23
Response
Sequence 23이라면 같은 Transaction임을 확인할 수 있습니다.
다만 Counter가:
FF
↓
00처럼 순환할 수도 있으므로 충분히 오래 Capture하는 것이 좋습니다.
12장 상태값은 Bit 단위로 바뀔 수 있다#
Packet:
Status
05가 있다고 하겠습니다.
상태를 바꿨더니:
05
↓
07로 변했습니다.
Binary로 보면:
05
0000 0101
07
0000 0111차이는:
Bit 1입니다.
이때 특정 Sensor나 상태를 ON/OFF하면서 값을 비교하면 각 Bit의 역할을 추론할 수 있습니다.
예:
| 상태 | 값 |
|---|---|
| 기본 | 0x00 |
| Sensor A ON | 0x01 |
| Sensor B ON | 0x02 |
| Sensor A+B ON | 0x03 |
이 결과가 반복된다면:
Bit 0
Sensor A
Bit 1
Sensor B라는 강한 근거가 됩니다.
XOR 비교도 유용합니다.
05 XOR 07
=
02즉 두 상태의 차이가 0x02라는 것을 바로 확인할 수 있습니다.
13장 Checksum과 CRC는 마지막에 분석하는 편이 좋다#
문서가 없는 Packet에서 마지막 1~2 Byte가 계속 변하면 Checksum이나 CRC를 의심하게 됩니다.
하지만 처음부터 모든 CRC Algorithm을 무작정 대입하는 것은 효율적이지 않습니다.
먼저 다음을 확인합니다.
검증값 크기
Packet 끝에 위치하는가?
Data 변경 시 같이 변하는가?
Sequence 변경 시 변하는가?
Header도 계산에 포함되는가?그다음 간단한 방식부터 확인합니다.
SUM
XOR
LRC
Two's Complement일치하지 않으면 CRC 계열을 검토합니다.
CRC의 경우 다음 Parameter가 필요할 수 있습니다.
Polynomial
Initial Value
RefIn
RefOut
XorOut
Output Byte Order또한 어느 영역을 계산하는지도 중요합니다.
예:
AA 55 01 10 02 00 64 XX XXCRC 대상이:
01 10 02 00 64일 수도 있고:
AA 55 01 10 02 00 64일 수도 있습니다.
검증값을 바꿔가며 실장비에 무작정 보내지 않는다#
Checksum·CRC를 잘못 추론한 상태에서 임의 Frame을 실장비에 반복 전송하는 것은 피합니다.
가능하면 Capture 데이터와 Offline 계산을 통해 먼저 가설을 검증합니다.
14장 TCP Packet과 Application Message를 혼동하지 않는다#
Ethernet 장비 분석에서 매우 흔한 실수입니다.
Wireshark에서 TCP Packet이 다음처럼 보였다고 하겠습니다.
TCP Packet 1
AA 55 01
TCP Packet 2
10 04 00 64
TCP Packet 3
00 C8 7A이것이 Protocol Frame 세 개라는 뜻은 아닙니다.
실제 Application Message는:
AA 55 01 10 04 00 64 00 C8 7A하나일 수 있습니다.
반대로 하나의 TCP Segment 안에 Application Frame 두 개가 들어갈 수도 있습니다.
Frame A | Frame BTCP는 Byte Stream이기 때문입니다.
따라서 다음을 분리해야 합니다.
Ethernet Frame
IP Packet
TCP Segment
Application Protocol Frame분석 대상이 장비 Protocol이라면 최종적으로 TCP Payload를 다시 Application Frame 규칙에 따라 조립해야 합니다.
15장 추론한 Command를 그대로 재전송하면 위험할 수 있다#
Capture에서 다음 Packet이 Motor를 움직이기 직전에 발생했다고 하겠습니다.
AA 55 01 21 00 810x21이 Motor Start Command일 가능성이 있다고 추론할 수 있습니다.
하지만 이 Packet을 그대로 실장비에 Replay하는 것은 위험할 수 있습니다.
왜냐하면 다음과 같은 숨은 조건이 존재할 수 있기 때문입니다.
현재 Mode
Safety Sensor
Session 상태
Sequence Number
Authentication
Interlock
Timestamp
일회용 Token또한 Capture Packet 자체가:
Motor Start가 아니라:
Motor 상태 확인일 수도 있습니다.
시간적으로 가까웠다는 사실만으로 인과관계를 확정해서는 안 됩니다.
먼저 Simulator에서 검증한다#
분석 결과로 다음과 같은 가상 장비를 만들 수 있습니다.
Request
↓
Parser
↓
Command 해석
↓
가상 상태 변경
↓
ResponseSimulator에서:
Packet Parsing
Checksum
Command Mapping
Sequence
Timeout을 먼저 검증합니다.
16장 분석 결과는 가설표와 Field Map으로 관리한다#
문서가 없는 Protocol에서는 특히 확정 사실과 추정을 분리해야 합니다.
예:
| Offset | 크기 | 추정 역할 | 근거 | 상태 |
|---|---|---|---|---|
| 0 | 2 | Header | 모든 Packet AA55 |
확정 |
| 2 | 1 | Address | 장비별로 값 변경 | 강한 추정 |
| 3 | 1 | Command | 동작별 값 변경 | 강한 추정 |
| 4 | 1 | Length | Payload 길이와 일치 | 확정 |
| 5~N | N | Data | 동작별 변경 | 분석 중 |
| Last | 1 | Checksum | Data 변경과 함께 변경 | 추정 |
이 방식은 매우 중요합니다.
분석자가:
Byte 3은 Command다.라고 메모해두면 나중에는 사실처럼 받아들여질 수 있습니다.
대신:
Offset 3
Command 후보
근거
OPEN과 CLOSE에서 값이 달라짐
신뢰도
높음
추가 검증
STATUS 명령과 비교 필요처럼 기록합니다.
Protocol 분석 문서에 남길 내용#
최종적으로 다음을 작성하는 것이 좋습니다.
Transport
Serial·Network 설정
Frame Format
Field Map
Data Type
Byte Order
Command Table
Response Table
Error Code
Checksum·CRC
Timing
Sequence
Timeout
Retry
미확인 Field
Firmware Version이 문서가 다음 단계인 Driver 개발의 기준이 됩니다.
17장 분석을 더 빠르게 만드는 실전 방법#
반복 Capture를 자동화한다#
동일 Command를 50번 Capture하면 손으로 비교하기 어렵습니다.
Script를 이용해 각 Offset의 값 분포를 계산하면 도움이 됩니다.
예:
Offset 0
AA 100%
Offset 1
55 100%
Offset 2
01 100%
Offset 3
10 100%
Offset 4
00~FF 변화이런 결과를 보면 고정 Field와 변화 Field를 빠르게 구분할 수 있습니다.
같은 종류 Packet끼리 묶는다#
Length나 Header가 같은 Packet을 Grouping하면 분석이 쉬워집니다.
Type A
Type B
Type C그리고 각 Group 내부에서 변화를 비교합니다.
물리 상태 로그와 시간을 맞춘다#
가능하면 다음 데이터를 같은 시간 기준으로 기록합니다.
Packet Capture
Application Log
Sensor 상태
장비 화면
운영자 동작예:
10:30:01.100
Button OPEN 클릭
10:30:01.107
TX Packet
10:30:01.135
RX ACK
10:30:01.180
Motor Start
10:30:02.320
Open Sensor ON이렇게 하면 Protocol의 의미를 훨씬 정확하게 추론할 수 있습니다.
18장 자기 점검#
Protocol 문서가 없을 때 가장 먼저 해야 할 일은 무엇인가#
기존 정상 시스템의 구조와 장비 Model·Firmware·통신 Interface를 확인하고 안전하게 Traffic을 관찰할 수 있는 환경을 만드는 것입니다.
같은 Packet을 한 번만 Capture해도 분석할 수 있는가#
일부 정보는 볼 수 있지만 신뢰성이 낮습니다. 동일 동작과 서로 다른 상태를 반복 Capture해야 고정 Field와 변화 Field를 구분할 수 있습니다.
특정 Byte가 동작 직전에 바뀌었다면 바로 Command라고 확정해도 되는가#
아닙니다. Sequence·Timestamp·Status 등이 우연히 함께 바뀌었을 가능성이 있으므로 반복 실험과 다른 동작 비교가 필요합니다.
마지막 두 Byte가 계속 변하면 CRC인가#
가능성은 있지만 바로 확정할 수 없습니다. Checksum·Counter·Timestamp 일부 등 다른 Field일 수도 있으므로 계산과 반복 비교가 필요합니다.
TCP Capture 한 개가 장비 Protocol Packet 하나인가#
아닙니다. TCP Segment 경계와 Application Message 경계는 다를 수 있으므로 Protocol의 Length·Header·Delimiter 등을 이용해 다시 Frame을 구성해야 합니다.
19장 이 글을 마치며#
Protocol 문서가 없는 장비를 분석하는 전체 흐름을 정리하면 다음과 같습니다.
장비 Model·Firmware 확인
↓
통신 Interface 확인
↓
기존 정상 통신 구조 확인
↓
안전한 Capture 환경 구성
↓
정상 Traffic 반복 수집
↓
HEX 정렬
↓
고정·변화 Field 분리
↓
동작별 Packet 비교
↓
Request·Response 연결
↓
Length·Sequence 추론
↓
Data Type·Bit Field 분석
↓
Checksum·CRC 검증
↓
Timing 분석
↓
Simulator 검증
↓
Field Map 작성
↓
Protocol 명세 작성특히 다음 원칙을 기억하면 됩니다.
문서가 없다고 Packet의 의미를 감으로 정하지 말고 동일 동작을 반복해서 Capture하고 변화가 하나씩 발생하도록 실험해야 합니다.
Header·Address·Command·Length·Sequence·Payload·Checksum 후보를 분리한 뒤 각 가설마다 근거와 신뢰도를 기록해야 합니다.
실제 장비의 물리 상태와 Packet 발생 시간을 함께 기록해야 단순한 상관관계를 실제 Command나 Status로 잘못 판단하는 일을 줄일 수 있습니다.
TCP Segment와 Application Packet은 다르며 Serial과 TCP 모두 수신한 Byte Stream에서 Protocol 규칙에 따라 Frame을 다시 구성해야 합니다.
추론한 Packet을 실장비에 Replay하기 전에 Simulator에서 Parser·Checksum·Command Mapping·Timeout을 검증해야 합니다.
분석 결과는 개인의 기억이나 주석으로 남기지 말고 Field Map·Command Table·Error Code·Timing·미확인 Field가 포함된 Protocol 명세로 문서화해야 합니다.
결국 Protocol Reverse Engineering은 HEX 값을 찍어보며 정답을 맞히는 작업이 아닙니다.
관찰
↓
비교
↓
가설
↓
검증
↓
반복
↓
문서화라는 과정입니다.
처음 보는 장비에서:
AA 55 01 10 04 00 64 00 C8 7A라는 한 줄을 발견했을 때도 바로 답을 내리지 않습니다.
먼저 질문합니다.
어떤 Byte가 항상 같은가?
어떤 Byte가 장비마다 달라지는가?
어떤 Byte가 동작에 따라 달라지는가?
길이를 나타내는 값이 있는가?
Request와 Response는 어떻게 연결되는가?
상태 변화와 동시에 변하는 Bit는 무엇인가?
마지막 값은 무엇을 검증하는가?
이 가설은 몇 번 반복해도 성립하는가?이 질문을 체계적으로 반복할 수 있다면 제조사 문서가 부족한 PLC, Sensor, 계측기, Reader, Printer, Controller, Gateway 등도 훨씬 안전하고 재현 가능한 방법으로 분석할 수 있습니다.