Проще говоря, нет тривиального способа сделать то, что вы хотите.Вы можете использовать библиотеку дизассемблера, такую как distorm , чтобы разобрать код вокруг экспортированных точек входа.Можно использовать некоторые эвристики, но многие из них будут работать только с 32-битными соглашениями о вызовах (__stdcall
и __cdecl
), в частности.Лично я нахожу привязки Python для этого полезными, но libdasm может сделать то же самое.
Любой другой инструмент с возможностями дизассемблера будет иметь большое значение, такой как OllyDbg или Immunity Debugger.
Примечание: если у вас есть программа, которая уже вызывает DLL, о которой идет речь, большую часть времени стоит запустить ее в отладчике (конечно, только если коду можно доверять,но ваш вопрос в основном подразумевает это) и устанавливает точки останова в экспортируемых функциях.С этого момента вы можете сделать гораздо больше из поведения во время выполнения и содержимого стека выполняемой цели.Тем не менее, это все еще будет сложно - особенно с __cdecl
, где функция может принимать произвольное количество параметров.В таком случае вам придется просеять вызывающую программу для внешних ссылок на соответствующую функцию и вывести из очистки стека, следуя call
, сколько параметров / байтов она отбрасывает.Конечно, просмотр инструкций push
перед call
также будет иметь определенную ценность, хотя это требует небольшого опыта, особенно когда вызовы вложены, и вам необходимо различить, какой push
принадлежит какому call
.
В основном вам придется разработать минимальный набор эвристик, соответствующий вашему случаю, если только вы не лицензировали один из дорогих инструментов ( и знают, как их использовать), которые поставляются с их собственными эвристиками, которые имеютобычно долго настраивались.
Если у вас уже есть лицензия IDA Pro (или плагин Hex-Rays), вы, конечно, должны ее использовать.Кроме того, бесплатные версии IDA , хотя и отстают, могут обрабатывать 32-битные файлы x86 PE (которые, конечно, включают в себя DLL), но лицензия здесь может быть препятствием в зависимости от проекта, над которым вы работаете(«Коммерческое использование запрещено»).