| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Handle и windows 7 |
| Автор: mayor123 27.9.2012, 01:07 |
| доброго времени суток! помогите решить проблему. работает по 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 27.9.2012, 03:38 |
| каждое открытие даёт разный хендл. По числовому значению их сравнивать нельзя как ты определяешь что хендл "неправильный"? |
| Автор: Delvish 27.9.2012, 08:47 |
| у меня с ТС немного сходный вопрос - можно я паровозом встану? если прога запущена в IDE - показывает один хендл (хоть 10 раз перезапускаю - он не изменяется и равен, скажем, 1944). а если из проводника запускаю - хендл совершенно другой (и тоже хоть 20 раз перезапущу - определится один и тот же, скажем, 64). но у меня WinXP. и совместимостями я не баловался. |
| Автор: bems 27.9.2012, 10:06 |
| это значит что от проводника и ide процесс получает разный набор унаследованных хендлов, и нужный получает разной место в таблице хендлов процесса |
| Автор: Delvish 27.9.2012, 11:41 |
| видимо, я не так выразился. или сам не так понял понятно что хэндл будет разный для 1.exe сколько раз я ее буду перезапускать. но почему же у другой проги хэндлы разные при разных обстоятельствах? для ТС: попробуй "суповой набор" OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, FALSE, ProcID); должно под 7й отработать нормально |
| Автор: mayor123 27.9.2012, 12:56 |
| из модуля AdvAPIHook под экспихой InjectDLL работает - библиотека загружается в сторонний процесс и показывает MessageBox, а под 7й MessageBox не появляется. PID процесса верный, значит раз не появляется MessageBox, то проблема с хэндлом. тем более что программа определяет хэндл стороннего процесса в режиме совместимости и без него по разному - странно ведь |
| Автор: mayor123 27.9.2012, 13:42 |
| спасибо за ответ. OpenProcess возвращает не ноль - 100 без режима совместимости (сколько раз ни запускал) и около 250 в режиме совместимости. понять бы теперь что за причины отсутствия инжекта в 7й... если есть идея - расскажите, пожалуйста. у меня пока что ничего путного в голове не появляется |
| Автор: Delvish 27.9.2012, 13:44 | ||
хммм... я считал что хэндл при открытии процесса является "глобальным", сродни PID'у, и должен быть постоянным для запущенного приложения, сколько бы раз к нему не обратились. спасибо за просвещение! |
| Автор: bems 27.9.2012, 13:54 | ||
|
| Автор: mayor123 27.9.2012, 14:16 | ||||||||
| с библиотекой все просто - один лишь MessageBox(0, 'It is a work!', 'Inject', mb_OK); код программки: используемые функции из AdvAPIHook: взятие ID процесса
включение Debug-привилегий (вроде без них в 7й никак)
инъекция
и сам код программочки:
|
| Автор: bems 27.9.2012, 14:46 |
| в InjectDll есть молчаливые выходы if Memory = nil then Exit; if hThread = 0 then Exit; и не проверяется что возвращает WriteProcessMemory посмотри не наворачивается ли где-то там также базовые адреса системных дллок в семерке уже не обязаны совпадать во всех процессах (чтобы совпадали оба процесса должны работать в режиме совместимости с хр) Добавлено через 51 секунду еще этот код не будет работать на юникодных делфях и х64-виндах |
| Автор: mayor123 27.9.2012, 14:53 |
| винда 32 бита, использую Delphi 7. чуть позже попробую с выводом промежуточных результатов в лог по каждому сомнительному моменту, о результатах отпишу. спасибо за идеи |
| Автор: Illusion Dolphin 27.9.2012, 23:13 | ||||||||
MSDN:
Не работает под гостем.
Вы ведь в курсе что в DLL_PROCESS_ATTACH нельзя вызывать подобные функции? |
| Автор: Delvish 28.9.2012, 01:05 | ||
так тут у него вроде не виртуальная dll с отображением в памяти чужого процесса с измененной таблицей импорта и прочим. разве загруженная таким образом библиотека лишается части функций? |
| Автор: bems 28.9.2012, 02:06 |
| в DllMain нельзя вызывать ничего кроме kernel32.dll но обычно user32.dll работает хоть это и запрещено. сама делфи нарушает этот запрет и в основном всё работает думаю мессейджбокс не при чем |
| Автор: mayor123 28.9.2012, 14:57 |
| удалось добиться появления MessageBox, но следующая задача - добавить в программу, куда происходит инжект, права на бэкап реестра (SeBackupPrivilege) видимо не получается, т.к. программа не может прочитать некоторые ветки. а если в другой программе задействовать тот же алгоритм - права на бэкап добавляются. |
| Автор: Dik0n 28.9.2012, 22:17 | ||
Программа должна быть запущена обязательно с правами "админа", и не забываем про манифест, что-бы не возникало проблем с UAC.
|
| Автор: mayor123 1.10.2012, 00:10 |
| Всем спасибо. Помогло. |