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