Вопрос

Три сомнения 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 - не знаю. К сожалению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top