2005년산 VoIP 폰, 둠(Doom)을 돌리다!

by DD
3개월 전
조회수 4

2005년형 VoIP 폰인 Snom 360에 둠(Doom)을 이식하기 위한 과정이 상세히 묘사됨

펌웨어 분석, 커스텀 펌웨어 구축, 하드웨어 드라이버 개발 등 기술적 난관 극복

리버스 엔지니어링(Reverse Engineering)을 통해 디스플레이, 키보드 드라이버 분석

성능 최적화(Performance Optimization)를 위해 640x400 해상도에서 132x64로 다운스케일링

펌웨어 분석 및 리버스 엔지니어링(Reverse Engineering)

저자는 Snom 360 폰의 펌웨어(Firmware)를 분석하기 위해 binwalk를 사용하여 파일 시스템을 추출했다. 추출된 파일 시스템에서 ELF 바이너리(ELF Binary)를 발견하고, Ghidra를 활용하여 디스어셈블리(Disassembly)를 수행했다. 특히, 디스플레이 및 키보드 드라이버의 동작 방식을 파악하기 위해 INCA-IP 커널 모듈(Kernel Module)의 ioctl 호출을 분석했다. 이러한 과정을 통해 하드웨어 제어 방식을 이해하고, 둠(Doom)을 포팅하기 위한 기반을 마련했다.

커스텀 펌웨어 구축 및 쉘(Shell) 접근

저자는 Snom 360 폰의 펌웨어 이미지를 분석한 후, GPL 소스 코드(GPL Source Code)를 활용하여 커스텀 펌웨어를 구축했다. 특히, BusyBox를 재구성하여 쉘(Shell) 접근 권한을 획득하고, 폰의 하드웨어에 접근할 수 있는 환경을 조성했다. 또한, UPX 툴(UPX Tool)을 사용하여 바이너리 크기를 최적화하여 폰의 제한된 자원 내에서 둠(Doom)을 실행할 수 있도록 했다.

하드웨어 드라이버 개발 및 디스플레이 제어

둠(Doom)을 실행하기 위해 저자는 폰의 디스플레이와 키보드를 제어하는 커스텀 드라이버(Custom Driver)를 개발했다. 디스플레이의 경우, INCA_PORT_IOCOUTPUT ioctl 호출을 분석하여 디스플레이 초기화 및 픽셀(Pixel) 데이터를 전송하는 방식을 파악했다. 또한, 폰의 LED 제어를 위한 inca360_write_led 함수를 분석하여 백라이트(Backlight)를 제어하는 방법을 알아냈다. 이러한 과정을 통해 폰의 하드웨어를 직접 제어할 수 있는 능력을 확보했다.

둠(Doom) 포팅 및 성능 최적화

저자는 둠(Doom)을 폰에 포팅하기 위해 doomgeneric을 기반으로, 폰의 하드웨어에 맞게 DG_Init, DG_SleepMs, DG_GetTicksMs, DG_GetKey, DG_DrawFrame 함수를 구현했다. 특히, 132x64 해상도의 디스플레이에 맞게 640x400 해상도에서 렌더링된 화면을 다운스케일링(Downscaling)하는 과정을 거쳤다. 또한, 흑백(Grayscale) 변환 및 픽셀(Pixel) 압축을 통해 폰의 제한된 자원 내에서 둠(Doom)을 실행할 수 있도록 성능 최적화(Performance Optimization)를 수행했다.

Porting Doom to a 20-year-old VoIP phone