{"id":471735,"date":"2025-08-23T15:03:22","date_gmt":"2025-08-23T15:03:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471735"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471735","title":{"rendered":"<span>Java Agent \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0431\u0445\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439: \u044d\u0442\u0438\u0447\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0438 \u0437\u0430\u0449\u0438\u0442\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/971\/8f2\/2d0\/9718f22d0b3b58ea5236629cc5e94d35.jpg\" alt=\"\" title=\"\" width=\"600\" height=\"437\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/971\/8f2\/2d0\/9718f22d0b3b58ea5236629cc5e94d35.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/971\/8f2\/2d0\/9718f22d0b3b58ea5236629cc5e94d35.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<ol>\n<li>\n<p><a href=\"#teory\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#code\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Protection\" rel=\"noopener noreferrer nofollow\">\u041c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0449\u0438\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e Java\u2011\u0430\u0433\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u0430 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0438\u0445\u2011\u0442\u043e \u0443\u043b\u044c\u0442\u0440\u0430\u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0445\u043e\u0442\u0444\u0438\u043a\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439.<\/p>\n<p>\u041d\u043e\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Java\u2011\u0430\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0433\u043e Java\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0434\u043b\u044f\u00a0\u043e\u0431\u0445\u043e\u0434\u0430\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u00ab\u0430\u0433\u0435\u043d\u0442\u00bb, \u00ab\u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u00bb \u0438\u00a0\u0442.\u00a0\u043f.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0421\u0435\u0440\u0433\u0435\u0439 \u041a\u0430\u043f\u0443\u0441\u0442\u0438\u043d, \u0442\u0438\u043c\u043b\u0438\u0434 \u0431\u044d\u043a\u044d\u043d\u0434-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 <strong>Data Ocean Cluster Manager<\/strong> \u0432\u0435\u043d\u0434\u043e\u0440\u0430 <strong>Data Sapience.<\/strong><\/p>\n<p>\u041a\u043e\u0434 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0435\u0437\u043b\u0438\u0447\u0435\u043d.<\/p>\n<p>\u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u044d\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0440\u0438\u0441\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h4>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h4>\n<p><em>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u043c\u0443 \u0430\u0433\u0435\u043d\u0442\u0443, \u044d\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0449\u0435\u043d\u044b \u0432\u0441\u0435 sensitive data, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0423 \u0432\u0430\u0441 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 Java Agent.<\/em><\/p>\n<p><em>\u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 Java.<\/em><\/p>\n<p><em>\u0410\u0432\u0442\u043e\u0440 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b  \u0438 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u0440\u0430\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.<\/em><\/p>\n<p><a class=\"anchor\" name=\"teory\" id=\"teory\"><\/a><\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p>\u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: <strong>Java Instrumentation API<\/strong> \u0438 <strong>ASM Framework.<\/strong><\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043e\u0440\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.<\/p>\n<p><strong>1\u00a0Java Instrumentation API<\/strong><\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/module-summary.html\" rel=\"noopener noreferrer nofollow\">Java Instrumentation API<\/a> \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 Java \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u00ab\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430\u00bb, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/package-summary.html\" rel=\"noopener noreferrer nofollow\"><strong><em>java.lang.instrument<\/em><\/strong><\/a>.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u2014 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/strong><\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/Instrumentation.html\" rel=\"noopener noreferrer nofollow\"><strong><em>Instrumentation<\/em><\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>interface Instrumentation<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface Instrumentation {  void addTransformer(ClassFileTransformer transformer);  void retransformClasses(Class... classes);  long getObjectSize(Object objectToSize);  Class[] getAllLoadedClasses();  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/ClassFileTransformer.html\" rel=\"noopener noreferrer nofollow\"><strong><em>ClassFileTransformer<\/em><\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>interface ClassFileTransformer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface ClassFileTransformer {  byte[] transform(ClassLoader loader, String className,  Class classBeingRedefined,  ProtectionDomain protectionDomain,  byte[] classfileBuffer);  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Java-\u0430\u0433\u0435\u043d\u0442\u0430 (premain) \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 JVM:<\/strong><\/p>\n<p>\u00a0\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u00abpremain\u00bb<\/p>\n<details class=\"spoiler\">\n<summary>class MyAgent<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class MyAgent {     public static void premain(String agentArgs, Instrumentation inst) {         inst.addTransformer(new MyTransformer());     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>Manifest.mf<\/strong>:<\/p>\n<pre><code class=\"yaml\">Premain-Class: com.example.MyAgent Can-Retransform-Classes: true<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c jar-\u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439-\u0430\u0433\u0435\u043d\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">java -javaagent:myagent.jar TargetApp<\/code><\/pre>\n<p><strong>\u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>APM-\u0441\u0438\u0441\u0442\u0435\u043c\u044b (Application Performance Monitoring);<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0425\u043e\u0442-\u0434\u0435\u043f\u043b\u043e\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u043e\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 JVM;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b \u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>Instrumentation API<\/strong> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 enterprise-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><strong>2 ASM Framework<\/strong><\/p>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/index.html\" rel=\"noopener noreferrer nofollow\">ASM<\/a> \u2014 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 Java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 Java. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/package-summary.html\" rel=\"noopener noreferrer nofollow\"><strong><em>org.objectweb.asm<\/em><\/strong><\/a>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 visitor pattern, \u043f\u0440\u044f\u043c\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187; \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c\u0438 \u043f\u043e CPU \u0438 RAM.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 JAR ~60KB;<\/p>\n<\/li>\n<li>\n<p>Visitor Pattern \u2014 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 Java \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u044f Records, Pattern Matching.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430:<\/p>\n<p><strong>Core API (Visitor-based)<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438\/\u0437\u0430\u043f\u0438\u0441\u0438;<\/p>\n<\/li>\n<li>\n<p><strong>Visitor Pattern<\/strong> \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 callback-\u043c\u0435\u0442\u043e\u0434\u044b;<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0434\u043d\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. ASM \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u043e\u0442\u0442\u0443\u0434\u0430 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/ClassVisitor.html\" rel=\"noopener noreferrer nofollow\"><strong>ClassVisitor<\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>abstract class ClassVisitor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public abstract class ClassVisitor {     public void visit(int version, int access, String name,                       String signature, String superName, String[] interfaces);     public MethodVisitor visitMethod(int access, String name, String desc,                                     String signature, String[] exceptions);     public FieldVisitor visitField(int access, String name, String desc,                                   String signature, Object value); }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassReader reader = new ClassReader(\"com.example.MyClass\"); ClassVisitor visitor = new ClassVisitor(ASM9) {     @Override     public MethodVisitor visitMethod(int access, String name, String desc,                                     String signature, String[] exceptions) {         System.out.println(\"Method: \" + name + desc);         return super.visitMethod(access, name, desc, signature, exceptions);     } }; reader.accept(visitor, 0);<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>Tree API (Object-based)<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/strong> \u2014 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0433\u0440\u0430\u0444 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f<\/strong> \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u0441\u043e\u043a\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> \u2014 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/tree\/ClassNode.html\" rel=\"noopener noreferrer nofollow\"><strong>ClassNode<\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>ClassNode<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class ClassNode extends ClassVisitor {     public int version;     public int access;     public String name;     public String signature;     public String superName;     public List&lt;String&gt; interfaces;     public List&lt;AnnotationNode&gt; visibleAnnotations;     public List&lt;FieldNode&gt; fields;     public List&lt;MethodNode&gt; methods; }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 ClassNode<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassReader reader = new ClassReader(\"com.example.MyClass\"); ClassNode classNode = new ClassNode(); reader.accept(classNode, 0);  \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f for (MethodNode method : classNode.methods) {     if (method.name.equals(\"targetMethod\")) {         \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438         method.instructions.insert(new LdcInsnNode(\"Log message\"));         method.instructions.insert(new MethodInsnNode(INVOKESTATIC,              \"java\/lang\/System\", \"println\", \"(Ljava\/lang\/String;)V\"));     } }  \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); byte[] bytecode = writer.toByteArray();<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043d\u0443\u043b\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassWriter cw = new ClassWriter(0); cw.visit(V11, ACC_PUBLIC, \"com\/example\/Generated\", null,           \"java\/lang\/Object\", null);  \/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, \"&lt;init&gt;\", \"()V\", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, \"java\/lang\/Object\", \"&lt;init&gt;\", \"()V\", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd();  \/\/ \u041c\u0435\u0442\u043e\u0434 mv = cw.visitMethod(ACC_PUBLIC, \"hello\", \"()Ljava\/lang\/String;\", null, null); mv.visitCode(); mv.visitLdcInsn(\"Hello World\"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd();  byte[] bytecode = cw.toByteArray();<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class LoggingAdapter extends MethodVisitor {     private String methodName;          public LoggingAdapter(MethodVisitor mv, String methodName) {         super(ASM9, mv);         this.methodName = methodName;     }          @Override     public void visitCode() {         super.visitCode();         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430         mv.visitFieldInsn(GETSTATIC, \"java\/lang\/System\", \"out\",                           \"Ljava\/io\/PrintStream;\");         mv.visitLdcInsn(\"Entering method: \" + methodName);         mv.visitMethodInsn(INVOKEVIRTUAL, \"java\/io\/PrintStream\",                            \"println\", \"(Ljava\/lang\/String;)V\", false);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u2014 Spring, Hibernate \u0438 \u0434\u0440. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 ASM \u0434\u043b\u044f proxy-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u2014 Kotlin, Scala \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 ASM;<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043a\u0438\u043d\u0433 \u2014 Mockito, PowerMock \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f mock-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>AOP \u2014 AspectJ \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f cross-cutting concerns.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Reflection:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0432 10-100 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 Reflection;<\/p>\n<\/li>\n<li>\n<p>Compile-time \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <strong>ASM<\/strong> \u2014 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c \u0432 Java-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p><strong>3 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f ASM \u0441 Instrumentation<\/strong><\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f ASM \u0441 Instrumentation \u0432 Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 JVM.\u00a0<\/p>\n<p><strong>\u0412\u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 (\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u0440\u044d\u043a\u0438\u043d\u0433, \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435) \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>AOP<\/strong>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0441\u043f\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430).<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437. <\/strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043c\u043e\u043a-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/strong>. \u0417\u0430\u043c\u0435\u043d\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043b\u0435\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>Java Agent \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Instrumentation API (java.lang.instrument.Instrumentation).<\/p>\n<\/li>\n<li>\n<p>ASM \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>Agent \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Instrumentation \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0430; ASM \u2014 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440:<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0430\u0433\u0435\u043d\u0442 real-time \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 ProfilingAgent<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">import java.lang.instrument.*; import java.security.ProtectionDomain; import org.objectweb.asm.*;  public class ProfilingAgent {     public static void premain(String agentArgs, Instrumentation inst) {         inst.addTransformer(new MethodTimeTransformer());     } }  class MethodTimeTransformer implements ClassFileTransformer {     @Override     public byte[] transform(Module module, ClassLoader loader, String className,                             Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain,                             byte[] classfileBuffer) {         if (className == null || className.startsWith(\"java\/\")) return null;         ClassReader cr = new ClassReader(classfileBuffer);         ClassWriter cw = new ClassWriter(cr, 0);         ClassVisitor cv = new ClassVisitor(Opcodes.ASM9, cw) {             @Override             public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {                 MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);                 if (mv != null &amp;&amp; !name.equals(\"&lt;init&gt;\") &amp;&amp; !name.equals(\"&lt;clinit&gt;\")) {                     mv = new ProfilingMethodVisitor(mv, name);                 }                 return mv;             }         };         cr.accept(cv, 0);         return cw.toByteArray();     } }  class ProfilingMethodVisitor extends MethodVisitor {     private final String methodName;     public ProfilingMethodVisitor(MethodVisitor mv, String methodName) {         super(Opcodes.ASM9, mv);         this.methodName = methodName;     }     @Override     public void visitCode() {         mv.visitCode();         mv.visitMethodInsn(Opcodes.INVOKESTATIC, \"java\/lang\/System\", \"nanoTime\", \"()J\", false);         mv.visitVarInsn(Opcodes.LSTORE, 1);         mv.visitFieldInsn(Opcodes.GETSTATIC, \"java\/lang\/System\", \"out\", \"Ljava\/io\/PrintStream;\");         mv.visitLdcInsn(\"Enter: \" + methodName);         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, \"java\/io\/PrintStream\", \"println\", \"(Ljava\/lang\/String;)V\", false);     }     @Override     public void visitInsn(int opcode) {         if ((opcode &gt;= Opcodes.IRETURN &amp;&amp; opcode &lt;= Opcodes.RETURN) || opcode == Opcodes.ATHROW) {             mv.visitMethodInsn(Opcodes.INVOKESTATIC, \"java\/lang\/System\", \"nanoTime\", \"()J\", false);             mv.visitVarInsn(Opcodes.LLOAD, 1);             mv.visitInsn(Opcodes.LSUB);             mv.visitVarInsn(Opcodes.LSTORE, 3);             mv.visitFieldInsn(Opcodes.GETSTATIC, \"java\/lang\/System\", \"out\", \"Ljava\/io\/PrintStream;\");             mv.visitTypeInsn(Opcodes.NEW, \"java\/lang\/StringBuilder\");             mv.visitInsn(Opcodes.DUP);             mv.visitLdcInsn(\"Exit: \" + methodName + \" elapsed \");             mv.visitMethodInsn(Opcodes.INVOKESPECIAL, \"java\/lang\/StringBuilder\", \"&lt;init&gt;\", \"(Ljava\/lang\/String;)V\", false);             mv.visitVarInsn(Opcodes.LLOAD, 3);             mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, \"java\/lang\/StringBuilder\", \"append\", \"(J)Ljava\/lang\/StringBuilder;\", false);             mv.visitLdcInsn(\" ns\");             mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, \"java\/lang\/StringBuilder\", \"append\", \"(Ljava\/lang\/String;)Ljava\/lang\/StringBuilder;\", false);             mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, \"java\/lang\/StringBuilder\", \"toString\", \"()Ljava\/lang\/String;\", false);             mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, \"java\/io\/PrintStream\", \"println\", \"(Ljava\/lang\/String;)V\", false);         }         mv.visitInsn(opcode);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f <strong>ASM<\/strong> \u0438 <strong>Instrumentation<\/strong> \u0434\u0430\u0451\u0442 \u0433\u0438\u0431\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432, \u044d\u0442\u043e \u0446\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 ClassFileTransformer \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ASM<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 ASMTransformer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class ASMTransformer implements ClassFileTransformer {     @Override     public byte[] transform(ClassLoader loader, String className,                            Class&lt;?&gt; classBeingRedefined,                            ProtectionDomain protectionDomain,                            byte[] classfileBuffer) {                  ClassReader reader = new ClassReader(classfileBuffer);         ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES);                  ClassVisitor visitor = new ClassVisitor(ASM9, writer) {             @Override             public MethodVisitor visitMethod(int access, String name, String desc,                                             String signature, String[] exceptions) {                 MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);                 return new LoggingAdapter(mv, name);             }         };                  reader.accept(visitor, 0);         return writer.toByteArray();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"code\" id=\"code\"><\/a><\/p>\n<h2>\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430<\/h2>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 bash-\u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043f\u043e\u043a \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0430\u0433\u0435\u043d\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u0432\u0435\u0436\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0421\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">#!\/bin\/bash  # Download Targetapp Professional Latest.     echo 'Downloading Targetapp Professional Latest...'     mkdir -p \/usr\/share\/targetapp     cp loader.jar \/usr\/share\/targetapp\/     cp target_app.ico \/usr\/share\/targetapp\/     rm -rf .git     cd \/usr\/share\/targetapp\/     html=$(curl -s https:\/\/targetapp.com\/target\/releases)     version=$(echo $html | grep -Po '(?&lt;=\/target\/releases\/prof-community-)[0-9]+\\-[0-9]+\\-[0-9]+' | head -n 1)     Link=\"https:\/\/targetapp.com\/target\/releases\/download?product=pro&amp;version=&amp;type=jar\"     echo $version     wget \"$Link\" -O Targetapp_pro_v$version.jar --quiet --show-progress  # Execute Key Generator.     echo 'Starting Key Generator'     (java -jar loader.jar) &amp;     sleep 2s  # Execute target app Professional     echo 'Executing Targetapp Professional with Key Generator'     echo \"java --add-opens=java.desktop\/javax.swing=ALL-UNNAMED --add-opens=java.base\/java.lang=ALL-UNNAMED --add-opens=java.base\/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base\/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED --add-opens=java.base\/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED -javaagent:$(pwd)\/loader.jar -noverify -jar $(pwd)\/Targetapp_pro_v$version.jar &amp;\" &gt; targetapp     chmod 777 targetapp     cp targetapp \/bin\/targetapp     (.\/targetapp)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0441 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Java:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"bash\">java \\ --add-opens=java.desktop\/javax.swing=ALL-UNNAMED \\ --add-opens=java.base\/java.lang=ALL-UNNAMED \\ --add-opens=java.base\/jdk.internal.org.objectweb.asm=ALL-UNNAMED \\ --add-opens=java.base\/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED \\ --add-opens=java.base\/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED \\ -javaagent:$(pwd)\/loader.jar \\ -noverify \\ -jar $(pwd)\/Targetapp_pro_v$version.jar &amp;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u0445.<\/p>\n<ol>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <strong><em>&#8212;add-opens<\/em><\/strong>\u00a0 &#171;\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442&#187; \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b <strong>loader.jar<\/strong> \u043c\u043e\u0433 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <strong>target app<\/strong>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <strong><em>ALL-UNNAMED<\/em><\/strong> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#171;\u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439&#187;. \u0412 Java \u0441 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 JAR \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0435\u043c (\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c <a href=\"http:\/\/module-info.java\" rel=\"noopener noreferrer nofollow\">module-info.java<\/a>) \u043b\u0438\u0431\u043e &#171;\u043d\u0435\u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c&#187; (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 JAR \u0431\u0435\u0437 <a href=\"http:\/\/module-info.java\" rel=\"noopener noreferrer nofollow\">module-info.java<\/a>). <\/p>\n<p><strong><em>&#8212;add-opens=module\/package=ALL-UNNAMED<\/em><\/strong> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 JVM \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u043c\u0438 (\u0442. \u0435. \u0441\u0442\u0430\u0440\u044b\u0435 JAR-\u0444\u0430\u0439\u043b\u044b, \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0442. \u043f.). \u0412 Java 21 \u043a\u043b\u044e\u0447 <strong><em>-add-opens<\/em><\/strong> \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d <strong>deprecated<\/strong>, \u0438 Oracle\/JDK-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435\/\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 API.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438:<\/p>\n<ul>\n<li>\n<p><strong><em>javax.swing<\/em><\/strong> (\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441),<\/p>\n<\/li>\n<li>\n<p><strong><em>java.lang<\/em><\/strong> (\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b Java),<\/p>\n<\/li>\n<li>\n<p>\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b ASM (\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <strong><em>-javaagent:$(pwd)\/loader.jar<\/em><\/strong> \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 <strong>loader.jar<\/strong> \u043a\u0430\u043a <strong>Java Agent<\/strong>. Java-\u0430\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0445 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u0430 target app \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0433\u043e \u043f\u043e \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <strong>-noverify<\/strong> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 JVM. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 <strong>loader.jar<\/strong> \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b target app \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <strong><em>-jar $(pwd)\/Targetapp_pro_v$version.jar<\/em><\/strong> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 JAR-\u0444\u0430\u0439\u043b target app Professional.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <strong>jadx<\/strong>. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <strong>jadx<\/strong>:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffe\/ebe\/9b7\/ffeebe9b72b4b83ccc4b197cc7e28824.png\" alt=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 jadx\" title=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 jadx\" width=\"1046\" height=\"573\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ffe\/ebe\/9b7\/ffeebe9b72b4b83ccc4b197cc7e28824.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ffe\/ebe\/9b7\/ffeebe9b72b4b83ccc4b197cc7e28824.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 jadx<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c jar-\u0444\u0430\u0439\u043b \u0430\u0433\u0435\u043d\u0442\u0430 \u0438 \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3be\/791\/bc9\/3be791bc911814c4b9b65e3868b1db10.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043a\u0440\u044f\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\" title=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043a\u0440\u044f\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\" width=\"906\" height=\"755\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3be\/791\/bc9\/3be791bc911814c4b9b65e3868b1db10.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3be\/791\/bc9\/3be791bc911814c4b9b65e3868b1db10.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043a\u0440\u044f\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043b\u0430\u0441\u0441\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u00abSource code\u00bb, \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0443 Java\u2011\u043a\u043e\u0434\u0430.<\/p>\n<p><strong>\u0410\u043d\u0430\u043b\u0438\u0437 Java\u2011\u043a\u043e\u0434\u0430 <\/strong><\/p>\n<p><strong>\u0412\u00a0\u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 4\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b MANIFEST.MF: <\/strong><\/p>\n<ol>\n<li>\n<p><strong>KeygenForm<\/strong>\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p><strong>Keygen<\/strong>\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442;<\/p>\n<\/li>\n<li>\n<p><strong>Filter<\/strong>\u00a0\u2014 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u044b\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0\u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p><strong>Loader<\/strong>\u00a0\u2014 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 Java\u2011\u043a\u043e\u0434 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb, \u043f\u0430\u0442\u0447\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><strong>MANIFEST.MF\u00a0\u2014 <\/strong>\u0441\u043b\u0443\u0436\u0438\u0442 \u00ab\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439\u00bb \u0434\u043b\u044f\u00a0JVM, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u043e\u0441\u043e\u0431\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0433\u043e \u043f\u0430\u0442\u0447\u0438\u043d\u0433\u0430\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0441\u043e\u0441\u0442\u0430\u0432 jar\u2011\u0430\u0440\u0445\u0438\u0432\u0430 Java\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\u00a0<\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u0444\u0430\u0439\u043b\u044b.<\/p>\n<ol>\n<li>\n<p><strong>MANIFEST.MF<\/strong><\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 <strong>MANIFEST.MF<\/strong>:<\/p>\n<pre><code class=\"yaml\">Manifest-Version: 1.0 Can-Retransform-Classes: true Main-Class: com.targetloaderkeygen.KeygenForm Premain-Class: com.targetloaderkeygen.Loader<\/code><\/pre>\n<p>\u0418\u0437 <strong>MANIFEST.MF<\/strong> \u0432\u0438\u0434\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u0430:<\/p>\n<p><strong>Can-Retransform-Classes: true<\/strong> \u2014 \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0432 MANIFEST.MF \u0444\u0430\u0439\u043b\u0435 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e Java-\u0430\u0433\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<p><strong>Main-Class: com.targetloader.keygen.KeygenForm<\/strong> \u2192 \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0430. \u042d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 main() \u2013 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (java -jar your_app.jar).<\/p>\n<p><strong>Premain-Class: com.targetloader.keygen.Loader<\/strong> \u2192 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0430\u0442\u0447\u0438\u0442 target app \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 Java Agent<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 Loader<\/strong><\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 Loader \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f premain-\u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0438 \u0432 \u043d\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u00ab\u043c\u0430\u0433\u0438\u044f\u00bb \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 Target\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>class Loader<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package org.example;   import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; import java.util.List; import jdk.internal.org.objectweb.asm.ClassReader; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.tree.ClassNode; import jdk.internal.org.objectweb.asm.tree.InsnList; import jdk.internal.org.objectweb.asm.tree.InsnNode; import jdk.internal.org.objectweb.asm.tree.IntInsnNode; import jdk.internal.org.objectweb.asm.tree.JumpInsnNode; import jdk.internal.org.objectweb.asm.tree.LabelNode; import jdk.internal.org.objectweb.asm.tree.LdcInsnNode; import jdk.internal.org.objectweb.asm.tree.MethodInsnNode; import jdk.internal.org.objectweb.asm.tree.MethodNode; import jdk.internal.org.objectweb.asm.tree.TypeInsnNode; import jdk.internal.org.objectweb.asm.tree.VarInsnNode;   public class Loader implements ClassFileTransformer {    public Loader() {    }      public byte[] app_patch2(String className, byte[] classBytes) {        if (!className.startsWith(\"target_app\/\") || classBytes.length &lt; 110000) {            return null;        }        ClassReader cr = new ClassReader(classBytes);        ClassNode cn = new ClassNode();        cr.accept(cn, 0);        for (MethodNode method : cn.methods) {            if (method.desc.equals(\"([Ljava\/lang\/Object;Ljava\/lang\/Object;)V\") &amp;&amp; method.instructions.size() &gt; 20000) {                InsnList insnList = method.instructions;                int j = 0;                for (int i = insnList.size() - 1; i &gt; 0; i--) {                    if (insnList.get(i) instanceof TypeInsnNode) {                        TypeInsnNode typeInsnNode = insnList.get(i);                        if (typeInsnNode.getOpcode() == 187 &amp;&amp; \"java\/lang\/Exception\".equals(typeInsnNode.desc)) {                            j++;                            if (j == 2) {                                for (int k = 0; k &lt; 6; k++) {                                    if (insnList.get(i - k) instanceof JumpInsnNode) {                                        JumpInsnNode jumpInsnNode = insnList.get(i - k);                                        method.instructions.insert(insnList.get(i - k), new JumpInsnNode(167, jumpInsnNode.label));                                    }                                }                            }                        }                    }                }            }        }        ClassWriter writer = new ClassWriter(3);        cn.accept(writer);        return writer.toByteArray();    }      public byte[] client_patch(String className, byte[] classBytes) {        if (!className.equals(\"feign\/okhttp\/OkHttpClient\")) {            return null;        }        ClassReader cr = new ClassReader(classBytes);        ClassNode cn = new ClassNode();        cr.accept(cn, 0);        List&lt;MethodNode&gt; methods = cn.methods;        for (MethodNode method : methods) {            if (\"toFeignResponse\".equals(method.name) &amp;&amp; \"(Lokhttp3\/Response;Lfeign\/Request;)Lfeign\/Response;\".equals(method.desc)) {                InsnList srcList = method.instructions;                for (MethodInsnNode methodInsnNode : srcList.toArray()) {                    if ((methodInsnNode instanceof MethodInsnNode) &amp;&amp; methodInsnNode.getOpcode() == 182) {                        MethodInsnNode methodInsnNode2 = methodInsnNode;                        if (methodInsnNode2.owner.equals(\"feign\/Response$Builder\") &amp;&amp; methodInsnNode2.name.equals(\"build\") &amp;&amp; methodInsnNode2.desc.equals(\"()Lfeign\/Response;\")) {                            InsnList insnList = new InsnList();                            insnList.add(new VarInsnNode(25, 1));                            insnList.add(new MethodInsnNode(182, \"feign\/Request\", \"url\", \"()Ljava\/lang\/String;\", false));                            insnList.add(new VarInsnNode(25, 1));                            insnList.add(new MethodInsnNode(182, \"feign\/Request\", \"body\", \"()[B\", false));                            insnList.add(new MethodInsnNode(184, \"com\/target_apploaderkeygen\/Filter\", \"LicenceFilter\", \"(Ljava\/lang\/String;[B)[B\", false));                            insnList.add(new VarInsnNode(58, 2));                            insnList.add(new VarInsnNode(25, 2));                            LabelNode outLabel = new LabelNode();                            insnList.add(new JumpInsnNode(198, outLabel));                            insnList.add(new VarInsnNode(25, 2));                            insnList.add(new MethodInsnNode(182, \"feign\/Response$Builder\", \"body\", \"([B)Lfeign\/Response$Builder;\", false));                            insnList.add(new IntInsnNode(17, 200));                            insnList.add(new MethodInsnNode(182, \"feign\/Response$Builder\", \"status\", \"(I)Lfeign\/Response$Builder;\", false));                            insnList.add(outLabel);                            srcList.insertBefore(methodInsnNode2, insnList);                        }                    }                }            }        }        ClassWriter writer = new ClassWriter(3);        cn.accept(writer);        return writer.toByteArray();    }      public byte[] bigint_patch(String className, byte[] classBytes) {        if (!className.equals(\"java\/math\/BigInteger\")) {            return null;        }        try {            ClassReader reader = new ClassReader(classBytes);            ClassNode node = new ClassNode();            reader.accept(node, 0);            for (MethodNode mn : node.methods) {                if (\"oddModPow\".equals(mn.name) &amp;&amp; \"(Ljava\/math\/BigInteger;Ljava\/math\/BigInteger;)Ljava\/math\/BigInteger;\".equals(mn.desc)) {                    InsnList instructions = new InsnList();                    instructions.add(new LdcInsnNode(\"2464649455065463415875363469\"));                    instructions.add(new VarInsnNode(25, 2));                    instructions.add(new MethodInsnNode(182, \"java\/math\/BigInteger\", \"toString\", \"()Ljava\/lang\/String;\", false));                    instructions.add(new MethodInsnNode(182, \"java\/lang\/String\", \"equals\", \"(Ljava\/lang\/Object;)Z\", false));                    LabelNode label = new LabelNode();                    instructions.add(new JumpInsnNode(153, label));                    instructions.add(new TypeInsnNode(187, \"java\/math\/BigInteger\"));                    instructions.add(new InsnNode(89));                    instructions.add(new LdcInsnNode(\"24363643532616265602004787593990571998354762769517556824947462364764746856\"));                    instructions.add(new MethodInsnNode(183, \"java\/math\/BigInteger\", \"&lt;init&gt;\", \"(Ljava\/lang\/String;)V\", false));                    instructions.add(new VarInsnNode(58, 2));                    instructions.add(label);                    mn.instructions.insert(instructions);                    ClassWriter writer = new ClassWriter(3);                    node.accept(writer);                    return writer.toByteArray();                }            }            return null;        } catch (Exception e) {            System.out.println(e);            return null;        }    }      public byte[] app_patch1(String className, byte[] classBytes) {        if (className.startsWith(\"target_app\/\") &amp;&amp; classBytes.length &gt; 110000) {            ClassReader cr = new ClassReader(classBytes);            ClassNode cn = new ClassNode();            cr.accept(cn, 0);            for (MethodNode method : cn.methods) {                if (method.desc.equals(\"([Ljava\/lang\/Object;Ljava\/lang\/Object;)V\") &amp;&amp; method.instructions.size() &gt; 20000) {                    InsnList insnList = method.instructions;                    insnList.clear();                    insnList.add(new VarInsnNode(25, 0));                    insnList.add(new MethodInsnNode(184, \"com\/target_apploaderkeygen\/Filter\", \"TargetAppFilter\", \"([Ljava\/lang\/Object;)V\", false));                    insnList.add(new InsnNode(177));                    method.exceptions.clear();                    method.tryCatchBlocks.clear();                }            }            ClassWriter writer = new ClassWriter(3);            cn.accept(writer);            return writer.toByteArray();        }        return null;    }      @Override    public byte[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, byte[] classBytes) {        byte[] result = bigint_patch(className, classBytes);        if (result != null) {            return result;        }        byte[] result2 = client_patch(className, classBytes);        if (result2 != null) {            return result2;        }        byte[] result3 = app_patch1(className, classBytes);        return result3 != null ? result3 : app_patch2(className, classBytes);    }      public static void premain(String agentArgs, Instrumentation inst) {        Loader loader = new Loader();        inst.addTransformer(loader);    } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Premain-Class<\/strong>,<strong> \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d?<\/strong><\/p>\n<p><strong>Premain-Class<\/strong> \u2013 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <strong>Java Agent<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Java Agent:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0432 JVM). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u043a\u043e\u0434\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u043e\u0442\u0444\u0438\u043a\u0441-\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0445\u043e\u0434 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0432\u0437\u043b\u043e\u043c\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Loader<\/strong> \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <strong><em>ClassFileTransformer.<\/em><\/strong><\/p>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"java\">public static void premain(String agentArgs, Instrumentation inst) {     Loader loader = new Loader();     inst.addTransformer(loader);  \/\/ \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440\u0430 }<\/code><\/pre>\n<p>\u0422. \u0435. \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 premain, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 Loader \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p><strong><em>ClassFileTransformer<\/em><\/strong> \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0437 <strong><em>Java Instrumentation API<\/em><\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 JVM.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <strong>transform()<\/strong> \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <strong><em>ClassFileTransformer, <\/em><\/strong>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442. \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e, \u0438, \u0435\u0441\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432-\u043f\u0430\u0442\u0447\u0435\u0439, \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f:<br \/>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <strong>ASM Framework<\/strong> \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0435\u0442\u043e\u0434 transform<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public byte[] transform(ClassLoader loader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, byte[] classBytes) {    byte[] result = bigint_patch(className, classBytes);    if (result != null) {        return result;    }    byte[] result2 = client_patch(className, classBytes);    if (result2 != null) {        return result2;    }    byte[] result3 = app_patch1(className, classBytes);    return result3 != null ? result3 : app_patch2(className, classBytes); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 ASM:<\/p>\n<ul>\n<li>\n<p><strong>ClassReader\/ClassWriter<\/strong>: <strong><em>ClassReader cr = new ClassReader(classBytes)<\/em><\/strong> \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>ClassNode<\/strong>: <strong><em>ClassNode cn = new ClassNode()<\/em><\/strong> \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>MethodNode<\/strong>: \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>IInsnList<\/strong>: \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 method.instructions;<\/p>\n<\/li>\n<li>\n<p><strong>VarInsnNode, MethodInsnNode, JumpInsnNode, LdcInsnNode<\/strong>: \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0430\u0442\u0447\u0438:<\/p>\n<p><strong>1) bigint_patch<\/strong> \u2013 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <strong><em>java\/math\/BigInteger<\/em><\/strong>.<\/p>\n<details class=\"spoiler\">\n<summary>bigint_patch<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\"><\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418\u0449\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439 <strong><em>&#171;oddModPow&#187;.equals(<\/em><\/strong><a href=\"http:\/\/mn.name\" rel=\"noopener noreferrer nofollow\"><strong><em>mn.name<\/em><\/strong><\/a><strong><em>) &amp;&amp; &#171;(Ljava\/math\/BigInteger;Ljava\/math\/BigInteger;)Ljava\/math\/BigInteger;&#187;.equals(mn.desc)<\/em><\/strong> \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043e\u0442\u0432\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 <strong>BigInteger<\/strong> \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.\u00a0<\/p>\n<p>\u042d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u0437\u043b\u043e\u043c\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 RSA \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439,\u00a0\u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0437\u043b\u043e\u043c\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<p><strong>2) client_patch<\/strong> \u2013 \u043f\u0430\u0442\u0447\u0438\u0442 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442<strong><em> feign\/okhttp\/OkHttpClient<\/em><\/strong><\/p>\n<details class=\"spoiler\">\n<summary>client_patch<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public byte[] client_patch(String className, byte[] classBytes) {        if (!className.equals(\"feign\/okhttp\/OkHttpClient\")) {            return null;        }        ClassReader cr = new ClassReader(classBytes);        ClassNode cn = new ClassNode();        cr.accept(cn, 0);        List&lt;MethodNode&gt; methods = cn.methods;        for (MethodNode method : methods) {            if (\"toFeignResponse\".equals(method.name) &amp;&amp; \"(Lokhttp3\/Response;Lfeign\/Request;)Lfeign\/Response;\".equals(method.desc)) {                InsnList srcList = method.instructions;                for (MethodInsnNode methodInsnNode : srcList.toArray()) {                    if ((methodInsnNode instanceof MethodInsnNode) &amp;&amp; methodInsnNode.getOpcode() == 182) {                        MethodInsnNode methodInsnNode2 = methodInsnNode;                        if (methodInsnNode2.owner.equals(\"feign\/Response$Builder\") &amp;&amp; methodInsnNode2.name.equals(\"build\") &amp;&amp; methodInsnNode2.desc.equals(\"()Lfeign\/Response;\")) {                            InsnList insnList = new InsnList();                            insnList.add(new VarInsnNode(25, 1));                            insnList.add(new MethodInsnNode(182, \"feign\/Request\", \"url\", \"()Ljava\/lang\/String;\", false));                            insnList.add(new VarInsnNode(25, 1));                            insnList.add(new MethodInsnNode(182, \"feign\/Request\", \"body\", \"()[B\", false));                            insnList.add(new MethodInsnNode(184, \"com\/target_apploaderkeygen\/Filter\", \"LicenceFilter\", \"(Ljava\/lang\/String;[B)[B\", false));                            insnList.add(new VarInsnNode(58, 2));                            insnList.add(new VarInsnNode(25, 2));                            LabelNode outLabel = new LabelNode();                            insnList.add(new JumpInsnNode(198, outLabel));                            insnList.add(new VarInsnNode(25, 2));                            insnList.add(new MethodInsnNode(182, \"feign\/Response$Builder\", \"body\", \"([B)Lfeign\/Response$Builder;\", false));                            insnList.add(new IntInsnNode(17, 200));                            insnList.add(new MethodInsnNode(182, \"feign\/Response$Builder\", \"status\", \"(I)Lfeign\/Response$Builder;\", false));                            insnList.add(outLabel);                            srcList.insertBefore(methodInsnNode2, insnList);                        }                    }                }            }        }        ClassWriter writer = new ClassWriter(3);        cn.accept(writer);        return writer.toByteArray();    } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418\u0449\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <strong><em>&#171;toFeignResponse&#187;.equals(<\/em><\/strong>method.name<strong><em>) &amp;&amp; &#171;(Lokhttp3\/Response;Lfeign\/Request;)Lfeign\/Response;&#187;.equals(method.desc)<\/em><\/strong><\/p>\n<p>\u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 <strong><em>methodInsnNode2.owner.equals(&#171;feign\/Response$Builder&#187;) &amp;&amp; methodInsnNode2.name.equals(&#171;build&#187;).<\/em><\/strong><\/p>\n<p>\u0412\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 <strong><em>new MethodInsnNode(184, &#171;com\/targetloaderkeygen\/Filter&#187;, &#171;LicenceFilter&#187;, &#171;(Ljava\/lang\/String;[B)[B&#187;, false).<\/em><\/strong><\/p>\n<p>\u0422. \u0435. \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f <strong><em>OkHttpClient, <\/em><\/strong>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 URL \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 Filter \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430.<\/p>\n<p><strong>3) app_patch2<\/strong> \u2013 \u0431\u043e\u043b\u0435\u0435 \u201c\u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u201d \u043f\u043e\u0434\u0445\u043e\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>app_patch2<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\"> public byte[] app_patch2(String className, byte[] classBytes) {      if (!className.startsWith(\"target_app\/\") || classBytes.length &lt; 110000) {          return null;      }      ClassReader cr = new ClassReader(classBytes);      ClassNode cn = new ClassNode();      cr.accept(cn, 0);      for (MethodNode method : cn.methods) {          if (method.desc.equals(\"([Ljava\/lang\/Object;Ljava\/lang\/Object;)V\") &amp;&amp; method.instructions.size() &gt; 20000) {              InsnList insnList = method.instructions;              int j = 0;              for (int i = insnList.size() - 1; i &gt; 0; i--) {                  if (insnList.get(i) instanceof TypeInsnNode) {                      TypeInsnNode typeInsnNode = insnList.get(i);                      if (typeInsnNode.getOpcode() == 187 &amp;&amp; \"java\/lang\/Exception\".equals(typeInsnNode.desc)) {                          j++;                          if (j == 2) {                              for (int k = 0; k &lt; 6; k++) {                                  if (insnList.get(i - k) instanceof JumpInsnNode) {                                      JumpInsnNode jumpInsnNode = insnList.get(i - k);                                      method.instructions.insert(insnList.get(i - k), new JumpInsnNode(167, jumpInsnNode.label));                                  }                              }                          }                      }                  }              }          }      }      ClassWriter writer = new ClassWriter(3);      cn.accept(writer);      return writer.toByteArray();  } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b, \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u00abtarget\/\u00bb \u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0435\u043d\u0435\u0435 110 \u041a\u0411.<\/p>\n<p>\u0421\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>\u0418\u0449\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 java\/lang\/Exception (\u043e\u043f\u043a\u043e\u0434 187 = NEW).<\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f (j==2) \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b (GOTO, \u043e\u043f\u043a\u043e\u0434 167) \u043f\u0435\u0440\u0435\u0434 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438, \u0447\u0442\u043e, \u043a\u0430\u043a \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.<\/p>\n<p><strong><em>4) app_patch1<\/em><\/strong> \u2014 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<details class=\"spoiler\">\n<summary>app_patch1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public byte[] app_patch1(String className, byte[] classBytes) {        if (className.startsWith(\"target_app\/\") &amp;&amp; classBytes.length &gt; 110000) {            ClassReader cr = new ClassReader(classBytes);            ClassNode cn = new ClassNode();            cr.accept(cn, 0);            for (MethodNode method : cn.methods) {                if (method.desc.equals(\"([Ljava\/lang\/Object;Ljava\/lang\/Object;)V\") &amp;&amp; method.instructions.size() &gt; 20000) {                    InsnList insnList = method.instructions;                    insnList.clear();                    insnList.add(new VarInsnNode(25, 0));                    insnList.add(new MethodInsnNode(184, \"com\/target_apploaderkeygen\/Filter\", \"TargetAppFilter\", \"([Ljava\/lang\/Object;)V\", false));                    insnList.add(new InsnNode(177));                    method.exceptions.clear();                    method.tryCatchBlocks.clear();                }            }            ClassWriter writer = new ClassWriter(3);            cn.accept(writer);            return writer.toByteArray();        }        return null;    } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u044b, \u0438\u043c\u0435\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u00abtarget\/\u00bb \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 110 \u041a\u0411. \u0418\u0449\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439:<\/p>\n<p><strong><em>method.desc.equals(&#171;([Ljava\/lang\/Object;Ljava\/lang\/Object;)V&#187;) &amp;&amp; method.instructions.size() &gt; 20000.<\/em><\/strong><\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434: <strong><em>insnList.clear().<\/em><\/strong><\/p>\n<p>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0437\u043e\u0432:<\/p>\n<pre><code class=\"java\">insnList.add(new VarInsnNode(25, 0));\u00a0 \/\/ aload_0 insnList.add(new MethodInsnNode(184, \"com\/target_apploaderkeygen\/Filter\", \"targetFilter\", \"([Ljava\/lang\/Object;)V\", false)); insnList.add(new InsnNode(177));\u00a0 \/\/ return<\/code><\/pre>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438. \u041f\u0430\u0442\u0447 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c Filter.targetFilter().<\/p>\n<p>\u0423\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 try-catch \u0431\u043b\u043e\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 Filter<\/strong><\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <strong>Filter<\/strong>\u00a0\u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043a\u043e\u0434\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>class Filter<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package org.example;  import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; import java.security.interfaces.RSAPrivateKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPrivateKeySpec; import java.util.Arrays; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec;   public class Filter {    private static byte[] encryption_key = \"keykeykey\".getBytes();      private static byte[] decrypt(byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException {        try {            SecretKeySpec spec = new SecretKeySpec(encryption_key, \"DES\");            Cipher cipher = Cipher.getInstance(\"DES\");            cipher.init(2, spec);            return cipher.doFinal(data);        } catch (Exception var3) {            var3.printStackTrace();            throw new RuntimeException(var3);        }    }      public static void targetFilter(Object[] obj) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException {        byte[] data = (byte[]) obj[0];        byte[] decode = Base64.getDecoder().decode(data);        byte[] decrypt = decrypt(decode);        String str = new String(decrypt);        String[] strs = str.split(\"\\\\\\\\\");        obj[0] = Arrays.copyOf(strs, strs.length - 2);    }      public static byte[] LicenceFilter (String url, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {        if (url.equals(\"https:\/\/api.licensespring.com\/api\/v4\/activate_license\")) {            String doSign = new String(data);            String json = getText(doSign, \"hardware_id\") + \"#\" + getText(doSign, \"license_key\") + \"#2099-12-31t14:58:33.b\";            return (\"{\\\"license_signature\\\":\\\"\" + getsign(json.toLowerCase()) + \"\\\",\\\"license_type\\\":\\\"perpetual\\\",\\\"is_trial\\\":false,\\\"validity_period\\\":\\\"2099-12-31T20:28:33.213+05:30\\\",\\\"max_activations\\\":99,\\\"times_activated\\\":99,\\\"transfer_count\\\":99,\\\"prevent_vm\\\":false,\\\"customer\\\":{\\\"email\\\":\\\"email@email.email\\\",\\\"first_name\\\":\\\"name\\\")\".getBytes();        }        if (url.equals(\"https:\/\/api.licensespring.com\/api\/v4\/product_details?product=target_product\")) {            return \"{\\\"product_name\\\":\\\"Product Name\\\",\\\"short_code\\\":\\\"target_product_code\\\",\\\"allow_trial\\\":false,\\\"trial_days\\\":0,\\\"authorization_method\\\":\\\"license-key\\\"}\".getBytes();        }        if (url.startsWith(\"https:\/\/api.licensespring.com\/api\/v4\/check_license?app_name=target_app\")) {            String json2 = \"{\\\"license_signature\\\":\\\"\" + getsign((getparam(url, \"hardware_id\") + \"#\" + getparam(url, \"license_key\") + \"#2099-12-31t14:58:33.c\").toLowerCase()) + \"\\\",\\\"license_type\\\":\\\"perpetual\\\"\";            return json2.getBytes();        }        return null;    }      public static String getText(String json, String label) {        String before = \"\\\"\" + label + \"\\\":\\\"\";        int start = json.indexOf(before);        if (start != -1) {            int start2 = start + before.length();            int end = json.indexOf(\"\\\"\", start2);            return json.substring(start2, end);        }        return null;    }      public static String getparam(String url, String label) {        String before = label + \"=\";        String[] strs = url.substring(url.indexOf(63) + 1).split(\"&amp;\");        for (String str : strs) {            if (str.startsWith(before)) {                return str.substring(before.length());            }        }        return null;    }      public static String getsign(String dover) throws InvalidKeySpecException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {        Signature sign = Signature.getInstance(\"SHA256withRSA\");        sign.initSign(getPriKeyByND(\"772466485972938442854944399195933\", \"772466485972938442854944399195933\"));        byte[] data = dover.getBytes(StandardCharsets.UTF_8);        sign.update(data);        byte[] signature = sign.sign();        return Base64.getEncoder().encodeToString(signature);    }      public static RSAPrivateKey getPriKeyByND(String n, String d) throws InvalidKeySpecException, NoSuchAlgorithmException {        RSAPrivateKeySpec spec = new RSAPrivateKeySpec(new BigInteger(n), new BigInteger(d));        KeyFactory kf = KeyFactory.getInstance(\"RSA\");        return (RSAPrivateKey) kf.generatePrivate(spec);    } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<strong>:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 <strong>LicenseSpring<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043c\u0435\u043d\u0430 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 JSON \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 target app.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422. \u0435. \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u044b\u0445 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p><strong>1) targetFilter<\/strong>\u00a0\u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 target app;<\/p>\n<details class=\"spoiler\">\n<summary>targetFilter<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">   public static void targetFilter(Object[] obj) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException {        byte[] data = (byte[]) obj[0];        byte[] decode = Base64.getDecoder().decode(data);        byte[] decrypt = decrypt(decode);        String str = new String(decrypt);        String[] strs = str.split(\"\\\\\\\\\");        obj[0] = Arrays.copyOf(strs, strs.length - 2);    } <\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>2) LicenceFilter<\/strong> \u2014 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439;<\/p>\n<details class=\"spoiler\">\n<summary>LicenceFilter<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static byte[] LicenceFilter (String url, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {        if (url.equals(\"https:\/\/api.licensespring.com\/api\/v4\/activate_license\")) {            String doSign = new String(data);            String json = getText(doSign, \"hardware_id\") + \"#\" + getText(doSign, \"license_key\") + \"#2099-12-31t14:58:33.b\";            return (\"{\\\"license_signature\\\":\\\"\" + getsign(json.toLowerCase()) + \"\\\",\\\"license_type\\\":\\\"perpetual\\\",\\\"is_trial\\\":false,\\\"validity_period\\\":\\\"2099-12-31T20:28:33.213+05:30\\\",\\\"max_activations\\\":99,\\\"times_activated\\\":99,\\\"transfer_count\\\":99,\\\"prevent_vm\\\":false,\\\"customer\\\":{\\\"email\\\":\\\"email@email.email\\\",\\\"first_name\\\":\\\"name\\\")\".getBytes();        }        if (url.equals(\"https:\/\/api.licensespring.com\/api\/v4\/product_details?product=target_product\")) {            return \"{\\\"product_name\\\":\\\"Product Name\\\",\\\"short_code\\\":\\\"target_product_code\\\",\\\"allow_trial\\\":false,\\\"trial_days\\\":0,\\\"authorization_method\\\":\\\"license-key\\\"}\".getBytes();        }        if (url.startsWith(\"https:\/\/api.licensespring.com\/api\/v4\/check_license?app_name=target_app\")) {            String json2 = \"{\\\"license_signature\\\":\\\"\" + getsign((getparam(url, \"hardware_id\") + \"#\" + getparam(url, \"license_key\") + \"#2099-12-31t14:58:33.c\").toLowerCase()) + \"\\\",\\\"license_type\\\":\\\"perpetual\\\"\";            return json2.getBytes();        }        return null;    } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u044b\u0435 JSON-\u043e\u0442\u0432\u0435\u0442\u044b \u0441:<\/p>\n<p><strong><em>&#171;license_type&#187;:&#187;perpetual&#187;<\/em><\/strong> \u2014 \u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f;<\/p>\n<p>&#171;<strong><em>validity_period&#187;:&#187;2099-12-31T20:28:33.655+05:30&#8243;<\/em><\/strong> \u2014 \u0441\u0440\u043e\u043a \u0434\u043e 2099 \u0433\u043e\u0434\u0430;<\/p>\n<p><strong><em>&#171;license_active&#187;:true,&#187;license_enabled&#187;:true,&#187;is_expired&#187;:false<\/em><\/strong> \u2014 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f.<\/p>\n<p><strong>3) getsign<\/strong> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439. RSA-\u043a\u043b\u044e\u0447 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u0431\u0438\u0442\u044b\u0445 \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>getsign<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">   public static String getsign(String dover) throws InvalidKeySpecException, NoSuchAlgorithmException, SignatureException, InvalidKeyException {        Signature sign = Signature.getInstance(\"SHA256withRSA\");        sign.initSign(getPriKeyByND(\"772466485972938442854944399195933\", \"772466485972938442854944399195933\"));        byte[] data = dover.getBytes(StandardCharsets.UTF_8);        sign.update(data);        byte[] signature = sign.sign();        return Base64.getEncoder().encodeToString(signature);    } <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438:<\/p>\n<ol>\n<li>\n<p>target app \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438 \u0434\u043e 2099 \u0433\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0443\u0442\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>ASM Framework \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>Java Instrumentation API \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>RSA\/SHA256 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>DES-\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>HTTP-\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e <a href=\"https:\/\/square.github.io\/okhttp\/3.x\/okhttp\/okhttp3\/OkHttpClient.html\" rel=\"noopener noreferrer nofollow\"><strong>OkHttpClient<\/strong><\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0437\u0430\u0449\u0438\u0442\u044b, \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0437\u043b\u043e\u043c \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<p><a class=\"anchor\" name=\"Protection\" id=\"Protection\"><\/a><\/p>\n<h2>\u041c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0449\u0438\u0442\u044b<\/h2>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u043c\u0443 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u041a\u0430\u043a, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b \u0432\u0437\u043b\u043e\u043c Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u0441 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0432\u044b\u0431\u0440\u043e\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 java\/lang\/Exception;<\/p>\n<\/li>\n<li>\n<p>\u0411\u0430\u0439\u0442-\u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u044b\u043b \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0430\u044f \u043a \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0411\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0430\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0430\u0442\u0447\u0438\u0442 Target-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<p><strong>1. \u0411\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/strong><\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u043d\u044b\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438.<br \/>\u0421\u0442\u0440\u043e\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">java -javaagent:agent1.jar -javaagent:agent2.jar -javaagent:agent3.jar -jar myapp.jar<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u0441 \u043d\u0435\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0435\u0442\u043e\u0434 detectSpecificAgents<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static boolean detectSpecificAgents() {    Set&lt;String&gt; allowedAgents = Set.of(\"jacoco\", \"jprofiler\", \"yourkit\");      List&lt;String&gt; jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments();    for (String arg : jvmArgs) {        if (arg.startsWith(\"-javaagent:\")) {            String agentPath = arg.substring(\"-javaagent:\".length());              boolean isAllowed = false;            for (String allowedAgent : allowedAgents) {                if (agentPath.contains(allowedAgent)) {                    isAllowed = true;                    break;                }            }              if (!isAllowed) {                return false; \/\/ \u041f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043d\u0435\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 = false            }        }    }    return true; \/\/ \u0412\u0441\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b } <\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0434\u0435\u0431\u0430\u0433\u0430:<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0435\u0442\u043e\u0434 isDebuggerAttached<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static boolean isDebuggerAttached() {     List&lt;String&gt; args = ManagementFactory.getRuntimeMXBean().getInputArguments();     return args.stream().anyMatch(arg -&gt;         arg.contains(\"-agentlib:jdwp\") ||         arg.contains(\"-Xrunjdwp\") ||         arg.contains(\"-Xdebug\") ||         arg.contains(\"jdwp\")     ); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<p><strong><em>-agentlib:jdwp<\/em><\/strong> \u2014 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0430\u0433\u0435\u043d\u0442 Java Debug Wire Protocol (JDWP). \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 JVM.<\/p>\n<p><strong><em>-Xrunjdwp<\/em><\/strong> \u2014 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f JDWP, \u0443\u0441\u0442\u0430\u0440\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f -agentlib.<\/p>\n<p><strong><em>-Xdebug<\/em><\/strong> \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438 JVM.<\/p>\n<p><strong><em>jdwp<\/em><\/strong> \u2014 \u043e\u0431\u0449\u0435\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 Java Debug Wire Protocol, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a, \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f.<\/p>\n<p>\u0422\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u043c\u0438 \u044d\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 reverse engineering \u0438 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u043b\u0430\u0433\u0438 \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \ud83d\ude42<\/p>\n<p><strong>3. \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0448\u0435\u0434\u0443\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u0432 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0438\u0440\u0430\u0442\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>class LicenseValidator<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class LicenseValidator {     private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();     private final long intervalMinutes;     private final Runnable onInvalidLicense;     public LicenseValidator(long intervalMinutes, Runnable onInvalidLicense) {         this.intervalMinutes = intervalMinutes;         this.onInvalidLicense = onInvalidLicense;     }     public void startPeriodicValidation() {         scheduler.scheduleAtFixedRate(() -&gt; {             try {                 if (!validateWithServer()) {                     onInvalidLicense.run();                 }             } catch (Exception e) {                 \/\/ log error             }         }, 0, intervalMinutes, TimeUnit.MINUTES);     }     public void stop() {         scheduler.shutdownNow();     }     private boolean validateWithServer() {         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438         return true;     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>4. \u0417\u0430\u0449\u0438\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/strong><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c <a href=\"https:\/\/square.github.io\/okhttp\/3.x\/okhttp\/okhttp3\/CertificatePinner.html\" rel=\"noopener noreferrer nofollow\">CertificatePinner<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u00ab<a href=\"http:\/\/api.licensespring.com\" rel=\"noopener noreferrer nofollow\">api.licensespring.com<\/a>\u00bb \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c (hash \u043a\u043b\u044e\u0447\u0430 \u0447\u0435\u0440\u0435\u0437 SHA256).<\/p>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u043c\u0435\u043d\u0443 OkHttp \u0441\u0440\u0430\u0432\u043d\u0438\u0442 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u043c. \u041d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Man-in-the-middle%5C_attack\" rel=\"noopener noreferrer nofollow\">MITM-\u0430\u0442\u0430\u043a<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0438\u043d\u043d\u0438\u043d\u0433 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public static void configureCertificatePinning(OkHttpClient.Builder builder) {     CertificatePinner certificatePinner = new CertificatePinner.Builder()         .add(\"api.licensespring.com\", \"sha256\/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\")         .build();     builder.certificatePinner(certificatePinner); }  \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 SSL-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 private static void validateSSLContext() throws Exception {     SSLContext context = SSLContext.getDefault();     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/strong><\/p>\n<p>1. \u041e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0438 \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0439\u0442\u0435 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0443 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0430\u0448 \u043a\u043e\u0434 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0447\u0435\u043d\u044c \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">\/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 public native boolean validateLicenseNative(String license);  \/\/ \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 private static SecretKey generateDynamicKey() {     long timestamp = System.currentTimeMillis();     byte[] seed = ByteBuffer.allocate(8).putLong(timestamp \/ 10000).array();     return new SecretKeySpec(Arrays.copyOf(seed, 16), \"AES\"); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>2. \u0413\u0440\u0430\u0434\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e \u0442\u0438\u043f\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/p>\n<details class=\"spoiler\">\n<summary>class SecurityResponseManager<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class SecurityResponseManager {          public enum ThreatLevel {         LOW(1), MEDIUM(2), HIGH(3), CRITICAL(4);         private final int severity;         ThreatLevel(int severity) { this.severity = severity; }     }          public static void handleSecurityViolation(String violationType, ThreatLevel level) {         switch (level) {             case LOW:                 handleLowThreat(violationType);                 break;             case MEDIUM:                 handleMediumThreat(violationType);                 break;             case HIGH:                 handleHighThreat(violationType);                 break;             case CRITICAL:                 handleCriticalThreat(violationType);                 break;         }     }          private static void handleLowThreat(String violation) {         \/\/ \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 + \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435         logSecurityEvent(violation, ThreatLevel.LOW);                  \/\/ \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e         showWarningDialog(\"\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \" +                          \"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.\");                  \/\/ \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a         SecurityMonitor.increaseCheckFrequency();     }          private static void handleMediumThreat(String violation) {         logSecurityEvent(violation, ThreatLevel.MEDIUM);                  \/\/ \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c         FeatureManager.disableNonEssentialFeatures();                  \/\/ \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e         requestReauthentication();                  \/\/ \u0423\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440         notifyServer(violation, ThreatLevel.MEDIUM);     }          private static void handleHighThreat(String violation) {         logSecurityEvent(violation, ThreatLevel.HIGH);                  \/\/ \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439         FeatureManager.enableRestrictedMode(Duration.ofHours(1));                  \/\/ \u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c         forceLicenseRevalidation();                  \/\/ \u0421\u043e\u0437\u0434\u0430\u0442\u044c \"\u043b\u043e\u0432\u0443\u0448\u043a\u0443\" \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430         deployHoneypot();                  notifyServer(violation, ThreatLevel.HIGH);     }          private static void handleCriticalThreat(String violation) {         logSecurityEvent(violation, ThreatLevel.CRITICAL);                  \/\/ \u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439         FeatureManager.shutdownCriticalSystems();                  \/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445         SecurityUtils.wipeSensitiveData();                  \/\/ \u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435         revokeLicenseRemotely();                  \/\/ \u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b         scheduleGracefulShutdown();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>3. \u0421\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u043c\u0435\u0440\u044b. \u041d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043b\u0430\u043d \u043d\u0435 \u0443\u0434\u0430\u043b\u0441\u044f, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c. \u041c\u0435\u0442\u043e\u0434 \u0441\u043f\u043e\u0440\u043d\u044b\u0439.<\/p>\n<details class=\"spoiler\">\n<summary>class StealthCountermeasures<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class StealthCountermeasures {          \/\/ \u041d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u0430\u044f \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438     public static void gradualFunctionalityReduction() {         new Thread(() -&gt; {             try {                 \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438                 for (int i = 1; i &lt;= 10; i++) {                     Thread.sleep(i * 1000);                     PerformanceManager.introduceDelay(i * 100);                 }                                  \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \"\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435\" \u0441\u0431\u043e\u0438                 RandomFailureGenerator.setFailureRate(0.05f); \/\/ 5%                                  \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432                 ResultQualityManager.reduceAccuracy(0.1f);                              } catch (InterruptedException e) {                 Thread.currentThread().interrupt();             }         }).start();     }          \/\/ \u041b\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445     public static void injectDecoyErrors() {         ErrorInjector.scheduleRandomErrors(Arrays.asList(             \"Network timeout occurred\",             \"Temporary service unavailable\",              \"Configuration file corrupted\",             \"Memory allocation failed\"         ));     }          \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0432\u0443\u0448\u0435\u043a \u0434\u043b\u044f \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e     public static void deployDeceptionMeasures() {         \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043b\u043e\u0436\u043d\u044b\u0435 \"\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438\"         FakeVulnerabilityManager.createDecoyWeakness();                  \/\/ \u041b\u043e\u0436\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438         DecoyDataManager.injectFakeSecrets();                  \/\/ \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0432\u0443\u0448\u0435\u043a         TrapMonitor.enableTrapDetection();     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>4. \u0414\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u043d\u043e\u0432\u044b\u0435 \u0434\u044b\u0440\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>class SecurityAuditLogger<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class SecurityAuditLogger {          private static final Logger securityLogger =          LoggerFactory.getLogger(\"SECURITY\");          public static class SecurityEvent {         private final String eventType;         private final ThreatLevel severity;         private final Instant timestamp;         private final Map&lt;String, Object&gt; context;         private final String sessionId;         private final SystemFingerprint fingerprint;                  public SecurityEvent(String type, ThreatLevel severity) {             this.eventType = type;             this.severity = severity;             this.timestamp = Instant.now();             this.context = collectContextInfo();             this.sessionId = SessionManager.getCurrentSessionId();             this.fingerprint = SystemFingerprint.capture();         }                  private Map&lt;String, Object&gt; collectContextInfo() {             Map&lt;String, Object&gt; context = new HashMap&lt;&gt;();                          \/\/ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435             context.put(\"os.name\", System.getProperty(\"os.name\"));             context.put(\"java.version\", System.getProperty(\"java.version\"));             context.put(\"user.timezone\", System.getProperty(\"user.timezone\"));                          \/\/ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435             RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();             context.put(\"process.pid\", runtime.getName().split(\"@\")[0]);             context.put(\"jvm.arguments\", runtime.getInputArguments());             context.put(\"uptime.ms\", runtime.getUptime());                          \/\/ \u0421\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432             StackTraceElement[] stack = Thread.currentThread().getStackTrace();             context.put(\"call.stack\", Arrays.stream(stack)                 .limit(10)                 .map(StackTraceElement::toString)                 .collect(Collectors.toList()));                          \/\/ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0430\u043c\u044f\u0442\u0438             MemoryMXBean memory = ManagementFactory.getMemoryMXBean();             context.put(\"memory.heap\", memory.getHeapMemoryUsage());             context.put(\"memory.nonheap\", memory.getNonHeapMemoryUsage());                          return context;         }     }          \/\/ \u0424\u043e\u0440\u0435\u043d\u0437\u0438\u043a-\u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f     public static void performForensicsCapture() {         try {             Map&lt;String, Object&gt; forensics = new HashMap&lt;&gt;();                          \/\/ \u0421\u043d\u0438\u043c\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432             forensics.put(\"loaded.classes\", captureLoadedClasses());                          \/\/ \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438             forensics.put(\"active.threads\", captureThreadState());                          \/\/ \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f             forensics.put(\"network.connections\", captureNetworkState());                          \/\/ \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f             forensics.put(\"environment\", System.getenv());                          \/\/ \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430             forensics.put(\"system.properties\", System.getProperties());                          \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043c\u043f \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430             saveForensicsData(forensics);                      } catch (Exception e) {             securityLogger.error(\"Failed to capture forensics data\", e);         }     }          private static List&lt;String&gt; captureLoadedClasses() {         return Arrays.stream(             java.lang.instrument.Instrumentation.class.getClasses()         ).map(Class::getName).collect(Collectors.toList());     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"Conclusion\" id=\"Conclusion\"><\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441 \u0432\u0430\u043c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0442\u0435\u043e\u0440\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Java-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0438\u0440\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445, \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u0438, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u0443\u0442\u0435\u043c \u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043e \u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b.<br \/>\u0411\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u043d\u0435\u0435 \u044f \u0432\u0438\u0434\u0435\u043b \u043b\u0438\u0431\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438, \u043b\u0438\u0431\u043e \u043a\u043e\u0434, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u00ab\u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c\u0438\u00bb, \u0438\u0437\u0443\u0447\u0430\u044e\u0449\u0438\u043c\u0438 \u044f\u0437\u044b\u043a Java. \u0421 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u043c\u0438 \u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u0431\u044b\u043b \u043d\u043e\u0432\u044b\u0439 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043f\u044b\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0443\u043c\u043d\u044b\u043c, \u043d\u043e \u0434\u0430\u043b\u0435\u043a\u0438\u043c \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0442\u043e \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u044b (\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u043b \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430\u0445 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u044d\u0442\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c). \u0412 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0433\u043e\u043b, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b <strong><em>\u201c_\u201d<\/em><\/strong> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <strong>Loader<\/strong> \u0438 <strong>Filter<\/strong> \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0432\u0430, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043f\u044f\u0442\u044c.<\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0442. \u0434.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u0434 \u043b\u0435\u0433\u043a\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043a\u0443\u043f\u0438\u0442\u044c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0430\u0441\u0445\u0430\u043b\u043a\u0430 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0422\u0430\u0439\u0432\u0430\u043d\u044c\u00a0\u2014 \u044d\u0442\u043e \u041a\u0438\u0442\u0430\u0439.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u043c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0434\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/938416\/\"> https:\/\/habr.com\/ru\/articles\/938416\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p><strong>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<ol>\n<li>\n<p><a href=\"#teory\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#code\" rel=\"noopener noreferrer nofollow\">\u0420\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Protection\" rel=\"noopener noreferrer nofollow\">\u041c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u0449\u0438\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e Java\u2011\u0430\u0433\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u0430 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0438\u0445\u2011\u0442\u043e \u0443\u043b\u044c\u0442\u0440\u0430\u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0445\u043e\u0442\u0444\u0438\u043a\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439.<\/p>\n<p>\u041d\u043e\u00a0\u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Java\u2011\u0430\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0433\u043e Java\u2011\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0434\u043b\u044f\u00a0\u043e\u0431\u0445\u043e\u0434\u0430\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u00ab\u0430\u0433\u0435\u043d\u0442\u00bb, \u00ab\u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u00bb \u0438\u00a0\u0442.\u00a0\u043f.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0421\u0435\u0440\u0433\u0435\u0439 \u041a\u0430\u043f\u0443\u0441\u0442\u0438\u043d, \u0442\u0438\u043c\u043b\u0438\u0434 \u0431\u044d\u043a\u044d\u043d\u0434-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 <strong>Data Ocean Cluster Manager<\/strong> \u0432\u0435\u043d\u0434\u043e\u0440\u0430 <strong>Data Sapience.<\/strong><\/p>\n<p>\u041a\u043e\u0434 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0435\u0437\u043b\u0438\u0447\u0435\u043d.<\/p>\n<p>\u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u044d\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u0430\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0432 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0440\u0438\u0441\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h4>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h4>\n<p><em>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u043c\u0443 \u0430\u0433\u0435\u043d\u0442\u0443, \u044d\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0449\u0435\u043d\u044b \u0432\u0441\u0435 sensitive data, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u0423 \u0432\u0430\u0441 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 Java Agent.<\/em><\/p>\n<p><em>\u0422\u0430\u043a\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u042f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u043e \u0437\u043b\u043e\u0432\u0440\u0435\u0434\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 Java.<\/em><\/p>\n<p><em>\u0410\u0432\u0442\u043e\u0440 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b  \u0438 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u0440\u0430\u0432\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445.<\/em><\/p>\n<p><a class=\"anchor\" name=\"teory\" id=\"teory\"><\/a><\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438<\/h2>\n<p>\u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a: <strong>Java Instrumentation API<\/strong> \u0438 <strong>ASM Framework.<\/strong><\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043e\u0440\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.<\/p>\n<p><strong>1\u00a0Java Instrumentation API<\/strong><\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/module-summary.html\" rel=\"noopener noreferrer nofollow\">Java Instrumentation API<\/a> \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 Java \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u00ab\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430\u00bb, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/package-summary.html\" rel=\"noopener noreferrer nofollow\"><strong><em>java.lang.instrument<\/em><\/strong><\/a>.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u2014 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u2014 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/strong><\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/Instrumentation.html\" rel=\"noopener noreferrer nofollow\"><strong><em>Instrumentation<\/em><\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>interface Instrumentation<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface Instrumentation {  void addTransformer(ClassFileTransformer transformer);  void retransformClasses(Class... classes);  long getObjectSize(Object objectToSize);  Class[] getAllLoadedClasses();  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/17\/docs\/api\/java.instrument\/java\/lang\/instrument\/ClassFileTransformer.html\" rel=\"noopener noreferrer nofollow\"><strong><em>ClassFileTransformer<\/em><\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>interface ClassFileTransformer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public interface ClassFileTransformer {  byte[] transform(ClassLoader loader, String className,  Class classBeingRedefined,  ProtectionDomain protectionDomain,  byte[] classfileBuffer);  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f Java-\u0430\u0433\u0435\u043d\u0442\u0430 (premain) \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 JVM:<\/strong><\/p>\n<p>\u00a0\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u00abpremain\u00bb<\/p>\n<details class=\"spoiler\">\n<summary>class MyAgent<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class MyAgent {     public static void premain(String agentArgs, Instrumentation inst) {         inst.addTransformer(new MyTransformer());     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>Manifest.mf<\/strong>:<\/p>\n<pre><code class=\"yaml\">Premain-Class: com.example.MyAgent Can-Retransform-Classes: true<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c jar-\u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439-\u0430\u0433\u0435\u043d\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">java -javaagent:myagent.jar TargetApp<\/code><\/pre>\n<p><strong>\u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>APM-\u0441\u0438\u0441\u0442\u0435\u043c\u044b (Application Performance Monitoring);<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0425\u043e\u0442-\u0434\u0435\u043f\u043b\u043e\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u043e\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u043a\u043b\u0430\u0441\u0441\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 JVM;<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b \u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><strong>Instrumentation API<\/strong> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 enterprise-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><strong>2 ASM Framework<\/strong><\/p>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/index.html\" rel=\"noopener noreferrer nofollow\">ASM<\/a> \u2014 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f Java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 Java-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 Java. \u041f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/package-summary.html\" rel=\"noopener noreferrer nofollow\"><strong><em>org.objectweb.asm<\/em><\/strong><\/a>.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 visitor pattern, \u043f\u0440\u044f\u043c\u0430\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 &#171;\u043d\u0430 \u043b\u0435\u0442\u0443&#187; \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u0430\u043c\u0438 \u043f\u043e CPU \u0438 RAM.<\/p>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 JAR ~60KB;<\/p>\n<\/li>\n<li>\n<p>Visitor Pattern \u2014 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 Java \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u044f Records, Pattern Matching.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430:<\/p>\n<p><strong>Core API (Visitor-based)<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438\/\u0437\u0430\u043f\u0438\u0441\u0438;<\/p>\n<\/li>\n<li>\n<p><strong>Visitor Pattern<\/strong> \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 callback-\u043c\u0435\u0442\u043e\u0434\u044b;<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0434\u043d\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c;<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. ASM \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043a\u043b\u0430\u0441\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u043e\u0442\u0442\u0443\u0434\u0430 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/ClassVisitor.html\" rel=\"noopener noreferrer nofollow\"><strong>ClassVisitor<\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>abstract class ClassVisitor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public abstract class ClassVisitor {     public void visit(int version, int access, String name,                       String signature, String superName, String[] interfaces);     public MethodVisitor visitMethod(int access, String name, String desc,                                     String signature, String[] exceptions);     public FieldVisitor visitField(int access, String name, String desc,                                   String signature, Object value); }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassReader reader = new ClassReader(\"com.example.MyClass\"); ClassVisitor visitor = new ClassVisitor(ASM9) {     @Override     public MethodVisitor visitMethod(int access, String name, String desc,                                     String signature, String[] exceptions) {         System.out.println(\"Method: \" + name + desc);         return super.visitMethod(access, name, desc, signature, exceptions);     } }; reader.accept(visitor, 0);<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>Tree API (Object-based)<\/strong><\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/strong> \u2014 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u0433\u0440\u0430\u0444 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f<\/strong> \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong> \u2014 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u044b\u0441\u043e\u043a\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> \u2014 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/asm.ow2.io\/javadoc\/org\/objectweb\/asm\/tree\/ClassNode.html\" rel=\"noopener noreferrer nofollow\"><strong>ClassNode<\/strong><\/a><\/p>\n<details class=\"spoiler\">\n<summary>ClassNode<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class ClassNode extends ClassVisitor {     public int version;     public int access;     public String name;     public String signature;     public String superName;     public List&lt;String&gt; interfaces;     public List&lt;AnnotationNode&gt; visibleAnnotations;     public List&lt;FieldNode&gt; fields;     public List&lt;MethodNode&gt; methods; }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 ClassNode<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassReader reader = new ClassReader(\"com.example.MyClass\"); ClassNode classNode = new ClassNode(); reader.accept(classNode, 0);  \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f for (MethodNode method : classNode.methods) {     if (method.name.equals(\"targetMethod\")) {         \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438         method.instructions.insert(new LdcInsnNode(\"Log message\"));         method.instructions.insert(new MethodInsnNode(INVOKESTATIC,              \"java\/lang\/System\", \"println\", \"(Ljava\/lang\/String;)V\"));     } }  \/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); classNode.accept(writer); byte[] bytecode = writer.toByteArray();<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043d\u0443\u043b\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ClassWriter cw = new ClassWriter(0); cw.visit(V11, ACC_PUBLIC, \"com\/example\/Generated\", null,           \"java\/lang\/Object\", null);  \/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, \"&lt;init&gt;\", \"()V\", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, \"java\/lang\/Object\", \"&lt;init&gt;\", \"()V\", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd();  \/\/ \u041c\u0435\u0442\u043e\u0434 mv = cw.visitMethod(ACC_PUBLIC, \"hello\", \"()Ljava\/lang\/String;\", null, null); mv.visitCode(); mv.visitLdcInsn(\"Hello World\"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd();  byte[] bytecode = cw.toByteArray();<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">public class LoggingAdapter extends MethodVisitor {     private String methodName;          public LoggingAdapter(MethodVisitor mv, String methodName) {         super(ASM9, mv);         this.methodName = methodName;     }          @Override     public void visitCode() {         super.visitCode();         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430         mv.visitFieldInsn(GETSTATIC, \"java\/lang\/System\", \"out\",                           \"Ljava\/io\/PrintStream;\");         mv.visitLdcInsn(\"Entering method: \" + methodName);         mv.visitMethodInsn(INVOKEVIRTUAL, \"java\/io\/PrintStream\",                            \"println\", \"(Ljava\/lang\/String;)V\", false);     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u2014 Spring, Hibernate \u0438 \u0434\u0440. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 ASM \u0434\u043b\u044f proxy-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a, \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u2014 Kotlin, Scala \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 ASM;<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u043a\u0438\u043d\u0433 \u2014 Mockito, PowerMock \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f mock-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>AOP \u2014 AspectJ \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f cross-cutting concerns.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Reflection:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u0432 10-100 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 Reflection;<\/p>\n<\/li>\n<li>\n<p>Compile-time \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u2014 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 <strong>ASM<\/strong> \u2014 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c \u0432 Java-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p><strong>3 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f ASM \u0441 Instrumentation<\/strong><\/p>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f ASM \u0441 Instrumentation \u0432 Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 JVM.\u00a0<\/p>\n<p><strong>\u0412\u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong>. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 (\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u0440\u044d\u043a\u0438\u043d\u0433, \u043c\u0435\u0442\u0440\u0438\u043a\u0438, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435) \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>AOP<\/strong>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0441\u043f\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430).<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437. <\/strong>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043c\u043e\u043a-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043b\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p><strong>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/strong>. \u0417\u0430\u043c\u0435\u043d\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-471735","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471735","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=471735"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471735\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}