gcc 어느 정도 최신 버전에서는 char username[7] = "myUser"; 로 적어주기만 해도
strings 에는 걸리지 않습니다. 왜냐하면 char *username = "myUser" 로 쓰게 되면
이는 "myUser" 가 data 섹션에 들어가고 주소를 대입하는 명령으로 채워지기 때문에
그대로 나오지만, char username[7] = "myUser" 로 하면 스택 변수에 4바이트씩(타겟 시스템마다 다름)
쓰는 명령으로 치환되기 때문에 strings 를 해봐야 굳이 나오는 건 4자씩 끊어서 나오는 정도일까요.
(물론 타겟 아키텍쳐마다, 버전마다 다릅니다. Visual Studio 는 저렇게 해도 data 섹션에 박힙니다. 이것도 버전마다, 설정마다 다를 수 있습니다.)
물론 당연한 얘기지만 로컬에서 접속하는 경우, 무슨 짓을 해도 완벽하게 은닉하는 것은 불가능합니다.
애초에 접속 자체가 로컬에서 이루어지기만 하면 그게 어떤 형태든 똑같이 흉내내면 그만입니다.
단지 평문 ID/PW 만 숨기자는 거면 서버에서 개인키를 갖고 있고 클라이언트에선 공개키로 암호화한 내용만
들고 있고 그것만 던져주는 식으로 하면 상관없겠지만 어차피 똑같은 식으로 암호화한 내용을 던져서 접속할 수 있게 됩니다.
결론은 그런 데에 신경쓰는 시간이 아깝기 때문에 정석대로 미들웨어를 하나 만들거나 아니면
클라이언트를 themida 나 vmprotect, Code Virtualizer 등으로 패킹하는게 차라리 더 낫습니다.
그 정도까지 해야 될 일인지는 모르겠습니다만.
#include <stdio.h> int main
이런식으로 하드 코딩하면 되지 않을까요? 일단 이렇게 하면 strings 에서는 걸리지 않습니다. :-) 물론 코드를 확인할 수 있으면 '은닉'이라는 것과는 상관이 없어지지만, 혹시 binary 레벨에서의 은닉을 말씀 하시는 듯해서 ..
아~ 이런 방법이 있었군요.
답변 감사합니다.
C 개발 시에 참고하겠습니다.
지금은 안드로이드 기반 개발 중인데 난독화란게 있네요. .class 파일을 읽기 어렵게 하는 과정이라고 합니다.
ADT 에서 proguard 란 툴을 제공하는데 이를 이용해 난독화를 수행해보려 하고 있습니다.
^^
?
gcc 어느 정도 최신 버전에서는 char username[7] = "myUser"; 로 적어주기만 해도
strings 에는 걸리지 않습니다. 왜냐하면 char *username = "myUser" 로 쓰게 되면
이는 "myUser" 가 data 섹션에 들어가고 주소를 대입하는 명령으로 채워지기 때문에
그대로 나오지만, char username[7] = "myUser" 로 하면 스택 변수에 4바이트씩(타겟 시스템마다 다름)
쓰는 명령으로 치환되기 때문에 strings 를 해봐야 굳이 나오는 건 4자씩 끊어서 나오는 정도일까요.
(물론 타겟 아키텍쳐마다, 버전마다 다릅니다. Visual Studio 는 저렇게 해도 data 섹션에 박힙니다. 이것도 버전마다, 설정마다 다를 수 있습니다.)
물론 당연한 얘기지만 로컬에서 접속하는 경우, 무슨 짓을 해도 완벽하게 은닉하는 것은 불가능합니다.
애초에 접속 자체가 로컬에서 이루어지기만 하면 그게 어떤 형태든 똑같이 흉내내면 그만입니다.
단지 평문 ID/PW 만 숨기자는 거면 서버에서 개인키를 갖고 있고 클라이언트에선 공개키로 암호화한 내용만
들고 있고 그것만 던져주는 식으로 하면 상관없겠지만 어차피 똑같은 식으로 암호화한 내용을 던져서 접속할 수 있게 됩니다.
결론은 그런 데에 신경쓰는 시간이 아깝기 때문에 정석대로 미들웨어를 하나 만들거나 아니면
클라이언트를 themida 나 vmprotect, Code Virtualizer 등으로 패킹하는게 차라리 더 낫습니다.
그 정도까지 해야 될 일인지는 모르겠습니다만.
sha1을 쓰세요.
sha1을 쓰세요.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기