Как сделать мою программу совместимой с DEP?

Это работает:

sauce = urllib.request.urlopen('https://us.diablo3.com/en/item/helm/').read()
soup = bs.BeautifulSoup(sauce, 'lxml')

item_names = soup.find_all('div', class_='item-details')
for ele in item_names:
   print(ele.h3.a.text)

item_type = soup.find_all('ul', class_='item-type')
for ele in item_type:
    print(ele.span.text)

Почему ваш код не работал:

Похоже, что вместо перебора всех элементов ваш код продолжал извлекать один и тот же элемент (find_all для всех элементы).

8
задан Kris Kumler 8 December 2008 в 21:38
поделиться

5 ответов

DEP работает в одном из двух режимов:

1) Аппаратный DEP для центральных процессоров, которые могут отметить страницы памяти как неисполняемый файл. Это помогает предотвратить определенное использование, такое как переполнение буфера.

2) Программное обеспечение DEP для центральных процессоров, которые не имеют аппаратных средств поддержкой DEP. Это не предотвращает выполнение кода в страницах данных, но вместо этого останавливает перезапись SEH (другой тип нападения).

На Windows XP с центральными процессорами, которые поддерживают его, аппаратные средства, которые DEP включен по умолчанию только для определенных системных двоичных файлов Windows, и также для программ, которые принимают решение "подписаться".

На Vista с центральными процессорами, которые поддерживают его, аппаратные средства, которые DEP включен по умолчанию почти для всех процессов. Это может иногда быть проблематично, обычно для более старых программ и драйверов, и для независимых поставщиков программного обеспечения, которые не сделали никакого тестирования Vista.

Таким образом, я подозреваю, что первый шаг должен обнаружить, имеете ли Вы дело с программным обеспечением или аппаратными средствами DEP. Кроме того, Вы используете C#/VB или Управляемый С++? И Вы используете какой-либо собственный код или компоненты? Если Ваше приложение использует собственный компонент или элемент управления ActiveX, который был создан с помощью старой платформы ATL, то довольно возможно, что приложение приведет к сбою с аппаратными средствами DEP.

Начиная с Платформы.NET 2,0 SP1 я полагаю, что компилятор C# испускает управляемый код, который совместим с DEP. Но если Ваше приложение генерирует исключения DEP, то можно попытаться очистить флаг IMAGE_DLLCHARACTERISTICS_NX_COMPAT для исполняемого файла. Чтобы сделать это, Вы используете EDITBIN.EXE от набора инструментов VC как так:

editbin.exe /NXCOMPAT:NO <your binary>

При использовании Visual Studio можно добавить, что постсборка ступает в проект исполняемого файла. Необходимо будет установить среду так, чтобы зависимости EDITBIN могли быть разрешены. Когда я использую собственный код как часть моего приложения, шаг постсборки похож на это:

call $(DevEnvDir)..\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO $(TargetPath)  
17
ответ дан 5 December 2019 в 05:35
поделиться

Более старыми версиями ATL не является знающий DEP, поэтому при использовании каких-либо элементов управления ActiveX, которые создаются с помощью ATL и были основаны на той версии ATL (версия 7.1 и ниже, я думаю), Вы получите ошибки DEP.

Как последнее прибежище можно на самом деле отключить DEP для процесса путем вызова API-функции: SetProcessDEPPolicy.

Больше информации о SetProcessDEPPolicy

5
ответ дан 5 December 2019 в 05:35
поделиться

Компиляторы, которые поставили с.NET 2,0 SP1, включают флаг NXCOMPAT в заголовке исполняемого файла. Можно выключить тот флаг на шаге Сборки Сообщения путем выполнения EditBin.exe с/NXCOMPAT:NO опцией.

5
ответ дан 5 December 2019 в 05:35
поделиться

Запустите путем попытки выяснить, где и как программа перестала работать. Можно ли копировать проблему о системе? С включением DEP для приложения в Вашей системе? Когда можно копировать проблему и получить ошибку (нарушение прав доступа), можно обратиться к фиксации программы.

См. статью MSDN для получения информации о DEP.

0
ответ дан 5 December 2019 в 05:35
поделиться

FWIW, стоит прямо упомянуть, что во многих случаях приложения не «несовместимы с DEP», а скорее вот-вот вылезут из строя, и DEP «нырнул, чтобы спасти положение». Очень часто, отключив DEP, вы обнаруживаете, что сталкиваетесь с «обычным» AV.

Если ваш проект написан исключительно на .NET 3.0, это почти наверняка так, потому что .NET не делать любые «сумасшедшие» вещи, запускающие DEP (например, переключение функций и т. д.).

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

3
ответ дан 5 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: