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

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

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

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

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

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


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

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

  • Плюс 1

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


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

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

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

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


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

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

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

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


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

image.jpg

  • Плюс 1

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


Ссылка на сообщение
Поделиться на другие сайты
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


 

  • Плюс 2

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


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

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

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

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


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

Проблема решилась спонтанно. В общем для всех, кто забрёл в эту тему, просто закидываете dll'ку в dnSpy, ставите флажок "MEM_EXECUTE" в последней секции и сохраняете файл.

Ещё раз огромное спасибо Hack'у 🙂

unknown.png

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


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация  

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

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

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