{"id":300583,"date":"2020-03-23T15:00:23","date_gmt":"2020-03-23T15:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=300583"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-03-23T15:00:23","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=300583","title":{"rendered":"\u041a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u044b \u0434\u043b\u044f Unity-\u0438\u0433\u0440. \u0427\u0430\u0441\u0442\u044c 1: \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u043c\u0441\u044f \u0432 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/493534\/\">\n<p>\u0423 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0438\u0433\u0440 \u043d\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u043e\u0434\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0432 \u0438\u0433\u0440\u044b \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043f\u0440\u043e \u0437\u0430\u043c\u0435\u043d\u0443 <a href=\"https:\/\/youtu.be\/6wY1FnQ9ygg\" rel=\"nofollow\">\u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u043b\u0438 \u043c\u0443\u0437\u044b\u043a\u0438<\/a>, \u043d\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043d\u043e\u0432\u044b\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438, \u0442.\u0435. \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u0432\u043d\u0435\u0434\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u042f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u0430\u044e \u0432 Beat Saber \u0441 \u043c\u043e\u0434\u0430\u043c\u0438, \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438. Beat Saber \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 Unity, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043f\u043e\u043a\u043e\u043f\u0430\u043b\u0441\u044f \u0432 \u0435\u0433\u043e \u043a\u043e\u0434\u0435, \u0432 \u043a\u043e\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u043e\u0434\u043e\u0432, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u043a\u0430\u043a \u0442\u0430\u043c \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0440\u0430\u0437\u0431\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u044b: \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0433\u0440\u044b \u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 dll \u0438 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 Mono Runtime.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qz\/-b\/tw\/qz-btwwnew2hj7pup0dp_el33g0.png\"><\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p><em>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439: <a href=\"https:\/\/www.oculus.com\/experiences\/quest\/2448060205267927\/\" rel=\"nofollow\">1<\/a>, <a href=\"https:\/\/youtu.be\/OH4txDD23_c\" rel=\"nofollow\">2<\/a><\/em><\/p>\n<p>  <\/p>\n<h2 id=\"o-beat-saber\">\u041e Beat Saber<\/h2>\n<p>  <\/p>\n<p>Beat Saber \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0438\u0433\u0440 \u0434\u043b\u044f VR-\u0448\u043b\u0435\u043c\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0448\u043b\u0435\u043c, \u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Beat Saber. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0432\u0438\u0434\u0435\u043e \u0438\u0437 \u0438\u0433\u0440\u044b \u0432 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u0445 Youtube:<\/p>\n<p>  <\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/qPlUNAI7qV4?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e Beat Saber \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0437 \u043c\u043e\u0434\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u0438. \u0412 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u043d\u043e \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u043a-\u043b\u0438\u0431\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f, \u0438, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0435\u0441\u043d\u044f. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u0432\u043e\u0435\u043c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u044c \u043a \u0441\u0435\u0431\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u0441 \u0438\u0445 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0447\u0442\u043e-\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0438\u0441.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0432\u043e\u043a\u0440\u0443\u0433 Beat Saber \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e: Beat Saber Modding Group (BSMG, <a href=\"https:\/\/bsmg.wiki\/\" rel=\"nofollow\">https:\/\/bsmg.wiki\/<\/a>). \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0438\u0433\u0440\u0435.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/beatsaver.com\" rel=\"nofollow\">https:\/\/beatsaver.com<\/a> \u2014 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0421\u044e\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c.<\/li>\n<li><a href=\"https:\/\/bsaber.com\" rel=\"nofollow\">https:\/\/bsaber.com<\/a> \u2014 \u0441\u0430\u0439\u0442, \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u2014 \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u0439\u0442\u0438 \u0447\u0442\u043e-\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0441\u0440\u0435\u0434\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/beatsaver.com\" rel=\"nofollow\">https:\/\/beatsaver.com<\/a>. \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043a\u0443\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0442\u043e\u043f\u044b \u0437\u0430 \u043d\u0435\u0434\u0435\u043b\u044e, \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0436\u0430\u043d\u0440\u0430\u043c \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435.<\/li>\n<li><a href=\"https:\/\/scoresaber.com\" rel=\"nofollow\">https:\/\/scoresaber.com<\/a> \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u0438\u0434\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439.<\/li>\n<li><a href=\"https:\/\/modelsaber.com\" rel=\"nofollow\">https:\/\/modelsaber.com<\/a> \u2014 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u0435\u0447\u0435\u0439, \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438 \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u0432. \u0422\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 3D-\u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/li>\n<li><a href=\"https:\/\/beatmods.com\" rel=\"nofollow\">https:\/\/beatmods.com<\/a> \u2014 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043c\u043e\u0434\u043e\u0432, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b.<\/li>\n<li><a href=\"https:\/\/github.com\/Assistant\/ModAssistant\" rel=\"nofollow\">https:\/\/github.com\/Assistant\/ModAssistant<\/a> \u2014 ModAssistant, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043c\u043e\u0434\u043e\u0432. \u0418\u0433\u0440\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u044b, \u0438 \u0436\u043c\u0435\u0442 Install. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u043e\u0432 \u0438 \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u0438 \u0441\u0430\u0439\u0442\u044b \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 GitHub, \u0447\u0435\u043c \u044f \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u0432\u043e\u0436\u0443, \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0442\u044c \u0438 \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434, \u044f \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0444\u0430\u0439\u043b\u044b \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 GitHub.<\/p>\n<p>  <\/p>\n<h2 id=\"obschaya-informaciya-o-unity\">\u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e Unity<\/h2>\n<p>  <\/p>\n<p>Beat Saber \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 Unity. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f \u0438\u0433\u0440 \u0432 Unity \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f C# \u2014 \u0432 \u0442\u0430\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c. C# \u2014 \u044d\u0442\u043e \u044f\u0437\u044b\u043a, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c \u043a\u043e\u0434\u043e\u043c .NET (managed .NET assemblies) \u2014 dll-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (Common Intermediate Language, CIL \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e IL). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f\u0434\u0440\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 C++, \u0430 \u0447\u0430\u0441\u0442\u044c \u0435\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u2014 \u043d\u0430 C#. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e Unity \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c CIL-\u043a\u043e\u0434 \u0438 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u044f\u0434\u0440\u043e\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Unity \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Mono. <\/p>\n<p>  <\/p>\n<p>Mono \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0431\u0449\u0435\u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (Common Language Infrastructure, CLI) \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. Mono \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Windows, Linux, macOS, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0438 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445. \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 2001 \u0433\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Ximian, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 2003 \u043a\u0443\u043f\u0438\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Novell, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 2011 \u043a\u0443\u043f\u0438\u043b\u0430 Attachmate. Attachmate \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445, \u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Mono \u0445\u043e\u0442\u0435\u043b\u0438 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c Mono, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0433\u043e\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e Xamarin, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 2016 \u043a\u0443\u043f\u0438\u043b\u0438 Microsoft.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0433\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 C \u0438\u043b\u0438 C++, \u0430 \u0438\u0433\u0440\u043e\u0432\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Lua. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e C# \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u201c\u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439\u201d, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0433\u0440\u044b, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ib\/4h\/wu\/ib4hwuej6z3eulggd0bbezpog9i.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Mono: <a href=\"https:\/\/www.mono-project.com\/docs\/advanced\/embedding\/scripting\/\" rel=\"nofollow\">https:\/\/www.mono-project.com\/docs\/advanced\/embedding\/scripting\/<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u0433\u0440 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043a\u0430\u043a \u043f\u043b\u0430\u0433\u0438\u043d\u044b) \u2014 \u044d\u0442\u043e dll-\u0444\u0430\u0439\u043b\u044b (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 .NET-\u0441\u0431\u043e\u0440\u043a\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a \u0438\u0433\u0440\u0435 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0435\u0439. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Beat Saber \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u0417\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0432 \u0438\u0433\u0440\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 BSIPA.<\/p>\n<p>  <\/p>\n<h2 id=\"bsipa\">BSIPA<\/h2>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gh\/xe\/-t\/ghxe-twuper7zmt7qohwmeawmcs.png\"><\/p>\n<p>  <\/p>\n<p>BSIPA (Beat Saber Illusion Plugin Architecture) \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0444\u0430\u0439\u043b\u044b Beat Saber \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u043c\u043e\u0433\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u044b. \u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>BSIPA \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 C# (\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434: <a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\" rel=\"nofollow\">https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded<\/a>) \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u0440\u043a\u043e\u043c IPA (<a href=\"https:\/\/github.com\/Eusth\/IPA\" rel=\"nofollow\">https:\/\/github.com\/Eusth\/IPA<\/a>). \u0422.\u0435. \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u0432\u0437\u044f\u043b\u0438 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f Unity \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434 \u043d\u0443\u0436\u0434\u044b Beat Saber. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 BSIPA \u044f \u0432\u044b\u0434\u0435\u043b\u044f\u044e \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f: IPA, IPA.Loader \u0438 IPA.Injector. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u044b.<\/p>\n<p>  <\/p>\n<h2 id=\"ipaexe\">IPA.exe<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\/blob\/e6097054b26d7a7cf584f5acb928b92b168ebc2c\/IPA\/Program.cs\" rel=\"nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a><\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0433\u0440\u043e\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 ModAssistant \u0438 \u0435\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u044b, \u043d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 BSIPA, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0438\u0433\u0440\u043e\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c IPA.exe. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u0432 \u0442\u0435 \u043f\u0430\u043f\u043a\u0438, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f. \u0418 \u044d\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0432\u0441\u0435, \u0447\u0442\u043e \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442: \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b, \u0438 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0438\u0433\u0440\u0435, \u0442\u043e \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e. \u0412\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Beat Saber_Data\\Managed\\I18N.dll Beat Saber_Data\\Managed\\I18N.West.dll Beat Saber_Data\\Managed\\IPA.Injector.dll Beat Saber_Data\\Managed\\IPA.Injector.pdb Beat Saber_Data\\Managed\\IPA.Loader.dll Beat Saber_Data\\Managed\\IPA.Loader.pdb Beat Saber_Data\\Managed\\IPA.Loader.xml Beat Saber_Data\\Managed\\Microsoft.CSharp.dll Beat Saber_Data\\Managed\\System.Runtime.Serialization.dll Libs\\0Harmony.1.2.0.1.dll Libs\\Ionic.Zip.1.9.1.8.dll Libs\\Mono.Cecil.0.10.4.0.dll Libs\\Mono.Cecil.Mdb.0.10.4.0.dll Libs\\Mono.Cecil.Pdb.0.10.4.0.dll Libs\\Mono.Cecil.Rocks.0.10.4.0.dll Libs\\Newtonsoft.Json.12.0.0.0.dll Libs\\SemVer.1.2.0.0.dll winhttp.dll<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0435 \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f BSIPA, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0440\u0430\u043d\u0435\u0435: IPA.Loader.dll \u0438 IPA.Injector.dll. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u044d\u0442\u0438 \u0434\u0432\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043c\u044b \u0435\u0449\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"ipaloaderdll\">IPA.Loader.dll<\/h2>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u043e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b <a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\/blob\/e6097054b26d7a7cf584f5acb928b92b168ebc2c\/IPA.Loader\/Loader\/PluginLoader.cs\" rel=\"nofollow\">PluginLoader<\/a>, <a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\/blob\/e6097054b26d7a7cf584f5acb928b92b168ebc2c\/IPA.Loader\/Loader\/PluginManager.cs\" rel=\"nofollow\">PluginManager<\/a> \u0438 <a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\/blob\/e6097054b26d7a7cf584f5acb928b92b168ebc2c\/IPA.Loader\/Loader\/PluginComponent.cs\" rel=\"nofollow\">PluginComponent<\/a>. PluginLoader \u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 Plugins. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 IPA \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c. \u0412 BSIPA \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u0430: Loader \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0438 \u0441\u0442\u0440\u043e\u0438\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 PluginManager \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438: \u043f\u043e\u0438\u0441\u043a, \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 PluginComponent \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Unity, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u0442\u0430\u0440\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u043e\u0432, \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0438\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0438\u0433\u0440\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 \u0441\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0446\u0435\u043d\u0430 (\u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438\u043b\u0438, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e), \u0442\u043e PluginComponent \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u043c\u043e\u0434\u0430\u043c \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0438\u043c \u043e\u0431 \u044d\u0442\u043e\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"ipainjectordll\">IPA.Injector.dll<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/beat-saber-modding-group\/BeatSaber-IPA-Reloaded\/blob\/e6097054b26d7a7cf584f5acb928b92b168ebc2c\/IPA.Injector\/Injector.cs\" rel=\"nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Injector \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0433\u0440\u0443. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0437\u0430\u0431\u0430\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430: BSIPA \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0438\u0433\u0440\u0443 \u0430\u043d\u0442\u0438\u043f\u0438\u0440\u0430\u0442\u0441\u043a\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443. <\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">if (AntiPiracy.IsInvalid(Environment.CurrentDirectory)) {     loader.Error(&quot;Invalid installation; please buy the game to run BSIPA.&quot;);     return; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0449\u0438\u0442\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u0438\u0433\u0440\u043e\u0439 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0432\u0437\u043b\u043e\u043c: SmartSteamEmu.ini, BSteam crack.dll, HUHUVR_steam_api64.dll \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">public static bool IsInvalid(string path) {     var dataPlugins = Path.Combine(GameVersionEarly.ResolveDataPath(path), &quot;Plugins&quot;);     return          File.Exists(Path.Combine(path, &quot;IGG-GAMES.COM.url&quot;)) ||         File.Exists(Path.Combine(path, &quot;SmartSteamEmu.ini&quot;)) ||         File.Exists(Path.Combine(path, &quot;GAMESTORRENT.CO.url&quot;)) ||         File.Exists(Path.Combine(dataPlugins, &quot;BSteam crack.dll&quot;)) ||         File.Exists(Path.Combine(dataPlugins, &quot;HUHUVR_steam_api64.dll&quot;)) ||         Directory.GetFiles(dataPlugins, &quot;*.ini&quot;, SearchOption.TopDirectoryOnly).Length &gt; 0; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, BSIPA \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u0430 \u043f\u0438\u0440\u0430\u0442\u0441\u043a\u0430\u044f, \u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0432\u0437\u043b\u043e\u043c\u0430\u043d\u0430 \u0438 \u0447\u0430\u0441\u0442\u044c \u0435\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. BSIPA \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u0433\u0440\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u043f\u0438\u0440\u0430\u0442\u0441\u043a\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>IPA.Injector \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443: Mono.Cecil (\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434: <a href=\"https:\/\/github.com\/jbevain\/cecil\" rel=\"nofollow\">https:\/\/github.com\/jbevain\/cecil<\/a>). \u0415\u0435 \u0430\u0432\u0442\u043e\u0440: Jb Evain, \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 Novell \u043d\u0430\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 Mono, \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Microsoft, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 Visual Studio Tools for Unity. Mono.Cecil \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 2004 \u0433\u043e\u0434\u0430, \u0442.\u0435. \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d \u0440\u0435\u043b\u0438\u0437\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Mono. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c .NET-\u0441\u0431\u043e\u0440\u043a\u0438: \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c IL-\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043d\u0438\u0445 \u0437\u0430\u043f\u0438\u0441\u0430\u043d. <\/p>\n<p>  <\/p>\n<p>IPA.Injector \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Mono.Cecil, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 UnityEngine.CoreModule.dll. \u041e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 C# (\u0438\u043d\u0430\u0447\u0435 \u0431\u044b \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u0435\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 Unity. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b GameObject (\u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0438\u0433\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0445, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430) \u0438 \u043a\u043b\u0430\u0441\u0441 MonoBehaviour (\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 PluginComponent). IPA.Injector \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 UnityEngine.CoreModule.dll \u043a\u043b\u0430\u0441\u0441 UnityEngine.Application \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0442\u0443\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u043f\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">var unityAsmDef = AssemblyDefinition.ReadAssembly(unityPath, new ReaderParameters { ... }); var unityModDef = unityAsmDef.MainModule; var application = unityModDef.GetType(&quot;UnityEngine&quot;, &quot;Application&quot;);  MethodDefinition cctor = null; foreach (var m in application.Methods)     if (m.IsRuntimeSpecialName &amp;&amp; m.Name == &quot;.cctor&quot;)         cctor = m;  var createBootstrapper = unityModDef.ImportReference(((Action)CreateBootstrapper).Method);  if (cctor == null) {     cctor = new MethodDefinition(&quot;.cctor&quot;, ...);     application.Methods.Add(cctor);      var ilp = cctor.Body.GetILProcessor();     ilp.Emit(OpCodes.Call, cbs);     ilp.Emit(OpCodes.Ret); } else {     var ilp = cctor.Body.GetILProcessor();     ilp.Replace(cctor.Body.Instructions[0], ilp.Create(OpCodes.Call, cbs));     ilp.Replace(cctor.Body.Instructions[1], ilp.Create(OpCodes.Ret)); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 Unity 2019.3.0f3 \u0443 Application \u043d\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0442\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430. \u0415\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 Injector \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e, \u0442\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Application \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 UnityEngine.CoreModule.dll):<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">static Application() {   IPA.Injector.Injector.CreateBootstrapper(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 CreateBootstrapper \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Bootstrapper:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">private static void CreateBootstrapper() {     ...     var bootstrapper = new GameObject(&quot;NonDestructiveBootstrapper&quot;)             .AddComponent&lt;Bootstrapper&gt;();     bootstrapper.Destroyed += Bootstrapper_Destroyed; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u043f\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">internal class Bootstrapper : MonoBehaviour {     public event Action Destroyed = delegate {};      public void Start()     {         Destroy(gameObject);     }      public void OnDestroy()     {         Destroyed();     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 Start \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 Awake, \u043d\u043e Awake \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u0430\u0434\u0440, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0430 Start \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u0430\u0434\u0440 \u043f\u043e\u0441\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438). \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0437\u0430 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Bootstrapper \u0432 \u0441\u0432\u043e\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0435 Start \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 OnDestroy \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0431\u044d\u043a, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 CreateBootstrapper:<\/p>\n<p>  <\/p>\n<pre><code class=\"cs\">private static void Bootstrapper_Destroyed() {     \/\/ wait for plugins to finish loading     pluginAsyncLoadTask.Wait();     permissionFixTask.Wait();      PluginComponent.Create(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043b\u0431\u044d\u043a \u0434\u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 PluginComponent. \u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u044f \u043d\u0435 \u0437\u043d\u0430\u044e, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441 \u0441\u0430\u043c\u043e\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0442\u0441\u0442\u0440\u0430\u043f\u043f\u0435\u0440\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c PluginComponent \u0432 OnDestroy. \u041c\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u2014 \u043c\u0435\u0442\u043e\u0434 Start \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u0430 \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0438\u0433\u0440\u043e\u0432\u0430\u044f \u0441\u0446\u0435\u043d\u0430. \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0435 Unity-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u044f\u0442 \u043c\u0435\u043d\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441 Application (\u0442.\u0435. \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 .NET-\u0441\u0431\u043e\u0440\u043e\u043a Unity), \u0443 \u043d\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f PluginComponent \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 Plugins. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0438\u0441\u044c \u043d\u0435 \u0432 \u043a\u043e\u0434 Beat Saber, \u0430 \u0432 \u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u0433\u043e Unity.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e IPA.Injector \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u2014 MainAssembly.dll. \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0434 Beat Saber. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0435 \u0442\u043e\u0433\u043e \u0436\u0435 Mono.Cecil IPA.Injector \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0443 \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 sealed \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u042d\u0442\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u043d\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043c\u043e\u0434\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u0443 \u043d\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0435 BSIPA, \u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f IPA, \u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u0412 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 IPA.exe \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Injector, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 UnityEngine.CoreModule.dll, \u0438 \u0432 \u0438\u0433\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u044b. \u0423 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0443\u0441 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c IPA.exe \u0438 \u043f\u0430\u0442\u0447\u0438\u0442\u044c \u0438\u0433\u0440\u0443. BSIPA \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u043e, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, IPA.exe \u0432 BSIPA \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e. \u0417\u0430 \u0437\u0430\u043f\u0443\u0441\u043a Injector \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"unity-doorstop\">Unity Doorstop<\/h2>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_f\/kp\/z7\/_fkpz7-xwyd07bvdr6ihmgrczyg.png\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u0434 Unity \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 UnityDoorstop-BSIPA. \u041e\u043d\u0430 \u043b\u0435\u0436\u0438\u0442 \u0441\u0440\u0435\u0434\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 BSIPA \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c C. UnityDoorstop-BSIPA (\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434: <a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\" rel=\"nofollow\">https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA<\/a>) \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0444\u043e\u0440\u043a, \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/NeighTools\/UnityDoorstop\" rel=\"nofollow\">https:\/\/github.com\/NeighTools\/UnityDoorstop<\/a>. \u0414\u0430\u043b\u0435\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0431\u0443\u0434\u0443 \u0432\u043c\u0435\u0441\u0442\u043e UnityDoorstop-BSIPA \u043f\u0438\u0441\u0430\u0442\u044c Doorstop. \u041b\u043e\u0437\u0443\u043d\u0433\u043e\u043c Doorstop \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0440\u0430\u0437\u0430 \u201cRun managed code before Unity does!\u201d, \u0447\u0442\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u201c\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Unity \u0441\u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u201d. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u201c\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434\u201d \u2014 \u044d\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0434 C#. \u0412\u044b\u0448\u0435 \u043c\u044b \u0443\u0436\u0435 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0434\u0432\u0438\u0436\u043a\u0430 Unity \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 C++, \u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e Unity \u2014 \u043d\u0430 C#. \u0417\u043d\u0430\u0447\u0438\u0442, Doorstop \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0432\u043c\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0433\u0434\u0430 \u044f\u0434\u0440\u043e Unity \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u043e\u0441\u044c, \u0430 C#-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u2014 \u0435\u0449\u0435 \u043d\u0435\u0442. <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u0433\u0440\u0443 \u043d\u0430 Unity (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Beat Saber.exe), \u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 UnityPlayer.dll. \u041e\u043d\u0430 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c Unity-\u0438\u0433\u0440\u0430\u043c \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b. \u0423 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e UnityPlayer \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e GetProcAddress \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 kernel32.dll. GetProcAddress \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f WinAPI, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e \u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e. \u042f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Unity, \u043d\u043e \u0441\u0443\u0434\u044f \u043f\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044f \u0432\u0438\u0434\u0435\u043b \u0432 BSIPA \u0438 Doorstop, \u0432 UnityPlayer \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">mono_dll = LoadLibrary(\u201cMono.dll\u201d); init_mono = GetProcAddress(mono_dll, \u201dmono_jit_init_version\u201d); mono = init_mono(...); \/\/ \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c mono, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u0438\u0433\u0440\u044b<\/code><\/pre>\n<p>  <\/p>\n<p>mono_jit_init_version \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0437\u0430\u043f\u0443\u0441\u043a Mono. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/www.mono-project.com\/docs\/advanced\/embedding\/\" rel=\"nofollow\">https:\/\/www.mono-project.com\/docs\/advanced\/embedding\/<\/a>. Doorstop \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0432 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"shag-1-proksiruem-getprocaddress\">\u0428\u0430\u0433 1. \u041f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c GetProcAddress<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Doorstop.dll \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0435 DllMain \u0438, \u0435\u0441\u043b\u0438 <code>reasonForDllLoad == DLL_PROCESS_ATTACH<\/code>, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">HMODULE targetModule = GetModuleHandleA(&quot;UnityPlayer&quot;); iat_hook(targetModule, &quot;kernel32.dll&quot;, &amp;GetProcAddress, &amp;hookGetProcAddress);<\/code><\/pre>\n<p>  <\/p>\n<p><em><a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\/blob\/7fc2aee268918751c46e6c4523a21175ad625b43\/Proxy\/main.c#L326\" rel=\"nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 DllMain<\/a>, <a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\/blob\/7fc2aee268918751c46e6c4523a21175ad625b43\/Proxy\/hook.h#L123\" rel=\"nofollow\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 iat_hook<\/a><\/em><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 UnityPlayer.dll, \u0431\u0435\u0440\u0435\u0442 \u0435\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 (Import Address Table, IAT), \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0435\u0439 GetProcAddress \u0438\u0437 kernel32.dll \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0435 \u043d\u0430 \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e hookGetProcAddress \u0438\u0437 Doorstop.dll. hookGetProcAddress \u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">void * WINAPI hookGetProcAddress(HMODULE module, char const *name) {     if (lstrcmpA(name, &quot;mono_jit_init_version&quot;) == 0)     {         init(module);         return (void*)&amp;ownMonoJitInitVersion;     }     return (void*)GetProcAddress(module, name); }<\/code><\/pre>\n<p>  <\/p>\n<p><em><a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\/blob\/7fc2aee268918751c46e6c4523a21175ad625b43\/Proxy\/main.c#L204\" rel=\"nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 hookGetProcAddress<\/a><\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e IAT Hooking \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/pentest.blog\/offensive-iat-hooking\/\" rel=\"nofollow\">https:\/\/pentest.blog\/offensive-iat-hooking\/<\/a>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e hookGetProcAddress \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b GetProcAddress. \u041f\u0440\u043e\u043a\u0441\u0438-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443 \u043d\u0435\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u041d\u0415 mono_jit_init_version, \u0442\u043e hookGetProcAddress \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e GetProcAddress \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043d\u0435 \u043c\u0435\u0448\u0430\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0435\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 mono_jit_init_version, \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e ownMonoJitInitVersion. \u041f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u043f\u0440\u043e\u043a\u0441\u0438-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0449\u0435\u0442\u0441\u044f mono_jit_init_version, \u0438 \u0431\u0435\u0440\u0435\u0442 \u0438\u0437 \u043d\u0435\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Mono \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GetProcAddress (\u0432\u043d\u0443\u0442\u0440\u0438 <code>init(module);<\/code>):<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/** * \\brief Loads Mono C API function pointers so that the above definitions can be called. * \\param monoLib Mono.dll module. *\/ inline void loadMonoFunctions(HMODULE monoLib) {     \/\/ Enjoy the fact that C allows such sloppy casting     \/\/ In C++ you would have to cast to the precise function pointer type #define GET_MONO_PROC(name) name = (void*)GetProcAddress(monoLib, #name)      \/\/ Find and assign all our functions that we are going to use     GET_MONO_PROC(mono_debug_domain_create);     GET_MONO_PROC(mono_domain_assembly_open);     GET_MONO_PROC(mono_assembly_get_image);     GET_MONO_PROC(mono_runtime_invoke);     GET_MONO_PROC(mono_debug_init);     GET_MONO_PROC(mono_jit_init_version);     GET_MONO_PROC(mono_jit_parse_options);     GET_MONO_PROC(mono_method_desc_new);     GET_MONO_PROC(mono_method_desc_search_in_image);     GET_MONO_PROC(mono_method_signature);     GET_MONO_PROC(mono_signature_get_param_count);     GET_MONO_PROC(mono_array_new);     GET_MONO_PROC(mono_get_string_class);     GET_MONO_PROC(mono_string_new_utf16);     GET_MONO_PROC(mono_gc_wbarrier_set_arrayref);     GET_MONO_PROC(mono_array_addr_with_size);     GET_MONO_PROC(mono_object_to_string);     GET_MONO_PROC(mono_string_to_utf8);     GET_MONO_PROC(mono_dllmap_insert);     GET_MONO_PROC(mono_free); }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"shag-2-pereopredeleyaem-mono_jit_init_version\">\u0428\u0430\u0433 2. \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u044f\u0435\u043c mono_jit_init_version<\/h3>\n<p>  <\/p>\n<p>ownMonoJitInitVersion \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e mono_jit_init_version, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c Mono. \u0417\u0430\u0442\u0435\u043c \u043e\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Mono \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 IPA.Injector.dll \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0438\u0437 \u043d\u0435\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 Main. \u0412 (\u043e\u0447\u0435\u043d\u044c) \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u043a\u043e\u0434 ownMonoJitInitVersion \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">void *ownMonoJitInitVersion(const char *root_domain_name, const char *runtime_version) {     void *domain = mono_jit_init_version(root_domain_name, runtime_version);      \/\/ Load our custom assembly into the domain     void *assembly = mono_domain_assembly_open(domain, dll_path); \/\/ dll_path - \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u043a IPA.Inhector.dll      \/\/ Get assembly's image that contains CIL code     void *image = mono_assembly_get_image(assembly);      \/\/ Create a descriptor for a random Main method     void *desc = mono_method_desc_new(&quot;*:Main&quot;, FALSE);      \/\/ Find the first possible Main method in the assembly     void *method = mono_method_desc_search_in_image(desc, image);      mono_runtime_invoke(method, NULL, args, &amp;exception);      return domain; }<\/code><\/pre>\n<p>  <\/p>\n<p><em><a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\/blob\/7fc2aee268918751c46e6c4523a21175ad625b43\/Proxy\/main.c#L40\" rel=\"nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 ownMonoJitInitVersion<\/a><\/em><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u044b\u0448\u0435, \u0447\u0442\u043e IPA.Injector \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 Beat Saber. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a IPA.Injector \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, ownMonoJitInitVersion \u043e\u0442\u0434\u0430\u0435\u0442 Mono \u0432 Unity. Unity \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0442\u0430\u043a. \u0415\u0441\u043b\u0438 \u0431 \u043e\u043d \u0432\u044b\u0437\u0432\u0430\u043b \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e mono_jit_init_version, \u0442\u043e \u043e\u043d \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b Mono \u0438 \u043d\u0430\u0447\u0430\u043b \u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 Unity \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e ownMonoJitInitVersion, \u0442\u043e \u043e\u043d \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 Mono \u2014 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u044d\u0442\u0438\u043c Mono \u0443\u0441\u043f\u0435\u043b\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u0435\u0449\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"winhttpdll\">winhttp.dll<\/h2>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043e\u0434\u0438\u043d \u043d\u0435\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 Doorstop \u044f \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Doorstop.dll. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u043f\u044f\u0442\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 IPA.exe \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432 \u0438\u0433\u0440\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Beat Saber_Data\\Managed\\I18N.dll Beat Saber_Data\\Managed\\I18N.West.dll Beat Saber_Data\\Managed\\IPA.Injector.dll Beat Saber_Data\\Managed\\IPA.Injector.pdb Beat Saber_Data\\Managed\\IPA.Loader.dll Beat Saber_Data\\Managed\\IPA.Loader.pdb Beat Saber_Data\\Managed\\IPA.Loader.xml Beat Saber_Data\\Managed\\Microsoft.CSharp.dll Beat Saber_Data\\Managed\\System.Runtime.Serialization.dll Libs\\0Harmony.1.2.0.1.dll Libs\\Ionic.Zip.1.9.1.8.dll Libs\\Mono.Cecil.0.10.4.0.dll Libs\\Mono.Cecil.Mdb.0.10.4.0.dll Libs\\Mono.Cecil.Pdb.0.10.4.0.dll Libs\\Mono.Cecil.Rocks.0.10.4.0.dll Libs\\Newtonsoft.Json.12.0.0.0.dll Libs\\SemVer.1.2.0.0.dll winhttp.dll<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c, Doorstop.dll \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b Doorstop.dll \u0437\u0434\u0435\u0441\u044c \u0431\u044b, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 Beat Saber \u0438\u043b\u0438 Unity \u0434\u043e\u043b\u0436\u043d\u044b \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430? \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0432\u044b\u0434\u0430\u0442\u044c Doorstop.dll \u0437\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Unity, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0430\u0441\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439. \u0422\u0430\u043a\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f winhttp.dll \u2014 \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Windows \u0434\u043b\u044f http-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 C:\/Windows\/System32). \u0423 Unity \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0435\u0439 \u043d\u0443\u0436\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 winhttp.dll, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Unity Windows \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 winhttp.dll \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e Unity \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>Doorstop \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043f\u043e\u0434 \u0442\u0435\u043c \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c: winhttp.dll. \u0422\u0430\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043a\u043e\u0434 Doorstop, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0432\u0441\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 GetProcAddress \u0438 mono_jit_init_version, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0443\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 (Export Address Table) \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u0442\u043e \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 winhttp.dll. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432 Windows \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e Windows \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b, \u0438\u0434\u0435\u0442 \u0432 System32. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0433\u0440\u044b Windows \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0448 \u0444\u0430\u0439\u043b. \u041f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e winhttp \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e LoadLibrary) \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0438\u0437 \u0441\u0432\u043e\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GetProcAddress). \u041c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\u044b: \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u0435\u0441\u0438\u0442 16\u043a\u0431, \u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u2014 960\u043a\u0431.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445 IPA \u0438 BSIPA \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 proxy.c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0443\u044e \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0435\u0440\u0435\u0437 GetProcAddress. \u0412 IPA \u0442\u0430\u043a\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 PowerShell, \u0430 \u0432 BSIPA \u2014 \u043d\u0430 Python. \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <a href=\"https:\/\/github.com\/nike4613\/UnityDoorstop-BSIPA\/blob\/7fc2aee268918751c46e6c4523a21175ad625b43\/Proxy\/proxy.c\" rel=\"nofollow\">proxy.c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e DLL Search Order Hijacking \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442: <a href=\"https:\/\/attack.mitre.org\/techniques\/T1038\/\" rel=\"nofollow\">https:\/\/attack.mitre.org\/techniques\/T1038\/<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"perechislenie-deystviy-v-hronologicheskom-poryadke\">\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u0432 \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c IPA.exe. \u0412\u0441\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 \u0438\u0433\u0440\u044b. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u0438\u0433\u0440\u044b \u043f\u043e\u043a\u0430 \u043d\u0435\u0442.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u0433\u0440\u0443 (Beat Saber.exe).<\/li>\n<li>Windows \u0438\u0449\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f Unity. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u044d\u0442\u043e winhttp.dll. Windows \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u0438\u0433\u0440\u043e\u0439 \u043d\u0430\u0448\u0443 \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 winhttp.dll \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0435\u0435.<\/li>\n<li>\u0412 \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u043e\u0439 winhttp.dll \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434 Doorstop. \u041e\u043d \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e GetProcAddress \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 kernel32.dll \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438 hookGetProcAddress.<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 UnityPlayer.dll, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 C++.<\/li>\n<li>Unity \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 GetProcAddress, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e mono_jit_init_version. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 GetProcAddress, \u043e\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e ownMonoJitInitVersion.<\/li>\n<li>ownMonoJitInitVersion \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Mono.<\/li>\n<li>ownMonoJitInitVersion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Mono, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c IPA.Injector.dll \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 Main \u0438\u0437 \u043d\u0435\u0435.<\/li>\n<li>IPA.Injector \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Mono.Cecil \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 Application \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 UnityEngine.CoreModule.dll \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0443\u0434\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u044b \u0434\u043b\u044f Beat Saber.<\/li>\n<li>ownMonoJitInitVersion \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Mono \u0432 Unity.<\/li>\n<li>Unity \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Mono, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 C#.<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Application \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041e\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043c\u043e\u0434\u044b \u0434\u043b\u044f Beat Saber.<\/li>\n<li>Unity \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Mono, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434 Beat Saber.<\/li>\n<li>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b \u0438 \u043a\u043e\u0434 \u0438\u0437 \u043c\u043e\u0434\u043e\u0432 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"pro-chast-2\">\u041f\u0440\u043e \u0447\u0430\u0441\u0442\u044c 2<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. \u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 Windows \u0438 Unity \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u044b \u0432 Beat Saber. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e BSIPA \u2014 \u044d\u0442\u043e \u0444\u043e\u0440\u043a, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0438\u0433\u0440\u044b, \u043c\u044b \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0438\u0433\u0440\u044b \u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0435\u0435 \u043a\u043e\u0434, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043a\u043e \u0432\u0441\u0435\u043c Unity-\u0438\u0433\u0440\u0430\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434 \u0434\u043b\u044f Beat Saber: \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0434\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0441 \u0438\u0433\u0440\u043e\u0439, \u043a\u0430\u043a \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0433\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f Harmony \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0434\u043b\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 C#-\u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0434\u0435\u0440\u0430\u043c\u0438 \u0432 RimWorld, BATTLETECH, Cities: Skylines, Kerbal Space Program, Oxygen Not Included, Stardew Valley, Subnautica \u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<p>  <\/p>\n<h2 id=\"blagodarnosti\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>  <\/p>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e BSMG \u0438 \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 DaNike \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u043d\u0430 \u043c\u043e\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 Discord \u0438 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Doorstop \u0438 \u0437\u0430\u0447\u0435\u043c \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 winhttp.dll. \u0412\u0440\u044f\u0434 \u043b\u0438 \u043e\u043d\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u044e\u0442, \u043d\u043e \u0431\u0435\u0437 \u043d\u0438\u0445 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/493534\/\"> https:\/\/habr.com\/ru\/post\/493534\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/493534\/\">\n<p>\u0423 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0438\u0433\u0440 \u043d\u0435\u0442 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043c\u043e\u0434\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0432 \u0438\u0433\u0440\u044b \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043f\u0440\u043e \u0437\u0430\u043c\u0435\u043d\u0443 <a href=\"https:\/\/youtu.be\/6wY1FnQ9ygg\" rel=\"nofollow\">\u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0438\u043b\u0438 \u043c\u0443\u0437\u044b\u043a\u0438<\/a>, \u043d\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043d\u043e\u0432\u044b\u0435 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438, \u0442.\u0435. \u043c\u043e\u0434\u0434\u0435\u0440\u044b \u0432\u043d\u0435\u0434\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434 \u0438\u0433\u0440\u044b \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u042f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u0430\u044e \u0432 Beat Saber \u0441 \u043c\u043e\u0434\u0430\u043c\u0438, \u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438. Beat Saber \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 Unity, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043f\u043e\u043a\u043e\u043f\u0430\u043b\u0441\u044f \u0432 \u0435\u0433\u043e \u043a\u043e\u0434\u0435, \u0432 \u043a\u043e\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043c\u043e\u0434\u043e\u0432, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u043a\u0430\u043a \u0442\u0430\u043c \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e, \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0440\u0430\u0437\u0431\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u044b: \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0433\u0440\u044b \u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 dll \u0438 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 Mono Runtime.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qz\/-b\/tw\/qz-btwwnew2hj7pup0dp_el33g0.png\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-300583","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=300583"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/300583\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=300583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=300583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=300583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}