자동차 엔진을 다시 만들어보거나 엔진을 부품으로 분리해보는 일, 이런 것만으로도 많은 것을 배울 수 있다. 요컨대 어떠한 객체를 이해하고 그것을 더 향상하기 위해서 같은 것을 만들어 보거나 분해하는 것은 좋은 과정이다. 이렇게 완성된 객체를 역으로 분석해 가는 과정을 리버스 엔지니어링이라고 하며 컴퓨터, 디자인, 의학, 기계 등 너무도 다양한 분야에서 이 기술은 쓰이고 있다. 본문에서는 리버스 엔지니어링에 대한 설명과 어디에 쓰이는지에 대해 자세히 이야기해보려 한다.
리버스 엔지니어링은 다른 말로 역공학이라고도 하며 객체를 이해하고 이를 복제하거나 향상하기 위해 어떻게 작동하는 것인지 살펴보는 과정을 말한다.[1] 즉, 사람이 인공적으로 만들어 낸 것에서 지식이나 디자인 정보를 추출하고 이 정보를 바탕으로 어떤 것을 다시 생산하는 과정을 말한다.[2]
리버스 엔지니어링의 사용 범위는 점점 분야가 더 넓어지면서 소프트웨어, 데이터베이스, 소스코드 심지어 인간의 DNA, 뇌까지도 리버스 엔지니어링의 영향을 받는다.[3][4] 이 글을 보는 이라면 하드웨어나 소프트웨어에 리버스 엔지니어링이 자주 쓰인다는 것을 언뜻 들어봤을 것이다. 좀 더 자세하게 이야기하면 프로그램은 사람이 이해할 수 있는 C언어나 JAVA를 통해 개발자에 의해서 구현된다. 하지만 컴퓨터가 프로그램을 실행하기 위해서는 컴파일러라는 다른 프로그램을 통해 컴퓨터의 언어 1과 0으로 변환해야 한다. 참고로 컴파일된 코드는 대부분의 개발자가 보기에도 이해하기 어려울 정도로 복잡하기 때문에 이를 다시 개발자가 이해하는 언어로 변환해주기 위해서는 디컴파일러라고 불리는 프로그램을 통해 기계 코드에서 사람이 볼 수 있는 언어로 변환해야 한다.
리버스 엔지니어링은 다양한 목적으로 사용된다.[5] 리버스 엔지니어링은 학습도구로도 사용되며 출시된 프로그램을 더 저렴하고 새롭게 호환되는 제품으로 만드는 데 사용되기도 한다. 소프트웨어를 효과적으로 상호 운용하거나 다른 운영체제 또는 데이터베이스 간의 데이터를 연결하기 위해 사용되기도 하며 제품의 문서로 만들어 지지 않는 기능, 밝혀지지 않은 기능을 밝혀내기 위해 사용되기도 한다. 이뿐만 아니라 제품의 보안 분석을 하거나버그를 수정하는데도 사용된다.오래된 제품을 다시 사용하기 위해 리버싱하여 재설계할 수도 있고 경쟁 업체의 제품을 분석하거나 승인되지 않은 프로그램을 리버싱하여 무면허로 복제하여 사용하기도 한다. 리버스 엔지니어링은 사용되는 곳도 사용되는 이유도 매우 다양할 정도로 수많은 곳에서 쓰인다.[6]
리버스 엔지니어링이 자주 사용되는 곳 중 하나는 CAD(Computer-Aided Design)다. CAD는 디자인, 설계에 많이 사용되는 프로그램으로 3D 가상 모델을 만들 수 있다.[7] CAD를 다루는 교과목도 생길 정도로 CAD 사용이 보편화함에 따라 CAM, CAE 등 CAD는 3D 가상 모델을 만들어내는 가장 실용적인 방법이 되었다.[8] CAD의 리버스 엔지니어링 프로세스는 하나의 객체를 측정한 후, 그 객체를 3D 모델로 재구성한다. 물리적 객체는 CMM(좌표 측정기), 레이저 스캐너, 구조화된 광선 디지타이저 또는 컴퓨터 단층 촬영 등과 같은 3D 스캔 기술을 통해 물리적 객체를 측정하여 실제 제품에서 3D CAD 모델을 생성한다.[9] 사실, 이게 얼마나 자주 사용되는지 감이 안 온다면 우리가 눈에 보이는 대부분은 CAD로 설계되어 만들어진 것이라고 보면 된다. 옛날에는 사람이 직접 설계하고 나무를 깎아 만들었다면 이제는 CAD로 설계하기만 하면 바로 가공할 수 있는 과정으로 넘어간다. 더욱이, CAD를 이용해 간단히 설계한 것치고는 상당히 정밀한 작업도 할 수 있다. 이 때문에 선진국에서 설계하고 제조는 중국에서라고 할 정도로 선진국의 제조업이 급속도로 붕괴하였다는 이야기도 있다.[10] 정리하자면, CAD의 리버스 엔지니어링 프로세스는 현실의 물리적 객체를 디지털 환경으로 가져와 3D 객체로 만들어 객체의 작동방식, 구성 요소 등을 분석하고 비용을 추정하여 잠재적인 특허 침해 등을 식별하거나 객체를 평가하는데 사용된다.[11]
소프트웨어에서 리버스 엔지니어링은 사람마다 용어의 의미도 다르고 다양한 용도로 연구하고 분류해 놨지만 사실 결국엔 소프트웨어에서 리버스 엔지니어링이란 하나의 과정이라는 것은 일맥상통하다. 이 과정은 소스 코드의 유무에 따라 두 개로 나뉠 수 있는데 소스코드가 손실되었을 경우 프로그램의 소스 코드를 찾기 위해 리버스 엔지니어링이 사용되기도 한다. 더불어, 프로그램의 동작 원리를 연구하거나 소스코드를 검색하기 위해 사용되기도 한다. 반대로 프로그램의 소스코드가 제공된다면 프로그램의 상위 수준 측면을 발견하기도 한다. 또한,악의적인 프로그램에서 악의적인 콘텐츠를 식별하거나 프로그램에서 버그를 찾아내기도 한다.[12][13]
리버스 엔지니어링의 또 다른 쓰임새는 소스 코드를 가져와 UML 다이어그램으로 만들어내기도 한다.[14] 더욱이, UML뿐만 아니라 KDM(Knowledge Discovery Metamodel) 역시 가능하다. KDM은 소프트웨어 시스템과 운영환경들을 위한 공통 중개 표현으로 리버스 엔지니어링을 통해 나온 산출물에 접근 방법을 위한 표준화가 필요함에 따라 사용된다.[15] 즉, 쉽게 말하면 한 프로그램을 분석할 때 그 프로그램의 소스코드만 보는 것이 아니라 그 프로그램 회사에서 제공하는 모든 프로그램의 소스코드의 정보까지 나타낼 수 있다는 것이다. 이는 소스 코드 분석을 위한 데이터, 제어, 호출과 같은 시스템 흐름과 규칙, 프로세스, 용어 등을 추출할 수 있게 한다. 결국, 한 소프트웨어에서 자세한 분석 또는 파생된 분석 모두 다양한 시스템 계층의 상관관계를 고려하여 공통 데이터 형식(XMI)를 이용해 분석할 수 있도록 한다. 이는 점차 많아지는 언어의 수, 소프트웨어의 발전, 새로운 언어의 개발 등 을 고려하여 앞으로의 확장뿐만 아니라 진화를 지원하려는 시스템 지식을 활용할 수 있다.[16]
소프트웨어를 리버스 엔지니어링하는 사람은 여러 도구를 사용하여 프로그램을 분석할 수 있다. 수많은 도구 중 Hex editor라는 도구는 프로그램의 2진수를 16진수 형식으로 표시하여 사용자가 더 알아보기 쉽게 표현해주는 도구다. 프로세서 명령어뿐만 아니라 명령어 길이를 나타내는 비트 패턴을 파악하여 프로그램의 특정 부분을 식별하여 어떻게 작동하는지를 알 수 있다.[17] 디스어셈블러는 기계어를 어셈블리어로 변화하는 컴퓨터 프로그램으로 실행 가능한 명령어와 프로그램에서 사용되는 데이터의 알 수 없는 차이를 이 프로그램을 통해 사람이 읽기 쉽도록 만들어 준다.[18] 이와 같은 프로그램의 사용은 악의적인 사용자가 코드를 수정하거나 컴퓨터 시스템에 들어가는 등 다른 위험을 초래할 수 있다는 점에서 문제가 된다.
하드웨어에서 리버스 엔지니어링은 디바이스 작동 방법을 보기 위해 디바이스를 분해하는 것을 포함한다. 예를 들어 프로세서 제조 업체가 경쟁 업체의 프로세서가 어떻게 작동하는지 보고 싶다면 경쟁 업체의 프로세서를 구입하여 디스어셈블 한 다음 유사한 프로세서를 만들 수 있다. 그러나 이 과정은 국내뿐만 아니라 여러 국가에서 불법이다. 일반적으로 하드웨어 리버스 엔지니어링은 많은 전문지식과 비용이 많이 든다.[19]
리버스 엔지니어링을 통해 스마트 카드 같은 작은 회로도 분석할 수 있다. 스마트 카드의 외부를 살짝 흠집 내어레이어를 노출시키고 이를 전자 현미경을 통해 확인하면 스마트 카드의 전체 하드웨어 및 소프트웨어 부분을 확인할 수 있다. 이렇게 노출된 정보를 분석하다 보면 스마트 카드가 어떻게 어떤 순서로 작동하는 지를 알아낼 수 있다. 이 때문에 스마트 카드 제조 업자들은 인식하는 기기의 메모리 위치를 섞어 키와 실행 구조를 숨기려고 한다. 때에 따라서 스마트 카드가 작동하는 동안 전압을 측정하기 위해 프로브라는 것을 부착할 수도 있는데 이 같은 공격을 탐지하여 막기 위해 따로 센서를 사용하기도 한다.[20] 이러한 칩 리버스 엔지니어링은 대게 대형 칩 제조업체만 사용할 수 있는 특수 장비와 장비에 대한 지식이 많이 있어야 하므로 사실 흔치 않지만 우리 회사에서는 비슷한 걸 누군가 하고 계신 것 같다...
이 뿐만 아니라 리버스 엔지니어링은 또 다른 분야에서도 쓰이고 있다. 카네기 멜론 대학의 연구원은 컴퓨터를 인간과 더 비슷하게 생각할 수 있도록 하는 것에 대해 리버스 엔지니어링을 사용하고 있다.[21] 이를 통해 뇌에서 받아들이는 시각적인 정보를 처리하고 사용하는 규칙을 발견하여 이를 그대로 머신러닝 알고리즘에 적용했다. 특히, 이를 위해 사용되는 알고리즘을 더 향상시키고 정보를 더 잘 처리할 수 있도록 수만 개의 개별 신호를 받아들여 신호를 기록하고 분석할 수 있는 기술을 사용했다.[22] 이러한 정보의 처리에서도 리버스 엔지니어링으로 충분히 잘 쓰여지고 있다.
이 외에도 군사 프로그램에서의 리버스 엔지니어링은 다른 국가의 기술, 장치 또는 정보를 얻기 위한 중요한 기술로도 사용된다. 군대에서 리버스 엔지니어링의 사용 사례는 독일군이 사용한 뛰어난 디자인의 가솔린 깡통을 리버싱한 제리 캔이 있으며 독일인은 미국의 바주카를 리버싱하는 등 군대에서의 리버스 엔지니어링 사례는 상당히 많다.[23]
이처럼 리버스 엔지니어링의 쓰임새는 어느 분야에서든지 정말 다양하게 사용되고 있다. 그만큼 우리는 많은 분야에서 리버스 엔지니어링 기술을 사용하고 상당히 많은 부분을 의존하며 살아왔다. 하지만 이러한 리버스 엔지니어링이란 기술이 우리에게 도움이 되는 기술임에도 불구하고 정당성, 합법성에 대한 논란은 항상 뒤따라 왔다. 이에 관한 리버스 엔지니어링의 합법성과 논란, 대표적인 리버싱의 사용 사례에 대해서는 2부에서 이야기해보겠다.
=> 분석의 꽃, 리버스 엔지니어링