Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Попытка чтения или записи защищенной памяти при вызове собственной C DLL

Автор вопроса: ProfKОтветов: 2

У меня есть родная dll C, которая экспортирует одну функцию, кроме DllEntryPoint, FuncX. Я пытаюсь выяснить, как FuncX взаимодействует со своим вызывающим абонентом, потому что он имеет возвращаемый тип void и не имеет параметров. Когда я вызываю его из обвязки С#, я получаю AccessViolationException - Попытка чтения или записи в защищенную память.

У меня есть подозрение, что его клиентское приложение может выделять буфер для отправки или получения значений из dll. Это верная догадка?

Я не могу отладить клиентское приложение, потому что оно почему-то не запускается, поэтому я не могу запустить его и подключиться к процессу. Я могу, однако, разобрать его в IDA Pro, но не знаю, как, если я смогу, попытаться отладить его там.

debuggingwinapidllreverse-engineering

Ответы

Ответ 1 · zildjohn01

Я бы попробовал загрузить саму DLL в IDA Pro. Будем надеяться, что C# сохранит собственный стек вызовов, и вы сможете посмотреть код, в котором происходит сбой DLL.

Примечание: плагин декомпилятора просто великолепен.

Ответ 2 · рейтинг 1 · Mike

Если в рассматриваемой DLL есть какие-либо статические или глобальные символы, вполне возможно, что вся связь осуществляется через эти символы. У вас есть какой-нибудь код API, который выглядит так, как будто он это делает?

Маловероятно, что DLL использует предоставленный клиентом буфер, поскольку и клиент, и сервер должны знать базовый адрес этого буфера, и вы не можете запрашивать у calloc или malloc "предпочтительный" адрес во время вызова.

Вы также можете попробовать запустить link /dump /symbols и указать его на свою DLL. Это покажет вам список экспортированных символов в вашей DLL. Удачи!

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы