>백엔드 개발 >C++ >실행 가능한 바이너리에 포함된 문자열을 어떻게 효과적으로 난독화할 수 있습니까?

실행 가능한 바이너리에 포함된 문자열을 어떻게 효과적으로 난독화할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-01 18:27:15463검색

How Can We Effectively Obfuscate Strings Embedded in Executable Binaries?

바이너리 코드의 문자열 난독화

문제 설명

실행 가능한 바이너리에 포함된 문자열 난독화는 암호화 키와 같은 중요한 정보를 무단 액세스로부터 보호하는 데 유용합니다. 그러나 문자열을 문자 배열에 저장하는 것과 같은 간단한 방법을 사용하면 분석 중에 해당 내용을 쉽게 드러낼 수 있습니다.

해결책

컴파일된 바이너리에서 문자열을 효과적으로 숨기려면 보다 정교한 접근 방식을 사용할 수 있습니다. 다음 예를 고려하십시오.

#include "HideString.h"

DEFINE_HIDDEN_STRING(EncryptionKey, 0x7f, ('M')('y')(' ')('s')('t')('r')('o')('n')('g')(' ')('e')('n')('c')('r')('y')('p')('t')('i')('o')('n')(' ')('k')('e')('y'))
DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

int main()
{
    std::cout << GetEncryptionKey() << std::endl;
    std::cout << GetEncryptionKey2() << std::endl;

    return 0;
}

이 코드는 사용자 지정 매크로 "DEFINE_HIDDEN_STRING"을 통합하여 지정된 문자열을 암호화합니다. 매크로는 제공된 시드 값에서 파생된 고유 키를 사용하여 각 문자를 인코딩합니다(예: "내 강력한 암호화 키" -> 0x7f). 시드를 기반으로 한 암호화 알고리즘이 문자 시퀀스에 적용되어 결과 데이터가 무작위로 나타나고 컴파일된 바이너리에서 식별하기 어렵게 만듭니다.

#define CRYPT_MACRO(r, d, i, elem) (elem ^ (d - i))
#define DEFINE_HIDDEN_STRING(NAME, SEED, SEQ) \
static const char* BOOST_PP_CAT(Get, NAME)() \
{ \
    static char data[] = { \
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)), \
        '' \
    }; \
    static bool isEncrypted = true; \
    if (isEncrypted) \
    { \
        for (unsigned i = 0; i < (sizeof(data) / sizeof(data[0])) - 1; ++i) \
        { \
            data[i] = CRYPT_MACRO(_, SEED, i, data[i]); \
        } \
        isEncrypted = false; \
    } \
    return data; \
}

이 접근 방식은 문자열 내에 포함된 문자열을 효과적으로 난독화합니다. 바이너리 코드로 인해 암호화 키와 알고리즘을 모르면 추출하기가 어렵습니다. 보안과 사용 편의성 사이의 균형을 유지하여 민감한 정보를 보호할 수 있는 편리한 방법을 제공합니다.

위 내용은 실행 가능한 바이너리에 포함된 문자열을 어떻게 효과적으로 난독화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.