Приблизительный код: Код (Text): ABCF proc LOCAL buff [1024]:byte ;Начало кода, ничего интересного ...... call sendd ...... call sendd ...... call sendd ...... invoke CallingProc,.... test ebx,ebx jz metka quit: xor eax,eax ret sendd: mov esi,[esp] invoke send,s,addr buff,sizeof buff jmp esi ABCF endp Вопрос в следующем: нужно ли выравнивать стек при таком локальном вызове? Ведь в стек ложится адрес возврата... просто вытолкнуть его pop? Или нет необходимости?
twgt ret Обрати внимание, что sendd: ... jmp esi внутри ABCF proc ... ABCF endp, которая в свою очередь содержит LOCAL buff [1024]:byte, что означает, что в ней присутствует невидимый пролог и эпилог. OFFSIDE нужно ли выравнивать стек В показанном тобой коде - необязательно. ps afaik у send'а четыре параметра.
q_q Действительно. В таком случае можно сделать так: Код (Text): sendd: pop eax push 0 push sizeof buff push addr buff push s push eax jmp send Тогда по идее ret из send'а должен вернуться после call sendd. Не так ли?!
twgt Поправь сам. Hint что будет первым параметром send'а? можно сделать так Зачем? Зачем ТС придумал sendd? Экономия на push'ах?
twgt Про первый парамер Я НЕ ПРАВ. Код #4 похож на правду, осталось разобраться какой ассемблер переварит push addr buff.
OFFSIDE Разумеется mov esi,[esp] invoke send,s,addr buff,sizeof buff jmp esi не только мусорит в стеке, оставляя за собой не вытолкнутые адреса возврата, но и портит работу предсказателя ret, что приведёт к лишним тормозам, даже если чистить стек через pop или add esp, 4 лучше сделать sendd: invoke send,s,addr buff,sizeof buff db 0C3h ; ret без эпилога И все проблемы решатся