문제

저는 고용주의 고객에게 배포할 소프트웨어를 Python으로 개발하고 있습니다.내 고용주는 시간 제한이 있는 라이센스 파일로 소프트웨어 사용을 제한하고 싶어합니다.

.py 파일 또는 .pyc 파일을 배포하는 경우 라이센스 파일을 확인하는 코드를 쉽게 제거(디컴파일 및)할 수 있습니다.

또 다른 측면은 고용주가 코드가 도난당하거나 적어도 "참신한 아이디어"를 두려워하여 고객이 코드를 읽는 것을 원하지 않는다는 것입니다.

이 문제를 처리할 수 있는 좋은 방법이 있나요?기성 솔루션을 사용하는 것이 좋습니다.

소프트웨어는 Linux 시스템에서 실행됩니다(그래서 py2exe가 그 트릭을 수행할 것이라고 생각하지 않습니다).

도움이 되었습니까?

해결책

바이트 코드 컴파일 해석 언어 인 Python은 잠기기가 매우 어렵습니다. exe-packager와 같은 경우에도 마찬가지입니다 py2exe, 실행 파일의 레이아웃은 잘 알려져 있으며, 파이썬 바이트 코드는 잘 이해된다.

일반적으로 이와 같은 경우 트레이드 오프를해야합니다. 코드를 보호하는 것이 얼마나 중요합니까? 거기에 실제 비밀이 있습니까 (예 : 은행 이체의 대칭 암호화의 열쇠), 아니면 단지 편집증이 있습니까? 최고의 제품을 가장 빠르게 개발할 수있는 언어를 선택하고 새로운 아이디어가 얼마나 가치있는 지에 대해 현실적입니다.

라이센스 수표를 안전하게 시행해야한다고 결정한 경우, 라이센스 확인 코드가 리버스 엔지니어를 리버스 엔지니어링 할 수 있도록 작은 C 확장으로 작성하여 리버스 엔지니어가 될 수 있고, 대부분의 코드를 Python에 두십시오. .

다른 팁

"이 문제를 처리하는 좋은 방법이 있습니까?" 아니요. 역 엔지니어링으로부터 보호 할 수있는 것은 없습니다. DVD 머신의 펌웨어조차도 역 엔지니어링되었으며 AACS 암호화 키 노출된. 그리고 그것은 DMCA에도 불구하고 그것을 범죄 행위로 만들었습니다.

기술적 인 방법이 고객이 코드를 읽지 못하게 할 수 없으므로 일반적인 상업적 방법을 적용해야합니다.

  1. 라이센스. 계약. 이용 약관. 사람들이 코드를 읽을 수있을 때에도 여전히 작동합니다. 일부 파이썬 기반 구성 요소는 해당 구성 요소를 사용하여 소프트웨어를 판매하기 전에 수수료를 지불해야 할 수도 있습니다. 또한 일부 오픈 소스 라이센스는 해당 구성 요소의 출처 또는 기원을 숨길 수 없습니다.

  2. 중요한 가치를 제공합니다. 당신의 물건이 너무 좋다면 - 거절하기 어려운 가격으로 - 시간과 돈을 낭비하는 데 도움이되지는 않습니다. 리버스 엔지니어링은 비싸다. 제품을 약간 저렴하게 만드십시오.

  3. 리버스 엔지니어링을 나쁜 아이디어로 만드는 업그레이드 및 향상을 제공합니다. 다음 릴리스가 리버스 엔지니어링을 중단하면 아무런 의미가 없습니다. 이것은 극단적 인 극단으로 이어질 수 있지만, 다음 릴리스를 리버스 엔지니어링보다 더 가치있게 만드는 새로운 기능을 제공해야합니다.

  4. 매력적으로 매력적으로 사용자 정의를 제공하여 향상을 구축하고 지원합니다.

  5. 만료되는 라이센스 키를 사용하십시오. 이것은 잔인하고 평판이 좋지 않지만 소프트웨어가 작동하지 않습니다.

  6. 웹 서비스로 제공하십시오. Saas는 고객에게 다운로드하지 않습니다.

파이썬은 필요한 도구가 아닙니다

올바른 도구를 사용하여 올바른 일을해야하며 파이썬은 난독 화하도록 설계되지 않았습니다. 그것은 반대입니다. 그것은 모든 것이 언어의 철학이기 때문에 모든 것이 파이썬에서 공개하거나 수정하기 쉽습니다.

볼 수없는 것을 원한다면 다른 도구를 찾으십시오. 이것은 나쁜 것이 아니며 다른 사용에 대해 여러 가지 도구가 존재하는 것이 중요합니다.

난독 화는 정말 어렵습니다

컴파일 된 프로그램조차도 리버스 엔지니어링 될 수 있으므로 코드를 완전히 보호 할 수 있다고 생각하지 마십시오. 난독 화 된 PHP를 분석하고 플래시 암호화 키 등을 분해 할 수 있습니다. 최신 버전의 Windows가 매번 갈라집니다.

법적 요구 사항을 갖는 것은 좋은 방법입니다.

누군가가 코드를 오용하는 것을 막을 수는 없지만 누군가가 할 때 쉽게 발견 할 수 있습니다. 따라서 그것은 단지 캐주얼 한 법적 문제 일뿐입니다.

코드 보호가 과대 평가되었습니다

요즘 비즈니스 모델은 제품 대신 서비스 판매를하는 경향이 있습니다. 서비스를 복사하거나 해적을 훔치거나 훔칠 수 없습니다. 어쩌면 흐름과 함께 갈 시간입니다 ...

파이썬을 컴파일하고 바이너리를 배포하십시오!

현명한 아이디어 :

사용 시톤, 나이트 카, 피부를 흘립니다 또는 Python을 C 코드로 컴파일 한 다음 앱을 Python Binary Libraries (PYD)로 배포하십시오.

이렇게하면 파이썬 (바이트) 코드가 남아 있지 않으며 정기적 인 코드에서 기대할 수있는 합리적인 금액의 모호한 금액을 수행했습니다. (.NET 또는 Java는 바이트 코드가 난독 화되지 않고 합리적인 소스로 비교적 쉽게 분해 될 수 있기 때문에이 경우보다 안전하지 않습니다.)

Cython은 Cpython과 점점 더 호환되고 있으므로 작동해야한다고 생각합니다. (저는 실제로 우리 제품에 대해 이것을 고려하고 있습니다. 우리는 이미 3 인 파티를 PYD/DLL으로 제작하고 있으므로 Binaries로 자체 Python 코드를 배송합니다.)

보다 이 블로그 게시물 (나에 의해 아님) 방법에 대한 튜토리얼. (thx @hithwen)

미친 아이디어 :

Cython이 각 모듈에 대해 C- 파일을 별도로 저장 한 다음 모든 것을 연결하고 무거운 인라인으로 만들 수 있습니다. 그렇게하면 파이썬 모듈은 매우 모 놀리 식적이고 일반적인 도구를 사용하기가 어렵습니다.

미친 것 이상 :

Python 런타임과 모든 라이브러리 (DLL)를 정적으로 링크하고 최적화 할 수있는 경우 단일 실행 파일을 구축 할 수 있습니다. 이렇게하면 Python에 대한 호출을 가로 채고 사용하는 프레임 워크 라이브러리를 가로 채기가 어려울 것입니다. 그래도 LGPL 코드를 사용하는 경우에는 수행 할 수 없습니다.

고객이 파이썬의 힘을 사용하기를 원하지만 소스 코드를 노출시키지 않기를 바랍니다.

내 제안은 다음과 같습니다.

(a) 코드의 중요한 부분을 C 또는 C ++ 라이브러리로 작성한 다음 사용하십시오. 한모금 또는 통음 C/C ++ API를 파이썬 네임 스페이스에 노출시키기 위해.

(b) 사용 시톤 파이썬 대신

(c) (a)와 (b) 모두에서 라이브러리를 파이썬 인터페이스와 함께 라이센스 이진으로 배포 할 수 있어야합니다.

고용주는 다른 사람들이 귀하의 코드에서 얻는 아이디어를 "훔칠"수 있다는 것을 알고 있습니까? 그들이 당신의 작품을 읽을 수 있다면, 당신은 당신의 일을 할 수 있습니다. 상황에서 혜택을 누릴 수있는 방법을 살펴보면 잃을 수있는 금액을 두려워하는 것보다 투자 수익이 더 나을 수 있습니다.

편집] Nick의 의견에 대한 답변 :

아무것도 얻지 못하고 잃어버린 것은 없습니다. 고객은 자신이 원하는 것을 가지고 있습니다 (그리고 변화를 직접 한 이후로 지불했습니다). 그는 변화를 풀지 않기 때문에 마치 다른 사람들에게는 일어나지 않은 것처럼 보입니다.

이제 고객이 소프트웨어를 판매하는 경우 저작권 통지를 변경해야합니다 (불법이므로 소송을 제기 할 수 있고 간단한 사례).

저작권 통지를 변경하지 않으면, 2 단계 고객은 소프트웨어가 원본에서 나온다는 것을 알게되며 무슨 일이 일어나고 있는지 궁금합니다. 그들이 당신에게 연락 할 것이고 당신은 당신의 일의 재판매에 대해 배울 것입니다.

다시 한 번 우리는 두 가지 사례가 있습니다. 원래 고객은 몇 장만 판매했습니다. 그것은 그들이 어쨌든 많은 돈을 벌지 못했기 때문에 왜 귀찮게합니다. 또는 그들은 볼륨으로 판매했습니다. 그것은 당신이 그들이하는 일에 대해 배우고 그것에 대해 무언가를 할 수있는 더 나은 기회를 의미합니다.

그러나 결국 대부분의 회사는 법을 준수하려고합니다 (일단 명성이 파괴되면 사업을하기가 훨씬 어렵습니다). 그래서 그들은 당신의 일을 훔치지 않고 그것을 개선하기 위해 당신과 함께 일합니다. 따라서 소스 (간단한 재판매로부터 보호하는 라이센스 포함)를 포함하는 경우, 변경 사항이 다음 버전에 있는지 확인하고 유지 관리 할 필요가 없기 때문에 단순히 변경 사항을 뒤로 밀 수 있습니다. . 그것은 윈윈입니다 : 당신은 변화를 얻고 그들이 공식 릴리스에 포함시키지 않더라도 필사적으로 필요로한다면 스스로 변화를 만들 수 있습니다.

당신은 보았습니까? 피미니퍼? 그것은 파이썬 코드를 미달, 난독 화 및 압축합니다. 예제 코드는 캐주얼 리버스 엔지니어링에 매우 불쾌 해 보입니다.

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ=ImportError
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱=print
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡=False
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨=object
try:
 import demiurgic
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
 import mystificate
except ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲמּ:
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺬ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ巡
class ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ澨):
 def __init__(self,*args,**kwargs):
  pass
 def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ클(self,dactyl):
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲=mystificate.dark_voodoo(ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ퐐)
  return ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𠛲
 def ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯(self,whatever):
  ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ燱("Forming...")
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ=ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐦚("epicaricacy","perseverate")
 ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲﺃ.ﺭ异𞸐𐤔ﭞﰣﺁں𝕌𨿩𞸇뻛𐬑𥰫嬭ﱌ𢽁𐡆𧪮Ꝫﴹ뙫𢤴퉊ﳦﲣפּܟﺶ𐐤ﶨࠔ𐰷𢡶𧐎𐭈𞸏𢢘𦘼ﶻ𩏃𦽨𞺎𠛘𐠲䉊ﰸﭳᣲ𐠯("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)

난독 화에 의존하지 마십시오. 올바르게 결론을 내렸 듯이 매우 제한된 보호 기능을 제공합니다. 업데이트 : 다음은 다음과 같습니다 종이에 링크 Dropbox에서 난독 화 된 파이썬 코드를 리버스 엔지니어링했습니다. 접근 방식 -Opcode Remping은 좋은 장벽이지만 분명히 패배 할 수 있습니다.

대신, 많은 포스터가 언급 한 바와 같이 :

  • 리버스 엔지니어링 시간의 가치가 없습니다 (소프트웨어가 너무 좋습니다. 지불하는 것이 합리적입니다)
  • 계약서에 서명하고 가능하다면 라이센스 감사를하십시오.

대안으로, Kick-Ass Python Ide Wingide와 마찬가지로 : 코드를 제공하십시오. 맞습니다. 코드를 버리고 사람들이 업그레이드와 지원을 위해 돌아 오게합니다.

배송 .pyc 파일에는 문제가 있습니다. 생성 된 Python 버전보다 다른 Python 버전과 호환되지 않으므로 제품이 실행될 시스템에서 어떤 Python 버전이 실행되는지 알아야합니다. 그것은 매우 제한적인 요소입니다.

어떤 상황에서는 소프트웨어의 모든 또는 최소한 핵심 부분)을 조직에서 호스팅하는 웹 서비스로 이동할 수 있습니다.

이렇게하면 라이센스 검사는 자신의 서버 룸의 안전에서 수행 할 수 있습니다.

완벽한 해결책은 없지만 다음을 수행 할 수 있습니다.

  1. 중요한 시작 코드를 기본 라이브러리로 옮깁니다.
  2. 기본 라이브러리에서 라이센스 점검을 시행하십시오.

기본 코드에 대한 호출이 제거되면 프로그램은 어쨌든 시작되지 않습니다. 제거되지 않으면 라이센스가 시행됩니다.

이것은 크로스 플랫폼 또는 순수한 파이썬 솔루션이 아니지만 작동합니다.

코드를 보호하는 신뢰할 수 있는 유일한 방법은 자신이 제어하는 ​​서버에서 코드를 실행하고 해당 서버와 인터페이스하는 클라이언트를 클라이언트에 제공하는 것입니다.

파이썬 코드를 보호하는 방법이 하나 더 있다고 생각합니다. 난독 화 방법의 일부. Mount and Blade와 같은 게임이나 자신의 Python 통역사 (오픈 소스라고 생각하는 원래 통역사)를 변경하고 충신시키는 것들이 있다고 생각하고 OP 코드 테이블의 OP 코드를 표준 Python OP와 다르게 변경했습니다. 코드.

따라서 Python 소스는 수정되지 않았지만 *.pyc 파일의 파일 확장자는 다르고 OP 코드는 Python.exe 통역사와 일치하지 않습니다. 게임 데이터 파일을 확인한 경우 모든 데이터는 Python 소스 형식입니다.

이런 식으로 미숙 한 해커를 엉망으로 만들기 위해 모든 종류의 불쾌한 트릭을 수행 할 수 있습니다. 경험이없는 해커를 많이 멈추는 것은 쉽습니다. 당신이 이길 수없는 것은 전문 해커입니다. 그러나 대부분의 회사는 직원들에게 프로 해커를 유지하지 않습니다. 그러나 미성숙 해커는 모든 곳에 있습니다 (호기심 많은 IT 직원으로 읽으십시오).

예를 들어, 수정 된 통역사에서 소스의 특정 주석 또는 문자열을 확인할 수 있습니다. 그러한 코드 라인에 대한 특별한 OP 코드를 가질 수 있습니다. 예를 들어:

OP 234는 "# Copyright I를 작성하거나"소스 라인을위한 것입니다. 또는 해당 라인이 "False :"If "# Copyright"가 누락 된 OP 코드로 컴파일합니다. 기본적으로 모호한 이유에 대해 전체 코드 블록을 비활성화합니다.

수정 된 통역사를 다시 컴파일하는 경우 앱을 작성하지 않은 곳이면 앱이 크지 만 금융 앱의 전용 서버 관리자와 같이 보호 비용을 지불해야합니다.

시선을 위해 소스 나 opcodes를 열어 두는 것이 약간 모순되는 것을 발견하지만 네트워크 트래픽에는 SSL을 사용합니다. SSL도 100% 안전하지 않습니다. 그러나 그것은 대부분의 눈이 그것을 읽는 것을 막는 데 사용됩니다. 비트 예방 조치는 합리적입니다.

또한, 충분한 사람들이 파이썬 소스와 opcodes가 너무 눈에 띄는 것으로 간주되면 누군가가 결국 적어도 간단한 보호 도구를 개발할 것입니다. 따라서 "파이썬 앱을 보호하는 방법"을 묻는 사람들이 더 많을수록 해당 개발 만 촉진합니다.

고객이 누구인지에 따라, 간단한 보호 메커니즘은 현명한 라이센스 계약과 결합됩니다. 멀리 복잡한 라이센스/암호화/난독 화 시스템보다 더 효과적입니다.

최상의 솔루션은 코드를 서비스로 판매하거나 서비스를 호스팅하거나 지원을 제공함으로써 서비스로 판매하는 것입니다.

코드를 배송합니다 .pyc 파일은 몇 가지에 의해 보호를받지 못하게합니다. #S, 그러나 그것은 거의 효과적인 반 양제 방지 보호는 아니며 (그러한 기술이있는 것처럼) 하루가 끝날 무렵 회사와의 괜찮은 라이센스 계약을 달성해서는 안됩니다.

코드를 최대한 사용하기에 좋은 코드를 만드는 데 집중하십시오. 행복한 고객이 있으면 이론적 인 불법 복제를 막는 것보다 회사가 훨씬 더 많은 돈을 벌 수 있습니다 ..

사용 시톤. 모듈을 고성능 C 파일로 컴파일 한 다음 기본 바이너리 라이브러리로 컴파일 할 수 있습니다. 이것은 기본적으로 .pyc bytecode와 비교할 때 비방 가능합니다!

Python 프로젝트를 위해 Cython을 설정하는 방법에 대한 자세한 기사를 작성했습니다.

Cython으로 파이썬 소스를 보호합니다

코드를 훔치기 어렵게 만드는 또 다른 시도는 Jython을 사용한 다음 사용하는 것입니다. Java Obfuscator.

이것은 Jythonc이 Python 코드를 Java로 번역 한 다음 Java가 바이트 코드로 컴파일되므로 잘 작동합니다. 따라서 온스는 클래스를 난독 화하여 실제 코드를 복구하는 것은 말할 것도없고, 대결 후에 무슨 일이 일어나고 있는지 이해하기가 어려울 것입니다.

Jython의 유일한 문제는 c로 작성된 Python 모듈을 사용할 수 없다는 것입니다.

중요한 파일을 해싱하고 서명하고 공개 키 방법으로 확인하여 표준 암호화 체계로 코드에 서명하는 것은 어떻습니까?

이러한 방식으로 각 고객의 공개 키로 라이센스 파일을 발행 할 수 있습니다.

추가로 파이썬 오발적 인 것과 같은 파이썬 난독자를 사용할 수 있습니다 이 하나 (그냥 googled).

GetDropbox.com의 직원들이 Linux를 포함한 클라이언트 소프트웨어를 위해 어떻게 수행하는지 살펴 봐야합니다. 크래킹하는 것은 매우 까다 롭고 보호 메커니즘을 극복하려면 매우 창의적인 분해가 필요합니다.

나는 보지 못한 것에 놀랐다 Pyconcrete 어떤 대답으로. 어쩌면 질문보다 새롭기 때문일 수 있습니까?

정확히 필요한 것일 수 있습니다 (ed).

코드를 난독 화하는 대신 코드를 암호화하고로드 시간에 해독합니다.

에서 pypi 페이지:

파이썬 스크립트 작업 흐름을 보호하십시오

  • your_script.py import pyconcrete
  • Pyconcrete는 가져 오기 모듈을 연결합니다
  • 스크립트가 가져올 때 MODULE, pyconcrete 가져 오기 후크가 찾으려고합니다 MODULE.pye 먼저 해독합니다 MODULE.pye ~을 통해 _pyconcrete.pyd 해독 된 데이터 실행 (.pyc 컨텐츠)
  • 암호화 및 해독 비밀 키 레코드 _pyconcrete.pyd(DLL 정도처럼) 비밀 키는 이진 코드로 숨어 있습니다. 16 진수에서 직접 볼 수 없습니다.

파이썬으로 할 수있는 최선은 사물을 모호하게하는 것입니다.

  • 모든 docstrings를 제거하십시오
  • .pyc 컴파일 된 파일 만 배포하십시오.
  • 얼립니다
  • 클래스/모듈 내부에서 상수를 가리려면 도움 (구성)이 모든 것을 표시하지 않도록

일부를 암호화하여 즉석에서 해독하여 Eval ()에 전달하여 추가 모호함을 추가 할 수 있습니다. 그러나 당신이 무엇을하든 누군가가 그것을 깨뜨릴 수 있습니다.

이 중 어느 것도 결정된 공격자가 바이트 코드를 분해하거나 API를 통해 도움, DIR 등을 파는 것을 막을 수 없습니다.

시간 제한 라이센스를 갖고 로컬에 설치된 프로그램에서 이를 확인하는 아이디어는 작동하지 않습니다.완벽한 난독화를 하더라도 라이센스 확인을 제거할 수 있습니다.그러나 원격 시스템에서 라이센스를 확인하고 폐쇄된 원격 시스템에서 프로그램의 상당 부분을 실행하면 IP를 보호할 수 있습니다.

경쟁업체가 소스 코드를 자신의 것으로 사용하거나 동일한 코드의 영감을 받은 버전을 작성하는 것을 방지하는 한 가지 보호 방법은 프로그램 논리에 서명(코드가 도난당했음을 증명할 수 있는 일부 비밀)을 추가하고 난독화하는 것입니다. Python 소스 코드이므로 읽고 활용하기가 어렵습니다.

좋은 난독화는 기본적으로 코드를 실행 파일로 컴파일하고 바이너리를 제거하는 것과 동일한 보호 기능을 코드에 추가합니다.난독화된 복잡한 코드가 어떻게 작동하는지 파악하는 것은 실제로 직접 구현을 작성하는 것보다 훨씬 어려울 수 있습니다.

이는 프로그램 해킹을 방지하는 데 도움이 되지 않습니다.난독화 코드를 사용하더라도 라이선스 내용은 깨질 수 있으며 프로그램은 약간 다른 동작을 갖도록 수정될 수 있습니다(코드를 바이너리로 컴파일하는 것이 기본 프로그램 보호에 도움이 되지 않는 것과 같은 방식).

기호 난독화 외에도 코드를 리팩토링 해제하는 것이 좋은 생각일 수 있습니다.호출 그래프는 실제로는 서로 다른 장소가 결국 동일한 작업을 수행하더라도 여러 다른 장소를 가리킵니다.

난독화된 코드 내부의 논리적 서명(예:프로그램 로직에서 사용되지만 서명으로도 사용되는 값 테이블을 생성할 수 있으며, 이를 통해 코드가 사용자로부터 생성되었는지 확인하는 데 사용할 수 있습니다.누군가 귀하의 난독화된 코드 모듈을 자신의 제품의 일부로 사용하기로 결정한 경우(다른 것처럼 보이도록 다시 난독화한 후에도) 해당 코드가 귀하의 비밀 서명과 함께 도난당했음을 보여줄 수 있습니다.

나는 내 자신의 프로젝트를 위해 일반적으로 소프트웨어 보호를 살펴 보았고 일반적인 철학은 완전한 보호가 불가능하다는 것입니다. 달성 할 수있는 유일한 것은 다른 라이센스를 구매하는 것보다 고객이 우회하는 데 더 많은 비용을 지불하는 수준에 보호를 추가하는 것입니다.

그로 인해 나는 단지 Google에서 Python obsfucation을 확인하고 많은 것을 나타 내지 않았다고 말했습니다. .NET 솔루션에서는 Obsfucation이 Windows 플랫폼에서 문제에 대한 첫 번째 접근 방식이지만 Mono와 함께 작동하는 Linux에 솔루션이 있는지 확실하지 않습니다.

다음은 컴파일 된 언어로 코드를 작성하거나 실제로 모든 길로 가고 싶다면 어셈블러로 작성하는 것입니다. 제거 된 실행 파일은 해석 된 언어보다 소형화하기가 훨씬 어렵습니다.

그것은 모두 트레이드 오프로 내려집니다. 한쪽 끝에는 Python에서 소프트웨어 개발이 용이하며 비밀을 숨기기가 매우 어렵습니다. 다른 한편으로, 당신은 어셈블러로 쓰여진 소프트웨어가있어 쓰기가 훨씬 어렵지만 비밀을 숨기는 것이 훨씬 쉽습니다.

상사는 자신의 요구 사항을 지원하는 연속체의 어딘가에 포인트를 선택해야합니다. 그리고 그는 당신이 원하는 것을 만들 수 있도록 도구와 시간을 제공해야합니다. 그러나 내 베팅은 그가 실제 개발 비용과 잠재적 인 금전적 손실에 반대한다는 것입니다.

메모리에로드하고 실행하는 C 런처에 대한 Crypted Resource에 py2exe 바이트 코드를 가질 수 있습니다. 몇 가지 아이디어 여기 그리고 여기.

일부는 또한 생각했습니다 자체 수정 프로그램 리버스 엔지니어링 비용을 비쌉니다.

당신은 또한 찾을 수 있습니다 디버거 방지를위한 튜토리얼, 분리기를 실패시키고 설정하십시오 허위 디버거 중단 점 체크섬으로 코드를 보호하십시오. 더 많은 링크에 대해서는 "메모리에서"crypted code "execute"]를 검색하십시오.

그러나 다른 사람들이 이미 말했듯이 코드가 가치가 있다면 리버스 엔지니어는 결국 성공할 것입니다.

짧은 이야기 :

  1. 소스 코드를 암호화합니다
  2. 가져올 때 코드를 해독하려면 자신의 Python 모듈 로더를 작성하십시오.
  3. C/C ++에서 모듈 로더를 구현하십시오
  4. 모듈 로더에 더 많은 기능을 추가 할 수 있습니다 (예 : Anti-Debugger, 라이센스 제어, 하드웨어 지문 바인딩 등).

자세한 내용은 이것을 살펴보십시오 대답.

주제에 관심이 있다면이 프로젝트가 도움이 될 것입니다. pyprotect.

소프트웨어 라이센스에 중점을두면 다른 스택 오버플로 답변을 살펴 보는 것이 좋습니다. 여기 라이센스 키 검증 시스템을 구축 할 수있는 방법에 대한 영감을 얻으려면.

오픈 소스 라이브러리가 있습니다 github 라이센스 확인 비트에 도움이 될 수 있습니다.

당신은 그것을 설치할 수 있습니다 pip install licensing 다음 코드를 추가합니다.

pubKey = "<RSAKeyValue><Modulus>sGbvxwdlDbqFXOMlVUnAF5ew0t0WpPW7rFpI5jHQOFkht/326dvh7t74RYeMpjy357NljouhpTLA3a6idnn4j6c3jmPWBkjZndGsPL4Bqm+fwE48nKpGPjkj4q/yzT4tHXBTyvaBjA8bVoCTnu+LiC4XEaLZRThGzIn5KQXKCigg6tQRy0GXE13XYFVz/x1mjFbT9/7dS8p85n8BuwlY5JvuBIQkKhuCNFfrUxBWyu87CFnXWjIupCD2VO/GbxaCvzrRjLZjAngLCMtZbYBALksqGPgTUN7ZM24XbPWyLtKPaXF2i4XRR9u6eTj5BfnLbKAU5PIVfjIS+vNYYogteQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"

res = Key.activate(token="WyIyNTU1IiwiRjdZZTB4RmtuTVcrQlNqcSszbmFMMHB3aWFJTlBsWW1Mbm9raVFyRyJd",\
                   rsa_pub_key=pubKey,\
                   product_id=3349, key="ICVLD-VVSZR-ZTICT-YKGXL", machine_code=Helpers.GetMachineCode())

if res[0] == None not Helpers.IsOnRightMachine(res[0]):
    print("An error occured: {0}".format(res[1]))
else:
    print("Success")

RSA 공개 키 등이 구성되는 방식에 대한 자세한 내용을 읽을 수 있습니다. 여기.

CXFreeze (Linux 용 Py2Exe)를 사용하면 작업이 수행됩니다.

http://cx-freeze.sourceforge.net/

우분투 저장소에서 사용할 수 있습니다

C/C ++의 이진 파일을 보호하기 위해 동일한 방식을 사용하십시오. 즉, 실행 파일 또는 라이브러리 바이너리 파일에서 각 기능 본체를 난독 화하고 각 기능 항목을 시작할 때 명령 "점프"를 삽입하여 특수 기능으로 점프하여 난독 화 된 코드를 복원하십시오. 바이트 코드는 파이썬 스크립트의 이진 코드입니다

  • 먼저 Python 스크립트를 코드 객체로 컴파일합니다
  • 그런 다음 각 코드 객체, 각 코드 객체의 co_code를 다음과 같이 반복하십시오.
    0   JUMP_ABSOLUTE            n = 3 + len(bytecode)

    3
    ...
    ... Here it's obfuscated bytecode
    ...

    n   LOAD_GLOBAL              ? (__pyarmor__)
    n+3 CALL_FUNCTION            0
    n+6 POP_TOP
    n+7 JUMP_ABSOLUTE            0
  • 난독 화 된 코드 객체를 .pyc 또는 .pyo 파일로 저장하십시오

해당 코드 객체가 처음이라고 불리는 경우 Omeral Python Interperter에서는 난독 화 된 파일 (.pyc 또는 .pyo)을 사용할 수 있습니다.

  • 첫 번째 OP는 JUMP_ABSOLUTE입니다.

  • 오프셋 N에서 명령어는 pycfunction을 호출하는 것입니다. 이 기능은 오프셋 3과 N 사이의 난독 화 된 바이트 코드를 복원하고 원래 바이트 코드를 오프셋 0에 넣습니다.

        char *obfucated_bytecode;
        Py_ssize_t len;
        PyFrameObject* frame = PyEval_GetFrame();
        PyCodeObject *f_code = frame->f_code;
        PyObject *co_code = f_code->co_code;      
        PyBytes_AsStringAndSize(co_code, &obfucated_bytecode, &len)
    
  • 이 함수가 반환 된 후 마지막 명령은 오프셋 0으로 이동하는 것입니다. 실제로 바이트 코드가 실행됩니다.

도구가 있습니다 Pyarmor 이런 식으로 파이썬 스크립트를 난독 화합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top