dnSpy로 광고 프로그램 분석 (PortBook, 디컴파일, 어셈블리)
친한 친구 컴퓨터에서 쿠팡이랑 짱게임 광고가 계속 뜬다는 말을 들었을 때, 처음엔 그냥 설정 문제겠거니 했습니다. 그런데 광고 관련 프로그램을 지우고 나서도 광고가 계속 다시 뜨는 걸 보면서 뭔가 더 깊은 곳에 원인이 있다는 걸 직감했습니다. 그렇게 시작된 추적이 결국 dnSpy라는 도구를 손에 쥐게 만들었고, 저는 처음으로 EXE 파일 내부를 직접 들여다보는 경험을 하게 됐습니다.
PortBook이라는 프로그램을 발견하다
설치된 프로그램 목록을 AI에게 통째로 맡겨서 분석을 부탁했습니다. 그랬더니 PortBook이라는 프로그램이 수상하다는 답변이 돌아왔습니다. 솔직히 처음엔 반신반의했습니다. 이름만 봐서는 그냥 포트 관리 프로그램처럼 보였거든요. 그래서 직접 AppData 폴더를 뒤지기 시작했습니다.
경로를 따라가 보니 AppData > Roaming > PortBook 폴더 안에 파일이 꽤 많이 들어 있었습니다. PortBook.exe 하나만 있는 게 아니라 PortBookLauncher, Updater, yhLog.dll, 그리고 unins000 계열 파일들까지 함께 있었습니다. 이 구조를 보는 순간 이건 단순한 유틸리티가 아니구나 싶었습니다. 런처와 업데이터가 따로 존재한다는 건, 이 프로그램이 스스로 살아 움직이는 구조를 갖추고 있다는 뜻이기 때문입니다.
파일 속성을 확인해보니 버전은 1.0.7.68이었고, 디지털 서명(Digital Signature)도 들어 있었습니다. 디지털 서명이란 프로그램 파일이 특정 개발사에 의해 제작됐음을 인증 기관이 보증하는 전자 도장 같은 개념입니다. 서명자는 MobSoft Co., Ltd.였고, 인증서 발급 기관은 DigiCert였으며 유효기간은 2025년 3월부터 2026년 3월까지로 확인됐습니다. 그런데 여기서 중요한 점이 있습니다. 디지털 서명이 있다고 해서 그 프로그램의 동작 자체가 안전하다는 의미는 절대 아닙니다. 서명은 단지 “이 회사가 만든 파일이 맞다”는 것만 증명할 뿐입니다.
그래서 저는 멈추지 않고 실제 내부를 보기로 했습니다. 처음엔 메모장으로 PortBook.exe를 열어봤는데, 결과는 예상대로 MZ, PE 헤더 문자와 알 수 없는 바이너리 데이터의 향연이었습니다. MZ 헤더(MZ Header)란 Windows 실행 파일의 시작 지점을 알리는 2바이트 식별자로, 거슬러 올라가면 MS-DOS 시절부터 이어져 온 실행 파일 형식의 흔적입니다. 메모장으로는 여기까지가 한계였습니다.
dnSpy로 디컴파일하니 세상이 달라졌다
dnSpy는 .NET 어셈블리를 디버깅하고 편집할 수 있는 오픈소스 도구입니다. 디컴파일(Decompile)이란 이미 컴파일된 실행 파일을 역으로 분석해서 사람이 읽을 수 있는 소스코드 형태로 되돌리는 과정을 뜻합니다. 원본 소스코드 없이도 프로그램의 내부 구조를 파악할 수 있다는 점에서, 제가 겪은 이런 상황에서는 정말 딱 맞는 도구였습니다.
dnSpy로 PortBook.exe를 열자마자 분위기가 완전히 달라졌습니다. 메모장에서 보이던 깨진 문자 대신 C# 코드가 눈앞에 펼쳐졌습니다. 프로그램의 시작 지점인 Main() 함수를 찾아보니 Application.Run(new SmartBridgeClientUIForm())이라는 코드가 나왔습니다. 이걸 보는 순간 “아, 이건 .NET 기반으로 만들어진 윈도우 애플리케이션이구나”라는 게 바로 파악됐습니다. .NET 어셈블리(Assembly)란 .NET 플랫폼에서 실행되는 코드 단위로, C#이나 Visual Basic으로 작성한 코드를 컴파일하면 만들어지는 파일 형태입니다. 이 구조 덕분에 dnSpy 같은 도구로 원본에 가까운 코드를 복원하는 것이 가능합니다.
코드를 따라가다 보니 SmartBridgeClientUIForm이라는 클래스가 핵심 역할을 하고 있었습니다. 그리고 그 안에서 UrlExtraction이라는 이름의 코드 흐름도 발견했습니다. Chrome, Edge, Whale 같은 브라우저 창을 감지하고 현재 URL을 추출하는 것으로 보이는 구조였습니다. 제가 직접 눈으로 확인하면서 느낀 건, 이게 단순히 실행되고 끝나는 프로그램이 아니라 백그라운드에서 브라우저를 계속 들여다보는 형태의 프로그램이라는 점이었습니다.
설정값을 처리하는 부분에서는 더 노골적인 이름들이 등장했습니다. F_Favorite_On, F_Popunder_On, F_NewTab_On, F_IdSync_On 같은 변수명들이었습니다. 팝언더(Popunder)란 현재 브라우저 창 뒤에 새 창을 몰래 띄우는 광고 방식으로, 사용자가 브라우저를 닫을 때 갑자기 나타나는 그 광고 창이 바로 이 방식입니다. 친구 컴퓨터에서 쿠팡이나 짱게임이 갑자기 열리던 현상과 연결되는 부분이었습니다. 코드에서 이름을 발견한 것과 실제 동작을 증명하는 건 또 다른 문제이지만, 적어도 이 프로그램이 그런 기능을 탑재할 수 있는 구조임은 분명해 보였습니다.
한 가지 더 흥미로웠던 건 Costura라는 구성 요소였습니다. Costura는 .NET 프로그램에서 여러 DLL 파일을 하나의 실행 파일 안에 통합하는 라이브러리입니다. 즉 PortBook.exe 하나 안에 다른 DLL들이 내장되어 있을 수 있다는 뜻이고, 그래서 겉에서 보이는 것보다 훨씬 더 많은 기능이 숨어 있을 가능성이 있었습니다. 이 부분에서 저는 “파일 하나를 디컴파일했다고 다 본 게 아니구나”라는 걸 실감했습니다.
참고로 dnSpy는 오픈소스로 공개된 도구이며, 공식 GitHub 저장소(출처: dnSpy GitHub)에서 누구나 내려받아 사용할 수 있습니다. 소스코드 없이 .NET 및 Unity 게임 어셈블리까지 디버깅하고 편집할 수 있다는 점이 이 도구의 핵심 특징입니다.
광고 프로그램의 구조와 남은 의문들
분석을 하면서 이 프로그램의 전체 구조가 조금씩 보이기 시작했습니다. 단순히 실행 파일 하나가 아니라 런처, 업데이터, 로거, 본체가 분리된 구조였습니다. 이런 형태의 프로그램 구조를 분석할 때 확인해야 할 포인트를 정리하면 다음과 같습니다.
- AppData 폴더에서 런처(Launcher)와 업데이터(Updater)가 따로 존재하는지 확인한다. 이 둘이 따로 있다면 프로그램이 자동 업데이트 기능을 갖추고 있다는 신호다.
- 디지털 서명(Digital Signature)이 있더라도 서명자가 신뢰할 수 있는 회사인지, 그리고 프로그램의 실제 동작이 안전한지는 별개로 판단해야 한다.
- dnSpy로 디컴파일 후 네임스페이스와 클래스 이름에서 브라우저, URL, 팝언더 관련 키워드가 보이면 광고성 프로그램일 가능성을 높게 봐야 한다.
- Costura 같은 어셈블리 합치기 라이브러리가 포함돼 있다면, 눈에 보이는 코드 외에 내장 DLL까지 추가로 확인해야 전체 기능을 파악할 수 있다.
- Process.Start나 ShellExecute 같은 외부 프로그램 실행 코드가 있는지 검색하면, 실제로 어떤 URL이나 프로그램을 열게 되어 있는지 단서를 찾을 수 있다.
솔직히 이야기하면 저도 이번 분석에서 한계를 느꼈습니다. 코드를 보면서 “이게 광고를 띄우는 구조인 것 같다”는 건 느꼈지만, 구체적으로 어떤 URL에 접근해서 어떤 명령을 실행하는지까지는 제 실력으로 혼자 추적하기 어려웠습니다. 그래서 핵심 코드를 복사해서 ChatGPT에 붙여넣고 “이 코드가 어떤 역할을 하는 코드냐”고 물어보는 방식을 활용했는데, 이게 꽤 효과적이었습니다. AI가 팝언더 방식으로 브라우저에 특정 URL을 여는 구조라는 분석을 내놓았고, 제가 눈으로 본 코드 흐름과도 맞아떨어졌습니다.
한국인터넷진흥원(KISA)에서는 이런 방식의 광고성 소프트웨어, 즉 사용자 동의 없이 설치되거나 브라우저에 광고를 강제로 노출하는 프로그램을 애드웨어(Adware)로 분류하고 있으며, 명확한 삭제 기능 미제공 시 관련 법령 위반으로 처리될 수 있다고 안내하고 있습니다(출처: 한국인터넷진흥원 KISA). 제가 발견한 PortBook의 구조가 이 기준에 해당하는지 여부는 법적 판단의 영역이지만, 적어도 사용자 모르게 브라우저를 감시하고 팝언더 기능을 탑재한 구조라는 점은 분명히 불편한 부분이었습니다.
결국 친구 컴퓨터에서 프로그램을 삭제한 뒤 광고가 사라졌고, 저로서는 이 과정이 예상보다 훨씬 깊은 데까지 파고드는 경험이 됐습니다. 단순히 불법 광고 프로그램인지 아닌지 확인하는 용도라면 dnSpy를 활용해서 디컴파일해보는 것은 충분히 해볼 만한 방법이라고 생각합니다. 물론 전체 동작을 완벽히 분석하려면 훨씬 깊은 지식이 필요하지만, 코드 흐름을 눈으로 확인하고 AI에게 분석을 맡기는 방식만으로도 “이 프로그램이 뭘 하려는 프로그램인지”는 어느 정도 파악할 수 있었습니다.
자주 묻는 질문
Q. dnSpy는 모든 EXE 파일을 디컴파일할 수 있나요?
A. dnSpy는 .NET 기반으로 만들어진 어셈블리에 특화된 도구입니다. C나 C++로 컴파일된 네이티브 실행 파일은 분석 대상이 아니고, C#이나 VB.NET으로 작성된 .NET 프로그램에서 잘 작동합니다. PortBook.exe처럼 .NET으로 만들어진 프로그램이라면 소스코드 없이도 내부 구조를 상당 부분 복원해서 볼 수 있습니다.
Q. 디지털 서명이 있는 프로그램이면 안전한 건가요?
A. 디지털 서명은 “이 파일이 특정 회사에서 만들었다”는 것만 보증할 뿐, 프로그램의 동작이 사용자에게 안전하다는 의미가 아닙니다. 제가 직접 확인해봤는데, PortBook.exe에는 MobSoft Co., Ltd. 명의의 서명이 있었지만 내부 코드에는 브라우저 감시와 팝언더 관련 구조가 들어 있었습니다. 서명 여부와 프로그램의 안전성은 반드시 분리해서 판단해야 합니다.
Q. 광고 프로그램을 삭제했는데도 광고가 계속 뜨면 어떻게 해야 하나요?
A. 설정 > 앱에서 삭제한 것만으로는 부족한 경우가 많습니다. AppData\Roaming이나 AppData\Local 폴더 안에 잔여 파일이 남아 있는지 직접 확인하고, 작업 스케줄러(Task Scheduler)에 해당 프로그램의 예약 작업이 등록돼 있지 않은지도 체크하는 것이 좋습니다. PortBook처럼 런처와 업데이터가 따로 존재하는 구조라면 각 파일을 개별적으로 제거해야 완전히 사라질 수 있습니다.
Q. dnSpy를 사용하는 게 법적으로 문제가 되지 않나요?
A. dnSpy 자체는 GPLv3 라이선스로 배포되는 합법적인 오픈소스 도구입니다. 다만 타인의 소프트웨어를 무단으로 분석하거나 수정해서 배포하는 것은 저작권법 위반이 될 수 있습니다. 제가 이번에 한 것처럼 본인 또는 지인의 컴퓨터에 설치된 의심 프로그램을 분석하는 용도라면 일반적으로 문제가 없지만, 상업 소프트웨어를 분석해서 우회하거나 복제하는 데 사용하는 것은 별개의 문제입니다.
Q. 코드 분석 실력이 없어도 dnSpy를 활용할 수 있나요?
A. 저도 C# 전문가가 아닌데 어느 정도 활용할 수 있었습니다. 클래스 이름이나 변수명만 봐도 프로그램의 의도를 짐작할 수 있는 경우가 많고, 모르는 코드는 복사해서 ChatGPT 같은 AI에게 붙여넣으면 분석을 도와줍니다. 전체 동작을 완벽히 이해하기는 어렵더라도, “이 프로그램이 어떤 기능을 탑재하고 있는가” 수준의 판단은 충분히 가능합니다.
처음엔 그냥 친구 컴퓨터 광고 좀 잡아주려고 시작한 일이었는데, 어느새 dnSpy를 설치하고 EXE 내부를 들여다보고 있었습니다. 탐정이 된 것 같은 기분이 든 게 솔직한 소감이었고, 그 기분이 나쁘지 않았습니다. 만약 컴퓨터에서 출처 모를 광고가 계속 뜬다면, 설치 프로그램 목록을 꼼꼼히 살피고 의심스러운 프로그램은 AppData까지 따라가 보시길 권합니다. 그리고 그 프로그램이 정말 의심스럽다면, dnSpy로 열어보는 것도 생각보다 접근하기 어렵지 않습니다.
—
참고: https://github.com/dnSpy/dnSpy
https://www.kisa.or.kr