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

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

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

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


person ProfK    schedule 24.02.2009    source источник


Ответы (2)


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

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

person zildjohn01    schedule 24.02.2009
comment
Я только на 20-й странице или около того из 300-страничного руководства по IDA Pro и заказал книгу на 600 страниц, но на данный момент, как мне загрузить DLL в IDA Pro и по-прежнему вызывать ее из C#? Я проверяю плагин Decompiler, спасибо. - person ProfK; 25.02.2009
comment
Ой, я глаза видел цену декомпилятора. По текущему обменному курсу это в три раза больше моей платы за дом! Вероятно, достойное вложение, если я получу больше работы по реверс-инжинирингу. - person ProfK; 25.02.2009
comment
Не знаю, я никогда особо не интересовался собой. Видел его только на своей старой работе. Но когда вы получите сбой, посмотрите в AccessViolationException и посмотрите, сможете ли вы найти адрес памяти. Я знаю, что вы можете перейти прямо к адресу памяти и посмотреть, что там. Может быть, это поможет вам начать. - person zildjohn01; 26.02.2009

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

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

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

person Mike    schedule 24.02.2009