Справка: сбой приложения при доступе к исходному коду - PullRequest
2 голосов
/ 04 января 2011

Вот простой asm-код, который я вставил в проект VC ++. addr_curr_ebp - текущий адрес указателя EBP. Он указывает на старое значение EBP внутри стекового фрейма. Через 4 байта после этого указывается адрес возврата внутри функции приложения. Я извлекаю один байт из раздела кода. Я запускаю свой код вместе с другими приложениями, такими как gtalk, vlc и т. Д. Приложение всегда падает, когда я включаю ProbStat 1 и 2 в мой код. Когда я удаляю эти заявления, все работает нормально. Как вы думаете, это?

__asm{
       push eax
       push ebx
       push cx

       mov ebx, addr_curr_ebp
       mov eax, [ebx + 4]

       mov cl, BYTE PTR [eax - 5]  //ProbStat 1
       mov ret_5, cl  // ProbStat 2

       pop cx
       pop ebx
       pop eax
}

1 Ответ

1 голос
/ 04 января 2011

Ваш фрагмент кода недостаточно хорош, чтобы увидеть, где находится "ret_5". Вы получите автоматический сбой, если он является членом класса. Регистр ecx хранит указатель «this», вы его испортили.

Не уверен, что это делает, звучит для меня, как будто вам нужно использовать встроенную функцию _ReturnAddress. Он возвращает адрес инструкции после инструкции вызова, которая вызвала этот код. Присвойте его неподписанному символу *, сборка таким образом не требуется.

...