Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 30.03.09 16:53
Оценка:
Добрый день!

Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.

Я использовал код Рихтера (глава 22 из книги "Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows). Та же самая ошибка. У Рихтера никаких объяснений по этому поводу нет (да и про возможность появления ошибки тоже).

Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс.

Если кто-то сталкивался с подобной проблемой — поделитесь как решали.
Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.
Re: Работа 32-битных приложений в 64-битных ОС
От: Pavel Dvorkin Россия  
Дата: 31.03.09 05:30
Оценка:
Здравствуйте, AlexKom, Вы писали:

AK>Добрый день!


AK>Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.


А чужой процесс по-прежнему 32-битный ? Уверен ? Внедрение 32-битного кода в 64-битный невозможно.

AK>Есть подозрение, что 32-битный процесс запускается в своей "песочнице" и поэтому нельзя 32-битную dll внедрить в 32-битный процесс.


Нет. Если бы это было так, перестали бы работать все глобальные хуки.

AK>Если кто-то сталкивался с подобной проблемой — поделитесь как решали.

AK>Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.

См. WOW64 в MSDN
With best regards
Pavel Dvorkin
Re[2]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 11:16
Оценка:
Здравствуйте, 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

смотрю. пока ничего найти толкового не могу, все поверхностно
Re: Работа 32-битных приложений в 64-битных ОС
От: urukhai Украина  
Дата: 31.03.09 11:27
Оценка:
Здравствуйте, AlexKom, Вы писали:

AK>Может быть у кого есть линки на хорошее описание, как именно выполняются 32-битные процессы в Win64 — было бы тоже замечательно. Ничего внятного по этой теме я пока найти не смог.


читай на здоровье.
http://freebooks.net.ua/4312-vnutrennee-ustrojjstvo-microsoft-windows..html

искать статью про WOW64
Re: Работа 32-битных приложений в 64-битных ОС
От: Аноним  
Дата: 31.03.09 11:34
Оценка:
AK>Я столкнулся с проблемой — есть 32-битный проект, который выполняет inject в чужой процесс используя CreateRemoteThread. В 32-х битной WinXP всё работает замечательно. Тот же самый код в 64-битном окружении работать не хочет, функция CreateRemoteThread возвращает ошибку Access denied.

ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР.
Re[2]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 11:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>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 нет и в помине. процессы запускаются под аккаунтом администратора.
"Код в студию"
Re[2]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 11:45
Оценка:
Здравствуйте, urukhai, Вы писали:

U>читай на здоровье.

U>http://freebooks.net.ua/4312-vnutrennee-ustrojjstvo-microsoft-windows..html
U>искать статью про WOW64
спасибо! буду изучать, может пойму в чем подвох.
Re[4]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 11:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>ACCESS_DENIED — значит нет доступа. Возможно процесс в который вы исполняетесь работает на более высоком IL чем вы. И дело тут не в 64 битах, а в UAC который появился в висте ( и 32 битной) но которого не было в ХР.

AK>>не работает в WinXP 64 бита. UAC нет и в помине. процессы запускаются под аккаунтом администратора.
А>"Код в студию"

http://alver.us/injlib.zip

в архиве проект для 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 битные?
Re[6]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 12:29
Оценка:
Здравствуйте, Аноним, Вы писали:

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. Процессы _просто_ запущенные в администраторвской сессии в висте не обладают админскими правами без этого.
Re[8]: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 31.03.09 12:48
Оценка:
Здравствуйте, Аноним, Вы писали:

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-битных ОС
От: AlexKom  
Дата: 31.03.09 14:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И еще — виста 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-битных ОС
От: AlexKom  
Дата: 31.03.09 15:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>И еще — виста SP1. Безо всяких файрволлов/антивирей.

AK>>м-да. я в шоке. в Vista 64 bit — всё работает. причем не надо даже фокус с запуском из консоли — все работает и так, если пользователь с админскими правами.
AK>>проблема сужается только для WinXP 64 bit.
А>XP x64 — мертвая операционка. Забейте.
да уже не первый раз напарываюсь на проблемы именно в XP, а в висте — все замечательно при этом спасибо за помощь!
Re: Работа 32-битных приложений в 64-битных ОС
От: AlexKom  
Дата: 03.04.09 12:21
Оценка: 2 (1)
Здравствуйте, 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. В документации четко указано, нужно обязательно его использовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.