Побег из wow64
2015-08-03 10:56 pmОказывается, из wow64-эмулятора, в котором выполняются 32-битные приложения на 64-битной винде, можно сбежать. Процессор входит в long mode и покидает его с помощью инструкции "jmp на следующую команду" с префиксом 0x66. Код, выполняющийся в 64-битном режиме, имеет доступ к виртуальной памяти за 4-м гигабайтом, а также к регистрам R8-R15 и к старшим частям обычных регистров. В частности, во всех wow64-процессах в регистре R12 постоянно хранится указатель на TIB64 (64-битный Thread Information Block), откуда можно перейти на PEB64 (64-битный Process Environment Block), там хранится голова двусвязного списка всех загруженных в адресное пространство модулей, так можно вычислить базу, по которой загружена 64-битная ntdll.dll, распарсить её таблицу экспорта, и таким макаром получить указатель на функцию LdrGetProcedureAddress и остальные.
Энтузиасты соорудили даже соответствующую библиотеку: https://github.com/rwfpl/rewolf-wow64ext
Если по уму, то это всё надо было делать немного не так. Библиотека должна была бы поддерживать загрузку и вызов функций 64-битной DLLки из ресурсов 32-битного приложения, делая всю работу по релокации, резолвингу импортов, встраиванию в двусвязный список загруженных модулей и так далее, вот тогда можно было бы по-настоящему разгуляться, а так это всего лишь забавный прототип.
Layout структур TIB и PEB зависит от версии Windows, так что в целом это достаточно непереносимая технология. Это для смелых, сродни прямому доступу к полям KUSER_SHARED_DATA. Строго говоря, очередной хотфикс или сервиспак, который затрагивает файл kernel32.dll или ntdll.dll, может всё сломать.
Энтузиасты соорудили даже соответствующую библиотеку: https://github.com/rwfpl/rewolf-wow64ext
Если по уму, то это всё надо было делать немного не так. Библиотека должна была бы поддерживать загрузку и вызов функций 64-битной DLLки из ресурсов 32-битного приложения, делая всю работу по релокации, резолвингу импортов, встраиванию в двусвязный список загруженных модулей и так далее, вот тогда можно было бы по-настоящему разгуляться, а так это всего лишь забавный прототип.
Layout структур TIB и PEB зависит от версии Windows, так что в целом это достаточно непереносимая технология. Это для смелых, сродни прямому доступу к полям KUSER_SHARED_DATA. Строго говоря, очередной хотфикс или сервиспак, который затрагивает файл kernel32.dll или ntdll.dll, может всё сломать.