컴파일 및 빌드 관련해서 질문이 있습니다

   조회 3255   추천 0    

 안녕하세요 형님들.


본격적으로 날씨가 추워졌습니다 건강 관리 유의하십시오.


저는 요즘 업무 자동화 프로그램을 만들어서 사용료를 받고 있습니다. 그런데 모 업체에서 저의 사무자동화 프로그램을 바이러스 등으로 규정하고 자기네 프로그램과 경합하게 만들어 놨습니다.


처음에는 저 자신은 제 프로그램이 바이러스가 아님을 알고 있고, 사용자의 컴퓨터에 그 어떤 해도 끼치지 않을 것이므로 그러한 경합으로부터 제 프로그램이 이기게 할 방법을 찾아가면서 싸워 왔는데 프로그램 만드는 것 보다 그 경합에 쓰는 시간이 더 많아지더군요. 자료 찾고 뭐하고 하는 것도 하루 이틀이고 너무 힘듭니다.


주변의 다른 선배 제작자들에게 물어보니 우선순위를 두고 싸울게 아니고 애초에 프로그램이 검출되지 않게 하면 더 이상 싸울 일이 없고 그게 가장 깔끔한 방법이라고 하더군요. 구체적인 방법을 물어봤는데 "개별 컴파일 하라"는 조언만 해줄 뿐 구체적인 방법은 알려주지 않더군요. 이 바닥 특성 상 서로 경쟁 상대이기 때문에 간단한 조언만 해줄 뿐 구체적인 방법은 서로 숨깁니다. 결국 스스로 방법을 찾아야 하는데요


개별 컴파일이라는 건 결국 이런 겁니다. 하나의 컴퓨터에서 단 하나의 프로그램만 돌아간다면 해당 업체에서 이 사람이 손으로 업무를 보는 건지 자동화 프로그램을 사용하는 건지 알 수 없습니다. 수십 대의 컴퓨터에서 같은 프로그램이 돌아가기 때문에 프로그램 간의 공통점을 통해서 프로그램이 검출된다는 겁니다. 그러니까 소스 코드를 컴파일 하고, 컴파일된 exe파일을 복사해서 쓰지 말고 컴파일 할 때마다 프로그램의 내부 구성 등 뭔가 정보가 다르게 끔 컴파일 하라는 건데요

그래서 이 부분에 대해 구글링 및 조사를 좀 해봤는데, 네임 스페이스를 바꾸는 것과 guid를 각각 다르게 하는 정도 외에는 유의미한 것을 찾지 못 했습니다.

특히 guid같은 경우엔 굳이 컴파일 할 때가 아니더라도, 실행 될 때마다 다르게 해 줄 수 있어서 개별 컴파일하라는 얘기와는 거리가 멀은 것 같았고.. 네임 스페이스의 경우에는 제 프로그램은 파이썬으로 제작 되었는데, 네임스페이스는 결국 __main__입니다. 그런데 __main__은 제 프로그램 뿐 아니라 파이썬으로 제작된 모든 프로그램이 별도로 개발자가 손대지 않으면 일반적으로 __main__으로 되어 있을 텐데 말이죠.


그리고 또 하나 말씀 드리고 싶은 것은, 제 프로그램을 쓰는 사람들 중 컴파일 하지 않고 vscode 에서 바로 실행하는 식으로 사용한 사람(저 포함)들은 검출이 되지 않은 반면, exe파일로 사용해온 사람들(제가 소스코드를 보여줄 수 없는 사람들입니다)은 검출이 된 것으로 보입니다. 물론 이 부분은 표본이 너무 적어서 vscode와 exe파일 간의 차이라고 확신은 할 수 없고, 그럴 수도 있다고 생각할 만한 정황이 있습니다. 조언 해 주실 때 혹시 도움이 될 수 있을것 같아서 말씀 드렸습니다.


구글링하다하다 안되고 생각 하다하다 안되서 여기다 질문 올려봅니다. 혹시 짐작가시는 방법이나 좋은 힌트 있으신 형님 계시면 부탁 드립니다.

짧은글 일수록 신중하게.
언젠가는 2021-11
code obfuscate 코드 난독화 말씀하시는것 같군요. 이 키워드로 찾으시면 됩니다.
그리고 파이선이면 py로 배포하시지 말고 pyo나 pyc로만 배포하셔도 대부분 해결됩니다.
파이선은 특히 배포 방법이 여러가지로 많으니 찾아보시고 좋은 방법으로 택하시면 됩니다.
     
조언 감사합니다. 난독화 얘기가 나와서 말인데요, 사실 그 업체 말고 사용자들이 소스코드를 보는것을 막기 위해서 themida를 결제해서 사용해왔습니다.

만약 그 업체에서 제 프로그램을 검출하는 방법이 난독화 이슈라면.. themida를 사용하는 것이 제가 아는 한 가장 좋은 방법인데

혹시 themida사용만으론 부족합니까? 만약 그렇다면 추가로 해줄 수 있는 조치는 뭐가 있겠습니까?
언젠가는 2021-11
그리고 __main__은 네임스페이스가 아닙니다. 말씀하신대로 특별한 의미를 가진 module이고, 이거 가지고 바이러스로 판독하진 않습니다.
     
아 그렇습니까? 네임스페이스에 대해서 좀 더 찾아보겠습니다.

감사합니다
          
언젠가는 2021-11
네임스페이스를 일반적인 의미로 사용하셨습니다.
언어별로 namespace, package, module, submodule, path, class, function는 로더에서 아주 명확한 의미를 가집니다.
예를들면 c는 한 바이너리에 free function으로 main은 1개만 존재해야 하고 그게 entry point가 됩니다. main은 어떠한 namespace 안에 존재할수 없습니다.
그래서 이 컨벤션을 따르는 main의 존재를 가지고 바이러스로 절대로 판독할순 없죠.
               
조언 감사합니다 namespace관련해서 찾아보던 중이었는데 명확한 개념을 모르고 단어만 듣고서 질문을 올렸던 건데 그 사이에 좀 찾아보다가 이 댓글을 보니 좀 알아 듣겠네요 ㅎㅎ

밑에 달아주신 해결책들과 namespace각각 컴파일마다 다르게 하는 등 해볼 수 있는 조치는 다 해 볼 겁니다.
찬이 2021-11
경합이라는게.. 어떤 의미인지 불분명해서 정확한 답을 드리기 어렵습니다만.
말씀 하신 내용은 해당 회사에서 만드신 프로그램의 hash로 검사한다면 프로그램을 재 빌드해서(보통은 빌드할 때마다 바이러리가 약간식 달라져서 동일한 hash를 갖지 않습니다) 다른 프로그래으로 인식하게 하라는 의미 같습니다.
python 빌드가 어케 되는진 잘 모르지만 재 빌드시 해시가 동일하다면 프로그램 내에 더미데이터를 랜덤하게 넣어서 빌드하면 될 듯 합니다.
만약 프로그램을 검출하는 방식이 hash가 아닌 똘똘한 방식이라면 이보단 어렵겠죠..
     
저도 이 생각을 해봤었습니다.

그래서 간단한 실험을 해봤는데요, cmd창에서 fc명령어를 통해 두 파일 간에 바이너리 비교를 해볼 수 있더군요.

그래서 먼저 A코드를 컴파일 한 후, 컴파일된 Bexe파일을 복사한 후 복사된 파일과 Bexe파일을 바이너리 비교해봤습니다.

당연히 두 파일은 100% 일치했고요

그 다음 A코드를 한번 더 빌드해서 Cexe파일을 생성한 후 Bexe파일과 Cexe파일을 바이너리 비교해봤는데
둘이 일치했습니다.
해시값이라는 개념을 언급하시니까 확실히 빌드 할 때 더미값이라도 여기저기 넣어서 다르게 해주면 최소한 해시값만은 달라질 수 있겠단 생각이 듭니다.

효과가 있을 진 모르겠지만 앞으론 빌드할 때 더미값 넣고 조금씩 다르게 컴파일 해보겠습니다.

의견 감사합니다
     
아 그리고 경합이라는 건 별게 아니고, 자기네 프로그램이 더 우선 적용되게 해 놓는겁니다.
저 역시 제 프로그램이 우선 적용되게끔 해야 하고, 사용자들도 제 프로그램이 우선 적용되길 원합니다.
gmltj 2021-11
게임 매크로 검출 안되게 하는 거 같은데.... 불법 아닌가요??
     
아닙니다
          
송주환 2021-11
약관 위반이지, 불법은 아니죠.
잘 이해하고 있습니다.
          
gmltj 2021-11
매크로를 개인적으로 쓰는 것은 괜찮지만 그것을 파는 것은 불법이고 처벌받는 위법의 대상입니다.... 인터넷에 검색해보면 판례가 있습니다...
               
희서님 걱정해주셔서 감사합니다만 매크로와 무관한 일입니다.

지난 몇몇 글에서 끈질기게 게임 매크로냐고 댓글 다는 분이 있었는데 그게 희서님과 동일인물인지 아닌진 모르겠습니다만,

제가 컴퓨터 기술과 관련해서 도움 받으려고 글을 올리는 입장이기 때문에 말싸움하고 싶지도 않고,

무엇보다 희서님께서 의구심이 들 수 있다는 부분은 인정합니다만, 의구심은 의구심으로 끝나야 합니다.

상대방이 해명할 때까지 집요하게 해명을 요구하고, 해명하지 않으면 니가 뒤가 구리기 때문이다, 라는 식으로 결론 내리는 사람들이

우리 사회에 만연해 있습니다.

그러나
1. 대개의 경우 의구심의 대상이 되는 당사자는 해명할 의무가 없습니다.
2. 해명을 요구하는 사람은 각자가 단 한번의 요구, 단 한 사람만 상대하는 입장이지만 해명하는 사람 입장에서는 수백 수천명입니다.
3. 해명의 요구, 의구심 제기는 한 두 마디의 말로도 해낼 수 있지만 이를 해명하는 입장에서는 수페이지, 수십 페이지에 걸쳐서 해명해야 합니다.
4. 해명을 요구하는 사람은 자신이 원하는 바를 얻어서 좋겠지만 해명을 하는 사람은 아무것도 얻을 것이 없습니다.
5. 따라서 희서님 등의 해명 요구는 정당하지 못 합니다.
그래서 이와 같이 해명이 꼭 필요한 경우에는 국가가 나서서 필요하다고 인정되는 극히 제한된 경우에 한해 공권력을 발휘한다는 것이 현대의 국가론이라고 합니다. 제가 웬만하면 그냥 넘어가는데 앞으로도 자주 오고 도움도 많이 받을 사이트이므로 글 남깁니다. 말씀하신 판례는 저도 잘 알고 있으니 현명하게 처신하겠습니다. 감사합니다.
                    
송주환 2021-11
1. 애초에 목적이 떳떳한 프로그램이었다면 '업무 자동화 프로그램'과 같은 모호한 워딩을 사용할 이유가 없습니다. 예시 또한 보다 구체적으로 들 수 있었을 것입니다.
2. 일반적인 프로그램은 다른 프로그램과, 특히 보안 프로그램과 경합할 일이 없습니다. 마치 MS Word에서 MathType을 제한하지 않는 것 처럼 말이죠.
3. '선배 제작자', '이 바닥 특성 상' 등의 워딩으로 미루어 보건데, 충분히 합리적인 의심으로 보입니다.
4. 정말로 문제가 되지 않을 프로그램이라면 회피가 아니라 화이트리스트 등록을 신청했어야 합니다. 제작사에 바이너리 시그니쳐를 제공하고 예외 처리를 해 달라고 해야죠. 하지만 시도조차 하지 않으셨습니다.
5. 여태까지의 질문을 고려했을 때, 이번에도 유사한 목적을 가지고 질문을 하신 것 같습니다. 목표가 게임은 아닐 수도 있겠죠? 게임일 확률이 가장 높아보이긴 합니다만.

2cpu에 질문글을 작성하시는 것은 자유입니다. 그리고 많은 분들이 '그 바닥'과는 다르게 무료로 답변을 제공하시죠.
마찬가지로 여러 사람이 의문을 표하는 것 또한 자유입니다. 만일 이 일로 인해 양질의 답변을 얻는 것이 힘들어진다는 생각이 드신다면, 비용을 지불하고 확실한 솔루션을 제공받는 것이 어떨까 생각합니다.
                         
송주환님의 입장에서 말씀드리자면,

송주환님께서 제 "워딩"이 모호하다고 느끼셨는데요

이는 다시 말하자면 무슨 프로그램이고, 어디에 어떻게 쓸 건지 이 글 만으로 짐작이 가면 좋겠다는 바람이 있으면서도,

한 편으로는 자신이 알고 싶은 바를 모르고 있다는 겁니다.

모르는 것은 누구의 사정일까요?

내가 모르기 때문에 너는 뒤가 구린 것이다. 떳떳하다면 해명을 하라는 요구에는 다음과 같은 잘못이 있습니다.

1. 모르는 것은 송주환님이고, 이는 전적으로 송주환님의 사정입니다. 알고 싶은 이유가 뭔지는 여쭙지도 않겠습니다. 알고 싶다는 바람 역시 순전히 송주환님의 사정입니다.
2. 그에 반해 해명의 책임과 이에 실패할 경우의 피해는 전적으로 저에게 전가됩니다. 또, 송주환님은 저 한명에게만 요구하셨지만 저는 앞으로 송주환님 같은 분을 몇명이나 더 상대해야 할 지 짐작조차 가지 않는군요. 여기에 소요되는 모든 시간과 에너지는 제가 부담해야 할 것이고요.

그 외에도 하고 싶은 말은 많지만, 을의 입장이고 앞으로 여기서 많이 배워야 할 입장이므로 요구하신 대로 말씀 드리겠습니다.
이 프로그램은 아침에 컴퓨터를 켜면, 사용자가 사전에 설정해둔 프로그램들을 켜주고 기존에 작업하던 창을 열어놓고 원하는 위치에 갖다두는 기능 등을 포함한 편의 유틸리티입니다. 여기서 경합하는 프로그램은 켜져야 할 프로그램 중 하나이고요.

별로 어려운 요구가 아니기 때문에 일단은 말씀 드렸습니다.
비록 제가 배우는 입장이지만 증거 없이 '떳떳한 프로그램', '그 바닥' 등으로 자신의 의심을 기정사실화 하며 모욕하는 것은 실례 아닙니까? 일단은 서로 모르는 사이인데요.

그간 매번 해주신 양질의 답변 감사합니다.
                    
gmltj 2021-11
되게 이상하게 답변을 다시는데.. 지난번에 제가 뭐를 어쨋다는건지 모르겠네요. 별로 관심도 없는데 열 좀 받게 만드네요. 나 참....
언젠가는 2021-11
1. 목표: 바이너리를 까봤을때 어떻게 돌아가는지 모르게 하고 싶다.
코드 난독화. themida를 이미 쓰고 계신다면야 별로 더 하실건 없겠습니다.
2. 목표: 바이너리의 해쉬값을 다르게 하고 싶다.
전체 바이너리의 해쉬 변경: 빌드 스크립트 처음에 compile time을 txt로 저장하는 스크립트를 넣고, 링커에 그 파일을 추가하는 방식이 젤 간단합니다. 전체 바이너리의 해쉬는 이걸로 충분히 바뀝니다.
개별 오브젝트 파일의 해쉬 변경: 개별 컴파일 유닛 별로 compile time을 끼워넣어야 합니다. 전처리에 compile time을 끼워넣는 방식이면 될겁니다. 매번 재컴파일 하게되서 비추합니다.
3. 목표: 바이너리의 실행 방법을 다르게 하고 싶다.
랜덤마이즈.
랜덤의 시드를 실행마다 당연히 바꾸시구요.
전체적인 바이너리의 구조야 바꾸기 힘들겠지만, 같은 in/out을 가진 알고리즘 중에서 램덤하게 선택하는 방식으로 합니다. 예를들면 소팅 알고리즘 같은 경우 다양한 방법이 있습니다.
비슷하게 in/out 데이터의 순서가 상관 없다면 일부러 꼬아서 다음으로 전달해도 처리순서가 꽤 바뀝니다.
4. 목표: 바이너리의 실행 자체를 남이 못보게 하고싶다.
vm에서 따로 돌립니다.
5. 목표: 남 프로그램보다 내 프로그램이 먼저 실행되게 하고 싶다.
library/binary/event handling precedence
윈도우라고 하시니, spy++같은걸 쓰시면 이벤트별로 무슨 핸들러가 붙어있는지 확인하실수 있습니다. 당연히 개별 프로그램도 이걸 확인 가능합니다. 그래서 핸들러를 unregister 하고 그보다 앞에 register 할수 있습니다.
library/binary의 순서는 environment variable의 path로 수정 가능합니다.
6. 기타: dll injection, message hooking, api hooking, 잘쓰면 못하는거 없습니다. 근데 업무 자동화 프로그램에 이런 방법까지 쓸것같진 않네요.

근데 질문이 모호한지라 답변도 모호합니다.
     
홀리 쒯.. 정말 감사합니다. 사실 저도 이 문제의 원인(상대방이 제 프로그램을 검출하는 방식)이 뭔지 정확하게 모르다 보니 뭘 고쳐야 해결 할 수 있을지 모르겠어서 질문이 모호해진 것 같습니다.

6번은 종종 언급되는 방법이어서 언젠가 꼭 하고 싶다고 생각만 하던 것들인데 1~5는 제가 찾아보면서 해보고 막히면 또 질문 드리겠습니다

답변이 모호하다고 하셨는데 오히려 저한테는 제가 뭔가 해볼 수 있는 여지가 많이 생겨서 크게 도움 되었습니다 감사합니다 형님
병철 2021-11
닉값이 안 되는듯 합니다. 메이플인가요 거상인가요?
엠브리오 2021-11
자세한 설명이 없으면 답변도 모호할수 밖에 없는게 맞는 거겠죠.
     
넵 가급적 구체적으로 작성하겠습니다
epowergate 2021-11
어떤 용도인지는 중요치 않구요
가장 확실한 방법은 MS에서 인증을 받는겁니다.
그 인증 받으면 MS가 제공하는 디펜더를 포함한 다른 상용 보안 프로그램에서 뭐라고 하지 않습니다.

다른 꿍수 부려서 돌아가봐야 나중에 다시 나올겁니다.
가장 정확한건 MS에 문의 하시는 겁니다.
     
조언 감사합니다 바로 해보겠습니다
무아 2021-11
다들 어떤 용도냐 궁금해 하시는 분들이 많네요.
리플자가 궁금하면 궁금한 내용을 리플로 올릴 수 도 있고 그에 대해 답변하기 곤란한 것이면 답변하지 않아도 되겠지요.

주식 관련 또는 아이템 트레이드 관련이 아닐까 상상해봅니다. 하하.
     
넵 비슷합니다 댓글 감사합니다
동력 2021-11
전에도 메이플스토리 거탐 우회 방법 질문 글 올리셨던 거로 알고 있고

본인이 게임 작업장 돌린다고 하셨고 (https://www.2cpu.co.kr/bbs/new_view.php?bo_table=QnA&wr_id=687285)

컴퓨터 기술 관련해서 도움받고 싶어서 질문 글 올린다고 하는데

그동안 올린 글 보면.. 누가 봐도 매크로 만들려고 필요한 내용 질문하는 거로 밖에 안 보이네요
     
겨울나무 2021-11
이 댓글 아녔으면 저사람 말에 속아넘어갈 뻔 했네요.
게임장 운영자에게 공짜컨설팅 해주고 계시는군요.
     
그렇게 보이셨군요. 댓글 감사합니다.
언젠가는 2021-11
뭐, 좋게 생각하면 다 먹고 살자고 하는 일 아니겠습니까.
     
감사합니다 더 열심히 하겠습니다
송주환 2021-11
그레이 존에서 돈 버는 것 가지고 뭐라고 말할 생각은 전혀 없습니다.
위법도 아니고, 제 소관도 아니기 때문입니다. 그저 질문을 하는 방법이 잘못되었다는 생각이 들어서 댓글을 달았을 뿐입니다.
QnA에 작성하신 글을 쭉 읽어보면, 명사가 지칭하는 대상이 모호하다는 것을 쉽게 알 수 있습니다. 그리고 맥락을 읽어 보면 뭐.. 게임 매크로나 작업장이거나 그렇습니다. 이럼에도 기망의 의도가 없었다는 말을 할 수 있을까요?

그냥 게임사면 게임사, 포털이면 포털, 광고면 광고라고 명확히 밝힌 뒤 질문을 하세요. 그게 도의적으로 옳은 일입니다.
예전에는 게임 이름까지 밝히셨는데, 왜 요즘에는 안 그러시는지..
     
제가 웬만하면 좋게 얘기하고 넘어가려고 했는데요 해명 해 달라고 해서 해줄 수 있는데 까지 해줬고요

정 그러시면 요구하시는대로 원하시는 인증 다 해드리겠습니다.

본인의 추측이 틀렸다고 입증되거나, 맞았다는게 입증되지 않으면 결국 생판 모르는 저에게 괜한 피해를 준 꼴이 됩니다

따라서 송주환님이 전적으로 책임지셔야 합니다.
최종적으로 본인 주장이 맞았다고 입증 안 되실 경우를 포함, 이 과정에서 제가 입는 모든 피해에 대해 전적으로 책임져 주실 것으로 약속 해주시고요 어떻게 책임을 지실 건지 구체적으로 작성해주세요

원하시는 모든 요구 다 해보세요 현실적으로 해드릴 수 있는거라면 전부 해드리겠습니다

그리고 제 생각엔 송주환님이 무슨 사법기관에 소속되어 있다거나 한 분은 아닐 것 같습니다. 수 많은 일반 시민 중 한 사람일 것으로 보이는데요, 저만 송주환님께 제가 글 올릴때마다 글의 의도와 실체 관계에 대해 진술하고 입증해야 한다면 그것만큼 불공평한 것도 드물겠죠? 앞으로 2cpu에서 활동하시면서 저 뿐 아니라 모든 사람에게 글 올릴 때 마다 송주환님에게 그 글이 불법적인 의도가 있는지 확인 및 승인 받게끔 요구해주세요
누구는 송주환님에게 확인 받아야 하고 누구는 그냥 넘어가면 그거야 말로 불공평한 일일 겁니다.
의심이야 그 어떤 글이라도 의심할 수 있는 것일테고요. 어제 보니 누가 쌀 사진 올린 글이 있던데 그런 글도 단지 의심만 하려면 할 수 있습니다.


QnA
제목Page 4705/5717
2015-12   1736753   백메가
2014-05   5204321   정은준1
2019-04   3255   헤즐
2018-11   3255   vmware2cpu
2023-05   3255   spooky21
2014-03   3255   미수맨
2015-07   3255   서울l승용
2022-12   3255   langrisser
2017-05   3255   정연
2021-11   3254   ZSNET5
2017-03   3254   민지파파
2020-06   3254   seru
2019-06   3254   2CPU최주희
2021-02   3254   제온프로
2021-01   3254   뉴자
2015-06   3254   윈도우10
2019-11   3254   나의정체는
2020-03   3254   검은콩
2020-03   3254   ArtsRommel
2017-05   3254   김유중
2020-07   3254   GPGPU
2015-07   3253   아름다운노을