Title: 소스코드 감쪽같이 숨기기 Package: Seoul.pm Category: perl Category: Seoul.pm Author: aanoaa 저자 ----- [@aanoaa][twitter-aanoaa] - Perl, 콧수염, 야구, 자전거, 낙타, 돌고래, 포청천 마니아. 아이유 열혈 삼촌팬. Perl과 Javascript, 안드로이드 어플리케이션 개발에 능하다. Perl 코드 사용시 탭 문자 대신 4칸 공백을 사용한다. 일신 상의 이유로 Vim을 버리고 Emacs로 투신. 현재 [콧수염 블로그][aanoaa-blog]를 운영하고 있다. 시작하며 ------- Perl 코드를 실행할 수 있다는 것은 소스 코드도 읽을 수 있다는 것을 뜻합니다. 하지만 단 몇 줄의 Perl 코드로 여러분의 코드를 감쪽같이 숨길 수도 있습니다. 어떻게? -------- 먼저 숨기고자 하는 문자열을 비트스트림으로 보고 `'0'`과 `'1'`로만 이루어진 문자열로 바꿉니다. 그런 다음, 이것을 다시 공백(`" "`)과 탭(`"\t"`)으로만 이루어진 문자열로 바꿉니다. 그러면 여러분의 코드는 아무리 모니터를 뚫어지게 쳐다봐도, 백번 인쇄를 해도 읽어낼 수 없게 됩니다! 예를 들어 아래와 같은 내용이 주어졌다면, #!plain 안녕하세요 먼저 이렇게 `0`과 `1`로만 이루어진 문자열로 바꿉니다. #!plain 00110111101010010001000111010111101000011010100110110111101010010001100100110111001000010001110100110111010110010010100101010000 그리고 `0`과 `1`을 각각 공백과 탭 문자로 바꾸면 읽을 수도 없고 인쇄할 수는 문자열이 완성됩니다! #!plain " " 보이지 않게 된 문자열을 큰 따옴표로 묶은 모습입니다. 만들어 봅시다! -------------- 먼저 Perl 내부로 읽어들인 문자열을 [unpack][perldoc-unpack] 함수를 사용하여 `'0'`과 `'1'`의 바이트 시퀀스로 변형합시다. #!perl my $text = ; $text = unpack "b*", $text; 다음으로 `'0'`은 `' '`로, `'1'`은 `"\t"`로 바꿉니다. #!perl $text =~ tr/01/ \t/; 이게 끝입니다! 전체 코드로 한번 볼까요? #!perl my $text = ; $text = unpack "b*", $text; $text =~ tr/01/ \t/; print $text; 결과 화면은 다음과 같습니다. `"Hello Susan!"`을 입력하면 빨간 박스에 표시한 부분만큼 공백이 출력된 것을 볼 수 있습니다. ![결과][img-01] 정리하며 -------- 역순으로 실행하면 `' '`와 `"\t"`로 이루어진 텍스트를 원상태로 복구할 수 있을 겁니다. Perl을 사용하면 이렇게 간단하게 문자열을 조작할 수 있습니다. 문서와 명령행 옵션이 깔끔하게 포함된 [s3cr3t 전체 소스코드][gist-s3cr3t]도 꼭 확인해보세요. 참고문서 --------- - [CPAN의 Acme::Bleach 모듈][cpan-acme-bleach] - [s3cr3t gist][gist-s3cr3t] - [gypark님의 위키][gypark-wiki-pack] - [perldoc pack][perldoc-pack] - [perldoc unpack][perldoc-unpack] [img-01]: http://advent.perl.kr/2011/2011-12-03-1.png [cpan-acme-bleach]: https://metacpan.org/module/Acme::Bleach [perldoc-pack]: http://perldoc.perl.org/functions/pack.html [perldoc-unpack]: http://perldoc.perl.org/functions/unpack.html [gypark-wiki-pack]: http://gypark.pe.kr/wiki/Perl/Pack#H_1_7_2 [gist-s3cr3t]: https://gist.github.com/1408846 [twitter-aanoaa]: http://twitter.com/#!/aanoaa [aanoaa-blog]: http://aanoaa.github.com/