Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kami Boleh Mengelirukan Rentetan yang Terbenam dalam Binari Boleh Laksana dengan Berkesan?

Bagaimanakah Kami Boleh Mengelirukan Rentetan yang Terbenam dalam Binari Boleh Laksana dengan Berkesan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 18:27:15463semak imbas

How Can We Effectively Obfuscate Strings Embedded in Executable Binaries?

Mengelirukan Rentetan dalam Kod Binari

Pernyataan Masalah

Mengeburkan rentetan yang dibenamkan dalam binari boleh laku adalah berharga untuk melindungi maklumat sensitif seperti kunci capaian yang disulitkan daripada tanpa kebenaran. Walau bagaimanapun, kaedah mudah seperti menyimpan rentetan dalam tatasusunan aksara boleh mendedahkan kandungannya dengan mudah semasa analisis.

Penyelesaian

Untuk menyembunyikan rentetan secara berkesan dalam binari yang disusun, pendekatan yang lebih canggih boleh digunakan. Pertimbangkan contoh berikut:

#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;
}

Kod ini menggabungkan makro tersuai, "DEFINE_HIDDEN_STRING," untuk menyulitkan rentetan yang diberikan. Makro mengekod setiap aksara menggunakan kunci unik yang diperoleh daripada nilai benih yang disediakan (cth., "Kunci penyulitan kuat saya" -> 0x7f). Algoritma penyulitan berdasarkan benih digunakan pada jujukan aksara, menjadikan data yang terhasil kelihatan rawak dan sukar untuk dikenal pasti dalam binari yang disusun.

#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; \
}

Pendekatan ini secara berkesan mengaburkan rentetan terbenam dalam kod binari, menjadikannya sukar untuk diekstrak tanpa pengetahuan tentang kunci penyulitan dan algoritma. Ia mencapai keseimbangan antara keselamatan dan kemudahan penggunaan, menawarkan kaedah yang mudah untuk melindungi maklumat sensitif.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mengelirukan Rentetan yang Terbenam dalam Binari Boleh Laksana dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn