Pull to refresh
159
0
Александр (Rouse_) Багель @Rouse

Инженер — программист

Send message
Для Windows XP есть полностью рабочий пример: rouse.drkb.ru/winapi.php#fwoledragdrop
Для Vista и выше, в нем работает только копирование в буфер и вставка, перетаскивание не срабатывает.
По всей видимости требуется поддержка дополнительных интерфейсов, по аналогии с реализацией расширений проводника на базе IShellFolder (там требовалось поддержка IPersistFolder2 и еще какой-то, на вскидку уже не помню).
Пока что руки не дошли для добавления поддержки Vista и выше, как появиться время — обновлю пример.
Смотря как запускать, если собрать экзешник из примера и запустить его из под админа, то перетащить на него файлы из проводника не получиться.
Ну я думаю это перебор :)
Так можно и псевдохэндлы для процесса и нити (-1/-2) в константы вынести.
Я думаю здесь логика проста — есть список, список ZERO_BASE, т.о. в списке не может быть элементов по отрицательному индексу.
А раз это не возможно — зачем такие сложности? :)
Хм, ну вообще-то они приводятся (здесь я немного повелся на Ваше утверждение и не проверил сам MSDN) :)

http://msdn.microsoft.com/en-us/library/windows/desktop/bb776408(v=vs.85).aspx

If the index value is 0xFFFFFFFF, the return value is a count of the dropped files. Note that the index variable itself returns unchanged, and therefore remains 0xFFFFFFFF.
Так это-ж Delphi :)
Unsigned тип данных, поэтому в скобках я и привел DWORD(-1) — что есть аналог…
Кстати у автора данной статьи есть и вторая часть материала: www.delphidabbler.com/articles?article=24
Она сейчас находится в процессе перевода, но в принципе все описанное в ней гарантированно должно работать под XE3.
Либо есть мой вариант реализации: rouse.drkb.ru/winapi.php#fwoledragdrop
Судя по коду (пардон переводил на лету без тестирования) он должен работать в том числе и под XE3.
По крайней мере я не вижу препятствий, ибо работа со строковыми буферами в юникодных версиях Delphi автоматом будет нивелироваться вызовом DragQueryFileW
Можно и готовым решением, только это статья по реализации перехвата с использованием Delphi, под которую кстати я не знаю, существует ли порт API Detours или нет.
Задача статьи была дать понимание как это работает, а готовые решения они немного для другого предназначены. :)
Спасибо, добавил в коллекцию :)
— если в начале перехватываемой функции сразу за основным телом следуем XMM инструкция — то вы получите проблему
— если на один исполняемый образ ссылаются более 1 активного потока выполнения

Эмм, так ведь это применяется только в случае HotPatch. т.е. когда мы имеем функцию которая всегда начинается с двубайтовой инструкции и предваряется пятью нопами. Т.е. что будет в начале MOV EDI, EDI, что вместо нее будет JMP SHORT -7, на XMM инструкцию это никак не повлияет. То-же относится и к лимитированию по длину прыжка — у нас всегда есть пять нопов перед процедурой.

Что-же по поводу CMPXCHG8B то именно для данной ситуации он ИМХО избыточен, но вот если у нас нет первой двубайтовой инструкции и нопов спереди, то его использование более чем оправдано.

Ну а Dr регистры — это все-же отладчик, это уже немножко вне рамок статьи :)
Примерно понял о чем вы, спасибо, попробую пересмотреть подачу материала.
Я постараюсь объяснить свою позицию.
Ms-Rem очень отличный специалист и энтузиаст своего дела.
Но он больше придерживается позиции взлома ПО и практически не рассматривает в своих статьях методы противодействия.
Почему придерживается?
Да если честно, я считаю что он просто сошел со сцены и стараюсь не верить в ту историю с аварией.
(по крайней мере очень сильно стараюсь не верить ибо ходят слухи не первый год, что это не так).
Я же работаю немного с другой стороны баррикад, где приходится знать всю эту «подноготную» плюс немножко еще, чтобы опережать хотя-бы на шаг.
Это я понимаю, но тут двояко…
Кстати немножко по Вашей статье, я заметил в ней небольшой недочет (правда не принципиальный).

Кроме того, если размер функции меньше 5 байт, перехват просто невозможен.


Это немного не верно, минимальный размер функции которую действительно нельзя перехватить равен одному байту, но в данном случае это будет RET и смысл в его перехвате попросту отсутствует.
Для двубайтовых функций есть диапазон в 256 байт.
Т.е. места достаточно для JMP SHORT, при условии что в ближайших 127 байтах сверху или снизу, будет неиспользуемые 5 байт для JMP NEAR OFFSET.
Хм, уже второй раз сравнивают, что-ж за беда? :)
Общее направление просто похожее :)
Ваша статья хорошая, не спорю.
Правда у Вас рассмотрен исключительно сплайсинг, я же попытался рассмотреть данный вопрос немного более обширно. Надеюсь получилось ;)
А кто сказал, что это используется в реальном ПО? :)
Это код из определенной утилиты, высылаемой пользователю в том случае, если у него что-то там опять не работает :)
Да чего там узнавать. Первый — жена, второй «Тестовый звонок в Skype» :)

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity