В настоящее время я изучаю аварийный дамп Windows, и отладчик Visual Studio показывает мне «недопустимую инструкцию 0xC000001D
» при открытии файла дампа. Позиция кода, в которой показана эта ошибка, показывает разборку в следующем примере:
void g(int x) {
00401E80 push ebp
00401E81 mov ebp,esp
if(x > 20) {
00401E83 cmp dword ptr [x],14h
00401E87 jle g+14h (401E94h)
x *= 4;
>00401E89 db 0fh // illegal instruction here
00401E8A db 0fh
00401E8B xadd eax,esp
00401E8E add cl,byte ptr [ecx+9EB0845h]
x += 42;
00401E94 mov ecx,dword ptr [x]
...
Я вручную создал вышеупомянутый пример в отладчике, переписав код функции некоторыми недопустимыми значениями в окне памяти отладчиков, но аварийный дамп, который я изучаю, показывает ту же запись db 0fh
, очевидно указывающую на недопустимую инструкцию. Код также похож на то, что отображает мой файл дампа, в котором все инструкции перед недопустимой инструкцией кажутся действительными и соответствуют исходному коду.
Теперь вопрос возможно ли вообще в нормально скомпилированной программе C ++ - которая не мешает ограничениям доступа к странице памяти - (Visual C ++ 2005 в Windows XP) испортить сегмент кода процесса?
Если я пытаюсь записать адрес функции в приведенном выше примере из кода, я всегда получаю нарушение прав доступа, то есть страница памяти сегмента кода выглядит защищенной от записи.
{
void* fnAddr = &g; // non-portable but OK in VC++
unsigned int x = 0xDEADBEEF;
// Simulate memory corruption: Try to write something to the code segment:
memcpy((char*)fnAddr+4, &x, sizeof(x)); // generated 0xC0000005 Access Violation
g(42); // call messed up function - never get here
}
Известны ли вам ситуации, когда на самом деле можно было бы непреднамеренно перезаписать что-либо в сегменте кода?
Я должен добавить, что настоящая программа намного сложнее, с большим количеством виртуальных функций, некоторыми указателями на функции-члены и т. Д., И, к сожалению, проблема не воспроизводима, в настоящее время у нас есть только один файл дампа, который выглядит нормально , - Тем не менее, файл дампа отображает недопустимую инструкцию в сегменте кода, и я бы не подумал, что можно испортить сегмент кода.