foo()
, как и ваш thunk, использует преобразование вызова __cdecl
, которое требует, чтобы вызывающая сторона помещала параметры в стек.Поэтому, когда вызывается pf(6)
, 6
помещается в стек с помощью инструкции PUSH 6
, а затем ввод вводится с помощью инструкции CALL pf
.Память, которую 6
занимает в стеке, находится на ESP+4
при вводе блока, то есть 4 байта от текущего значения регистра указателя стека ESP
.Первая инструкция thunk - увеличить значение, на которое указывает ESP+4
, таким образом, значение «6» увеличивается до «7».foo()
затем вводится инструкцией thunk JMP foo
.foo()
затем воспринимает свой параметр a
как 7
вместо исходного 6
, потому что thunk изменил стек вызовов foo()
.