стек вызовов и разборка сомнений - PullRequest
2 голосов
/ 17 июня 2009

три сомнения 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?

Ответы [ 3 ]

9 голосов
/ 17 июня 2009

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 голос
/ 17 июня 2009

Для первой части вашего вопроса упомянутые смещения байтов являются позицией в функции во время выполнения, что привело к последующему вызову выше в стеке.

0 голосов
/ 17 июня 2009

1) Это смещения от начала функции до строки, которая выполнялась при создании трассировки стека.

2 & 3 - не знаю. К сожалению.

...