Выход «Args to Child», показанный в kb и kv в WinDbg, всегда был очень подозрительным, даже на x86 эти столбцы не обязательно отображают вам аргументы функции.
На x86 «Args to Child» - это просто [EBP + 0x08], [EBP + 0x0C] и [EBP + 0x10] (kv показывает четыре аргумента, таким образом, последний столбец - [EBP + 0x14]). Они будут только аргументы функции, если:
- Функция использует EBP кадр
- Функция имеет стек передается аргументы (зависит от вызывающей конвенции)
- оптимизатор не повторно использовать эти места для чего-то еще
На x64, как вы отметили, первые четыре аргумента функции передаются через регистры. Однако, как часть вызывающего соглашения, вызывающий абонент должен выделять пространство «Дом» (или «Разливать») в стек для каждого из этих аргументов. Это пространство равно всегда выделено, даже если вызываемая функция занимает менее четырех аргументов. Вызванная функция может свободно использовать этот дом пространства так, как он выбирает, он может:
- Игнорируйте
- Сохранить энергонезависимые регистры там
- «Home» регистр передаваемых параметров в стек
Выход kb и kv показывает рабочее пространство на заказ (RCX Home, RDX Home, R8 Home, R9 Home). Чаще всего это пространство будет использоваться для 1 или 2 выше, поэтому оно фактически не имеет ничего общего с переданными в аргументах. Тем не менее, в сборке Debug компилятор немедленно Homes передается в аргументах, чтобы облегчить отладку.
Например, вот пролог функции с двумя аргументами, скомпилированными Debug.Обратите внимание самонаведения аргументов как первые инструкции:
0:000> u DriverEntry
mov qword ptr [rsp+10h],rdx
mov qword ptr [rsp+8],rcx
push rdi
sub rsp,0C0h
И тот же код, скомпилированный Release, используя Home Space для энергонезависимого сохранения регистра:
0:000> u DriverEntry
mov qword ptr [rsp+8],rbx
mov qword ptr [rsp+10h],rdi
push rbp
lea rbp,[rsp-57h]
sub rsp,0B0h
Это означает, что Home Space обычно довольно бесполезно с точки зрения получения аргументов функции. Тем не менее, его все еще можно использовать в качестве средства отладки для восстановления значений энергонезависимого регистра при вводе функции (т. Е. Я могу рассказать вам об уровне RBX или RDI выше, посмотрев на Home Space)
Прогулки по стопу не могут показать вам точную значения аргумента функции. Пройденные в регистры, они были пролиты на память, прежде чем регистр был использован для хранения чего-то другого. Очень больно, если вам действительно нужно знать, выкапывая адрес памяти * не * просто. В прошлый раз, когда я смотрел, это было чем-то, чему я должен был научиться жить. –