Попытка чтения или записи защищенной памяти при вызове нативной C DLL - PullRequest
0 голосов
/ 24 февраля 2009

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

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

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2009

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

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

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

0 голосов
/ 24 февраля 2009

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

Примечание: * * * * * * * * * * * * * * * * * * * * * * * *

...