Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.
Я использовал код Рихтера (глава 22 из книги "Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows). Та же самая ошибка. У Рихтера никаких объяснений по этому поводу нет (да и про возможность появления ошибки тоже).
Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс.
Если кто-то сталкивался с подобной проблемой — поделитесь как решали.
Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.
Здравствуйте, AlexKom, Вы писали:
AK>Добрый день!
AK>Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.
А чужой процесс по-прежнему 32-битный ? Уверен ? Внедрение 32-битного кода в 64-битный невозможно.
AK>Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс.
Нет. Если бы это было так, перестали бы работать все глобальные хуки.
AK>Если кто-то сталкивался с подобной проблемой — поделитесь как решали. AK>Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А чужой процесс по-прежнему 32-битный ? Уверен ? Внедрение 32-битного кода в 64-битный невозможно.
да, все процессы участвующие в процессе 32-х битные.
AK>>Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс. PD>Нет. Если бы это было так, перестали бы работать все глобальные хуки.
Я бы не был столь категоричен. Есть неработающий код. Причины почему не работают найти не удается. Про хуки сказано прямо — что они работают, вот тут: http://msdn.microsoft.com/en-us/library/aa384274(VS.85).aspx. Про CreateRemoteThread — нигде ничего найти не могу.
PD>См. WOW64 в MSDN
смотрю. пока ничего найти толкового не могу, все поверхностно
Здравствуйте, AlexKom, Вы писали:
AK>Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.
AK>Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.
ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР.
Здравствуйте, Аноним, Вы писали:
А>ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР.
не работает в WinXP 64 бита. UAC нет и в помине. процессы запускаются под аккаунтом администратора.
Re[3]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 11:45
Оценка:
А>>ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР. AK>не работает в WinXP 64 бита. UAC нет и в помине. процессы запускаются под аккаунтом администратора.
"Код в студию"
Здравствуйте, Аноним, Вы писали:
А>>>ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР. AK>>не работает в WinXP 64 бита. UAC нет и в помине. процессы запускаются под аккаунтом администратора. А>"Код в студию"
в архиве проект для 2008-ой студии и собранный бинарник. пример 1-в-1 из книги Рихтера.
Re[5]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 12:18
Оценка:
AK>http://alver.us/injlib.zip AK>в архиве проект для 2008-ой студии и собранный бинарник. пример 1-в-1 из книги Рихтера.
Проверил. Код работает при совпадении уровня привилегий и битности процессов. В х64 процессы понятное дело не инжектится. Кстати вы в курсе что в х64 винде все "обычные" процессы (типа explorer.exe, csrss etc) — 64 битные?
Здравствуйте, Аноним, Вы писали:
AK>>http://alver.us/injlib.zip AK>>в архиве проект для 2008-ой студии и собранный бинарник. пример 1-в-1 из книги Рихтера.
А>Проверил. Код работает при совпадении уровня привилегий и битности процессов. В х64 процессы понятное дело не инжектится. Кстати вы в курсе что в х64 винде все "обычные" процессы (типа explorer.exe, csrss etc) — 64 битные?
да, конечно знаю В Task Manager написано рядом с именем процесса его "битность".
можно с вами связаться каким-то другим способом (аська, джабер) для ускорения общения?
У меня этот код отказывается инжектится в 32-битные процессы на 64-битной платформе. Для примера — запускаю тотал коммандер, запускаю injlib.exe — получаю ошибку "DLL Injection/Ejection failed." Понятное дело, если собрать инжектор под 64 бита — то он нормально инжектит 64-битные процессы.
уровень привелегий как можно проверить? может в этом проблема?
Re[7]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 12:34
Оценка:
Здравствуйте, AlexKom, Вы писали:
AK>Здравствуйте, Аноним, Вы писали:
AK>>>http://alver.us/injlib.zip AK>>>в архиве проект для 2008-ой студии и собранный бинарник. пример 1-в-1 из книги Рихтера.
А>>Проверил. Код работает при совпадении уровня привилегий и битности процессов. В х64 процессы понятное дело не инжектится. Кстати вы в курсе что в х64 винде все "обычные" процессы (типа explorer.exe, csrss etc) — 64 битные? AK>да, конечно знаю В Task Manager написано рядом с именем процесса его "битность".
AK>можно с вами связаться каким-то другим способом (аська, джабер) для ускорения общения?
AK>У меня этот код отказывается инжектится в 32-битные процессы на 64-битной платформе. Для примера — запускаю тотал коммандер, запускаю injlib.exe — получаю ошибку "DLL Injection/Ejection failed." Понятное дело, если собрать инжектор под 64 бита — то он нормально инжектит 64-битные процессы.
Тоталом не пользуюсь, инжектил в 32битный калькулятор (который в syswow64).
AK>уровень привелегий как можно проверить? может в этом проблема?
Я запускал из elevated консоли. Правой кнопкой на ярлык консоли — Run as administrator. Процессы _просто_ запущенные в администраторвской сессии в висте не обладают админскими правами без этого.
Здравствуйте, Аноним, Вы писали:
AK>>У меня этот код отказывается инжектится в 32-битные процессы на 64-битной платформе. Для примера — запускаю тотал коммандер, запускаю injlib.exe — получаю ошибку "DLL Injection/Ejection failed." Понятное дело, если собрать инжектор под 64 бита — то он нормально инжектит 64-битные процессы. А>Тоталом не пользуюсь, инжектил в 32битный калькулятор (который в syswow64).
попробовал на калькуляторе, результат аналогичный.
AK>>уровень привелегий как можно проверить? может в этом проблема? А>Я запускал из elevated консоли. Правой кнопкой на ярлык консоли — Run as administrator. Процессы _просто_ запущенные в администраторвской сессии в висте не обладают админскими правами без этого.
Эт я знаю, речь только сейчас не о висте, а об XP. там запускаются от имени администратора, но я на всякий случай их ещё и Run As.. запустил. Бесполезно.
Совсем бредовые преположения дальше — у вас какой процессор? И ОС установлена как основная или в виртуальной машине? (я на виртуальной машине провожу тестирование).
Re[9]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 13:49
Оценка:
AK>>>уровень привелегий как можно проверить? может в этом проблема? А>>Я запускал из elevated консоли. Правой кнопкой на ярлык консоли — Run as administrator. Процессы _просто_ запущенные в администраторвской сессии в висте не обладают админскими правами без этого. AK>Эт я знаю, речь только сейчас не о висте, а об XP. там запускаются от имени администратора, но я на всякий случай их ещё и Run As.. запустил. Бесполезно. AK>Совсем бредовые преположения дальше — у вас какой процессор? И ОС установлена как основная или в виртуальной машине? (я на виртуальной машине провожу тестирование).
Ос на реальной машине. Процессор интеловский. Кстати я ваш проект перебилдил на 2005й студии, чтоб не искать 9й рантайм, но это думаю пофиг.
Re[10]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 13:54
Оценка:
И еще — виста SP1. Безо всяких файрволлов/антивирей.
Re[11]: Работа 32-битных приложений в 64-битных ОС
Здравствуйте, Аноним, Вы писали:
А>И еще — виста SP1. Безо всяких файрволлов/антивирей.
м-да. я в шоке. в Vista 64 bit — всё работает. причем не надо даже фокус с запуском из консоли — все работает и так, если пользователь с админскими правами.
проблема сужается только для WinXP 64 bit.
Re[12]: Работа 32-битных приложений в 64-битных ОС
От:
Аноним
Дата:
31.03.09 14:33
Оценка:
А>>И еще — виста SP1. Безо всяких файрволлов/антивирей. AK>м-да. я в шоке. в Vista 64 bit — всё работает. причем не надо даже фокус с запуском из консоли — все работает и так, если пользователь с админскими правами. AK>проблема сужается только для WinXP 64 bit.
XP x64 — мертвая операционка. Забейте.
Re[13]: Работа 32-битных приложений в 64-битных ОС
Здравствуйте, Аноним, Вы писали:
А>>>И еще — виста SP1. Безо всяких файрволлов/антивирей. AK>>м-да. я в шоке. в Vista 64 bit — всё работает. причем не надо даже фокус с запуском из консоли — все работает и так, если пользователь с админскими правами. AK>>проблема сужается только для WinXP 64 bit. А>XP x64 — мертвая операционка. Забейте.
да уже не первый раз напарываюсь на проблемы именно в XP, а в висте — все замечательно при этом спасибо за помощь!
Здравствуйте, AlexKom, Вы писали:
AK>Добрый день!
AK>Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.
AK>Я использовал код Рихтера (глава 22 из книги "Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows). Та же самая ошибка. У Рихтера никаких объяснений по этому поводу нет (да и про возможность появления ошибки тоже).
AK>Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс.
AK>Если кто-то сталкивался с подобной проблемой — поделитесь как решали. AK>Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.
проблема оказалась во флаге PROCESS_VM_READ, который нужно было обязательно указать в OpenProcess. Удивительно, но без него все хорошо работало везде, кроме WinXP64. В документации четко указано, нужно обязательно его использовать.