실행 가능한 바이너리에 포함된 문자열 난독화는 암호화 키와 같은 중요한 정보를 무단 액세스로부터 보호하는 데 유용합니다. 그러나 문자열을 문자 배열에 저장하는 것과 같은 간단한 방법을 사용하면 분석 중에 해당 내용을 쉽게 드러낼 수 있습니다.
컴파일된 바이너리에서 문자열을 효과적으로 숨기려면 보다 정교한 접근 방식을 사용할 수 있습니다. 다음 예를 고려하십시오.
#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!