У меня есть родная dll C, которая экспортирует одну функцию, кроме DllEntryPoint, FuncX. Я пытаюсь выяснить, как FuncX взаимодействует со своим вызывающим абонентом, потому что он имеет возвращаемый тип void и не имеет параметров. Когда я вызываю его из обвязки С#, я получаю AccessViolationException - Попытка чтения или записи в защищенную память.
У меня есть подозрение, что его клиентское приложение может выделять буфер для отправки или получения значений из dll. Это верная догадка?
Я не могу отладить клиентское приложение, потому что оно почему-то не запускается, поэтому я не могу запустить его и подключиться к процессу. Я могу, однако, разобрать его в IDA Pro, но не знаю, как, если я смогу, попытаться отладить его там.
Ответ 1 · zildjohn01
Я бы попробовал загрузить саму DLL в IDA Pro. Будем надеяться, что C# сохранит собственный стек вызовов, и вы сможете посмотреть код, в котором происходит сбой DLL.
Примечание: плагин декомпилятора просто великолепен.
Ответ 2 · рейтинг 1 · Mike
Если в рассматриваемой DLL есть какие-либо статические или глобальные символы, вполне возможно, что вся связь осуществляется через эти символы. У вас есть какой-нибудь код API, который выглядит так, как будто он это делает?
Маловероятно, что DLL использует предоставленный клиентом буфер, поскольку и клиент, и сервер должны знать базовый адрес этого буфера, и вы не можете запрашивать у calloc или malloc "предпочтительный" адрес во время вызова.
Вы также можете попробовать запустить link /dump /symbols и указать его на свою DLL. Это покажет вам список экспортированных символов в вашей DLL. Удачи!