строки в коде реализации C ++ не должны присутствовать в выходном двоичном файле. Как исправить - PullRequest
0 голосов
/ 13 июня 2019

Я не использую опцию -g компилятора, но все еще получаю строки в моем исполняемом файле, которые легко просматривать.например, с помощью программы для работы со строками.

Вот мой код:

test.hpp:

#ifndef TEST_HPP_
#define TEST_HPP_

#include <string>

namespace ns1 {

class Test
{
public:
  std::string Get(const std::string& root);

private:
  void append_other_stuff(std::string& s);
};

} // namespace ns1

#endif // TEST_HPP_

test.cpp:

#include "test.hpp"

static const char* privatePart = "_hideme_";

namespace ns1 {

std::string Test::Get(const std::string& root) {

  std::string result = root + "_fixed_" + privatePart;
  append_other_stuff(result);
  return result;   
}

void Test::append_other_stuff(std::string& s) {

  // all these string must be hidden
  static char middle1[] = {'s','e','c','r', 'e','t','1','\0'};
  static char middle2[] = {'s','e','c','r', 'e','t','2','\0'};
  static char endbit[] = {'s','e','c','r', 'e','t','3','\0'};

  s += middle1;
  s += middle2;
  s += endbit;
}

}

main.cpp:

#include "test.hpp"

#include <iostream>

using namespace std;

int main() {
  ns1::Test t1;
  cout << t1.Get("123") << endl;
}

Makefile:

CXX = g++
CXXFLAGS = -Wall -std=c++11


main.o: main.cpp
    $(CXX) $(CXXFLAGS) -c main.cpp

test.o: test.cpp test.hpp
    $(CXX) $(CXXFLAGS) -c test.cpp

prog: main.o test.o
    $(CXX) $(CXXFLAGS) main.o test.o -o prog

вывод (сокращен) при использовании строк:

строк prog

_hideme_
_fixed_
;*3$"
zPLR
secret1
secret2
secret3

evenесли я запускаю команду strip:

strip -s -g prog

строки, которые я хочу скрыть, все еще находятся в проге.

Как я могу скрыть эти строки?

1 Ответ

4 голосов
/ 13 июня 2019

Чтобы прокомментировать приведенный выше комментарий, невозможно скрыть эти строки, используя любой стандартный инструмент компилятора или компоновщика. Вам придется реализовать это самостоятельно.

Вы не говорите, почему вы хотите это сделать, поэтому я не решаюсь дать совет, как это сделать. BE AWARE любой, у кого есть ваша программа, может декодировать эту строку самостоятельно, если захочет, независимо от того, сколько вы запутываетесь: вы будете скрывать строку только от случайного расследования. Невозможно надежно хранить секреты в программе, если для декодирования не требуется внешний ввод. Таким образом, вы должны абсолютно НИКОГДА использовать эти методы для хранения паролей или любых других секретов в вашей программе.

С этим предупреждением есть простые способы не показывать вещи с помощью strings, если это ваша единственная цель: например, вы можете сохранить строку в статическом массиве целых, по одному для каждого символа, а затем преобразовать его обратно в строку во время выполнения.

...