Фундаментальные основы хакерства


Идентификация аргументов функций - часть 15


; порядк арументов на обратный – вот и все. Увы, это не так просто. Если имело

; место явное преобразование типа функции в cdecl, то Borland C++ без лишней

; самодеятельности поступил бы так, как ему велели и тогда бы обращение

; порядка аргументов дало бы неверный резлуьтат!

; Впрочем, подлинный порядок следования аргументов в прототипе функции

; не играет никакой роли. Важно лишь связать передаваемые и принимаемые

; аргументы, что мы и сделали.

; Обратите внимание: это стало возможно лишь при совместом анализе и вызываемой

; и вызывающей функуий! Анализ лишь одной из них ничего бы не дал!

; Примечание: никогда не следует безоговорочно полагаться на достоверность

; строки спецификаторов. Посколкьу, спецификаторы формируются вручную самим

; программистом, тут возможны ошибки, под час весьма трудноуловимые и дающие

; после компиляции чрезвычайно загадочный код!

; Подробнее об этом рассказывается в статье

; "неизвестная уявзимость ошибка printf", помещенный в главу "Приложения"

 

 

add    esp, 14h

pop    ebp

retn

MyFunc endp

Листинг 59

Так, кое-какие продвижения уже есть – мы уверенно восстановили прототип нашей первой функции. Но это только начало… Еще много миль предстоит пройти, прежде чем будет достигнут конец главы. Если вы устали – передохните. Тяпните пивка (колы), позвоните своей любимой девушке (а, что, у хакеров и любимые девушки есть?), словом, как хотите, но обеспечьте свежую голову. Мы приступаем к еще одной нудной, но важной теме – сравнительному анализу различных типов вызовов функций и их реализации в популярных компиляторах.

Начнем с изучения стандартного соглашения о вызове – stdcall. Рассмотрим следующий пример:

 

#include <stdio.h>

#include <string.h>

 

__stdcall MyFunc(int a, int b, char *c)

{

return a+b+strlen(c);

}

 

 

main()

{

printf("%x\n",MyFunc(0x666,0x777,"Hello,World!"));

}

Листинг 60 Демонстрация stdcall

 

Результат его компиляции Microsoft Visual C++ с настройками по умолчанию должен выглядеть так:




- Начало -  - Назад -  - Вперед -