Board.KolibriOS.org http://board.kolibrios.org/ |
|
Эмуляция KolibriOS API http://board.kolibrios.org/viewtopic.php?f=37&t=3679 |
Page 1 of 5 |
Author: | 0CodErr [ Sun Mar 04, 2018 9:00 pm ] |
Post subject: | Эмуляция KolibriOS API |
Эмулятор mike.dld MeOSEmul работает как интерпретатор, эмулятор diamond-a KlbrInWin — как дебаггер, ну а я же хочу просто установить свой обработчик исключений и в нём обрабатывать вызовы KolibriOS. Но для начала нужно загрузить приложение. В самой KolibriOS приложения грузятся по смещению 0. У diamond-a реализовано с помощью SetLdtEntries, что позволяет грузить не по нулевому смещению. Я не стану использовать такой способ, а буду загружать именно по нулевому смещению ![]() Сперва посмотрим, а что у нас находится по смещению 0 в адресном пространстве приложения после его загрузки. Посмотрим на скриншот распределения памяти(есть замечательная программа VMMap, спасибо Руссиновичу за это ![]() Spoiler: Show Как видно, регион 0..64K свободен, значит мы можем его использовать, нужно только выделить память в нуле. Я буду это делать вот так: Code: BaseAddress := Pointer(1); RegionSize := 1024 * 64 - 1;Функция NtAllocateVirtualMemory из ntdll определена вот так: Code: Function NtAllocateVirtualMemory(ProcessHandle: THandle; BaseAddress: PPChar; ZeroBits: Dword; RegionSize: PDword; AllocationType: Dword; Protect: Dword): Pointer; StdCall; External 'ntdll';Обнаружил ограничения этого: Quote: NULL page mitigations for Windows 8 (both x86 and x64), and even backported the mitigation to Vista+ Я тут нашёл кое-что про EMET https://habrahabr.ru/company/eset/blog/184428/ там есть что-то про NullPage, судя по скриншотам это можно как включить, так и выключить.То есть, если правильно понимаю, надо отключить NullPage в EMET чтобы выделение памяти в нуле заработало. Вот здесь https://www.atraining.ru/emet-4-0-windo ... r-2012-r2/ кое-что объясняется: Quote: Что такое Null Page Allocation (NPA) Это защита от достаточно интересной атаки, базирующаяся на предположении, что зловредный код “займёт” для себя страницу с адресом 0x0 в адресном пространстве приложения. Для этого сама программа – EMET – занимает адрес 0x0. Впрок, так сказать. Что интересно, если вызвать VirtualAlloc с параметром 0, то VirtualAlloc (что, в общем-то, логично) выделит память по адресу, который выберет сама, а не по нулевому. Для того, чтобы “застолбить” за собой такой адрес, как предполагается, применяется вызов NtAllocateVirtualMemory, у которой запрашивается адрес 0x1, при попытке выделения которого выделяется блок, начинающийся с 0x0. На данный момент зловредов, использующих эту возможность, не обнаружено. Включить NPA можно как и EAF – только для явно указанных приложений, а не на уровне системы. Когда эта технология включена, “нулевая” страница при запуске приложения будет занята в профилактических целях. Да, как видно, память чуть выше уже занята, и её использовать сейчас не получится(хотя всё ещё можно аллоцировать её динамически из кучи, например) У нас сначала идёт CODE из System, вот если бы можно было вставить в самое начало большой кусок ненужных данных или кода, которые можно было бы потом затереть... Code: Detailed map of segmentsПока только пришло на ум следующее: компилятор позволяет собрать приложение с ImageBase = 64 K: Spoiler: Show Имею в виду, в Dll будет функция Main, а загрузчик: Code: .DATAМожет быть кто-то знает более рациональный вариант? Пока что для тестов 64K должно хватить, а дальше дело техники ![]() Итак, приложения у нас могут быть упакованные с помощью kpack. Но не зря же я делал unpack viewtopic.php?f=46&t=355&p=69118#p69118 ![]() То есть, запакованные kex-файлы тоже будут поддерживаться. После загрузки приложения установим обработчик исключений, по умолчанию обнулим регистры и поехали! Code: AsmВ обработчике исключений мы проверяем, чем конкретно вызвано исключение, и если это вызов ядра KolibriOS, то соответственно обрабатываем его: Code: If (ExceptionCode = EXCEPTION_ACCESS_VIOLATION) And (Word(ExceptionAddress^) = $40CD) Then |
Author: | Leency [ Sun Mar 04, 2018 10:43 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Жду продолжения этой детективной стории ![]() |
Author: | tsdima [ Mon Mar 05, 2018 2:55 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Leency wrote: Жду продолжения этой детективной стории ![]() В качестве продолжения. В конце прошлого года я наткнулся на тему "Простой загрузчик ELF для Колибри" и там была ссылка на тему "Эмулятор под Linux", на которую я 10 лет назад не обратил внимание. А поскольку пару лет назад я пересел на Linux, то с интересом посмотрел на изыскания diamond-а и Ghost-а. Посмотрев на примеры и добившись их работы на 64-битной Ubuntu, мне показалось, что сделать эмулятор будет несложно. На деле же я столкнулся с массой проблем, так что разработка эмулятора растянулась на несколько месяцев (свободного от работы времени). На данный момент большинство программ с образа флоппи-диска уже запускается и работает, однако есть достаточное количество багов, поэтому я пока не решился выкладывать свои наработки. Но я обещаю, что в скором времени выложу свой проект на GitHub. |
Author: | 0CodErr [ Tue Mar 06, 2018 10:40 am ] |
Post subject: | Re: Эмуляция KolibriOS API |
Сейчас приложения действительно грузятся по нулевому смещению, вот в Borland debugger Spoiler: Show Spoiler: Show Spoiler: Show Code: 13: DrawRectangle(Ebx Shr 16, Ecx Shr 16, Ebx And $0000FFFF, Ecx And $0000FFFF, Edx);Вот так выглядят вызовы программы Pipet(viewtopic.php?f=38&t=3546&p=68926#p68926): Spoiler: Show Code: Inc(Eip, SizeOf(Word($40CD)));Так как я с загрузкой скинов ещё не работал, то в данный момент они не поддерживаются, я знаю, что скины могут быть сжаты kpack-ом, но распаковка таких файлов уже поддерживается для самих приложений, можно будет сделать это и для скинов. Сейчас программа при запуске грузит файл, переданный в качестве параметра командной строки(например, можно перетащить мышкой значок kex на значок эмулятора) Code: If ParamCount > 0 ThenТакже можно загрузить файл, выбранный из OpenDialog(на самом деле приложение перезапускается, в качестве параметра командной строки передаётся путь из OpenDialog(а всё из-за того, что OpenDialog не завершает свои потоки и не освобождает ресурсы)): Code: If CommDlg.GetOpenFileName(OpenFile) Then |
Author: | 0CodErr [ Fri Mar 09, 2018 2:16 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Для теста сейчас я взял пример SetPixel из темы Delphi7 examples viewtopic.php?f=33&t=3469 Сейчас скины не поддерживаются, также не учитываются клиентские координаты окна, но таскать окно за заголовок можно, можно использовать двойной щелчок по заголовку, ещё можно изменять размеры окна с помощью мыши(хотя это и не очевидно в отсутствие скинов). Вот для сравнения с KlbrInWin Spoiler: Show Некоторые демо программы работают(bcdclk, cslide); Spoiler: Show Spoiler: Show В папке Tests есть некоторые примеры, их исходники или на svn, или на форуме(SetPixel viewtopic.php?f=33&t=3469#p68384, GetScreenImage viewtopic.php?f=33&t=3469#p69039), поэтому не стал их туда включать. Attachment:
|
Author: | Kopa [ Fri Mar 09, 2018 3:00 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
0CodErr wrote: Было бы интересно узнать, как это работает на разных версиях Windows(и работает ли вообще). В XP работает. Попробовал запустить Tetris. Запустился, но управления от клавиш нет. В Win8.1 при попытке загрузить программу в консоле пишет "Read File error" P.S. В принципе - работает. ![]() |
Author: | 0CodErr [ Fri Mar 09, 2018 3:07 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Kopa, я писал в первом сообщении про EMET. Не в курсе просто, как оно там в Win8.1 устроено, может на уровне системы заблокировано, а может быть можно в настройках регулировать. "Read File error" — значит, что не загружен файл куда надо(по смещению 0). |
Author: | Kopa [ Fri Mar 09, 2018 3:12 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Проверил ещё в ReactOS,тоже принципиально работает. P.S. Какие то файлы не проходят верификацию загрузки. |
Author: | 0CodErr [ Fri Mar 09, 2018 3:16 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Kopa wrote: Какие то файлы не проходят верификацию загрузки. 0CodErr wrote: В подавляющем большинстве приложения KolibriOS имеют сигнатуру MENUET01, но некоторые старые — MENUET00, некоторые новые — MENUET02, так вот, на текущий момент они не поддерживаются.
|
Author: | Kopa [ Sat Mar 10, 2018 2:30 am ] |
Post subject: | Re: Эмуляция KolibriOS API |
Из игрушек запустилась и играбельна marblematch. Pong3 запустилась, но без управления. P.S. Чаще всего происходит крэш программы, как с возможностью сохранить дамп так и без каких либо сообщений. |
Author: | 0CodErr [ Sun Mar 11, 2018 11:50 am ] |
Post subject: | Re: Эмуляция KolibriOS API |
Kopa wrote: Из игрушек запустилась и играбельна marblematch. Эта игра почему-то создаёт окно с заголовком Heliothryx ![]() Code: EIP = $0000007B; EAX = $00000000; EBX = $00640209; ECX = $00640213Наверное, они просто друг у друга код скопировали ![]() Kopa wrote: Pong3 запустилась, но без управления. Ввод с клавиатуры сейчас не поддерживается(вообще, думаю, по исходнику это заметно).Kopa wrote: Чаще всего происходит крэш программы Многие приложения используют библиотеки(соответственно, пытаются вызвать функции из них), их загрузка сейчас не поддерживается.Некоторые приложения пишут\читают изображения "directly to\from LFB" — это тоже не поддерживается. Сделал DLL-версию. "Загрузчик", резервирующий 64 мегабайта памяти(константа MEM_SIZE в исходнике), загружается по адресу 64K. С помощью VirtualProtect устанавливаются атрибуты PAGE_EXECUTE_READWRITE. После чего управление передаётся в Main, которая находится в DLL. В дальнейшем "загрузчик" можно затереть кодом или данными загруженного KolibriOS приложения. Теперь поддерживаемых приложений стало чуть больше, например, работает FREE3D04(Fisheye Raycasting Engine Etc. by Dieter Marfurt). Загружается стартовый экран игры INVADERS, если бы системная функция SysFn2:GetKey поддерживалась, то можно было бы и поиграть ![]() Работают демки 3DWAV, TRANTEST, TUBE. Attachment:
|
Author: | Kopa [ Sun Mar 11, 2018 12:48 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Здесь какое то видео. Using EMET to Disable EMET P.S. Да, поддерживаемых приложений стало гораздо больше. ![]() Можно начать перечислять. Под ReactOS эти тесты не заработaли. Выводит ошибку доступа к памяти Write only. Можно, наверное, разработчмикам ReаctOS сделать баг-репорт. ![]() Где то на Read память ругается. |
Author: | paulcodeman [ Sun Mar 11, 2018 1:02 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Из-за чего с windows 7 и выше не запускается? Это возможно из-за защиты windows? |
Author: | Leency [ Sun Mar 11, 2018 3:28 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
JFYI: KlbrInWin x64, не тестировал. http://kolibriosandfasm.mybb.ru/viewtopic.php?id=11 |
Author: | 0CodErr [ Sun Mar 11, 2018 7:30 pm ] |
Post subject: | Re: Эмуляция KolibriOS API |
Leency wrote: KlbrInWin x64 В каком месте там x64? Обычный же ![]() ALEXS1983 wrote: Проверка работоспособности и настройки KlbrInWin и использование проводились в Windows XP. Есть такой эмулятор Cxbx. Quote: Cxbx is an emulator for the Xbox video game console that allows users to enjoy Xbox games from their home PCs. Там использовалось SetLDTEntries(то же, что использовал diamond).Но там решалась задача с регистром FS. Потом на 64 bit возникли проблемы с этой функцией(она там просто как заглушка, ничего не делает). У KlbrInWin тоже проблемы с x64. Трудно сказать, как именно они их решили. Вот тут http://qpdownload.com/cxbx/ написано, что, под все Windows. Раньше был такой файлик https://github.com/ILOVEPIE/Cxbx-Reloaded/blob/master/src/CxbxKrnl/EmuFS(64).cpp#L51 Кому интересно, вот тут функция EmuAllocateLDT https://github.com/ILOVEPIE/Cxbx-Reloaded/blob/master/src/CxbxKrnl/EmuLDT.cpp#L84 Сейчас вот поновее(форк вроде) https://github.com/Cxbx-Reloaded/Cxbx-Reloaded/tree/master/src/CxbxKrnl ![]() ![]() |
Page 1 of 5 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |