Перейти к содержанию
Авторизация  
Egor935

Вылетает игра при выделении памяти внутри кода.

Рекомендуемые сообщения

Игра 64 бит, Unity, il2cpp.

Я хочу встроить СЕ'шный скрипт в кодовый файл игры, просто выделив дополнительные байты в конце файла и написав там свой код, на который будет происходит прыжок с нужной инструкции. То есть идея заключается в том, что код скрипта будет байтами прописан непосредственно в самом файле, и автоматически будет загружаться при запуске игры. Я всё делал по тому же принципу, что и при активации скрипта: выделяется дополнительная память, в ней прописывается определённый код любых размеров с обратным прыжком на конце, и соответственно, нужная инструкция в оригинальном коде заменяется прыжком на выделенную память, при необходимости дополняясь nop'ами.
Проблема заключается в том, что игра просто вылетает при выполнении первой инструкции в "выделенной памяти" (проверил отладкой), сама же память в конце нигде оригинальным кодом не используется, поэтому в теории это даёт возможность написать код любых размеров, поскольку при физическом добавлении байтов в конце файла, игра нормально запускается и всё функционирует как надо. Может я что-то не учёл, поскольку не знаю каким образом СЕ выделяет память для прыжка при активации скриптов, или мешаются nop'ы перед кодом в "выделенной памяти", хотя они никак не задействуются. Прошу помочь с решением данной проблемы или объяснить почему так нельзя сделать.
unknown.pngcode.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этой памяти установлен флаг EXECUTE?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Hack сказал:

В этой памяти установлен флаг EXECUTE?

Что это такое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Hack сказал:

В этой памяти установлен флаг EXECUTE?

Я не знаю, если честно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, Egor935 сказал:

игра просто вылетает при выполнении первой инструкции в "выделенной памяти" (

Может у тебя 3-ий байт должен быть не 5C, а 58?image.png.f7a0cdf143251bc22ea6ba2bc6990378.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 06.01.2021 в 04:08, Garik66 сказал:

Может у тебя 3-ий байт должен быть не 5C, а 58?image.png.f7a0cdf143251bc22ea6ba2bc6990378.png

Да нет, так и задумано, я меняю значение на 4 байта выше. Тут проблема в другом.

 

В 06.01.2021 в 01:17, Hack сказал:

image.jpg

Вау, сработало, теперь буду знать о такой штуке. Большое спасибо, уже в какой раз выручаешь 😁👍
Теперь буду разбираться как это указать в самом файле.

 

Hack, ты кстати не знаешь как это указать в самом файле?

 

Не нашёл никакой информации об этом в интернете. Часть кода в CE изначально загружается с флагом "чтение-выполнение", а часть с флагом "чтение", как это устроено, не пойму.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не уж то там места нет, что бы твои 7 байт под патч, пристроить где то ? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 часов назад, LIRW сказал:

Не уж то там места нет, что бы твои 7 байт под патч, пристроить где то ? :)

Иногда можно изменить пару байт в инструкции, чтобы добиться нужного результата, но в этом случае места под все инструкции не хватает, поэтому и пришла в голову идея добавить байты в конце файла. Кодкейвы искать не надо, оригинальный код почти никак не изменяется (только прыжки). По сути можно писать код любых размеров, только почему в этой части файла защита страницы стоит только на "чтении", а где-то в середине кода на "чтении-выполнении". Можно каждый раз менять защиту страницы вручную через СЕ, но тогда смысла от того, что код встраивается непосредственно в сам файл, никакого нет. Не знаешь где эта защита страниц находится, может указывается какими-то байтами? Никогда с подобным не сталкивался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
48 минут назад, Egor935 сказал:

но в этом случае места под все инструкции не хватает,

Так смести код на int 3 или что там 00 00 00 что ли в юнити...  И не такие вещи умещали ,а 7 байт то уж, по любому приткнуть можно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотри  таблицу секций.

 

Спойлер

32879162.png

 

 

32879220.jpg


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 часов назад, LIRW сказал:

Так смести код на int 3 или что там 00 00 00 что ли в юнити...  И не такие вещи умещали ,а 7 байт то уж, по любому приткнуть можно.

А, не думал что так можно)
В любом случае, выделение байтов в конце позволяет написать код любых размеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр
Авторизация  

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.