import pandas as pd
from pathlib import Path
import plotly.express as px
import plotly.graph_objects as go
# data 디렉토리에 있는 모든 .asc 파일들
dir_data = Path('.').absolute()/'asc_per_id'
ascs = list(dir_data.glob('*.asc'))
print(f'{len(ascs) = :,}')
# for asc in ascs:
# print(asc.name)
len(ascs) = 59
한 asc를 대상으로 방법을 개발한다.
def read_asc_to_df(asc):
'''
.asc 파일을 읽어서 DataFrame으로 반환한다.
asc 파일은 m_id 별로 분리된 파일이어야 한다.
'''
# 파일을 읽어서 DataFrame으로 변환한다.
df = pd.read_csv(asc, sep=' ', skiprows=4, header=None, dtype=str)
# 빈 컬럼은 제거한다.
df = df.dropna(axis=1)
# 컬럼의 개수를 확인한다.
n_cols = df.shape[1]
# 처음 6개 컬럼은 고정이고, 나머지는 d01, d02, ... 이런 식으로 이름을 붙인다.
n_data_byte = n_cols - 6
col_ds = [f'd{i + 1:02}' for i in range(n_data_byte)]
cols = ['ts', 'ch', 'm_id', 'trx', 'd', 'dlc'] + col_ds
df.columns = cols
# 컬럼별 dtype을 변경한다.
df['ts'] = df['ts'].astype(float)
df['ch'] = df['ch'].astype(int)
df['dlc'] = df['dlc'].astype(int)
for col in col_ds:
df[col] = df[col].apply(lambda x: int(x, 16))
return df
# 임의로 파일을 선택하여 df로 만든다.
asc = ascs[10]
df = read_asc_to_df(asc)
print(df.head())
# 메시지 전송 주기는 인접한 메시지들의 ts(timestamp)들 사이의 차이다.
df['d_ts'] = df['ts'].diff()
# 맨 처음 메시지는 인접한 메시지가 없어 d_ts가 na이다. 이를 d_ts의 평균으로 채운다.
df['d_ts'] = df['d_ts'].fillna(df['d_ts'].mean())
# d_ts의 통계를 본다.
print(df['d_ts'].describe())
count 38393.000000
mean 0.010000
std 0.000257
min 0.008302
25% 0.009892
50% 0.010002
75% 0.010109
max 0.011694
Name: d_ts, dtype: float64
ascs_to_draw = ascs[:]
for asc in ascs_to_draw:
path_to_output_png = dir_data/f'{asc.stem}.png'
print(f'saving histogram of {asc.name} to {path_to_output_png.name}')
df = read_asc_to_df(asc)
df['d_ts'] = df['ts'].diff()
df['d_ts'] = df['d_ts'].fillna(df['d_ts'].mean())
fig = draw_histogram(df, asc)
# fig.show()
fig.write_image(path_to_output_png, format='png', engine='kaleido')
saving histogram of 042.asc to 042.png
saving histogram of 043.asc to 043.png
saving histogram of 044.asc to 044.png
saving histogram of 080.asc to 080.png
saving histogram of 081.asc to 081.png
saving histogram of 111.asc to 111.png
saving histogram of 112.asc to 112.png
saving histogram of 113.asc to 113.png
saving histogram of 124.asc to 124.png
saving histogram of 153.asc to 153.png
saving histogram of 164.asc to 164.png
saving histogram of 18F.asc to 18F.png
saving histogram of 200.asc to 200.png
saving histogram of 220.asc to 220.png
saving histogram of 251.asc to 251.png
saving histogram of 260.asc to 260.png
saving histogram of 280.asc to 280.png
saving histogram of 2B0.asc to 2B0.png
saving histogram of 316.asc to 316.png
saving histogram of 329.asc to 329.png
saving histogram of 340.asc to 340.png
saving histogram of 346.asc to 346.png
saving histogram of 34C.asc to 34C.png
saving histogram of 374.asc to 374.png
saving histogram of 381.asc to 381.png
saving histogram of 383.asc to 383.png
saving histogram of 386.asc to 386.png
saving histogram of 387.asc to 387.png
saving histogram of 38D.asc to 38D.png
saving histogram of 394.asc to 394.png
saving histogram of 417.asc to 417.png
saving histogram of 436.asc to 436.png
saving histogram of 483.asc to 483.png
saving histogram of 492.asc to 492.png
saving histogram of 4A7.asc to 4A7.png
saving histogram of 4E5.asc to 4E5.png
saving histogram of 4E6.asc to 4E6.png
saving histogram of 4E7.asc to 4E7.png
saving histogram of 4F1.asc to 4F1.png
saving histogram of 500.asc to 500.png
saving histogram of 502.asc to 502.png
saving histogram of 507.asc to 507.png
saving histogram of 50C.asc to 50C.png
saving histogram of 50E.asc to 50E.png
saving histogram of 52A.asc to 52A.png
saving histogram of 53E.asc to 53E.png
saving histogram of 541.asc to 541.png
saving histogram of 545.asc to 545.png
saving histogram of 547.asc to 547.png
saving histogram of 549.asc to 549.png
saving histogram of 553.asc to 553.png
saving histogram of 556.asc to 556.png
saving histogram of 557.asc to 557.png
saving histogram of 593.asc to 593.png
saving histogram of 5A0.asc to 5A0.png
saving histogram of 5B0.asc to 5B0.png
saving histogram of 5CE.asc to 5CE.png
saving histogram of 5CF.asc to 5CF.png
saving histogram of 5FA.asc to 5FA.png
# 마지막인 m_id = 0x5FA의 메시지 전송 주기 히스토그램을 살펴본다.
fig.show()
0x5FA 메시지의 전송 주기 히스토그램 점검
전송 주기는 1sec로 보인다.
예상대로 전송 주기를 중심으로 매우 집중된 분포를 보인다.
다른 메시지들에 비해서 상대적으로 전송 주기가 들쭉날쭉한 편이다.
IDS 관점에서 중요한 값은 최소 전송 주기이다. 0.996sec이다.
칩입 감지를 위한 전송 주기 기준을 0.9sec 혹은 0.95sec로 하면 될 것 같다. 넉넉하게 0.8sec 하면 민감 감지되는 일을 없을 것 같다.