首页 > 编程语言 >C++字符串常见混淆方案

C++字符串常见混淆方案

时间:2024-04-19 20:13:14浏览次数:22  
标签:__ 混淆 const string C++ constexpr 字符串 my define

正文

将字符串转换成等效int数组

std::vector<uint32_t> convert_wstring_to_int_array(const wchar_t *str) {
  std::vector<uint32_t> vec;

  for (size_t i = 0; i < wcslen(str); i += 2) {
    uint32_t val = (uint32_t)str[i] << 16 & 0xffff0000;
    if (i < wcslen(str) - 1) {
      val |= (uint32_t)str[i + 1];
    }
    vec.push_back(val << 8);
  }

  if (vec.back() & 0xffff) {
    vec.push_back(0);
  }

  return vec;
}

std::vector<uint32_t> convert_string_to_int_array(const char *str) {
  std::vector<uint32_t> vec;
  for (int i = 0; i < int(strlen(str)); i += 4) {
    uint32_t val = (uint32_t)str[i] << 24 & 0xff000000;
    if (i < int(strlen(str)) - 1) {
      val |= (uint32_t)str[i + 1] << 16 & 0xff0000;
    }
    if (i < int(strlen(str)) - 2) {
      val |= (uint32_t)str[i + 2] << 8 & 0xff00;
    }
    if (i < int(strlen(str)) - 3) {
      val |= (uint32_t)str[i + 3] & 0xff;
    }
    vec.push_back(val);
  }

  return vec;
}

编译时xor混淆字符串

#pragma once

namespace zzz {

#define XSTR_SEED                                                                             \
    ((__TIME__[7] - '0') * 1ull + (__TIME__[6] - '0') * 10ull + (__TIME__[4] - '0') * 60ull + \
     (__TIME__[3] - '0') * 600ull + (__TIME__[1] - '0') * 3600ull + (__TIME__[0] - '0') * 36000ull)

constexpr unsigned long long linear_congruent_generator(unsigned rounds) {
    return 1013904223ull +
           (1664525ull * ((rounds > 0) ? linear_congruent_generator(rounds - 1) : (XSTR_SEED))) % 0xFFFFFFFF;
}

#define Random() linear_congruent_generator(10)
#define XSTR_RANDOM_NUMBER(Min, Max) (Min + (Random() % (Max - Min + 1)))

// FIXME: Why use XSTR_RANDOM_NUMBER(0, 0xFF) will cause undefined behavior??
constexpr const unsigned long long XORKEY = 0x56; // XSTR_RANDOM_NUMBER(0, 0xFF);

template <typename Char>
constexpr Char encrypt_character(const Char character, int index) {
    return character ^ (static_cast<Char>(XORKEY) + index);
}

template <unsigned size, typename Char>
class Xor_string {
public:
    const unsigned _nb_chars = (size - 1);
    Char _string[size];

    // if every goes alright this constructor should be executed at compile time
    inline constexpr Xor_string(const Char* string) : _string{} {
        for (unsigned i = 0u; i < size; ++i) _string[i] = encrypt_character<Char>(string[i], i);
    }

    // This is executed at runtime.
    // HACK: although decrypt() is const we modify '_string' in place
    const Char* decrypt() const {
        Char* string = const_cast<Char*>(_string);
        for (unsigned t = 0; t < _nb_chars; t++) {
            string[t] ^= (static_cast<Char>(XORKEY) + t);
        }
        string[_nb_chars] = '\0';
        return string;
    }
};

}  // namespace zzz

#define XorS(name, my_string) \
    constexpr zzz::Xor_string<(sizeof(my_string) / sizeof(char)), char> name(my_string)
// Because of a limitation/bug in msvc 2017 we need to declare zzz::Xor_string() as a constexpr
// otherwise the constructor is not evaluated at compile time. The lambda function is here to allow this declaration
// inside the macro because there is no such thing as casting to 'constexpr' (and casting to const does not solve this
// bug).
#define XorString(my_string)                                                                         \
    [] {                                                                                             \
        constexpr zzz::Xor_string<(sizeof(my_string) / sizeof(char)), char> expr(my_string); \
        return expr;                                                                                 \
    }()                                                                                              \
        .decrypt()

#define XorWS(name, my_string) \
    constexpr zzz::Xor_string<(sizeof(my_string) / sizeof(wchar_t)), wchar_t> name(my_string)
#define XorWideString(my_string)                                                                           \
    [] {                                                                                                   \
        constexpr zzz::Xor_string<(sizeof(my_string) / sizeof(wchar_t)), wchar_t> expr(my_string); \
        return expr;                                                                                       \
    }()                                                                                                    \
        .decrypt()

// Crypt normal string char*
#define xorstr(string) XorString(string)

// crypt wide characters
#define xorstrw(string) XorWideString(string)

标签:__,混淆,const,string,C++,constexpr,字符串,my,define
From: https://www.cnblogs.com/PeterZ1997/p/18146691

相关文章

  • 十六进制字符串每隔32个字母换行显示
     //每32个字节换行打印publicstaticvoidformatPrint(StringhexStr){intno=0;intlength=hexStr.length();for(inti=0;i<length;i++){if((i+1)%32==0){Strings=twoSpaceTwo(hexStr.substring(i-31,i+1));System.out.println(......
  • 为什么有很多出名开源的C/C++方面的高性能网络库,比如libevent,boost-asio,有些企业还要
    为什么有很多出名开源的C/C++方面的高性能网络库,比如libevent,boost-asio,有些企业还要自己写?    我个人很倾向用著名的开源软件来完成功能需求,但是发现在实际开展中很多人会反对开源,而要求自己实现一套,我不知道是我考虑太少,还是他们太武断。 因为KPI的原因更多......
  • 美国政府敦促开发者:停止使用 C、C++
    美国政府敦促开发者:停止使用C、C++开源Linux​ ​关注他 5人赞同了该文章整理|屠敏出品|CSDN(ID:CSDNnews)“C、C++不安全,新应用开发时就别用了,旧应用应该采取迁移行动”,近日,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通......
  • 音视频开发是不是C++开发中最难的细分方向?
    音视频开发是不是C++开发中最难的细分方向?     关注者611被浏览599,438关注问题​写回答​邀请回答​好问题7​3条评论​分享​  查看全部67个回答luluce不关心国事的程序猿(不会QT)。已关注......
  • C++六种内存序详解
    前言要理解C++的六种内存序,我们首先须要明白一点,处理器读取一个数据时,可能从内存中读取,也可能从缓存中读取,还可能从寄存器读取。对于一个写操作,要考虑这个操作的结果传播到其他处理器的速度。并且,编译器的指令重排和CPU处理器的乱序执行也是我们需要考虑的因素。 我们先看......
  • [8] UE C++ Mario
    创建了盒子,定义了盒子的碰撞位置能在if里面直接声明赋值局部变量但不能赋值成员变量friend关键词应用导入类的时候如果是灰色就删掉,并且查看头文件 ......
  • 【学习笔记】 字符串基础 : 后缀自动机(基础篇)
    本文只介绍关于\(\mathbf{SAM}\)的基本概念与实现后缀自动机是什么类似\(\text{AC}\)自动机,后缀自动机(\(\text{SAM}\))是能且只能接收字符串所有后缀的自动机我们首先要知道,\(\mathbf{SAM}\)是只能接收所有后缀的结构而不是只能维护后缀的结构事实上\(\mathbf{SAM}\)......
  • c++函数模板和运行机制
    C++_templatec++提供了函数模板(functiontemplate.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函......
  • c++ double进行精度截取 (转)
    使用boost/multiprecision/cpp_dec_float.hpp #include<boost/multiprecision/cpp_dec_float.hpp>usingboost::multiprecision::number;usingboost::multiprecision::cpp_dec_float_50;intmain(){cpp_dec_float_50v1("5726.867366095");......
  • 判断一个字符串是否为另一个字符串的子串
    1、string类函数findC++的string类提供了字符串中查找另一个字符串的函数find。其重载形式为:string::size_typestring::find(string&);功能为在string对象中,查找参数string类型的字符串是否存在,如果存在,返回起始位置。不存在则返回string::npos。#include<iostream>#includ......