안녕하세요 형님들.
본격적으로 날씨가 추워졌습니다 건강 관리 유의하십시오.
저는 요즘 업무 자동화 프로그램을 만들어서 사용료를 받고 있습니다. 그런데 모 업체에서 저의 사무자동화 프로그램을 바이러스 등으로 규정하고 자기네 프로그램과 경합하게 만들어 놨습니다.
처음에는 저 자신은 제 프로그램이 바이러스가 아님을 알고 있고, 사용자의 컴퓨터에 그 어떤 해도 끼치지 않을 것이므로 그러한 경합으로부터 제 프로그램이 이기게 할 방법을 찾아가면서 싸워 왔는데 프로그램 만드는 것 보다 그 경합에 쓰는 시간이 더 많아지더군요. 자료 찾고 뭐하고 하는 것도 하루 이틀이고 너무 힘듭니다.
주변의 다른 선배 제작자들에게 물어보니 우선순위를 두고 싸울게 아니고 애초에 프로그램이 검출되지 않게 하면 더 이상 싸울 일이 없고 그게 가장 깔끔한 방법이라고 하더군요. 구체적인 방법을 물어봤는데 "개별 컴파일 하라"는 조언만 해줄 뿐 구체적인 방법은 알려주지 않더군요. 이 바닥 특성 상 서로 경쟁 상대이기 때문에 간단한 조언만 해줄 뿐 구체적인 방법은 서로 숨깁니다. 결국 스스로 방법을 찾아야 하는데요
개별 컴파일이라는 건 결국 이런 겁니다. 하나의 컴퓨터에서 단 하나의 프로그램만 돌아간다면 해당 업체에서 이 사람이 손으로 업무를 보는 건지 자동화 프로그램을 사용하는 건지 알 수 없습니다. 수십 대의 컴퓨터에서 같은 프로그램이 돌아가기 때문에 프로그램 간의 공통점을 통해서 프로그램이 검출된다는 겁니다. 그러니까 소스 코드를 컴파일 하고, 컴파일된 exe파일을 복사해서 쓰지 말고 컴파일 할 때마다 프로그램의 내부 구성 등 뭔가 정보가 다르게 끔 컴파일 하라는 건데요
그래서 이 부분에 대해 구글링 및 조사를 좀 해봤는데, 네임 스페이스를 바꾸는 것과 guid를 각각 다르게 하는 정도 외에는 유의미한 것을 찾지 못 했습니다.
특히 guid같은 경우엔 굳이 컴파일 할 때가 아니더라도, 실행 될 때마다 다르게 해 줄 수 있어서 개별 컴파일하라는 얘기와는 거리가 멀은 것 같았고.. 네임 스페이스의 경우에는 제 프로그램은 파이썬으로 제작 되었는데, 네임스페이스는 결국 __main__입니다. 그런데 __main__은 제 프로그램 뿐 아니라 파이썬으로 제작된 모든 프로그램이 별도로 개발자가 손대지 않으면 일반적으로 __main__으로 되어 있을 텐데 말이죠.
그리고 또 하나 말씀 드리고 싶은 것은, 제 프로그램을 쓰는 사람들 중 컴파일 하지 않고 vscode 에서 바로 실행하는 식으로 사용한 사람(저 포함)들은 검출이 되지 않은 반면, exe파일로 사용해온 사람들(제가 소스코드를 보여줄 수 없는 사람들입니다)은 검출이 된 것으로 보입니다. 물론 이 부분은 표본이 너무 적어서 vscode와 exe파일 간의 차이라고 확신은 할 수 없고, 그럴 수도 있다고 생각할 만한 정황이 있습니다. 조언 해 주실 때 혹시 도움이 될 수 있을것 같아서 말씀 드렸습니다.
구글링하다하다 안되고 생각 하다하다 안되서 여기다 질문 올려봅니다. 혹시 짐작가시는 방법이나 좋은 힌트 있으신 형님 계시면 부탁 드립니다.
그리고 파이선이면 py로 배포하시지 말고 pyo나 pyc로만 배포하셔도 대부분 해결됩니다.
파이선은 특히 배포 방법이 여러가지로 많으니 찾아보시고 좋은 방법으로 택하시면 됩니다.
만약 그 업체에서 제 프로그램을 검출하는 방법이 난독화 이슈라면.. themida를 사용하는 것이 제가 아는 한 가장 좋은 방법인데
혹시 themida사용만으론 부족합니까? 만약 그렇다면 추가로 해줄 수 있는 조치는 뭐가 있겠습니까?
감사합니다
언어별로 namespace, package, module, submodule, path, class, function는 로더에서 아주 명확한 의미를 가집니다.
예를들면 c는 한 바이너리에 free function으로 main은 1개만 존재해야 하고 그게 entry point가 됩니다. main은 어떠한 namespace 안에 존재할수 없습니다.
그래서 이 컨벤션을 따르는 main의 존재를 가지고 바이러스로 절대로 판독할순 없죠.
밑에 달아주신 해결책들과 namespace각각 컴파일마다 다르게 하는 등 해볼 수 있는 조치는 다 해 볼 겁니다.
말씀 하신 내용은 해당 회사에서 만드신 프로그램의 hash로 검사한다면 프로그램을 재 빌드해서(보통은 빌드할 때마다 바이러리가 약간식 달라져서 동일한 hash를 갖지 않습니다) 다른 프로그래으로 인식하게 하라는 의미 같습니다.
python 빌드가 어케 되는진 잘 모르지만 재 빌드시 해시가 동일하다면 프로그램 내에 더미데이터를 랜덤하게 넣어서 빌드하면 될 듯 합니다.
만약 프로그램을 검출하는 방식이 hash가 아닌 똘똘한 방식이라면 이보단 어렵겠죠..
그래서 간단한 실험을 해봤는데요, cmd창에서 fc명령어를 통해 두 파일 간에 바이너리 비교를 해볼 수 있더군요.
그래서 먼저 A코드를 컴파일 한 후, 컴파일된 Bexe파일을 복사한 후 복사된 파일과 Bexe파일을 바이너리 비교해봤습니다.
당연히 두 파일은 100% 일치했고요
그 다음 A코드를 한번 더 빌드해서 Cexe파일을 생성한 후 Bexe파일과 Cexe파일을 바이너리 비교해봤는데
둘이 일치했습니다.
해시값이라는 개념을 언급하시니까 확실히 빌드 할 때 더미값이라도 여기저기 넣어서 다르게 해주면 최소한 해시값만은 달라질 수 있겠단 생각이 듭니다.
효과가 있을 진 모르겠지만 앞으론 빌드할 때 더미값 넣고 조금씩 다르게 컴파일 해보겠습니다.
의견 감사합니다
저 역시 제 프로그램이 우선 적용되게끔 해야 하고, 사용자들도 제 프로그램이 우선 적용되길 원합니다.
잘 이해하고 있습니다.
지난 몇몇 글에서 끈질기게 게임 매크로냐고 댓글 다는 분이 있었는데 그게 희서님과 동일인물인지 아닌진 모르겠습니다만,
제가 컴퓨터 기술과 관련해서 도움 받으려고 글을 올리는 입장이기 때문에 말싸움하고 싶지도 않고,
무엇보다 희서님께서 의구심이 들 수 있다는 부분은 인정합니다만, 의구심은 의구심으로 끝나야 합니다.
상대방이 해명할 때까지 집요하게 해명을 요구하고, 해명하지 않으면 니가 뒤가 구리기 때문이다, 라는 식으로 결론 내리는 사람들이
우리 사회에 만연해 있습니다.
그러나
1. 대개의 경우 의구심의 대상이 되는 당사자는 해명할 의무가 없습니다.
2. 해명을 요구하는 사람은 각자가 단 한번의 요구, 단 한 사람만 상대하는 입장이지만 해명하는 사람 입장에서는 수백 수천명입니다.
3. 해명의 요구, 의구심 제기는 한 두 마디의 말로도 해낼 수 있지만 이를 해명하는 입장에서는 수페이지, 수십 페이지에 걸쳐서 해명해야 합니다.
4. 해명을 요구하는 사람은 자신이 원하는 바를 얻어서 좋겠지만 해명을 하는 사람은 아무것도 얻을 것이 없습니다.
5. 따라서 희서님 등의 해명 요구는 정당하지 못 합니다.
그래서 이와 같이 해명이 꼭 필요한 경우에는 국가가 나서서 필요하다고 인정되는 극히 제한된 경우에 한해 공권력을 발휘한다는 것이 현대의 국가론이라고 합니다. 제가 웬만하면 그냥 넘어가는데 앞으로도 자주 오고 도움도 많이 받을 사이트이므로 글 남깁니다. 말씀하신 판례는 저도 잘 알고 있으니 현명하게 처신하겠습니다. 감사합니다.
2. 일반적인 프로그램은 다른 프로그램과, 특히 보안 프로그램과 경합할 일이 없습니다. 마치 MS Word에서 MathType을 제한하지 않는 것 처럼 말이죠.
3. '선배 제작자', '이 바닥 특성 상' 등의 워딩으로 미루어 보건데, 충분히 합리적인 의심으로 보입니다.
4. 정말로 문제가 되지 않을 프로그램이라면 회피가 아니라 화이트리스트 등록을 신청했어야 합니다. 제작사에 바이너리 시그니쳐를 제공하고 예외 처리를 해 달라고 해야죠. 하지만 시도조차 하지 않으셨습니다.
5. 여태까지의 질문을 고려했을 때, 이번에도 유사한 목적을 가지고 질문을 하신 것 같습니다. 목표가 게임은 아닐 수도 있겠죠? 게임일 확률이 가장 높아보이긴 합니다만.
2cpu에 질문글을 작성하시는 것은 자유입니다. 그리고 많은 분들이 '그 바닥'과는 다르게 무료로 답변을 제공하시죠.
마찬가지로 여러 사람이 의문을 표하는 것 또한 자유입니다. 만일 이 일로 인해 양질의 답변을 얻는 것이 힘들어진다는 생각이 드신다면, 비용을 지불하고 확실한 솔루션을 제공받는 것이 어떨까 생각합니다.
송주환님께서 제 "워딩"이 모호하다고 느끼셨는데요
이는 다시 말하자면 무슨 프로그램이고, 어디에 어떻게 쓸 건지 이 글 만으로 짐작이 가면 좋겠다는 바람이 있으면서도,
한 편으로는 자신이 알고 싶은 바를 모르고 있다는 겁니다.
모르는 것은 누구의 사정일까요?
내가 모르기 때문에 너는 뒤가 구린 것이다. 떳떳하다면 해명을 하라는 요구에는 다음과 같은 잘못이 있습니다.
1. 모르는 것은 송주환님이고, 이는 전적으로 송주환님의 사정입니다. 알고 싶은 이유가 뭔지는 여쭙지도 않겠습니다. 알고 싶다는 바람 역시 순전히 송주환님의 사정입니다.
2. 그에 반해 해명의 책임과 이에 실패할 경우의 피해는 전적으로 저에게 전가됩니다. 또, 송주환님은 저 한명에게만 요구하셨지만 저는 앞으로 송주환님 같은 분을 몇명이나 더 상대해야 할 지 짐작조차 가지 않는군요. 여기에 소요되는 모든 시간과 에너지는 제가 부담해야 할 것이고요.
그 외에도 하고 싶은 말은 많지만, 을의 입장이고 앞으로 여기서 많이 배워야 할 입장이므로 요구하신 대로 말씀 드리겠습니다.
이 프로그램은 아침에 컴퓨터를 켜면, 사용자가 사전에 설정해둔 프로그램들을 켜주고 기존에 작업하던 창을 열어놓고 원하는 위치에 갖다두는 기능 등을 포함한 편의 유틸리티입니다. 여기서 경합하는 프로그램은 켜져야 할 프로그램 중 하나이고요.
별로 어려운 요구가 아니기 때문에 일단은 말씀 드렸습니다.
비록 제가 배우는 입장이지만 증거 없이 '떳떳한 프로그램', '그 바닥' 등으로 자신의 의심을 기정사실화 하며 모욕하는 것은 실례 아닙니까? 일단은 서로 모르는 사이인데요.
그간 매번 해주신 양질의 답변 감사합니다.
코드 난독화. 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는 제가 찾아보면서 해보고 막히면 또 질문 드리겠습니다
답변이 모호하다고 하셨는데 오히려 저한테는 제가 뭔가 해볼 수 있는 여지가 많이 생겨서 크게 도움 되었습니다 감사합니다 형님
가장 확실한 방법은 MS에서 인증을 받는겁니다.
그 인증 받으면 MS가 제공하는 디펜더를 포함한 다른 상용 보안 프로그램에서 뭐라고 하지 않습니다.
다른 꿍수 부려서 돌아가봐야 나중에 다시 나올겁니다.
가장 정확한건 MS에 문의 하시는 겁니다.
리플자가 궁금하면 궁금한 내용을 리플로 올릴 수 도 있고 그에 대해 답변하기 곤란한 것이면 답변하지 않아도 되겠지요.
주식 관련 또는 아이템 트레이드 관련이 아닐까 상상해봅니다. 하하.
본인이 게임 작업장 돌린다고 하셨고 (https://www.2cpu.co.kr/bbs/new_view.php?bo_table=QnA&wr_id=687285)
컴퓨터 기술 관련해서 도움받고 싶어서 질문 글 올린다고 하는데
그동안 올린 글 보면.. 누가 봐도 매크로 만들려고 필요한 내용 질문하는 거로 밖에 안 보이네요
게임장 운영자에게 공짜컨설팅 해주고 계시는군요.
위법도 아니고, 제 소관도 아니기 때문입니다. 그저 질문을 하는 방법이 잘못되었다는 생각이 들어서 댓글을 달았을 뿐입니다.
QnA에 작성하신 글을 쭉 읽어보면, 명사가 지칭하는 대상이 모호하다는 것을 쉽게 알 수 있습니다. 그리고 맥락을 읽어 보면 뭐.. 게임 매크로나 작업장이거나 그렇습니다. 이럼에도 기망의 의도가 없었다는 말을 할 수 있을까요?
그냥 게임사면 게임사, 포털이면 포털, 광고면 광고라고 명확히 밝힌 뒤 질문을 하세요. 그게 도의적으로 옳은 일입니다.
예전에는 게임 이름까지 밝히셨는데, 왜 요즘에는 안 그러시는지..
정 그러시면 요구하시는대로 원하시는 인증 다 해드리겠습니다.
본인의 추측이 틀렸다고 입증되거나, 맞았다는게 입증되지 않으면 결국 생판 모르는 저에게 괜한 피해를 준 꼴이 됩니다
따라서 송주환님이 전적으로 책임지셔야 합니다.
최종적으로 본인 주장이 맞았다고 입증 안 되실 경우를 포함, 이 과정에서 제가 입는 모든 피해에 대해 전적으로 책임져 주실 것으로 약속 해주시고요 어떻게 책임을 지실 건지 구체적으로 작성해주세요
원하시는 모든 요구 다 해보세요 현실적으로 해드릴 수 있는거라면 전부 해드리겠습니다
그리고 제 생각엔 송주환님이 무슨 사법기관에 소속되어 있다거나 한 분은 아닐 것 같습니다. 수 많은 일반 시민 중 한 사람일 것으로 보이는데요, 저만 송주환님께 제가 글 올릴때마다 글의 의도와 실체 관계에 대해 진술하고 입증해야 한다면 그것만큼 불공평한 것도 드물겠죠? 앞으로 2cpu에서 활동하시면서 저 뿐 아니라 모든 사람에게 글 올릴 때 마다 송주환님에게 그 글이 불법적인 의도가 있는지 확인 및 승인 받게끔 요구해주세요
누구는 송주환님에게 확인 받아야 하고 누구는 그냥 넘어가면 그거야 말로 불공평한 일일 겁니다.
의심이야 그 어떤 글이라도 의심할 수 있는 것일테고요. 어제 보니 누가 쌀 사진 올린 글이 있던데 그런 글도 단지 의심만 하려면 할 수 있습니다.