стек вызовов и разборка сомнений
-
06-07-2019 - |
Вопрос
Три сомнения 1) Предположим, я получаю стек вызовов, как показано ниже
user32.dll!_InternalCallWinProc@20() + 0x28 bytes
user32.dll!_UserCallWinProcCheckWow@32() + 0xb7 bytes
user32.dll!_CallWindowProcAorW@24() + 0x51 bytes
user32.dll!_CallWindowProcW@20() + 0x1b bytes
Теперь, какие байты упоминаются в конце каждой функции? Как для первого утверждения, что составляет 0x28 байт.
2) Как поставить точку останова на dll системы Windows в VS? В windbg я могу найти определенную функцию Windows dll системы как
>x wininet!*funcA*
с помощью этой команды я могу получить адрес этой функции и установить точку останова. Могу ли я сделать то же самое в Visual Studio? Р>
3) У меня нет файла символов DLL. Стек вызовов, который я получаю при разборке,
7814XXX0 call dword ptr [__imp__WindowsFuncA@32 (781EXXXXh)]
Что такое __ imp __
в стеке вызовов выше? Означает ли это, что эта функция Windows подключена к какой-то другой DLL?
Решение
1) Это смещение в байтах инструкции, выполняемой в этом стеке, относительно начала функции.
2) Введите что-то вроде этого в диалоговом окне Новая точка останова:
{,,user32.dll}_SendMessageW@16
где 16
- это число байтов параметров, ожидаемых функцией (в Win32 это почти всегда в 4 раза больше количества параметров). W
относится к версии API для Unicode; используйте A
, если вы отлаживаете приложение ANSI.
3) __ imp __
ссылается на таблицу импорта DLL - код текущего модуля перенаправляется через JMP
в настоящую библиотеку DLL Windows и символ __ imp __
относится к этому JMP
. Эти JMP
находятся в таблице в DLL или EXE, которые выполняют вызов.
Другие советы
Для первой части вашего вопроса упомянутые смещения байтов являются позицией в функции во время выполнения, что привело к последующему вызову выше в стеке.
1) Это смещения от начала функции до строки, которая выполнялась при создании трассировки стека.
2 & amp; 3 - не знаю. К сожалению.