Где хранятся жестко закодированные значения? - PullRequest
1 голос
/ 06 октября 2009

Для расследования мне нужно знать, где хранятся жестко запрограммированные значения.

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

Например: myFunc вызывается многими потоками одновременно. can literal "Необработанное исключение:" быть повреждено

  void myFunc()
   {
      EXCEPTION_RECORD ExceptRec
      bool  retValue=doSomething(ExceptRec);
      if(!retValue)
      {
          log ("Unhandled exception:"<< " code = " << hex << ExceptRec.ExceptionCode
            << " flags = " << ExceptRec.ExceptionFlags
            << " address = " << ExceptRec.ExceptionAddress)

         // log is macro which will insert content into ostrstream
      }
   }

Функция doSomething выглядит так:

bool doSomething(EXCEPTION_RECORD &ExceptRec)
  {
    __try
    {
       // some code here

    }
    __except (ExceptRec = *(GetExceptionInformation())->ExceptionRecord,  
        EXCEPTION_EXECUTE_HANDLER)
    {       
        return false;
    }

    return true;
  }

Ответы [ 3 ]

4 голосов
/ 06 октября 2009

Нет, строковые литералы не будут повреждены в этой ситуации, потому что они не записываются.

Однако: если вы не заблокируете / не синхронизируете использование этого выходного потока, вы можете увидеть смешивание выходных данных, которое напоминает повреждение.

3 голосов
/ 06 октября 2009

Литеральные строки хранятся в разделе .data образа вашей программы при компиляции. Раздел .data обычно отображается в постоянную память, поэтому он не может быть поврежден, как и раздел .code. Вы можете просмотреть раздел .data в Windows exe / dll, используя dumpbin.exe, поставляемый с Visual Studio.

Нет простого способа испортить этот литерал, это можно сделать, если вы измените разрешения страницы памяти, в которой он хранится, но вам придется явно сделать это с помощью API-интерфейса ОС, а не API-интерфейса c ++. Адрес, жестко запрограммированный в машинном коде во время компиляции, является относительным смещением (если мне не изменяет память, то это база данных). Это смещение добавляется к базовому адресу, предоставленному загрузчиком операционной системы.

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

3 голосов
/ 06 октября 2009

Строковые литералы обычно хранятся в доступной только для чтения части памяти процесса, и в вашем коде вы не пишете (и не должны) писать в них. Они используются для создания новой строки с содержимым этих литералов, скопированных в нее.

Если бы вы писали по адресам памяти этих литералов, вы бы знали об этом :) (т.е. это обычно приводило бы к аварийному завершению программы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...