1. Home
  2. 프로그래밍/C#
  3. [C#] 더미다(Themida) 2.X.X, 3.X.X 로 패킹해보기

[C#] 더미다(Themida) 2.X.X, 3.X.X 로 패킹해보기

이전에 C#으로 작성한 프로그램을 Obfuscar로 난독화 하는걸 보여드린적이 있습니다. 물론 가이드나 튜토리얼 글은 아니고 그냥 Obfuscar로 난독화 해보니 소스가 이 정도로 보호되더라~ 하는 정도의 후기글 이였습니다.

사실 C#으로 작성된 프로그램을 Obfuscar로 난독화 하는건 인터넷에 워낙 잘 나와있어서.. 별로 글을 적을 필요가 없더라구요.

 

그래서 오늘 가져와 본건 C#으로 작성된 프로그램을 패커 더미다(Themida) 를 이용해서 보호하는 방법에 대한 튜토리얼입니다. 물론 이것도 인터넷에 방법이 소개가 되어 있기 때문에 특별히 2.X.X 버전하고 3.X.X 버전 둘다 패킹을 진행하는걸 보여드리겠습니다.

 

또한 꼭 C#이 아니여도 패킹 특성상 모든 실행파일(*.exe) 에 적용할 수 있습니다.

그러므로 작성 언어가 꼭 C#이 아니여도 됩니다.

 

보안 목적

기본적으로 C#, Java 같은 프로그래밍 언어는 C, C++이랑 다르게 디컴파일이 매우 쉽게 됩니다. C, C++로 만든 프로그램(*.exe) 은 기본적으로 원본 코드를 복구하는게 어렵지만 C#, Java로 만든 실행 파일의 경우엔 원본 소스가 그대로 복구가 됩니다. 이 이유에 관해선 이전글에 간략히 설명을 해두었으니 읽어보시길 바랍니다.

 

사실 꼭 위 2개 언어가 아니라도 바이트코드로 컴파일 하는 대부분 언어는 이렇게 원본 소스코드 복구가 기계어로 바로 컴파일 하는 언어들보다 디컴파일이 용이합니다.

 

* 이 아래부턴 패킹을 하는 목적에 대한 글입니다. 관심없으신 분들은 그냥 스크롤 내리고 아래 패킹하는 부분만 보시면 됩니다.

 

어쨌던 이런 디컴파일을 막기 위해서 C# 프로그래머는 간단하게 2가지 옵션을 선택할 수 있습니다.

  1. 난독화
  2. 패킹

입니다. [**난독화**]는 디컴파일 자체를 막는건 아니고 디컴파일은 되는데, 그렇게 털어낸 소스코드를 읽기 어렵고 짜증나게 헤집어 놓는 것 입니다. 말그대로 난독화인것이죠. 디컴파일 해서 안에 보이는 코드를 읽기 어렵게 만듭니다.

 

반면에 [**패킹**]은 난독화처럼 실행 파일(*.exe)안의 소스코드를 헤집어 놓는게 아니라, 실행파일 자체를 헤집어 놓는 개념입니다. 기본적으로 프로그램을 만들면 모두 실행 파일(*.exe) 이 되고 그 실행 파일 안에는 CPU가 읽어서 실행해야할 기계어(0,1) 이 있습니다. 실제로 프로그램을 더블클릭해서 실행하면 CPU가 그 프로그램 안에 있는 기계어를 읽어서 프로그램이 동작하게 되는 것 입니다.

 

패킹을 하게 되면 이 기계어들을 압축(Pack) 해버린 다음 프로그램 시작코드 단에 이 압축한 기계어를 실시간으로 푸는 코드를 삽입합니다.

 

예를 들어서 CPU가 main.exe 라는 프로그램을 실행시켰고, 그 안에 있는 010101 이라는 기계어 코드를 실행해야 한다고 가정해봅시다. main.exe를 패킹하면 패커는 010101 을 통째로 a란 단어로 압축한 뒤 a라는 단어를 코드에 삽입한 다음에 프로그램 시작할때 실시간으로 a를 010101이라는 기계어로 풀어서 실행시키게끔 합니다.

 

이렇게 하면 얻는 첫번째 장점은 일단은 말그대로 압축 [Packing]. 실행파일의용량을 줄일 수 있게 됩니다. 010101 이라는 여러 기계어를 a라는 문자 하나로 압축해버리고 이걸 실시간으로 푸니깐, 결과적으로 프로그램 용량 자체는 줄일 수 있게 됩니다. (대신 CPU가 a를 010101로 풀어내기 위해 조금더 고생해야 겠지만요.)

이게 사실 패킹이 처음 사용되었던 순기능입니다.

 

그러나 요새 패킹을 하는 목적은 보안을 위함도 있습니다. 프로그램을 압축하는게 보안이랑 무슨 상관이냐구요?

사실 리버싱이란 기술을 통하면 실행 파일(*.exe) 의 기계어, 010101 과 같이 사람이 이해할 수 없는 내용을 어셈블리어라는 언어로 복구해서 읽은다음에 이 프로그램이 어떤 동작을 하는지 다 들여다 볼 수도 있고 임의로 기계어(어셈블리어)를 수정해서 크랙(Crack) 할 수도 있습니다. 

 

그러니깐 쉽게 이야기해서 전문적인 해커 앞에선 exe 파일만 가지고도 소스코드는 복구하기 쉽지 않겠지만, 이 프로그램이 어떻게 동작되는지 훤히 들여다볼 수 있고 수정도 가능하다 이말입니다 ^^;;

해커는 010101 이라는 코드를 보고 아 이게 CPU가 파일 어떤걸 읽는 기계어구나~ 알 수 있다는겁니다.

 

그러나 패킹을 해둔 실행파일을 분석해야 된다면? 실행 파일 안에는 a라는 문자와 그 a를 010101로 풀어내는 코드밖에 없을것이기 때문에 a를 010101로 풀어내는 흐름을 찾아내기 전까진 해커는 이 프로그램이 어떤 기계어를 실행해서, 어떻게 동작하는지 알 수 없을겁니다. 물론 풀어내는 흐름을 찾아내면 되지만 원본 기계어를 마구잡이로 꼬아놓게 되면 해커가 이 프로그램을 풀다가 짜증나서 포기하게 되겠죠.

 

더미다 역시 패커로써, 패킹을 해주는 프로그램입니다.

정확히는 패커겸 프로텍터인데 원본 프로그램의 기계어 코드(어셈블리어 코드) 를 마구잡이로 압축하고 섞어놓고 더럽게 꼬아놔서 분석을 어렵게 만듭니다.

 

참고로 C#으로 만든 프로그램에 패킹 과정을 거치면, 프로그램의 원본 코드들이 전부 무작위로 꼬아지기 때문에 디컴파일러가 C# 실행 파일의 구조를 분석하지 못해 디컴파일이 불가능하게 됩니다.

 

* 패커 : 패킹을 수행하는 프로그램

 

어쨌던 간에 그렇습니다.. 갑자기 글이 리버싱, 해킹 강좌글로 삼천포로 빠진 거 같지만 더미다로 패킹하러 오신 분들의 경우엔 뭐 패킹을 하는 기본적인 목적에 대해 아실거라고 믿고.. 대충 읽고 넘어가주세요 ㅎㅎ.

 

Themida 2.x.x.x 로 패킹하기

우선 패킹을 걸 프로그램입니다. C#으로 만들고 현재 판매중인 SMS전송기 입니다.

 

별건 없고.. 일단 이전에 작업해둔거라 Obfuscar로 난독화만 되어있는 상태입니다.

여기에 또다시 Themida 로 패킹을 걸어봅시다.

 

Themida 2.x.x.x 버전을 엽니다. 저는 2.3.2.0 버전을 열었는데.. 이걸 어디서 구했는진 묻지 마세요 ㅎㅎ..

모든 프로그램들이 그렇겠지만 더미다 역시 크랙이 많이 나돌아다닙니다.

 

만약에 Themida 실행파일이 x86(32비트 버전) 이랑 x64(64비트 버전) 으로 구분되어 있으면 패킹을 걸 프로그램에 따라서 선택해주시면 됩니다.

 

예를 들어서 패킹을 걸 C# 프로그램이 32비트로 컴파일 했으면 32비트 더미다로 열어서 패킹하시면 되고, 64비트 실행파일로 컴파일 하셨으면 64비트 더미다로 열어서 패킹하면 됩니다.

 

Themida로 패킹할 실행파일을 가져와야 하는데 실행파일을 쭈욱 드래그해서 Themida 창에 드랍하거나 아니면 저 노란색 폴더 버튼을 클릭해서 패킹할 실행파일을 열어주세요. exe파일을 열어주시면 됩니당.

 

참고로 이미 패킹된 파일을 열면 이렇게 이미 프로텍팅 / 패킹 되었다고 나옵니다. 참고로 Themida 프로그램은 Themida로 패킹되었습니다 ㅋㅋ. 재미있죠? 하지만 이렇게 해도 Themida 역시 털리고 크랙이 나왔습니다 ㅠㅠ 보안 목적은 어디까지나 대부분의 떨거지 해커를 걸러내는 목적이라.. 그래도 Themida로 패킹하면 대부분은 푸는거 포기하고 나자빠집니다.

 

참고로 Get from version info를 체크해서 어플리케이션 이름이나 Version을 가져온 채로 패킹할 수 있습니다. 사실 가져오는게 무슨 의미가 있는진 잘 모르겠네요. 그리고 아래 초록색 상자를 보시면 알겠지만 Themida가 똑똑하게 이 프로그램이 .NET 종류에요~ 라고 분석해서 알려주네요 ㅎ.

 

그리고 사진엔 표시되어있지 않은데 Same as input을 체크하면 같은 실행파일에 패킹한 결과를 덮어쓰게 됩니다. 이를 원치 않으시면 Same as input을 푸시고 패킹된 실행파일이 저장될 파일명이나 경로를 수정해주세요.

 

 

저는 요로코롬 sms.exe를 패킹해서, sms_protected.exe 로 패킹된 실행파일을 저장되게끔 바꿨습니다.

이제 Protection Options 탭으로 이동해서 프로텍팅 옵션을 정해줍니다.

기본옵션으로 두셔도 기본적으로 더미다가 워낙 강력해서 나쁘지 않은 결과물이 나옵니다.

개인적으로 수정할만한 부분은 저 두곳인데 Anti-Debugging 옵션하고 Anti-Patching 옵션입니다.

 

Anti-Debugging은 말그대로 디버깅을 막는 용도, Anti-Patching 은 패치를 막는건데 이것도 리버싱을 해보셔야 이해할 수 있는 부분이라 그냥 보안옵션이라고 보시면 됩니다.

 

난 잘 모르겠고 제일 강력하게 보호하고 싶다 하면 Ultra 랑 File path (sign support) 옵션으로 설정하시면 됩니다. 그리고 C#으로 만든 프로그램 패킹시 주의할 점이 있는데 저기서 Resources 압축을 해제해주셔야 합니다.

 

아마 바이트코드로 컴파일해서 실행시키는 C# 언어 특성상 리소스 부분이 압축되면 패킹후에 프로그램이 제대로 동작하지 않는다고 합니다. 반드시 압축 해제해주세요. 또한 Resources 를 풀었는데도 패킹후에 실행이 안되면 Application 도 체크 해제후 패킹해주시면 됩니다. [출처]

 

어쨌던 간에 저는 위 사진처럼 설정하고 가겠습니다.

 

다 끝났으면 Protect를 눌러줍니다.

 

다시 이런창 뜨면 오른쪽 아래에 Protect 버튼 다시눌러 줍니다.

패킹이 진행됩니다.. 참고로 왼쪽 아래에 Play sound 체크하시면 패킹 끝났을때 띵동 하고 소리 알림줍니다.

 

패킹 완료되면 이런식으로 뜨구요. 설정한대로 sms_protected.exe 가 생겼습니다.

패킹된 프로그램을 테스트 해보시고 싶으시면 만들어진 sms_protected.exe 를 직접 실행시키시거나 Test Protected File 버튼을 눌러서 테스트 해보시면 됩니다.

 

패킹을 걸었다고 해도 exe 파일 분석을 어렵게 만든것일뿐 애초에 프로그램 실행해서 압축이 풀리면 원본 코드 그대로 실행이 되기 때문에 사실상 프로그램에 무언가 바뀐건 없습니다.

 

그리고 log 파일이 생기는데 이건 실행파일을 Themida가 어떻게 패킹했냐에 대한 로그파일입니다. 사실 별로 중요한건 아니라 삭제해도 됩니다.

 

뭐 딱 하나 바뀐게 있다고 하면 용량이겠네요 ㅎㅎ; Themida가 기계어 코드를 압축할 뿐만 아니라 마구잡이로 분석이 어렵게 쓰레기 코드도 삽입해놨기에 이렇게 용량이 엄청나게 뛰게 됩니다.

61KB -> 1393KB... 실행파일 크기가 22배 가량 뛰었네요. 아마 기존 프로그램 용량이 컸다면 더 커졌겠죠.. 이게 Themida로 패킹한 단점입니다. 

 

사실상 패킹(압축) 이 아니네요.. ㅋㅋㅋ 용량 뻥튀기가 장난이 아닙니다. 프로그램 용량이 늘어났고 Themida가 쓰레기 코드도 삽입했고 코드 압축도 풀어야 해서 프로그램 로딩시간도 기존에 패킹하지 않은 것보다 더 늘어납니다.

 

Detect It Easy(Die) 로 분석하니 Themida로 프로텍팅 했다고 나오네요.

난독화 이후에 패킹을 걸어서 원본 실행 파일 구조(PE 구조) 가 변형되어서, 기존에 C#으로 컴파일 했다고 분석한 내용이나 (.NET) Obfuscar로 난독화 건 내용 등이 전부 사라졌습니다. Themida가 꼬아놔서 분석할 수 없다는 것이죠.

 

안티디버깅 테스트

아까 Themida에서 안티디버깅 옵션을 나름 Ultra 로 높게 줬는데..!

한번 디버거를 열어서 직접 안티디버깅이 먹히는지 확인해보겠습니다.

올리디버거 대신에 x32dbg를 이용해보겠습니다. 

 

x32dbg 를 열어서 파일 -> 부착(Attach) 을 누르면 프로그램에 디버깅을 걸어서 실행중인 프로그램의 기계어(어셈블리어) 를 전부 훔쳐볼 수 있습니다. 실시간으로 패치(프로그램 수정) 도 가능합니다.

지금 패킹해둔 sms_protected.exe를 실행해둔 상태라 맨 위에 뜨네요. 여기에 디버깅을 걸어보겠습니다.

 

디버깅이 걸렸나 싶더니 몇 초만에 Themida가 삽입해둔 안티디버깅 코드에 의해 바로 프로그램이 꺼져버리네요.

성능 확실하구만.

 

Themida 3.x.x.x 로 패킹하기

이번엔 Themida 3.x.x.x 버전으로 패킹하는 방법입니다. 저의 경우 3.0.4.0 을 사용했습니다.

위에서 사용한 2.3.2.0 의 경우 32비트 시절에 쓰던 구버전이라 64비트 버전용이 없었는데 Themida 3.x.x.x 버전대는 Themida.exe (32비트용) 하고 Themida64.exe(64비트용) 이 구분되어 있습니다. 제가 패킹하는 프로그램의 경우 어짜피 32비트라서 Themida.exe로 열겠습니다.

 

열면 2.x 버전대와는 다른 디자인을 보입니다. 근데 근본적으로 사용방법은 2.x 버전대랑 똑같습니다.

똑같이 패킹할 파일을 Application Information 쪽에 드래그 & 드랍 합니다.

 

조금 다른점은 출력 파일명이 실행파일명_protected.exe로 결정된다는 점 입니다.

Themida 2.x은 기본 파일에 덮어씌워서 패킹하는게 기본 옵션이였는데 말이죠.

 

C# 패킹을 위해 Resources 항목 정도만 해제하고 밑에 Extra Protection Options에 추가 옵션도 모두 체크했습니다.

작업이 완료되었으면 프로그램 위의 Protect 버튼을 누르면 됩니다.

 

패킹이 진행됩니다!

 

작업이 완료되었습니다. 2.x 버전대에 비해 3.x로 패킹한 파일이 용량이 훨씬 크네요

 

Original : 61KB

Themida 2.x 버전 : 1393KB

Themida 3.x 버전 : 3209KB (...)

 

안티디버깅 테스트 #2

 

이번엔 3.x 버전의 안티디버깅을 테스트 해보겠습니다.

똑같이 x32dbg로 Attach를 걸어서 실시간 디버깅합니다.

 

???. 2.x 버전대랑 다르게 3.x로 패킹한 파일의 경우 x32dbg 로 디버깅이 아주 잘 걸리네요 --;;

 

인터넷(음지)에 정보를 찾아보니 3.x 버전의 안티디버깅은 쓰레기라고 하네요

ida나 x86 디버거나 전부 작동했다고...

3.1.x 버전은 사용해보지 않았지만 기본적으로 Themida 3.x.x 가 2.x.x 보다 일반적으로 구리다고 합니다.

인터넷에서 긁어온 글이라 정확하지 않을 순 있지만 Themida 2.x.x 를 쉽게 뚫어버리는 짱깨 해커 형님들도 Themida 3.x가 2.x에 비해 별로 발전한게 없다고 하니 ^^;; 그냥 2.x 를 쓰는게 나아보이네요.

 

.NET 더미다 패킹 풀기 (언패킹)

https://github.com/cg10036/Themida-Unpacker-for-.NET

 

GitHub - cg10036/Themida-Unpacker-for-.NET

Contribute to cg10036/Themida-Unpacker-for-.NET development by creating an account on GitHub.

github.com

글을 다 쓰고 나서 혹시 .NET 에 대한 언패커가 있는지 찾아 봤는데 있네요

 

뭐지 이거.. 진짜 되는건가?

Themida 로 패킹한 .NET 에 대해 모든 버전 언패킹이 된다고 합니다. (Themida 1.x, 2.x, 3.x)

역시 아무리 패킹걸고 해도 C# 프로그램의 보안은 어쩔 수 없는것인가..?

진짜 해봤습니다.

 

설명서대로 그냥 *.exe에 드래그 & 드랍 해봤습니다.

 

수동으로 덤프뜨기는 귀찮아서 Auto Dump를 떴는데 실패했다고 나오네요

아 역시 안되나보다.. 했는데 일단은 이런 새로운 exe 파일이 생겼습니다.

혹시 몰라서 DIE로 확인해보니..?

 

뭐야 진짜 풀렸잖아 ㅅㅂ

예.. 역시 .NET은 패킹을 걸어도 풀기가 쉬운가 봅네요

 

일단 덤프가 꼬여서 실행은 안됩니다만... dotPeek (C# 디컴파일 도구) 에 올려보겠습니다.

 

예.. 소스코드가 그대로 복구가 되네요. 다만 패킹 이전에 난독화를 걸어놨기에 소스코드는 결론적으로 보호가 됐네요 ^^;

역시 .NET은 프로그램 보호가 힘든가봅니다...

사실 글 열심히 쓰고 나중에 언패커가 있어서 좀 현타가 왔는데 Themida랑 VMProtect로 이중 패킹을 걸면 좀 나을라나..?

 

왜 카카오가 프로그램은 C++로 만들고 여기에 패킹하는지 알 거 같습니다.. 

오늘의 결론 : 그냥 난독화나 걸자. (사실 이것도 안전하지 않음)

SNS 공유하기
네이버밴드
카카오톡
페이스북
X(트위터)

최근글
인기글
이모티콘창 닫기
울음
안녕
감사
당황
피폐