어려운 문제, 컴파일 타임 문자열 난독화

@codemaru · August 05, 2010 · 2 min read

바이너리에서 문자열 리터럴을 숨기기 위해서 아래 링크에 나온 것과 같은 테크닉을 많이 사용합니다.

http://www.gamedev.net/community/forums/topic.asp?topic_id=528265

그런데 이런 방법을 써보신 분들은 아시겠지만 이게 아주 많이 억수로 귀찮습니다. 모든 문자열 리터럴을 일일이 저렇게 인코딩한 형태로 만드는 것도 일이고, 유지보수도 힘들어지죠. 저렇게 난독화된 문자열이 해독되는 경우에 다른 것으로 치환하는 일도 쉽지 않습니다.

제가 늘 생각하던 것은 다음과 같은 방법으로 문자열 리터럴을 컴파일 타임에 자동으로 인코딩 시킬 수는 없을까? 하는 것이었습니다. 그럼 참 편할 것 같았거든요. 나중에 고칠 때도 Start 해시 값만 변경하면 다른 바이너리로 인코딩이 자동으로 될테니까 말이죠.

Obfuscator<0x10221337,0xA30624DD>(CompileTimeEncode("Hello", 0x10221337)+0xA30624DD).GetData()

물론 아무리 생각해봐도 이렇게 만들 수 있는 방법이 떠오르지 않는 것이 문제입니당. 혹시 이 문제를 아주 우아하게 해결할 수 있는 방법을 아시는 분 계신가욤? 찾아보니 D언어는 아래와 같은 퐌타스틱한 방법을 제공하는 것 같군요.

http://www.digitalmars.com/d/archives/digitalmars/D/learn/compile_time_string_manipulation_7225.html

덧) 물론 프리프로세서를 만들어서 데이터 파일에서 코드를 생성하도록 만들 수도 있습니다. 본문 내용은 그냥 지적 호기심입니다. C++에서 템플릿 메타 프로그래밍, 매크로나 기타 다른 방법들을 동원해서 컴파일 타임에 문자열 조작이 가능한지 말이죠.

 0  0

 

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중