본문 바로가기

Programming/VBA(Excel, Powerpoint)

엑셀 매크로 소스코드 비밀번호 없이 추출하는 방법

반응형

엑셀에 있는 (워드나 파워포인트도 마찬가지지만) 매크로 코드 (= VBA 코드, VBA: Visual Basic for Application)를 다른 사람이 함부로 볼 수 없게 하기 위해 비밀번호를 걸어 놓을 수 있다. 

 

엑셀 VB 에디터에서 VBA 프로젝트에 대한 암호설정 화면

 

그러나, 이 방법은 너무 쉽게 무력화되고, 그 무력화하는 방법이 인터넷에 너무 많이 알려져서, 개발자 수준도 아니고 일반 사용자가 쉽게 암호를 모르고도 매크로 코드를 볼 수 있다.

그래서, 다른 방식으로 매크로 코드를 보호하는 툴이 있고, 유상으로 판매하기도 한다. 

 

암호 없이 매크로 코드(VBA 소스코드)를 보는 방법 정리

가장 널리 알려지고 손쉬운 방법은, 엑셀 파일를 구성하는 부속 파일인 vbaProject.bin 파일의 내용 중 일부(암호에 관련된 값)를 수정하는 것이다.  이 방법을 "DPx 공격" 이라고 칭하겠다.

 

DPx 공격을 소개하는 사이트 들

구글링해서 먼저 나오는 5개 정도 사이트만 적었는데, 무수히 많은 국내외 사이트들이 이러한 "DPx 공격"을 소개하고 있다. 

 

이 방법이 논문으로 출간되기도 했다.

 

DPx 공격을 논문으로 작성

 

 

또한, DPx 공격을 사용자가 Hex 에디터로 수정하고 다시 zip 파일로 묶는 과정을 자동화한 프로그램도 등장했다.

 

DPx 공격을 자동화한 툴


위 방법은 모두 DPx 공격이라 할 수 있고, vbaProject.bin 파일에 있는 암호값을 저장하는 곳을 공격한다. 

이는, 엑셀에서 VBA코드를 방어함에 있어서, VBA 모듈에 접근할 때 암호를 물어보는 방식이고, 그 암호에 대한 해시값을 저장해두는 태그값을 이상한 태그로 바꿔버려서, 암호값을 아예 가져오지 못하게 하는 방식이다.

 

좀 다른 방법도 있는데, 엑셀에서 사용자가 VBA 모듈을 누르고 암호를 입력하고 나서, 암호가 맞으면 True, 틀리면 False값이 저장되는 메모리를 바꾸는 공격이 있다. 즉, 암호가 맞든 틀리든 무조건 True값이 되도록 해당 메모리 영역 값을 고정해버리는 것이다. 따라서, 암호를 물어보지도 않고 그냥 매크로 코드가 보이게 된다.

이 방법을 "암호체크 우회공격"이라 부르겠다. 

 

이 방법은 Stack Overflow에서 소개된 듯하고, 이를 바탕으로 해서 프로그램화한 사이트들이 몇 개 있다.

 

암호 체크 우회 공격: 비밀번호 체크 결괏값을 True로 고정해버리게 Excel 메모리 수정하는 공격 


위 방법들을 사용하면, 엑셀 기능만을 사용해서 암호를 걸어놓은 파일들에 대해서 매크로 코드 추출이 손쉽게 된다.

 

별도 툴을 이용해서 VBA 코드에 대한 보호를 하곤 하는데, 지금까지 가장 많이 알려진 것이 Unviewable + 이다. 

(우리나라에서 엑셀 매크로를 배포할 때 많이 사용한다.)

 

https://www.spreadsheet1.com/unviewable-vba-project-app-for-excel.html

 

Unviewable+ VBA for Excel PowerPoint Word AutoCAD Visio

Project is Unviewable+ VBA is an attempt to protect your intellectual VBA property without external file dependencies from the lion's share of hacking tricks

spreadsheet1.com

 

이 툴을 사용한 경우 위에서 소개한 "DPx 공격"이나 "암호체크 우회공격"을 막을 수 있다. 

그러나, 이 툴로 보호한 경우에도 코드 추출 공격은 막을 수 없다. 

 

코드 추출 공격은, VBA 코드가 저장되어 있는 vbaProject.bin 파일에서, 인코딩 되어 있는 바이너리 코드를 추출한 후, 직접 디코딩해버리는 공격이다. MS에서 VBA 코드를 저장할 때 암호화(Encryption)를 하지 않고 인코딩(Encoding)을 하기 때문에 벌어지는 현상이다. 

암호화는 AES 알고리즘 등 암호화 알고리즘을 이용해서 해시화된 패스워드를 암호화 키로 Encrypt를 하는 것을 말하고, password를 모르면 복보화(decrypt)를 할 수 없음이, 수학적으로 증명된다.

인코딩은 password 없이 일정한 규칙에 의해 원본 데이터를 다른 형태의 데이터로 바꾸는 것을 말하고, 그 규칙만을 알면 누구든 디코딩을 할 수 있다.

MS사에서는 VBA코드의 저장을 '암호화'가 아닌 '인코딩' 방식을 사용하고 있고, 이게 VBA코드의 보호를 막는 가장 근본적인 원인이다. (엑셀 초창기에 정한 메카니즘을, 상위/하위 호환성 때문에 지금도 바꾸지 못하는 것이라 생각든다.) 

 

 

코드 추출 공격에 사용되는 툴들은, 주로 악성 매크로를 탐지하고 소스를 추출해서 분석하기 위한 목적으로 만들어졌는데, 이것을 패스워드 없이 매크로 코드를 추출하는 데도 사용되고 있다. 

 

코드 추출 공격에 사용되는 툴

olevba 툴이 가장 많이 쓰이는 툴인데, 파이썬으로 제작되었고, ole라는 것은 VBA 코드를 저장하고 있는 vbaProject.bin파일 내 데이터 구조인 OLE(Object Linking and Embedding) 파일 구조를 얘기하는 것(이 OLE 파일 구조를 MS에서는 CFB 파일 구조라고 부른다.) 

vbaProject.bin 파일은 OLE 파일 형태이고, 이 안에 여러 파일들이 있고, 이 파일들은 VBA 스펙에 나와 있는 각각의 레코드를 가리키는 구조로 되어 있다.  vbaProject.bin이 파일인데, 이 안에 다시 파일이 있다는 말이 좀 헷갈리겠지만, vbaProject.bin안의 데이터 구조가 여러 개의 작은 파일 블럭들과 이를 관리하는 FCB(File Control Block)로 되어 있는, MS DOS의 파일구조와 유사한 형태로 되어 있다. 

이러한 vbaProject.bin 파일을 olevba 툴은, 직접 바이너리 레벨에서 파싱하면서 VBA 코드가 들어 있는 레코드를 찾아서 디코딩을 해 버린다.  

 

이 olevba 툴을 사용하려면, 기초적인 파이썬 사용법 정도는 알아야 하지만, 비교적 쉽게 대부분의 엑셀 파일(암호가 걸려있건, 보호 툴로 보호되어 있건)의 매크로 코드를 추출해 낸다. (unviewable+로 락킹 되어 있는 파일에 대해서도 코드를 추출해 낸다.)

 


olevba 등에 의한 '코드 추출 공격'에도 방어가 되는 방법이 있을까?

 

아래 사이트에서는 그것이 어느 정도 가능하다고 한다. 

 

'코드 추출 공격'에 대응 가능한 보호 방법

 

VBA Protection page!

Protect Excel VBA Code Upload Excel file, and you can download two protected files.

vbaprotect.com

 

여기서 생성된 파일로 테스트해봤을 때, 위에서 소개한 모든 공격 방법으로도 뚫리지 않았다. (olevba로도 추출 안됨!!!! )

 

 

앞으로 어떤 툴이 나와서 뚫을 지는 모르겠으나, 이 보호 방법으로 현존하는 공격 방법들을 어느 정도는 막을 수 있을 것 같다. 

 

-끝-

반응형