문제

비슷한 질문에서 논의 된 바와 같이 여기 그리고 여기 리버스 엔지니어링으로부터 코드를 보호하고 싶습니다.

내 상황은 동시 그의 (우수한) 대답에 설명합니다 여기:

기본적으로, 그것이 내려 오는 것은 소스 도난을 목표로하는 유일한 기회는 매우 구체적이고 엔지니어링하기 어려운 엔지니어, 도메인과 관련된 알고리즘이있는 경우 경쟁에서 다리를 부여하는 것입니다. 이것은 신청서의 작은 부분을 리버스 엔지니어링하는 것이 비용 효율적인 유일한 시간입니다.

나는이 상황이 정확히있다. 특정 도메인에 우아하고 가치있는 엔지니어 알고리즘.

몇 달을 소비 한 후 미세 조정 및 개발 후 최종 결과는 매우 작고 (약 100 줄의 코드) 우아합니다. 코드의 특정 부분을 역 엔지니어링으로부터 보호하거나 최소한 합리적으로 어렵게 만들고 싶습니다.

시나리오는 C#에 작성된 풍부한 클라이언트 응용 프로그램이며 코드 의이 부분을 배포해야합니다. 웹 서비스에서 실행할 수 없습니다.

코드를 추출하고 관리되지 않는 네이티브 바이너리에서 코드를 다시 작성하는 것은 성능 이유 (및 교차 경계 문제)로 인해 옵션이 아니라고 생각합니다.

처음에는 간단한 난독 화를하고 싶었지만 코드의 작은 크기가 주어지면 많은 보호 기능을 제공하지 않을 것이라고 생각합니다.

이상적으로는 전체 애플리케이션을 보호하고 싶지만 일반적인 난독스 캐터와 타사 패커를 사용하기가 어렵게 만드는 두 가지 주요 문제가 있습니다.

  1. 응용 프로그램은 플러그인 인터페이스를 제공하므로 일부 어셈블리 (및 인터페이스/클래스)는 난독 화 및 포장되지 않아야합니다.

  2. 우리는 여전히 오류 보고서를 수신 할 때 실제 스택 추적에 도달 할 수 있기를 원합니다. 잠재적으로 실제 코드에 대한 맵핑을 수행 할 수 있습니다.

이러한 문제를 제쳐두고 (이에 대한 정보도 감사하지만) 코드의 작은 부분을 리버스 엔지니어링으로부터 보호하는 좋은 방법은 무엇입니까? 나는 코드를 변경하거나 해킹하는 사람에 대해 걱정하지 않지만 코드를 이해하고 리버스 엔지니어링하기가 어렵습니다.

도움이 되었습니까?

해결책

작은 귀중한 부분에 도달하기가 어려워 지므로 완전한 코드를 난독 화해야합니다. 코드가 작을수록 코드를 이해하기가 더 쉬워집니다. 대부분의 난독 카이터는 많은 난독 화 된 라이브러리가 있기 때문에 공개 인터페이스를 엉망으로 만들어서는 안됩니다.

그러나 나는 당신이 사용자에게 숨기려고하는 대신 특별한 트릭이 없다고 확신해야한다고 생각합니다. Kaiser Soze를 인용하자면, "악마가 가져온 가장 큰 속임수는 세상이 존재하지 않는다는 것을 설득하는 것입니다."

물론 항상 발명 특허를 제출하고 합법적으로 자신을 보호 할 수 있습니다.

다른 팁

난독 화를 제외하고는 거의 무가치하며 심지어 Microsoft (스캇 구 기본적으로 기본적으로 적절한 양의 의도와 능력을 가진 사람들은 응용 프로그램을 리버스 엔지니어링하고 .NET에서 기본 방어는 모호함이나 역 엔지니어링을 방지하는 다른 수단을 통해 코드를 보호하는 대신 라이센스 및 IP입니다.

이것이 BCL 소스를 비공개로 유지하는 대신 왜 BCL 소스를 공개 한 이유에 대한 추론의 일부입니다.

할 수 없습니다. 코드를 실행할 수 있으면 읽고 리버스 엔지니어링 할 수 있습니다. 당신이 할 수있는 일은 조금 더 힘들게 만들고 나를 믿는 것입니다. 작은 더 어렵다. 당신은 사실을 좋아하지 않을 수도 있지만 대부분의 크래커는 다른 사람이 물건을 깨기 어렵게 만드는 것보다 크랙에 훨씬 낫습니다. 코드를 보호하려는 노력의 양은 일반적으로 가치가 없습니다. 특히 지불 고객에게 불리한 경우 특히 그렇습니다. DRM의 놀라운 비 서양을 목격하십시오.

내 조언은 그것에 대해 걱정하지 않는 것입니다. 알고리즘이 진정으로 새로운 것이라면 특허를 찾으십시오 (특정 하드웨어 구현에 연결하지 않으면 Bilski 결정에 약간 어려워졌지만). 소프트웨어를 계약에 서명하는 사람들에게만 소프트웨어를 배포하지 않는 한 소프트웨어에 의존하는 것도 쓸모가 없습니다. 그리고 당신은 이것을 경찰에 넣을 방법이 있어야합니다. 당신이 바이너리를 인터넷에 올리거나 계약없이 배포 한 순간, 나는 당신이 영업 비밀 지위를 잃은 것으로 간주 될 것입니다.

라이센스에 의존하는 것도 위험에 처해 있습니다. 리버스 엔지니어링을 금지하는 라이센스에 조항을 삽입 할 수 있지만 전 세계의 많은 관할 구역이 구체적으로 해당 조항을 허용하지 않는다고 생각할 수도 있습니다. 그리고 대부분의 크래킹을 책임지는 사람은 어쨌든 그 조항을 존중하지 않을 것입니다.

제품을 최대한 활용하는 데 집중하지 않는 이유는 무엇입니까? 목표는 군중보다 앞서 나가는 것이 아니라 그들을 완전히 잠그는 것입니다. 경쟁 그룹에서 최초의 제품을 제공하고 항상 최고의 제품을 보유하면 쓸모없는 보호 (IMNSHO)에 많은 노력을 기울이는 것보다 번영을 훨씬 더 많이 보장 할 것입니다.

이것은 단지 내 의견입니다. 나는 틀릴 수있다. 나는 전에 틀렸다. 당신은 내 아내에게만 물어봐야한다 :-)

한 가지 옵션은 라이센스 키 및/또는 하드웨어 지문을 사용하여 런타임에 민감한 코드를 해독하고 IL로 방출하는 것입니다. 이렇게하면 정적 리버스 엔지니어링 도구 (예 : 반사판)가 보이지 않습니다.

또한 디버거의 존재를 감지하고 매우 제한된 상황을 제외하고 (즉, 기계의 즉)를 제외하고 디버그 모드에서 실행을 거부하십시오.

이로 인해 디버깅을 매우 어렵게 만들고 다른 사람들에게는 거의 불가능 해집니다 (문제가 아닌 최종 사용자 앱이지만 다른 개발자가 구축 할 수있는 라이브러리 또는 프레임 워크라면 문제가됩니다).

또한 메모리 덤프에서 물리적 메모리 사본을 디스크에 그리고 오프라인 도구를 사용하면 해독 된 알고리즘이 드러날 수 있으므로 패배하기가 상당히 쉽지만 대부분의 사람들이 귀찮게하는 것보다 훨씬 더 많은 문제가 있습니다.

모든 것은 당신의 난이도와 몇 안되는 사과에 대한 억제와 도난/과도로 인한 잠재적 손실 사이의 상충 관계입니다.

행운을 빕니다. 그리고 당신이 결정한 것을 알려주십시오!

코드가 민감하다면 아무도 얻을 수없는 곳에 두십시오.

예를 들어 사람들이 기능을 노출시키는 서비스에 액세스 할 수 있도록 클라이언트 또는 웹 페이지를 제공합니다.

이 서비스는 외부 방화벽 뒤에 앉아 민감한 코드가 실행되는 내부 방화벽 뒤에 백엔드 서버와 통신 할 수 있습니다.

추가 측정을 위해 해당 코드를 난독 화하십시오.

코드에 도달하기 전에 여러 계층의 보안을 손상시켜야합니다.

C# 또는 CIL 레벨에서 난독화할 수 있지만 실제로 불가능하게 만드는 것은 IL 컴파일러가 설계 실제로 실행할 수있는 가장 효율적인 기계 코드를 작성합니다.

따라서 알고리즘을 리버스 엔지니어링하려면 기계 코드를 가져 와서 표준 분해 도구를 실행하십시오. 표준 입력 API 호출에서 표준 출력 API 호출로 진행하여 시스템을 통해 데이터를 추적합니다.

누군가가 원한다면 그것을 가질 수 있습니다.

~할 수 있다 우연히 알아 내기가 어렵습니다. 예를 들어, Java 응용 프로그램에서 관리하는 일부 데이터베이스의 내용을보고 싶었습니다. Java Decompile은 정말 지저분한 것으로 밝혀졌으며, 이상한 기능과 클래스 및 네임 스페이스는 모두 같은 이름을 가진 동일한 이름으로 가득 차있었습니다.

~할 수 있었다 내가 사용하고 있던 디 컴파일러를 수정하여 모든 것을 A가 대신 a_namespace로 바꾸면 기능 흐름이 Eclipse 호출 추적 그래프로 바로 튀어 나왔을 것입니다.

대신 나는 단지 내 손을 던지고 디 컴파일러를 다시 쓰기보다는 실제 일을 계속했다.

따라서 자연스럽게 관심있는 사람들로부터 숨길 수 있습니다.

대부분의 난독자를 사용하면 난독 화 된 방법/클래스를 지정할 수 있습니다. SmartAssembly 예를 들어, 방법이나 클래스를 속성으로 표시하는 반면, 다른 사람들은 프로세스에서 제외 할 UI에서 메소드를 선택할 수 있습니다. 당신은 과정을 꽤 잘 알려진 통제 할 수 있어야하므로 케이크를 먹고 먹을 수 있습니다.

그러나 반사를 사용하는 경우 문제가 발생합니다.

나는 그에 대한 좋은 의견을 들었다 Spices.net Obfuscator. 알고리즘을 얻는 데 필요한 시간을 크게 늘릴 수 있어야합니다.

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