2009-02-24 2 views
0

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

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

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

ответ

0

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

Сторона примечания: Decompiler plugin является довольно устрашающим.

+0

Я только на странице 20 или около 300 страниц учебного пособия по IDA Pro и заказал книгу на 600 страниц, но пока, как загрузить DLL в IDA Pro и все еще вызывать ее из C#? Спасибо, я заглянул в плагин Decompiler. – ProfK

+0

Ой, мои глаза видели цену декомпилятора. При текущих обменных курсах, это в три раза мой дом оплаты! Вероятно, это достойная инвестиция, если я получу более обратную инженерную работу. – ProfK

+0

Не знаю, я никогда больше не был IDA. Только видел, как он использовался на моей старой работе. Но когда вы получаете сообщение об ошибке, посмотрите в AccessViolationException и посмотрите, можете ли вы найти адрес памяти. Я знаю, что вы можете перейти прямо к адресу памяти и посмотреть, что там. Может быть, это поможет вам начать. – zildjohn01

1

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

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

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