이전에 C#으로 개발하여 판매중인 SMS 전송기 입니다. API 호출은 제가 따로 안드로이드 앱을 개발하진 않았고 전적으로 PushBullet 어플에 의존하고 있어서 프로그램 자체는 그렇게 비싸지 않게 판매중입니다. 그래도 많은 분들이 유용하게 사용중입니다.
제가 보안분야에 관심도 많고 실제로 리버싱 공부도 하는중이라 프로그램 보안에 좀 민감한 편입니다. C#이나 Java의 경우 컴파일을 할때 C, C++ 처럼 기계어로 다이렉트로 번역하는게 아닌 바이트 코드 라는 중간 언어로 먼저 번역한 다음에, 가상 머신이 바이트 코드를 해석해 최종적으로 기계어로 번역하게 됩니다.
어쨌던 바이트 코드의 경우 기계어와 고급 언어(C#, Java) 의 중간 정도의 레벨이므로 일단은 기계어보다 추상화 수준이 높습니다. (기계어보다 조금 더 쉽고 인간 친화적이라는 뜻) 그러니깐 바이트 코드만 적당히 털어내면 소스코드가 거의 원본에 가깝게 복원이 됩니다..
실제로 C#이나 Java는 인터넷에 나와있는 디컴파일 도구만 잘 받아서 돌려보면 웬만해서 소스가 원래대로 복구됩니다.
C# 디컴파일 도구로 유명한 프로그램은 dotPeek라는 프로그램 입니다. 위 사진을 보시면 알겠지만 따로 보안을 걸지 않은 상태에서 디컴파일을 걸어봤더니 소스코드가 적나라하게 다 보입니다.
구조도 완벽히 복구되었고 심지어 주석도 나옵니다 ㅋㅋㅋ;;
사실 제가 만든 SMS 전송기는 Client-Side 형태의 프로그램이기 때문에 소스코드를 털어내도 별로 볼 건 없습니다. 물론 여러곳에서 프로그램을 돌려쓰면 IP 차단하는 기능과 기초적인 보안 기능은 있습니다.
일단은 C#이나 Java는 바이트코드로 컴파일 하는 특성때문에 완벽하게 보안을 걸기가 어렵습니다. 패킹을 걸어도 똑똑한 사람들이라면 패킹을 풀고 다시 바이트코드를 찾아내 복구하면 원본 소스가 털리기 때문입니다.
그래서 보안에 민감한 기업들이라면 C, C++로 프로그램을 작성하는 경우도 있습니다. C, C++은 바로 기계어로 번역하는 특성 때문에 패킹을 걸어놔서 푼다고 쳐도 기계어(어셈블리어) 밖에 안남아서 분석이 어렵습니다. 물론 분석이 어려울뿐 실력좋은 리버서들 앞에선 무용지물입니다.
어쨌던 제가 개인적으로 생각하게 보안을 거는 목적은 완벽하게 막아내는 목적이 아니라 그냥 대부분의 해커들을 걸러내는 목적이라고 생각합니다. 보통 난독화를 건다음에 VMProtect나 Themida로 패킹만 걸어도 대부분의 해커는 뚫는걸 포기할태니깐요.
어쨌던 이야기가 이것저것 길어졌습니다만.. C#이나 Java같은 언어들은 털리기 쉽다는걸 이해하셨을 겁니다. 그러면 어떻게 할까요..? 일단은 털리기 쉽다는건 인정하고 소스코드를 털어도 읽기 어렵게 만들면 됩니다. 이게 바로 난독화 입니다.
읽을 순 있는데 읽어도 무슨 소린지 모르게 만들면 된다 이거죠!
C# 난독화 도구중에 유명한게 뭐가 있는지 찾아봤더니 Obfuscar 란 것이 보였습니다.
그래서 Obfuscar로 제 작성한 코드를 난독화 해보니 다음과 같이 일반적으론 읽기가 거의 불가능한 형태로 코드가 변경되었습니다.
내부적으론 저 꼬여있는 코드(난독화된 코드)와, 저 난독화된 코드를 풀어내는 복호화 코드로 구성되고 있을거라 추정해볼 수 있겠습니다.
https://github.com/obfuscar/obfuscar
그래도 조금 걱정인건 obfuscar이 오픈소스라는 점입니다.
저는 오픈소스 문화에 우호적인 편이긴 한데, 이런 난독화 도구가 오픈소스로 공개되면 코드를 하나 하나 보면서 난독화 로직을 분석하고 난독화를 풀어내는 코드 역시 작성할 수 있기 때문에 조금 걱정이 되네요.
그래도 인터넷에 obfuscar을 풀어내는 도구가 없는걸 보면 나름 복잡하게 작업을 하나봅니다.
물론 이렇게 난독화를 걸어놔도 여전히 실행 부턴 복호화 작업에 의해 코드가 원래대로 풀린 상태로 실행되므로 여전히 리버싱 엔지니어링 당합니다. 그러므로 리버싱 엔지니어링 까지 막기 위해선 난독화 이후 패킹까지 걸어 두는게 좋을겁니다.
그러나 Themida 같은 상용 프로텍터로 패킹을 걸면 제대로 된 인증서 없이 작업할 경우 백신 프로그램이 바이러스로 잡습니다. 이정도는 염두에 두고 사용해야 하지 않을까 싶네요.. 실제로 제가 블로그에 판매중인 프로그램이 몇 가지 있는데 기본적으로 난독화 + N중 패킹 정도는 기본으로 해두고 여기에 추가적인 보안을 걸어서 프로그램을 배포중입니다.
(물론 무료로 배포하는 프로그램은 전부 오픈소스로 공개중입니다. 저도 밥은 먹고 살아야죠 ㅎㅎ...)
여담이지만 카카오톡 PC Client의 경우에도 Themida 3.XX 버전으로 패킹되어 있습니다. 또 인증서까지 있어서 바이러스로 잡히지도 않구요. 카카오라는 회사가 보안에 민감한 편이라 그런지 카카오톡 클라이언트도 C#이나 Java 같은 언어가 아니라 C/C++로 만들었다고 합니다.
예전에 프로그래밍 카페에서 어떤 능력자분이 Themida 3.XX 패킹을 풀고 리버싱 엔지니어링 해서 카카오톡 실시간 암호화나 메세지 자동 전송을 보여주셨었는데 매우 인상깊었습니다.
녹화 프로그램인 반디캠도 마찬가지.. Themida가 아니라 VMProtect로 리버싱 되어 있네요.
근데 반디캠의 경우 제가 많이 분석을 해봤는데 생각보다 보안이 좋은편은 아니더라구요 ^^;;
녹화 프로그램이다 보니 모든 인증을 온라인에서 하는게 아니다보니..
자세한 내용은 말씀드리면 반디캠 회사에 매우 실례니깐.. 말씀드리지 않는걸로 하고 ㅎㅎ (고소 당하기 싫어요)
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 윈폼(WinForm) 프로그래밍 할 때 콘솔 같이 띄우기 & Nuget 패키지 명령어로 설치하기 (0) | 2023.04.16 |
---|---|
[C#] 더미다(Themida) 2.X.X, 3.X.X 로 패킹해보기 (0) | 2023.03.02 |
Excel을 통한 PC SMS 전송 프로그램을 개발했습니다 (73) | 2021.08.23 |
[C#] DataGridView Foucs 초기화 & 데이터 크기에 맞춰서 Column 자동 설정 (0) | 2021.07.23 |
[C#] 대량의 엑셀 파일 빠르게 읽어오기 (2) | 2021.02.24 |