Почему вывод «In foo, a = 7»? - PullRequest
       15

Почему вывод «In foo, a = 7»?

2 голосов
/ 15 сентября 2010
void foo(int a)
{ printf ("In foo, a = %d\n", a); }

unsigned char code[9];
* ((DWORD *) &code[0]) = 0x042444FF; /* inc dword ptr [esp+4] */
              code[4]  = 0xe9;       /* JMP */
* ((DWORD *) &code[5]) = (DWORD) &foo - (DWORD) &code[0] - 9; 
void (*pf)(int/* a*/) = (void (*)(int)) &code[0];
pf (6);

Кто-нибудь знает, где в приведенном выше коде 6 увеличивается на 1?

1 Ответ

3 голосов
/ 15 сентября 2010

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().

...