![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
доброго времени суток!
помогите решить проблему. работает по win XP, отказывается работать под Win 7. алгоритм: 1) программа получает SeDebugPrivilege 2) программа определяет PID чужого процесса - определяет корректно 3) программа определяет хэндл - вот тут ХР отрабатывает нормально, а 7-ка в режиме совместимости с вин ХР показывает один хендл, без совместимости - другой, и оба неверные. в чем беда? hProc := OpenProcess(PROCESS_ALL_ACCESS, false, PID); вместо PROCESS_ALL_ACCESS были испробованы всеразличные, в т.ч. PROCESS_QUERY_LIMITED_INFORMATION, PROCESS_VM_READ и прочие. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
каждое открытие даёт разный хендл. По числовому значению их сравнивать нельзя
как ты определяешь что хендл "неправильный"? -------------------- Обижено школьников: 8 |
|||
|
||||
| Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 2 Всего: 4 |
у меня с ТС немного сходный вопрос - можно я паровозом встану?
если прога запущена в IDE - показывает один хендл (хоть 10 раз перезапускаю - он не изменяется и равен, скажем, 1944). а если из проводника запускаю - хендл совершенно другой (и тоже хоть 20 раз перезапущу - определится один и тот же, скажем, 64). но у меня WinXP. и совместимостями я не баловался. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
это значит что от проводника и ide процесс получает разный набор унаследованных хендлов, и нужный получает разной место в таблице хендлов процесса
-------------------- Обижено школьников: 8 |
|||
|
||||
| Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 2 Всего: 4 |
видимо, я не так выразился. или сам не так понял
понятно что хэндл будет разный для 1.exe сколько раз я ее буду перезапускать. но почему же у другой проги хэндлы разные при разных обстоятельствах? для ТС: попробуй "суповой набор" OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, FALSE, ProcID); должно под 7й отработать нормально Это сообщение отредактировал(а) Delvish - 27.9.2012, 11:44 |
|||
|
||||
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
из модуля AdvAPIHook под экспихой InjectDLL работает - библиотека загружается в сторонний процесс и показывает MessageBox, а под 7й MessageBox не появляется. PID процесса верный, значит раз не появляется MessageBox, то проблема с хэндлом. тем более что программа определяет хэндл стороннего процесса в режиме совместимости и без него по разному - странно ведь
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
прочитай это и посмотри на рисунки в статье http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx ничего странного. хендлы не обязаны быть одинаковыми. ты должен только проверять вернул ли OpenProcess корректный хендл (не 0). А на само значение хендла не смотри что касается того что не работает инжект, то в семерке тому может быть много других причин. Если OpenProcess не вернула 0 значит у тебя есть валидный хендл -------------------- Обижено школьников: 8 |
|||
|
||||
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
спасибо за ответ. OpenProcess возвращает не ноль - 100 без режима совместимости (сколько раз ни запускал) и около 250 в режиме совместимости. понять бы теперь что за причины отсутствия инжекта в 7й... если есть идея - расскажите, пожалуйста. у меня пока что ничего путного в голове не появляется
|
|||
|
||||
| Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 2 Всего: 4 |
хммм... я считал что хэндл при открытии процесса является "глобальным", сродни PID'у, и должен быть постоянным для запущенного приложения, сколько бы раз к нему не обратились. спасибо за просвещение! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| mayor123 |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
с библиотекой все просто - один лишь MessageBox(0, 'It is a work!', 'Inject', mb_OK);
код программки: используемые функции из AdvAPIHook: взятие ID процесса
включение Debug-привилегий (вроде без них в 7й никак)
инъекция
и сам код программочки:
Это сообщение отредактировал(а) mayor123 - 27.9.2012, 14:16 Присоединённый файл ( Кол-во скачиваний: 3 )
ADVAPIHOOK.pas 52,70 Kb |
||||||||
|
|||||||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
в InjectDll есть молчаливые выходы
if Memory = nil then Exit; if hThread = 0 then Exit; и не проверяется что возвращает WriteProcessMemory посмотри не наворачивается ли где-то там также базовые адреса системных дллок в семерке уже не обязаны совпадать во всех процессах (чтобы совпадали оба процесса должны работать в режиме совместимости с хр) Добавлено через 51 секунду еще этот код не будет работать на юникодных делфях и х64-виндах -------------------- Обижено школьников: 8 |
|||
|
||||
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
винда 32 бита, использую Delphi 7. чуть позже попробую с выводом промежуточных результатов в лог по каждому сомнительному моменту, о результатах отпишу. спасибо за идеи
|
|||
|
||||
| Illusion Dolphin |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 4 Всего: 63 |
MSDN:
Не работает под гостем.
Вы ведь в курсе что в DLL_PROCESS_ATTACH нельзя вызывать подобные функции? -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||||||
|
|||||||||
| Delvish |
|
|||
![]() oO ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 13.12.2006 Репутация: 2 Всего: 4 |
так тут у него вроде не виртуальная dll с отображением в памяти чужого процесса с измененной таблицей импорта и прочим. разве загруженная таким образом библиотека лишается части функций? Это сообщение отредактировал(а) Delvish - 28.9.2012, 01:06 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
в DllMain нельзя вызывать ничего кроме kernel32.dll
но обычно user32.dll работает хоть это и запрещено. сама делфи нарушает этот запрет и в основном всё работает думаю мессейджбокс не при чем -------------------- Обижено школьников: 8 |
|||
|
||||
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
удалось добиться появления MessageBox, но следующая задача - добавить в программу, куда происходит инжект, права на бэкап реестра (SeBackupPrivilege) видимо не получается, т.к. программа не может прочитать некоторые ветки. а если в другой программе задействовать тот же алгоритм - права на бэкап добавляются.
|
|||
|
||||
| Dik0n |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.5.2011 Репутация: 1 Всего: 10 |
Программа должна быть запущена обязательно с правами "админа", и не забываем про манифест, что-бы не возникало проблем с UAC.
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой |
|||
|
||||
| mayor123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.9.2012 Репутация: нет Всего: нет |
Всем спасибо. Помогло.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |