- 전체
- Python 일반
- Python 수학
- Python 그래픽
- Python 자료구조
- Python 인공지능
- Python 인터넷
- Python SAGE
- wxPython
- TkInter
- iPython
- wxPython
- pyQT
- Jython
- django
- flask
- blender python scripting
- python for minecraft
- Python 데이터 분석
- Python RPA
- cython
- PyCharm
- pySide
- kivy (python)
Python 일반 [Python] 코드난독화
2018.01.19 10:43
[Python] 코드난독화
코드난독화 보고서 : 코드난독화.hwp
코드난독화 소스파일 : 난독화를 해보자!!.py
**알아야 할 것**
이 보고서는 변수명에 대한 난독화를 서술하고 있다. 하지만 해당 프로젝트는 변수명 뿐만 아니라 함수명에 대한 난독화도 진행되었다.
변수명 난독화와 함수명 난독화의 원리는 동일하기 때문에 이 보고서에서 변수명과 함수명을 별도로 서술하지 않았다.
따라서 보고서를 읽어주실 때 변수명과 함께 함수명도 같이 생각해주시면 감사하겠습니다.
* 프로그램 설명
난독화란 코드의 가독성을 떨어트리는 작업으로, 소스코드의 무단도용, 아이디어나 알고리즘의 무단유출을 막기 위함이 주된 목적이다.
코드 난독화는 크게 보았을 때, 필요 이상으로 복잡한 코드를 만들거나, 무의미한 코드를 삽입하여 난독화하는 방법과 데이터를 인코딩하여 가독성을 떨어트리는 방법이 있다. 이러한 난독화 방법 중 데이터 인코딩을 프로젝트로 삼았으며, 프로젝트의 주제는 ‘코드 내의 변수명을 사람이 알아보기 힘든 이름으로 변경하여 난독화를 하는 것이 어떠한가’라는 생각에서 시작되었다.
C언어 소스코드를 대상으로 코드 내에서 사용 중인 변수의 이름을 바코드조합(‘I’, ‘i’, ‘l’, ‘1’의 조합)으로 바꾸어 코드를 난독화 시킨다. 코드 내의 변수명이 ‘Il1llil’, ‘lillI1l’와 같은 방식의 이름으로 이루어져 있다면, 각각의 변수를 구분할 수 없을 것이며, 설령 안다하더라도 해당 변수가 어떤 역할을 하는지 변수명을 통한 유추를 막을 수 있다.
다음은 난독화의 예시이다.

* 프로그램 원리
프로그램의 난독화 원리 : 코드를 단어별로 분리하여 변수를 바코드조합으로 변경한 후, 단어를 다시 이어 붙인다.
난독화를 실행하기에 앞서, C언어 코드 내에서 어떠한 변수명이 사용되었는지 알아야 할 필요가 있다. C언어는 변수를 사용하기 전에 반드시 변수를 선언하여야 한다는 특징을 지니고 있다. C언어에서 변수의 선언은 자료형 + 변수명 의 문장으로 이루어지는데, 이 특징을 통해 변수명은 자료형 다음에 사용된 단어라는 것을 알아낼 수 있다.
코드 내에서 사용되는 변수의 이름들을 알아내었으니, 바코드조합을 생성하여 각각의 변수명을 매칭하도록 한다. 우선 바코드조합을 랜덤으로 생성하여 위에서 알아낸 변수와 매칭시켜 ‘사전’에 등록한다. ‘사전’의 key는 변수명이 되고, key에 따른 value는 바코드조합이 된다. 이렇게 생성된 ‘사전’을 통해 난독화를 실행하도록 한다.
우선 코드를 단어별로 쪼개어야 한다. 그 이후 변수에 해당하는 단어를 바코드조합으로 변경하여 코드를 재조합하면 된다. 하지만 여기서 문제가 발생한다. 이는 위에서 변수명을 알아내는 과정에서도 발생하는 문제이기도 하다. 코드를 단어별로 쪼개는 과정은 공백을 구분자로 이용하여 단어를 쪼개는 것으로, 만약 특정 코드가 “int index=0”이라 하면 이 문장은 ‘int’, ‘index=0’라는 단어로 쪼개진다. 이때, 변수명 ‘index’가 단어 ‘index=0’ 안에 포함되어 있기 때문에 이와 같은 방식은 단어를 쪼갠 이후, 변수가 포함된 단어를 다시금 쪼개야하는 불편함이 발생한다. 이러한 문제점을 해결하기 위해 고안한 방법은, 코드를 단어별로 쪼개기 이전에 특수문자 양 옆에 공백을 추가하는 것이다. 일반적으로 실생활에서의 코드를 보면 ‘int index=0’, ‘index+=3’와 같이 변수 양 옆에 특수문자가 사용된다. 이러한 특징으로 보컨대 특수문자 양 옆에 공백을 추가하면, 공백을 기준으로 코드를 쪼개어도 변수명을 쉽게 단어로 구별할 수 있게 된다. 단, ‘int main(){ ’과 같이 특수문자가 연달아 되는 경우, 공백삽입이 두 번 이루어지게 되어, 이후 코드 재조합에서 불필요한 공백이 추가될 가능성이 생긴다. 때문에 공백을 추가하는 작업을 하고나면, 공백을 정리하는 작업을 연달아 실행하도록 한다.
** 프로그램 작동 순서
지금까지의 내용을 바탕으로, 프로그램의 작동에 대하여 정리하면 다음과 같다.
1) 난독화 할 C코드 파일을 읽어 들인다.
2) 코드 내에서 특수문자 양 옆에 공백을 추가 하고 연달아 공백을 정리 한다
3) 코드를 단어별로 쪼갠 후 변수선언부분에서 변수명을 추출 한다.
4) 추출된 변수명을 바코드조합과 매칭하여 ‘사전’을 생성한다.
사전 (key = 변수명, value = 바코드조합)
5) 생성된 사전을 통해 변수명을 바코드로 변환한다.
6) 코드 내의 불필요한 공백을 삭제하고 결과를 출력한다.
7) 난독화된 최종 코드를 원본 파일에 덮어쓰기 한다.
* 실행 화면


광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

