{"id":354365,"date":"2024-05-20T22:47:00","date_gmt":"2024-05-20T22:47:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354365"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354365","title":{"rendered":"<span>Time-based \u0430\u0442\u0430\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u043c \u041f\u041e \u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u043c<\/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 loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a3\/8d9\/d82\/7a38d9d825371fba2bdb32fc8cee9c7f.png\" width=\"780\" height=\"450\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a3\/8d9\/d82\/7a38d9d825371fba2bdb32fc8cee9c7f.png\"\/><\/figure>\n<p>\u041a\u0438\u0431\u0435\u0440\u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043d\u0438\u043a\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u0442\u0430\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c \u0437\u0430\u0449\u0438\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0446\u0435\u043b\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u00a0<abbr class=\"habraabbr\" title=\"sandbox evasion\" data-title=\"&lt;p>sandbox evasion&lt;\/p>&#187; data-abbr=&#187;\u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446&#187;>\u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446<\/abbr>: \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0435 \u041f\u041e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0438, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. \u041a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:  <\/p>\n<ul>\n<li>\n<p>\u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435\u00a0<strong>ECX<\/strong>\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID(1)<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u043d\u0438 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID(0x40000000)<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p>MAC-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u0443\u0442\u0435\u0439 \u0440\u0435\u0435\u0441\u0442\u0440\u0430, \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p><strong>CPUID<\/strong>\u00a0\u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/virtualization\/hyper-v-on-windows\/tlfs\/feature-discovery\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft<\/a>\u00a0\u0438\u043b\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. <\/p>\n<\/blockquote>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u0445 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446 \u0432 \u0442\u0430\u0440\u0433\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a\u0430\u0445 \u2014\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/pt\/articles\/507912\/\">\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0410 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u043d\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u00a0<a href=\"https:\/\/www.ptsecurity.com\/ru-ru\/products\/sandbox\/\">PT Sandbox<\/a>.  <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0442\u0430\u043a\u0438<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0430\u0442\u0430\u043a\u0435 \u2015 \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID<\/strong>\u00a0\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 100\u2013200 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u0442\u0438\u043a\u043e\u0432, \u0430 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (VM) \u2014 \u0431\u043e\u043b\u0435\u0435 2000 \u0442\u0438\u043a\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Intel.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b76\/125\/85d\/b7612585dca4b87c41ad2da62abfefb4.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" width=\"896\" height=\"125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b76\/125\/85d\/b7612585dca4b87c41ad2da62abfefb4.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438,\u00a0<strong>CPUID<\/strong>\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u0438\u0437 VM (VM exit). \u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0447\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 CPUID \u0435\u0441\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/xen-project\/xen\/blob\/7a25a1501ca941c3e01b0c4e624ace05417f1587\/xen\/arch\/x86\/hvm\/vmx\/vmx.c#L4437\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/22b\/95c\/df4\/22b95cdf4b8cf86f7ef2670a7dcfcaf4.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a CPUID \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a CPUID \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen  \" width=\"680\" height=\"830\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/22b\/95c\/df4\/22b95cdf4b8cf86f7ef2670a7dcfcaf4.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a CPUID \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen  <\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e VM.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>.  <\/p>\n<blockquote>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a TSC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u00a0<strong>RESET<\/strong>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445\u00a0<strong>EDX:EAX<\/strong>\u00a0\u0432 \u0432\u0438\u0434\u0435 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0435 TSC \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_Stamp_Counter\">\u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>.  <\/p>\n<\/blockquote>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a In The Wild<\/h3>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445\u00a0<a href=\"https:\/\/github.com\/a0rtega\/pafish\/blob\/master\/pafish\/cpu.c#L84\">Pafish<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/github.com\/LordNoteworthy\/al-khaser\/blob\/master\/al-khaser\/TimingAttacks\/timing.cpp#L189\">Al-Khaser<\/a>. \u0412 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441 \u0437\u0430\u043c\u0435\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<strong>CPUID<\/strong>\u00a0\u0441 \u0442\u043e\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e Pafish \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<strong>Sleep<\/strong>\u00a0\u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430. \u042d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: \u043f\u043e\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u041e\u0421 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0445\u043e\u0434\u0435 \u0437\u0430\u043c\u0435\u0440\u0430.  <\/p>\n<pre><code class=\"cpp\">bool rdtsc_diff_vmexit() {     uint64_t tsc1 = 0;     uint64_t tsc2 = 0;     uint64_t avg = 0;     int cpuInfo[4] = {};     \/\/ Try this 10 times in case of small fluctuations     for (int i = 0; i &lt; 10; i++)     {         tsc1 = __rdtsc();         __cpuid(cpuInfo, 0);         tsc2 = __rdtsc();          \/\/ Get the delta of the two RDTSC         avg += (tsc2 - tsc1);         Sleep(500); \/\/ Not present in Al-Khaser     }     \/\/ Process repeated 10 times to make it more reliable     avg = avg \/ 10;     return (avg &lt; 1000 &amp;&amp; avg > 0) ? FALSE : TRUE; }<\/code><\/pre>\n<p>\u0412 Pafish \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0439\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<strong>CPUID<\/strong>. \u041e\u043d\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u044b, \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a TSC.  <\/p>\n<pre><code class=\"cpp\">bool rdtsc_diff() {     uint64_t avg = 0;     for (int i = 0; i &lt; 10; i++) {         tsc1 = __rdtsc();         avg += __rdtsc() - tsc1;          Sleep(500);     }     avg = avg \/ 10;     return (avg &lt; 750 &amp;&amp; avg > 0) ? FALSE : TRUE; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438\u00a0<strong>CPUID<\/strong>\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 VM exit, \u0442\u043e \u0434\u043b\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Intel,\u00a0<strong>RDTSC<\/strong>\u00a0\u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>. \u042d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c26\/49f\/693\/c2649f693ed578a42315a86e3b13478b.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" width=\"864\" height=\"232\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c26\/49f\/693\/c2649f693ed578a42315a86e3b13478b.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u0412\u041f\u041e<\/h3>\n<p><strong>FatalRat<\/strong>\u00a0\u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 TSC \u043d\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 255 \u0442\u0438\u043a\u043e\u0432.  <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/797\/575\/321\/797575321e9af8733d520f312cf46121.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 FatalRat (SHA-256 \u2014 17075832426b085743c2ba811690b525cf8d486da127edc030f28bb3e10e0734)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 FatalRat (SHA-256 \u2014 17075832426b085743c2ba811690b525cf8d486da127edc030f28bb3e10e0734)  \" width=\"505\" height=\"197\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/797\/575\/321\/797575321e9af8733d520f312cf46121.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 FatalRat (SHA-256 \u2014 17075832426b085743c2ba811690b525cf8d486da127edc030f28bb3e10e0734)  <\/figcaption><\/div>\n<\/figure>\n<p><strong>IcedID<\/strong>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439\u00a0<strong>RDTSC \u2192 CPUID \u2192 RDTSC<\/strong>\u00a0\u0438\u00a0<strong>RDTSC \u2192 RDTSC<\/strong>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u00a0<strong>SwitchToThread()<\/strong>\u00a0(\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439\u00a0<strong>Sleep<\/strong>\u00a0\u0432 Pafish).  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a3d\/ae9\/ac7\/a3dae9ac79129295492e7a6b4a638d91.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 IcedID (SHA-256 \u2014 a9fc2b58e0e714a5135bff2d7c5c3a1d46359363696bdfa3feaabeb6f6bdc3af)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 IcedID (SHA-256 \u2014 a9fc2b58e0e714a5135bff2d7c5c3a1d46359363696bdfa3feaabeb6f6bdc3af)  \" width=\"710\" height=\"495\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a3d\/ae9\/ac7\/a3dae9ac79129295492e7a6b4a638d91.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 IcedID (SHA-256 \u2014 a9fc2b58e0e714a5135bff2d7c5c3a1d46359363696bdfa3feaabeb6f6bdc3af)  <\/figcaption><\/div>\n<\/figure>\n<p><strong>GuLoader<\/strong>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043c\u0435\u0440\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0442\u043e\u0433\u043e \u0436\u0435\u00a0<strong>CPUID<\/strong>, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a TSC, \u0430 \u043f\u043e\u043b\u0435\u00a0<strong>SystemTime<\/strong>\u00a0\u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b\u00a0<strong>KUSER_SHARED_DATA<\/strong>\u00a0(\u0441\u043c.\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/ntddk\/ns-ntddk-kuser_shared_data\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>\u00a0Microsoft). \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c02\/94a\/85f\/c0294a85fcaad14d8b749beb81c763aa.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u043f\u0443\u0442\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u044f KUSER_SHARED_DATA.SystemTime (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u043f\u0443\u0442\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u044f KUSER_SHARED_DATA.SystemTime (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  \" width=\"1376\" height=\"429\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c02\/94a\/85f\/c0294a85fcaad14d8b749beb81c763aa.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u043f\u0443\u0442\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u044f KUSER_SHARED_DATA.SystemTime (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0442\u0435, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u0432\u044b\u0437\u043e\u0432\u00a0<strong>RDTSC<\/strong>\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0417\u0430\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f 100 000 \u0440\u0430\u0437, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043e\u0431\u0449\u0435\u043c\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u044c\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043c\u0435\u043d\u0435\u0435 49 \u0442\u0438\u043a\u043e\u0432.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4f2\/02f\/f62\/4f202ff62bbf694ac3ed5137ad475cb0.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 ECX (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 ECX (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  \" width=\"1009\" height=\"311\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4f2\/02f\/f62\/4f202ff62bbf694ac3ed5137ad475cb0.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 ECX (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u044c\u0442\u0430 \u0431\u044b\u043b\u0430 \u043c\u0435\u043d\u0435\u0435 49 \u0442\u0438\u043a\u043e\u0432, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 60\u00a0000;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0443\u043c\u043c\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 110 000 000 \u0442\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0417\u0430 \u0441\u0447\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430\u0445 GuLoader \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0445\u043e\u043b\u043e\u0441\u0442\u0443\u044e, \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u044f \u0434\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0442\u0430\u043a. \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435\u00a0<a href=\"https:\/\/i.blackhat.com\/eu-20\/Thursday\/eu-20-DElia-My-Ticks-Dont-Lie-New-Timing-Attacks-For-Hypervisor-Detection.pdf\">My Ticks Don\u2019t Lie: New Timing Attacks for Hypervisor Detection<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Black Hat.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u044e\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0432\u043e\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0412\u041f\u041e \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0430\u0442\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432\u00a0<strong>RDTSC<\/strong>\u00a0\u0438\u00a0<strong>CPUID<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u044d\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u0434\u0443\u0442 \u043f\u043e\u0434\u0440\u044f\u0434 \u0438\u043b\u0438 \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u043d\u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c VM exit \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0444\u043b\u0430\u0433\u0435\u00a0<strong>RDTSC_EXITING<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u043e\u043a\u0440\u044b\u0442\u0438\u0435 VM \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a<\/h3>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f VM \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u044f\u0437\u043a\u0438 Xen \u0438 DRAKVUF. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>\u00a0\u0432 Xen;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 VM;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440 CR3<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 64-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 CR3 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b PML4, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/blog.xenoscr.net\/2021\/09\/06\/Exploring-Virtual-Memory-and-Page-Structures.html\">\u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 Exploring Virtual Memory and Page Structures<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/connormcgarr.github.io\/paging\/\">Turning the Pages: Introduction to Memory Paging on Windows 10 x64<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b1e\/346\/d8c\/b1e346d8cf92276f6fd1bb711d50617a.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CR3 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CR3 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" width=\"924\" height=\"296\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b1e\/346\/d8c\/b1e346d8cf92276f6fd1bb711d50617a.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CR3 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0442\u043e \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 PML4 \u0432 CR3 \u0431\u0443\u0434\u0443\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438.  <\/p>\n<h4>\u041c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432 Xen<\/h4>\n<p>Xen \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c TSC: \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u043d\u0435\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430\u00a0<strong>RDTSC_EXITING<\/strong>\u00a0(\u0434\u0430\u043b\u0435\u0435 \u2014 \u043b\u043e\u0432\u0443\u0448\u043a\u0430). \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vmx_set_rdtsc_exiting(v, 1); \/\/ v \u2014 vCPU where flag should be enabled<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b EDX:EAX \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">void hvm_rdtsc_intercept_fixed(struct cpu_user_regs *regs, uint64_t set_time) {     \/\/ We already know the TSC value that we have to write     msr_split(regs, set_time);       HVMTRACE_2D(RDTSC, regs->eax, regs->edx); }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u044f\u0434\u0440\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043b\u043e\u0432\u0443\u0448\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u041e\u0421. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0443\u0442\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044f\u00a0<strong>TSC offset<\/strong>. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Intel \u0434\u0430\u0435\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.  <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1b5\/120\/559\/1b5120559f9b19f8d23fe4ebb536baa7.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f TSC offset (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f TSC offset (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  \" width=\"891\" height=\"141\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1b5\/120\/559\/1b5120559f9b19f8d23fe4ebb536baa7.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f TSC offset (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00a0<strong>TSC offset<\/strong>\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u043b\u044c\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0434\u0435\u043b\u044c\u0442\u0443 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00a0<strong>TSC offset<\/strong>\u00a0\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0432 \u043a\u0430\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">static void try_set_tsc_offset(struct vcpu *v) {     if (!v->ts.override_tsc)         return;     \/\/ Turn off RDTSC trap     disable_hook(v);     \/\/ Calculate delta between current time and the time we want to set     delta_to_set = hvm_get_guest_tsc(v) - v->ts;     \/\/ Subtract delta from currently cached tsc_offset      v->arch.hvm.cache_tsc_offset -= delta_to_set;     \/\/ Write new tsc_offset to vCPU     vmx_set_tsc_offset(v, v->arch.hvm.cache_tsc_offset, 0);     \/\/ Not updating system time might cause VM to crash after a while     if (v == current)         force_update_vcpu_system_time(v); }<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0438 \u0435\u0433\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u0438 VM \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439.  <\/p>\n<h4>\u041b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f<\/h4>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 Xen \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\u00a0<strong>RDTSC \u2192 RDTSC<\/strong>\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 \u043d\u0435\u0441\u0442\u0440\u0430\u0448\u043d\u044b. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<strong>CPUID<\/strong>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u00a0<strong>CPUID<\/strong>\u00a0\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 (<strong>CR3, RBP, RIP<\/strong>) \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0432\u0443\u0448\u043a\u0430\u00a0<strong>RDTSC<\/strong>, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0440\u0430\u043d\u0435\u0435.<strong>\u00a0CR3<\/strong>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430,<strong>\u00a0RBP<\/strong>\u00a0\u2014 \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,<strong>\u00a0RIP<\/strong>\u00a0\u2014 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u043a\u043e\u0434\u0430. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u0442\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0437 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u0430\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0432\u044b\u0445\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<strong>RDTSC<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043d\u0435 \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430 N \u0431\u0430\u0439\u0442 \u043e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b EDX:EAX, \u0430 \u043f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 VM \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<strong>TSC offset<\/strong>. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043b\u043e\u0433\u0438\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u043e\u0431\u0449\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">\/\/ Called on each VM exit static void timeoverride_get_params(struct vcpu *v, struct cpu_user_regs *regs, unsigned long exit_reason, unsigned long *cr3, int *override_method, bool *donotadvance)  {     unsigned long _cr3 = 0;     int _override_method = TIMEOVERRIDE_OVERRIDE_NONE;     ...     get_curr_cr3(&amp;_cr3);     \/\/ Checks are only required when RDTSC hook is enabled     if ( v->arch.hvm.vmx.exec_control &amp; CPU_BASED_RDTSC_EXITING)     {         \/\/ Is it the same process?         if ( _cr3 == v->ts.ts_cr3 )         {             \/\/ Is it the same thread or function?             if (v->ts.ts_rbp == regs->rbp)             {                 \/\/ Is it one of the interesting VM exits?                 if( check_vmexit_for_override(exit_reason))                 {                     \/\/ Some other exits within the same process &amp; thread occurred                     \/\/ Disable hook &amp; skip override                     disable_hook(v);                 }                  \/\/ Is it the same chunk of code?                 if (is_close(regs->rip, v->ts.ts_rip))                 {                     _override_method = TIMEOVERRIDE_OVERRIDE_CURRENT;                 }                 else                 {                     \/\/ It's too far, disable hook                     disable_hook(v);                 }             }             \/\/ It's another thread or func             else             {                 ...             }         }         \/\/ It's another process         else         {             ...         }      }            *override_method = _override_method;      *cr3 = _cr3; }<\/code><\/pre>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00a0<strong>CPUID<\/strong>:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">static void timeoverride_cpuid_handler(struct vcpu *v, struct cpu_user_regs *regs, unsigned long cr3, unsigned long exit_reason, uint64_t time) {     \/\/ Enable hook if it's not on     if (!rdstc_exiting(v))         vmx_set_rdtsc_exiting(v, 1);      ...      v->ts.ts = time - TIMEOVERRIDE_CPUID_FIX_DELTA;       \/\/ Save regs, etc.      ... }<\/code><\/pre>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00a0<strong>RDTSC<\/strong>:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"cpp\">static void timeoverride_rdtsc_handler(struct vcpu *v, struct cpu_user_regs *regs, unsigned long cr3, unsigned long exit_reason, int override_method, bool donotadvance, uint64_t time) {     if (override_method != TIMEOVERRIDE_OVERRIDE_NONE)     {         ...         v->ts.ts = v->ts.ts + v->ts.ts_rdtsc_time;         \/\/ Set override flag          v->ts.override_tsc = true;         ...         \/\/ Fill regs          hvm_rdtsc_intercept_fixed(regs, v->ts.ts);         ...     }     else     {      \/\/ Handle RDTSC normally       ...     } }<\/code><\/pre>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u0430\u043c\u043d\u0435\u0439:<\/p>\n<ol>\n<li>\n<p>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u043d\u0430\u00a0<strong>RDTSC<\/strong>\u00a0\u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0434\u0430\u043b\u0435\u0435, \u0447\u0435\u043c \u0437\u0430 N \u0431\u0430\u0439\u0442 \u043e\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0445\u043e\u0434 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c VM.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u041e\u0421 \u0447\u0430\u0441\u0442\u043e \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u00a0<strong>CPUID<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432\u0448\u0438\u0439\u00a0<strong>CPUID<\/strong>), \u0442\u043e\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0431\u0440\u043e\u0441\u044f\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u0431\u044b\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u00a0<strong>RDTSC\u00a0<\/strong>+\u00a0<strong>RDTSC<\/strong>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043f\u043e\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u043e\u0432\u0443\u0448\u043a\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u0432\u0443\u0448\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441\u0447\u0435\u0442\u0447\u0438\u043a \u00ab\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445\u00bb \u0442\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<strong>RDTSC<\/strong>. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430 \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439\u00a0<strong>CPUID<\/strong>\u00a0\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043f\u0440\u043e\u0447\u0438\u0445 VM exit (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432);<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00a0<strong>RDTSC\u00a0<\/strong>\u0438\u043b\u0438<strong>\u00a0CPUID<\/strong>\u00a0\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0432\u0435 \u043a\u043e\u043f\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434, \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b), \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0430\u0441\u044c. \u0414\u043b\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0433\u043e \u0438 \u043f\u044f\u0442\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u00a0<a href=\"#12\">\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u00ab\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f\u00bb\u00a0<\/a>\u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<h4>\u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DRAKVUF<\/h4>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u044f\u0434\u0435\u0440\u043d\u043e\u0439 VM. \u0415\u0441\u043b\u0438 \u0436\u0435 \u044f\u0434\u0435\u0440 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u043e \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u044f\u0434\u0440\u043e, \u0433\u0434\u0435 \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0427\u0442\u043e\u0431\u044b \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u00a0<a href=\"https:\/\/drakvuf.com\/\">DRAKVUF<\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u0445 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445\u00a0\u2014\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/procthread\/scheduling-priorities\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Microsoft<\/a>.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438. \u041f\u043e\u043b\u044f\u00a0<strong>BasePriority<\/strong>\u00a0(\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442) \u0438\u00a0<strong>Priority<\/strong>\u00a0(\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442) \u043f\u043e\u0442\u043e\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u00a0<strong>KTHREAD<\/strong>. \u041e\u043d\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u00a0<strong>KeStartThread<\/strong>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<strong>KeStartThread<\/strong>. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0<strong>KeStartThread<\/strong>, \u043d\u043e \u0438 \u043d\u0430<strong>\u00a0<\/strong>\u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<strong>PspInsertProcess<\/strong>\u00a0\u0438\u00a0<strong>NtTerminateProcess<\/strong>. \u041e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0430 VM \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u00ab\u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445\u00bb \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<pre><code class=\"cpp\">std::vector&lt;addr_t> new_procs;  setpriority::setpriority(drakvuf_t drakvuf,     const setpriority_config* config     , output_format_t output): pluginex(drakvuf, output)     , offsets(new size_t[__OFFSET_MAX])     ) {     \/\/ Load required offsets from profile      if (!drakvuf_get_kernel_struct_members_array_rva(drakvuf, offset_names, __OFFSET_MAX, offsets))     {         PRINT_DEBUG(\"[SETPRIORITY] Failed to get kernel struct member offsets\\n\");         throw -1;     }     ...     \/\/ Set hooks to monitor new processes &amp; save them to new_procs     hooks.push_back(createSyscallHook(\"PspInsertProcess\", &amp;setpriority::hook_insertprocess_cb));     \/\/ Hook to remove terminated process from new_procs     hooks.push_back(createSyscallHook(\"NtTerminateProcess\", &amp;setpriority::hook_terminate_process_cb));     hooks.push_back(createSyscallHook(\"KeStartThread\", &amp;setpriority::hook_threadstart_cb));      }<\/code><\/pre>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043b\u043e\u0432\u0443\u0448\u043a\u0438 \u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u0430\u00a0<strong>KeStartThread<\/strong>\u00a0\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430\u00a0<strong>KTHREAD<\/strong>\u00a0\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430:  <\/p>\n<pre><code class=\"cpp\">event_response_t setpriority::hook_threadstart_cb(drakvuf_t drakvuf, drakvuf_trap_info_t* info) {     \/\/ Get KTHREAD parameter from function arguments     auto kthread = drakvuf_get_function_argument(drakvuf, info, 1);     addr_t process;     \/\/ Find EPROCESS parameter from KTHREAD     if (!drakvuf_get_process_from_thread(drakvuf, kthread, &amp;process))     {         PRINT_DEBUG(\"[SETPRIORITY] Failed to get KTHREAD_PROCESS\\n\");         return VMI_EVENT_RESPONSE_NONE;     }     \/\/ We only want to monitor new processes     if (is_new_process(process))     {         \/\/ Create and save return hook          auto hook_id = this->make_hook_id(info);         auto hook = createReturnHook&lt;createthread_result_t>(info, &amp;return_hook_threadstart_cb);         auto params = libhook::GetTrapParams&lt;createthread_result_t>(hook->trap_);         \/\/ Save KTHREAD parameters to use later         params->thread = kthread;          ret_hooks[hook_id] = std::move(hook);     }     return VMI_EVENT_RESPONSE_NONE; }<\/code><\/pre>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0433\u0434\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u043b\u043e\u0432\u0443\u0448\u043a\u0430. \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442.  <\/p>\n<pre><code class=\"cpp\">static event_response_t return_hook_threadstart_cb(drakvuf_t drakvuf, drakvuf_trap_info_t* info) {     auto plugin = GetTrapPlugin&lt;setpriority>(info);     auto params = libhook::GetTrapParams&lt;createthread_result_t>(info);     \/\/ Ensure it's one of the processes we want to fix     if (!params->verifyResultCallParams(drakvuf, info))         return VMI_EVENT_RESPONSE_NONE;      vmi_lock_guard vmi(drakvuf);     \/\/ Get KTHREAD pointer from trap parameters     auto thread = params->thread;     \/\/ Attempt to fix its priority fields     if (!plugin->set_thread_priority_fields(drakvuf, thread))         return VMI_EVENT_RESPONSE_NONE;      auto hook_id = plugin->make_hook_id(info);     plugin->ret_hooks.erase(hook_id);      return VMI_EVENT_RESPONSE_NONE; }<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430: <\/p>\n<pre><code>bool setpriority::set_thread_priority_fields(drakvuf_t drakvuf, addr_t thread) {     vmi_lock_guard vmi(drakvuf);     if (VMI_SUCCESS != vmi_write_8_va(vmi, thread + offsets[KTHREAD_BASE_PRIORITY], 4, &amp;cfg_base_priority))     {         PRINT_DEBUG(\"[SETPRIORITY] Failed to set KTHREAD_BASE_PRIORITY\\n\");         return false;     }     if (VMI_SUCCESS != vmi_write_8_va(vmi, thread + offsets[KTHREAD_PRIORITY], 4, &amp;cfg_priority))     {         PRINT_DEBUG(\"[SETPRIORITY] Failed to set KTHREAD_BASE_PRIORITY\\n\");         return false;     }     return true; }<\/code><\/pre>\n<h4>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/h4>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Pafish \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a78\/c42\/527\/a78c425279b23388abfb3362d56b763b.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Pafish \u043d\u0430 VM  \" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Pafish \u043d\u0430 VM  \" width=\"653\" height=\"204\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a78\/c42\/527\/a78c425279b23388abfb3362d56b763b.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 10. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Pafish \u043d\u0430 VM  <\/figcaption><\/div>\n<\/figure>\n<h4>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h4>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u0435\u043d \u0438 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043a\u043e\u0440\u0435\u0435 proof of concept \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a.<\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 C-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e C0. \u0418\u043d\u0430\u0447\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM \u0438 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0444\u0441\u0435\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u044f\u0434\u0440\u0430\u043c\u0438 VM, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c.<\/p>\n<p><a class=\"anchor\" name=\"12\" id=\"12\"><\/a><\/p>\n<hr\/>\n<div class=\"persona\" persona=\"true\"><img decoding=\"async\" persona=\"true\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4e\/431\/b4d\/f4e431b4d01d7a904faf8b748fa30ec1.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f4e\/431\/b4d\/f4e431b4d01d7a904faf8b748fa30ec1.png\"\/><\/p>\n<h5 class=\"persona__heading\" persona=\"true\">\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0422\u044e\u043a\u043e\u0432<\/h5>\n<p>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043e\u0442\u0434\u0435\u043b\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u041f\u041e<a href=\"https:\/\/www.ptsecurity.com\/ru-ru\/services\/esc\/\">\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Positive Technologies\u00a0<\/a>(PT Expert Security Center)  <\/p>\n<\/div>\n<h3>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u041f\u043e\u043b\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f\u00bb<\/h3>\n<h4>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044f<\/h4>\n<p>\u041d\u0430\u0447\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0441\u0443\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0432 \u043a\u043e\u0434\u0435 \u043f\u043e\u043b\u0435\u0439 \u0438 \u0438\u0445 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u00a0<strong>vcpu<\/strong>, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0435\u0435 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u043b\u044f. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u044f \u043a\u043e\u043f\u0438\u044f \u043f\u043e\u043b\u0435\u0439.<\/p>\n<pre><code class=\"cpp\">struct vcpu {     int              vcpu_id;     struct timeoverride    ts; \/\/ &lt;- Struct containing all our stuff     ... #endif \u0421\u0430\u043c\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: struct timeoverride {     uint64_t        ts; \/\/ Time to be used for override     uint64_t        ts_rip; \/\/ Last saved RDTSC (CPUID) address     uint64_t        ts_rbp; \/\/ Last saved RDTSC (CPUID) thread, func address     unsigned long   ts_cr3; \/\/ Last saved process identifier  \/\/ Used for backing up ts_* fields     uint64_t        prev_ts;      uint64_t        prev_ts_rip;     uint64_t        prev_ts_rbp;     unsigned long   prev_ts_cr3;      int             ts_prev_exit_reason; \/\/ Last saved exit reason      int             skipped_time_threshold; \/\/ Threshold used to check whether RDTSC trap should be disabled     int             skipped_ctr_prev; \/\/ Used for keeping count of currently \u00abskipped\u00bb exits     int             skipped_ctr_curr; \/\/ Used for keeping count of skipped exits for prev-* fields*     bool            override_tsc; \/\/ Flag indicating if we have to \u00abfix\u00bb time       uint64_t        ts_cpuid_time; \/\/ Native CPUID time     uint64_t        ts_rdtsc_time; \/\/ Native RDTSC time      bool           ts_timing_init_done; \/\/ Flag indicating if native RDTSC (CPUID) times have been initialized  \/\/ Fields used to check whether new check might have started within the current process     uint64_t        temp_ts;      uint64_t        temp_rip;     uint64_t        temp_rbp; };<\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u043e\u043b\u044f\u00a0<strong>ts_cpuid_time<\/strong>\u00a0\u0438\u00a0<strong>ts_rdtsc_time \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.\u00a0<\/strong>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0440\u0430\u0437 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0438\u00a0<strong>CPUID<\/strong>\u00a0\u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0435.  <\/p>\n<pre><code class=\"cpp\">void hvm_ts_init_timings(struct vcpu *v) {     uint64_t r1, _avg = 0;     const int AVG_STEPS = 10;     int eax = 0, ebx = 0, ecx = 0, edx = 0;      for (int i = 0; i &lt; AVG_STEPS; i++)     {         r1 = rdtsc();         _avg = _avg + rdtsc() - r1;              }     v->ts.ts_rdtsc_time = _avg \/ AVG_STEPS;     printk(\"Got native RDTSC time -> %\"PRIu64\"\\n\", v->ts.ts_rdtsc_time);          for (int i = 0; i &lt; AVG_STEPS; i++)     {         r1 = rdtsc();         cpuid(0, &amp;eax, &amp;ebx, &amp;ecx, &amp;edx );         _avg = _avg + rdtsc() - r1;              }     v->ts.ts_cpuid_time = _avg \/ AVG_STEPS;      printk(\"Got native CPUID time -> %\"PRIu64\"\\n\", v->ts.ts_cpuid_time);     v->ts.ts_timing_init_done = true; }<\/code><\/pre>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a CPUID<\/h4>\n<p>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0432\u0443\u0445\u00a0<strong>CPUID<\/strong>\u00a0\u043f\u043e\u0434\u0440\u044f\u0434.<\/p>\n<pre><code class=\"cpp\">\/\/ Last exit from the same thread was CPUID, so it's most likely not a timing check if (v->ts.ts_cr3 == cr3 &amp;&amp; v->ts.ts_rbp == regs->rbp &amp;&amp; v->ts.ts_prev_exit_reason == exit_reason &amp;&amp; rdstc_exiting(v)) {     disable_hook(v); }<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430\u00a0<strong>CPUID<\/strong>\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u00a0<strong>RDTSC<\/strong>, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f: \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\"> \/\/ CPUID goes after some other exit that we saw if (is_close(v->ts.ts_rip, regs->rip) &amp;&amp; regs->rip > v->ts.ts_rip &amp;&amp; regs->rbp == v->ts.ts_rbp) {     init_time_if_needed(v);     \/\/ Emulate CPUID time     v->ts.ts = v->ts.ts + v->ts.ts_cpuid_time + time % 30; \/\/ Add native time + some randomness }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 CPUID:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void timeoverride_cpuid_handler(struct vcpu *v, struct cpu_user_regs *regs, unsigned long cr3, unsigned long exit_reason, uint64_t time) {     \/\/ Last exit from the same thread was CPUID, so it's most likely not a timing check     if (v->ts.ts_cr3 == cr3 &amp;&amp; v->ts.ts_rbp == regs->rbp &amp;&amp; v->ts.ts_prev_exit_reason == exit_reason &amp;&amp; v->arch.hvm.vmx.exec_control &amp; CPU_BASED_RDTSC_EXITING)     {         disable_hook(v);     }     else     {         \/\/ Enable hook if it's not on         if (!rdstc_exiting(v))             vmx_set_rdtsc_exiting(v, 1);          \/\/ CPUID goes after some other exit that we saw         if (is_close(v->ts.ts_rip, regs->rip) &amp;&amp; regs->rip > v->ts.ts_rip &amp;&amp; regs->rbp == v->ts.ts_rbp)         {             \/\/ Emulate CPUID time             v->ts.ts = v->ts.ts + v->ts.ts_cpuid_time + time % 30;         }         else         {             if (v->ts.ts_cr3 == cr3 &amp;&amp; v->ts.temp_rip != regs->rip &amp;&amp; is_close(v->ts.temp_rip, regs->rip))             {                 \/\/ Previous RDTSC call was caught and was considered another thread                 \/\/ Use saved temp time &amp; emulate                 v->ts.ts = v->ts.temp_ts  + v->ts.ts_cpuid_time + time % 30;             }             else             {                 \/\/ Delta is experimental and might differ between different CPUs                 v->ts.ts = time - TIMEOVERRIDE_CPUID_FIX_DELTA;             }          }         \/\/ Save regs          v->ts.ts_rip = regs->rip;         v->ts.ts_rbp = regs->rbp;         v->ts.ts_cr3 = cr3;         v->ts.skipped_ctr_curr = 0;         v->ts.skipped_ctr_prev = 0;         v->ts.ts_prev_exit_reason = exit_reason;     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/h4>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u00ab\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445\u00bb \u0432\u044b\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.  <\/p>\n<pre><code class=\"cpp\">if ( _cr3 == v->ts.ts_cr3 ) {     \/\/ Is it the same thread or function?     if (v->ts.ts_rbp == regs->rbp)     {       ...     }     else     {         if (v->ts.skipped_ctr_curr * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold)         {             _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;             v->ts.skipped_ctr_curr = v->ts.skipped_ctr_curr + 1;         }         else         {             \/\/ Turn off RDTSC trap if we're above the threshold             disable_hook(v);         }     } }<\/code><\/pre>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438; \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.  <\/p>\n<pre><code class=\"cpp\">if ( _cr3 == v->ts.ts_cr3 ) {     \/\/ Is it the same thread or function?     if (v->ts.ts_rbp == regs->rbp)     {       ...     }     else     {         if (v->ts.skipped_ctr_curr * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold)         {             _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;             v->ts.skipped_ctr_curr = v->ts.skipped_ctr_curr + 1;         }         else         {             \/\/ We might be in the middle of the check             \/\/ If so, do not drop saved values or disable hook             if (v->ts.temp_rbp == regs->rbp &amp;&amp; is_close(v->ts.temp_rip, regs->rip))             {                 _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;             }             else             {                 \/\/ Turn off RDTSC trap if we're above the threshold                 disable_hook(v);             }         }     } }<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u043e\u0432\u0443\u0448\u043a\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043d\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0418\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e\u00a0<strong>RDTSC<\/strong>.  <\/p>\n<pre><code class=\"cpp\">inline bool check_vmexit_no_advance(unsigned long exit_reason) {     if (exit_reason == EXIT_REASON_RDTSC ||         exit_reason == EXIT_REASON_RDTSCP)         return true;     return false; }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0432\u0443\u0448\u043a\u0443, \u043d\u0435 \u0432\u043b\u0438\u044f\u044f \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e, \u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440.  <\/p>\n<pre><code class=\"cpp\">if ( _cr3 == v->ts.ts_cr3 ) {     \/\/ Is it the same thread or function?     if (v->ts.ts_rbp == regs->rbp)     {       ...     }     else     {         if (v->ts.skipped_ctr_curr * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold)         {             _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;             v->ts.skipped_ctr_curr = v->ts.skipped_ctr_curr + 1;         }         else         {             \/\/ We might be in the middle of the check             \/\/ If so, do not drop saved values or disable hook             if (v->ts.temp_rbp == regs->rbp &amp;&amp; is_close(v->ts.temp_rip, regs->rip))             {                 _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;             }             else             {                 \/\/ Turn off RDTSC trap if we're above the threshold                 disable_hook(v);                 _donotadvance = check_vmexit_no_advance(exit_reason);             }         }     } }<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b\u0445\u043e\u0434 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u0435\u0435. \u041f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u043b\u0430\u0433 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u00a0<strong>RDTSC<\/strong>.  <\/p>\n<pre><code class=\"cpp\">if (v->ts.prev_ts_cr3 == _cr3 &amp;&amp; v->ts.prev_ts_rbp == regs->rbp) {     _override_method = TIMEOVERRIDE_OVERRIDE_PREV; }<\/code><\/pre>\n<p>\u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0445\u043e\u0434\u043e\u0432. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043b\u043e\u0432\u0443\u0448\u043a\u0443.  <\/p>\n<pre><code class=\"cpp\">if (v->ts.skipped_ctr_prev * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold ) {     if (v->ts.prev_ts_cr3 == v->ts.ts_cr3 &amp;&amp; v->ts.prev_ts_rbp == v->ts.ts_rbp)     {     \/\/ Values for this process were already backed up, update counters &amp; time         v->ts.prev_ts = v->ts.prev_ts + v->ts.ts_rdtsc_time;         v->ts.skipped_ctr_prev = v->ts.skipped_ctr_prev + 1;     }     else     {         \/\/ It hasn't been saved, save it now         v->ts.prev_ts = v->ts.ts;         v->ts.prev_ts_rbp = v->ts.ts_rbp;         v->ts.prev_ts_rip = v->ts.ts_rip;         v->ts.prev_ts_cr3 = v->ts.ts_cr3;         v->ts.skipped_ctr_prev =  v->ts.skipped_ctr_curr;         v->ts.skipped_ctr_curr = 0;     } } else {     disable_hook(v);   }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 timeoverride_get_params:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void timeoverride_get_params(struct vcpu *v, struct cpu_user_regs *regs,  unsigned long exit_reason, unsigned long *cr3, int *override_method, bool *donotadvance) {     unsigned long _cr3 = 0;     int _override_method = TIMEOVERRIDE_OVERRIDE_NONE;     bool _donotadvance = false;      get_curr_cr3(&amp;_cr3);     \/\/ The following is only required if RDTSC trap was enabled          if ( v->arch.hvm.vmx.exec_control &amp; CPU_BASED_RDTSC_EXITING )     {         \/\/ Is it the same process?         if ( _cr3 == v->ts.ts_cr3 )         {             \/\/ Is it the same thread or function?             if (v->ts.ts_rbp == regs->rbp)             {                 \/\/ Is it one of the interesting vm_exits?                 if( check_vmexit_for_override(exit_reason))                 {                     \/\/ Some other exits within the same process &amp; thread occurred, disable hook &amp; skip override                     disable_hook(v);                 }                  \/\/ Is it the same chunk of code?                 if (is_close(regs->rip, v->ts.ts_rip))                 {                     _override_method = TIMEOVERRIDE_OVERRIDE_CURRENT;                 }                 else                 {                     disable_hook(v);                     \/\/ Check if we should not advance RIP for current exit                     _donotadvance = check_vmexit_no_advance(exit_reason);                 }             }             else             {                 if (v->ts.skipped_ctr_curr * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold)                 {                     _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;                     v->ts.skipped_ctr_curr = v->ts.skipped_ctr_curr + 1;                 }                    else                 {                     \/\/ We might be in the middle of the check                     \/\/ If so, do not drop values                     if (v->ts.temp_rbp == regs->rbp &amp;&amp; is_close(v->ts.temp_rip, regs->rip))                     {                         _override_method = TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION;                     }                     else                     {                         \/\/ Turn off RDTSC trap if we're above the threshold                         disable_hook(v);                         _donotadvance = check_vmexit_no_advance(exit_reason);                     }                 }             }         }         else         {             \/\/ Do values match with the saved ones?             if (v->ts.prev_ts_cr3 == _cr3 &amp;&amp; v->ts.prev_ts_rbp == regs->rbp)             {                 _override_method = TIMEOVERRIDE_OVERRIDE_PREV;             }              else             {                 \/\/ Check if it's above the threshold, if so, disable hook                 if (v->ts.skipped_ctr_prev * v->ts.ts_rdtsc_time &lt; v->ts.skipped_time_threshold )                 {                     \/\/ It's another process, save current values as backup in case it was switched during override                     \/\/ If they're not saved already                     if (v->ts.prev_ts_cr3 == v->ts.ts_cr3 &amp;&amp; v->ts.prev_ts_rbp == v->ts.ts_rbp)                     {                         v->ts.prev_ts = v->ts.prev_ts + v->ts.ts_rdtsc_time;                         v->ts.skipped_ctr_prev = v->ts.skipped_ctr_prev + 1;                     }                     else                     {                         \/\/ It hasn't been saved yet, save it now                         v->ts.prev_ts = v->ts.ts;                         v->ts.prev_ts_rbp = v->ts.ts_rbp;                         v->ts.prev_ts_rip = v->ts.ts_rip;                         v->ts.prev_ts_cr3 = v->ts.ts_cr3;                         v->ts.skipped_ctr_prev =  v->ts.skipped_ctr_curr;                         v->ts.skipped_ctr_curr = 0;                     }                 }                 else                 {                     \/\/ Missed too much exits, drop saved values, disable hook                     disable_hook(v);                 }             }         }     }     \/\/ init variables for further use     *cr3 = _cr3;     *override_method = _override_method;     *donotadvance = _donotadvance; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a RDTSC<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0444\u043b\u0430\u0433\u0430\u00a0<strong>override_method<\/strong>, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0444\u043b\u0430\u0433\u0430\u00a0<strong>donotadvance<\/strong>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e, \u043a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435, \u043d\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u00a0<strong>RIP<\/strong>. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u00a0<strong>update_guest_eip<\/strong>.<\/p>\n<pre><code class=\"cpp\">if (!donotadvance)         update_guest_eip(); else     if (TIMEOVERRIDE_PRINT_DBG)         printk(\"[SKIPPED EIP UPDATE]\\n\");<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438\u0437 \u043a\u043e\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<strong>timeoverride_get_params<\/strong>, \u0434\u043b\u044f \u0444\u043b\u0430\u0433\u0430\u00a0<strong>override_method<\/strong>\u00a0\u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><strong>TIMEOVERRIDE_OVERRIDE_NONE<\/strong>,<\/p>\n<\/li>\n<li>\n<p><strong>TIMEOVERRIDE_OVERRIDE_CURRENT<\/strong>,<\/p>\n<\/li>\n<li>\n<p><strong>TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION<\/strong>,<\/p>\n<\/li>\n<li>\n<p><strong>TIMEOVERRIDE_OVERRIDE_PREV<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435\u00a0<strong>TIMEOVERRIDE_OVERRIDE_NONE<\/strong>\u00a0\u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u00a0<strong>RDTSC<\/strong>\u00a0\u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439.<\/p>\n<pre><code class=\"cpp\"> if (override_method != TIMEOVERRIDE_OVERRIDE_NONE) {     ... } else {     \/\/ Default handler      hvm_rdtsc_intercept(regs); }<\/code><\/pre>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435\u00a0<strong>TIMEOVERRIDE_OVERRIDE_PREV<\/strong>\u00a0\u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439.  <\/p>\n<pre><code class=\"cpp\"> if (override_method == TIMEOVERRIDE_OVERRIDE_PREV) {     v->ts.ts = v->ts.prev_ts;     time = v->ts.prev_ts;     v->ts.ts_rip = v->ts.prev_ts_rip;     v->ts.ts_rbp = v->ts.prev_ts_rbp;     v->ts.ts_cr3 = v->ts.prev_ts_cr3; }<\/code><\/pre>\n<p>\u041f\u0440\u0438\u00a0<strong>TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION<\/strong>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u043d\u0435\u0435. \u0418\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.  <\/p>\n<pre><code class=\"cpp\"> if (override_method == TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION)         {             if (v->ts.temp_rip != regs->rip)             {                 \/\/ RDTSC exit with differing RBP might indicate start of a new timing check                 \/\/ Save values to check on the next exit                 if (is_close(v->ts.temp_rip, regs->rip))                 {                     \/\/ Possible new check found, updating values                     v->ts.ts = v->ts.temp_ts;                     v->ts.ts_rbp = v->ts.temp_rbp;                     v->ts.ts_rip = v->ts.temp_rip;                     drop_temp_values(v);                 }                 else                 {                     \/\/ Saving new temp values                     v->ts.temp_rip = regs->rip;                     v->ts.temp_ts = time;                     v->ts.temp_rbp = regs->rbp;                 }             } }<\/code><\/pre>\n<p>\u0421\u043b\u0443\u0447\u0430\u0439\u00a0<strong>TIMEOVERRIDE_OVERRIDE_CURRENT<\/strong>\u00a0\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439: \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.  <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0447\u0430\u0441\u0442\u0438 \u0432\u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void timeoverride_rdtsc_handler(struct vcpu *v, struct cpu_user_regs *regs, unsigned long cr3, unsigned long exit_reason, int override_method, bool donotadvance, uint64_t time) {     if (override_method != TIMEOVERRIDE_OVERRIDE_NONE)     {         \/\/ Save the last exit reason          if (override_method == TIMEOVERRIDE_OVERRIDE_CURRENT)             v->ts.ts_prev_exit_reason = exit_reason;          if (override_method == TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION)         {             if (v->ts.temp_rip != regs->rip)             {                 \/\/ RDTSC exit with differing RBP might indicate start of a new timing check                 \/\/ Save values to check on the next exit                 if (is_close(v->ts.temp_rip, regs->rip))                 {                     \/\/ Possible new check found, updating values                     v->ts.ts = v->ts.temp_ts;                     v->ts.ts_rbp = v->ts.temp_rbp;                     v->ts.ts_rip = v->ts.temp_rip;                     drop_temp_values(v);                 }                 else                 {                     \/\/ Saving new temp values                     v->ts.temp_rip = regs->rip;                     v->ts.temp_ts = time;                     v->ts.temp_rbp = regs->rbp;                 }             }         }         else         {              if (override_method == TIMEOVERRIDE_OVERRIDE_PREV)             {                 v->ts.ts = v->ts.prev_ts;                 time = v->ts.prev_ts;                 v->ts.ts_rip = v->ts.prev_ts_rip;                 v->ts.ts_rbp = v->ts.prev_ts_rbp;                 v->ts.ts_cr3 = v->ts.prev_ts_cr3;             }         }          \/\/ logic to process some borderline cases         if (!is_close(v->ts.ts_rip, regs->rip))         {             if (override_method != TIMEOVERRIDE_OVERRIDE_ANOTHER_THREAD_OR_FUNCTION)             {                 \/\/ Long call delta from the same thread (func)                 v->ts.ts = time;                 v->ts.ts_rip = regs->rip;                 v->ts.ts_rbp = regs->rbp;                 v->ts.ts_cr3 = cr3;                 hvm_rdtsc_intercept_fixed(regs, v->ts.ts);             }             else             {                 \/\/ Long call from other thread                 hvm_rdtsc_intercept_fixed(regs, time);             }         }         else         {             \/\/ Fix time              v->ts.ts = v->ts.ts + v->ts.ts_rdtsc_time;             \/\/ If it was something we fixed, allow to update rip             donotadvance = false;             v->ts.ts_prev_exit_reason = exit_reason;             v->ts.override_tsc = true;             v->ts.skipped_ctr_curr = 0;             hvm_rdtsc_intercept_fixed(regs, v->ts.ts);         }     }     else     {         hvm_rdtsc_intercept(regs);     }      if (!donotadvance)         update_guest_eip();     else         if (TIMEOVERRIDE_PRINT_DBG)             printk(\"[SKIP EIP UPDATE]\\n\"); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0441\u0442\u0430.  <\/p>\n<pre><code class=\"cpp\">void vmx_vmexit_handler(struct cpu_user_regs *regs) {     uint64_t time;     unsigned long cr3;     int override_method = TIMEOVERRIDE_OVERRIDE_NONE;     bool donotadvance = false;      time = hvm_get_guest_tsc(v);      ...     timeoverride_get_params(v, regs, exit_reason, &amp;cr3, &amp;override_method, &amp;donotadvance);     ...     switch ( (uint16_t)exit_reason )     {         ...     case EXIT_REASON_CPUID:     {         int rc;         rc = hvm_vmexit_cpuid(regs, get_instruction_length());          timeoverride_cpuid_handler(v, regs, cr3, exit_reason, time);                  if ( rc &lt; 0 )             goto exit_and_crash;         if ( !rc )             update_guest_eip(); \/* Safe: CPUID *\/         break;     }     ...     case EXIT_REASON_RDTSC:     {         timeoverride_rdtsc_handler(v, regs, cr3, exit_reason, override_method, donotadvance, time);         break;     }               }  }<\/code><\/pre>\n<p>\u041d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 \u0432 VM.  <\/p>\n<pre><code class=\"cpp\">bool vmx_vmenter_helper(const struct cpu_user_regs *regs) {     ...     try_set_tsc_offset(curr); \/\/ curr \u2014 macro for current vCPU     return true; }<\/code><\/pre>\n<\/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\/759758\/\"> https:\/\/habr.com\/ru\/articles\/759758\/<\/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>\u041a\u0438\u0431\u0435\u0440\u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043d\u0438\u043a\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u0442\u0430\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c \u0437\u0430\u0449\u0438\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0446\u0435\u043b\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u00a0<abbr class=\"habraabbr\" title=\"sandbox evasion\" data-title=\"&lt;p>sandbox evasion&lt;\/p>&#187; data-abbr=&#187;\u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446&#187;>\u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446<\/abbr>: \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0435 \u041f\u041e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0438, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. \u041a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u043c \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:  <\/p>\n<ul>\n<li>\n<p>\u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435\u00a0<strong>ECX<\/strong>\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID(1)<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u043d\u0438 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID(0x40000000)<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u043d\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p>MAC-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043e\u0431\u0449\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u0443\u0442\u0435\u0439 \u0440\u0435\u0435\u0441\u0442\u0440\u0430, \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0440\u0435\u0434;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p><strong>CPUID<\/strong>\u00a0\u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438). \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/virtualization\/hyper-v-on-windows\/tlfs\/feature-discovery\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft<\/a>\u00a0\u0438\u043b\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. <\/p>\n<\/blockquote>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u0445 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446 \u0432 \u0442\u0430\u0440\u0433\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a\u0430\u0445 \u2014\u00a0<a href=\"https:\/\/habr.com\/ru\/companies\/pt\/articles\/507912\/\">\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0410 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a\u0430\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u043d\u0438\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432\u00a0<a href=\"https:\/\/www.ptsecurity.com\/ru-ru\/products\/sandbox\/\">PT Sandbox<\/a>.  <\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0442\u0430\u043a\u0438<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0430\u0442\u0430\u043a\u0435 \u2015 \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00a0<strong>CPUID<\/strong>\u00a0\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 100\u2013200 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u0442\u0438\u043a\u043e\u0432, \u0430 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (VM) \u2014 \u0431\u043e\u043b\u0435\u0435 2000 \u0442\u0438\u043a\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Intel.  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 1. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438,\u00a0<strong>CPUID<\/strong>\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u0438\u0437 VM (VM exit). \u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0447\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 CPUID \u0435\u0441\u0442\u044c\u00a0<a href=\"https:\/\/github.com\/xen-project\/xen\/blob\/7a25a1501ca941c3e01b0c4e624ace05417f1587\/xen\/arch\/x86\/hvm\/vmx\/vmx.c#L4437\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen<\/a>.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a CPUID \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 Xen  <\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 VM \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u0437 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e VM.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>.  <\/p>\n<blockquote>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a TSC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u00a0<strong>RESET<\/strong>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445\u00a0<strong>EDX:EAX<\/strong>\u00a0\u0432 \u0432\u0438\u0434\u0435 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0435 TSC \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Time_Stamp_Counter\">\u0438\u0437 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>.  <\/p>\n<\/blockquote>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a In The Wild<\/h3>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445\u00a0<a href=\"https:\/\/github.com\/a0rtega\/pafish\/blob\/master\/pafish\/cpu.c#L84\">Pafish<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/github.com\/LordNoteworthy\/al-khaser\/blob\/master\/al-khaser\/TimingAttacks\/timing.cpp#L189\">Al-Khaser<\/a>. \u0412 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441 \u0437\u0430\u043c\u0435\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0<strong>CPUID<\/strong>\u00a0\u0441 \u0442\u043e\u0439 \u043b\u0438\u0448\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439, \u0447\u0442\u043e Pafish \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<strong>Sleep<\/strong>\u00a0\u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430. \u042d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: \u043f\u043e\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u041e\u0421 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0445\u043e\u0434\u0435 \u0437\u0430\u043c\u0435\u0440\u0430.  <\/p>\n<pre><code class=\"cpp\">bool rdtsc_diff_vmexit() {     uint64_t tsc1 = 0;     uint64_t tsc2 = 0;     uint64_t avg = 0;     int cpuInfo[4] = {};     \/\/ Try this 10 times in case of small fluctuations     for (int i = 0; i &lt; 10; i++)     {         tsc1 = __rdtsc();         __cpuid(cpuInfo, 0);         tsc2 = __rdtsc();          \/\/ Get the delta of the two RDTSC         avg += (tsc2 - tsc1);         Sleep(500); \/\/ Not present in Al-Khaser     }     \/\/ Process repeated 10 times to make it more reliable     avg = avg \/ 10;     return (avg &lt; 1000 &amp;&amp; avg > 0) ? FALSE : TRUE; }<\/code><\/pre>\n<p>\u0412 Pafish \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0439\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f\u00a0<strong>CPUID<\/strong>. \u041e\u043d\u0430 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u044b, \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a TSC.  <\/p>\n<pre><code class=\"cpp\">bool rdtsc_diff() {     uint64_t avg = 0;     for (int i = 0; i &lt; 10; i++) {         tsc1 = __rdtsc();         avg += __rdtsc() - tsc1;          Sleep(500);     }     avg = avg \/ 10;     return (avg &lt; 750 &amp;&amp; avg > 0) ? FALSE : TRUE; }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438\u00a0<strong>CPUID<\/strong>\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 VM exit, \u0442\u043e \u0434\u043b\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Intel,\u00a0<strong>RDTSC<\/strong>\u00a0\u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0432 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>. \u042d\u0442\u043e\u0442 \u0444\u0430\u043a\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430\u043c \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 3. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<h3>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 \u0412\u041f\u041e<\/h3>\n<p><strong>FatalRat<\/strong>\u00a0\u0435\u0434\u0438\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 TSC \u043d\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 255 \u0442\u0438\u043a\u043e\u0432.  <\/p>\n<figure class=\"\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 4. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 FatalRat (SHA-256 \u2014 17075832426b085743c2ba811690b525cf8d486da127edc030f28bb3e10e0734)  <\/figcaption><\/div>\n<\/figure>\n<p><strong>IcedID<\/strong>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439\u00a0<strong>RDTSC \u2192 CPUID \u2192 RDTSC<\/strong>\u00a0\u0438\u00a0<strong>RDTSC \u2192 RDTSC<\/strong>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0445 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u00a0<strong>SwitchToThread()<\/strong>\u00a0(\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439\u00a0<strong>Sleep<\/strong>\u00a0\u0432 Pafish).  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 5. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 IcedID (SHA-256 \u2014 a9fc2b58e0e714a5135bff2d7c5c3a1d46359363696bdfa3feaabeb6f6bdc3af)  <\/figcaption><\/div>\n<\/figure>\n<p><strong>GuLoader<\/strong>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043c\u0435\u0440\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0442\u043e\u0433\u043e \u0436\u0435\u00a0<strong>CPUID<\/strong>, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a TSC, \u0430 \u043f\u043e\u043b\u0435\u00a0<strong>SystemTime<\/strong>\u00a0\u0438\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b\u00a0<strong>KUSER_SHARED_DATA<\/strong>\u00a0(\u0441\u043c.\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/ntddk\/ns-ntddk-kuser_shared_data\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>\u00a0Microsoft). \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u043f\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443.  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 6. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u043f\u0443\u0442\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u044f KUSER_SHARED_DATA.SystemTime (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0442\u0435, \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u0432\u044b\u0437\u043e\u0432\u00a0<strong>RDTSC<\/strong>\u00a0\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0417\u0430\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f 100 000 \u0440\u0430\u0437, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a \u043e\u0431\u0449\u0435\u043c\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u044c\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043c\u0435\u043d\u0435\u0435 49 \u0442\u0438\u043a\u043e\u0432.  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 7. \u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f CPUID \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0438\u0442\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 ECX (SHA-256 \u2014 b44b66a528c6cc9f395cf656a336edd3e763744529cbd3eab845f7ef371d6535)  <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u0437\u0430\u043c\u0435\u0440\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u044c\u0442\u0430 \u0431\u044b\u043b\u0430 \u043c\u0435\u043d\u0435\u0435 49 \u0442\u0438\u043a\u043e\u0432, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 60\u00a0000;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0443\u043c\u043c\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 110 000 000 \u0442\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0417\u0430 \u0441\u0447\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430\u0445 GuLoader \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0445\u043e\u043b\u043e\u0441\u0442\u0443\u044e, \u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u044f \u0434\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0430\u0442\u0430\u043a. \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435\u00a0<a href=\"https:\/\/i.blackhat.com\/eu-20\/Thursday\/eu-20-DElia-My-Ticks-Dont-Lie-New-Timing-Attacks-For-Hypervisor-Detection.pdf\">My Ticks Don\u2019t Lie: New Timing Attacks for Hypervisor Detection<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Black Hat.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u044e\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0432\u043e\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0412\u041f\u041e \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0430\u0442\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432\u00a0<strong>RDTSC<\/strong>\u00a0\u0438\u00a0<strong>CPUID<\/strong>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u044d\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438\u0434\u0443\u0442 \u043f\u043e\u0434\u0440\u044f\u0434 \u0438\u043b\u0438 \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u043d\u0441 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u00a0<strong>RDTSC<\/strong>\u00a0\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c VM exit \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u0444\u043b\u0430\u0433\u0435\u00a0<strong>RDTSC_EXITING<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0421\u043e\u043a\u0440\u044b\u0442\u0438\u0435 VM \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a<\/h3>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f VM \u043d\u0430 \u0431\u0430\u0437\u0435 \u0441\u0432\u044f\u0437\u043a\u0438 Xen \u0438 DRAKVUF. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 VM exit \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>\u00a0\u0432 Xen;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430 VM;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440 CR3<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 64-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 CR3 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b PML4, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c\u00a0<a href=\"https:\/\/blog.xenoscr.net\/2021\/09\/06\/Exploring-Virtual-Memory-and-Page-Structures.html\">\u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 Exploring Virtual Memory and Page Structures<\/a>\u00a0\u0438\u00a0<a href=\"https:\/\/connormcgarr.github.io\/paging\/\">Turning the Pages: Introduction to Memory Paging on Windows 10 x64<\/a>.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 8. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b CR3 (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0442\u043e \u0438 \u0430\u0434\u0440\u0435\u0441\u0430 PML4 \u0432 CR3 \u0431\u0443\u0434\u0443\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438.  <\/p>\n<h4>\u041c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432 Xen<\/h4>\n<p>Xen \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c TSC: \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0440\u0435\u0436\u0438\u043c \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u043d\u0435\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430\u00a0<strong>RDTSC_EXITING<\/strong>\u00a0(\u0434\u0430\u043b\u0435\u0435 \u2014 \u043b\u043e\u0432\u0443\u0448\u043a\u0430). \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vmx_set_rdtsc_exiting(v, 1); \/\/ v \u2014 vCPU where flag should be enabled<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b EDX:EAX \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">void hvm_rdtsc_intercept_fixed(struct cpu_user_regs *regs, uint64_t set_time) {     \/\/ We already know the TSC value that we have to write     msr_split(regs, set_time);       HVMTRACE_2D(RDTSC, regs->eax, regs->edx); }<\/code><\/pre>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u044f\u0434\u0440\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043b\u043e\u0432\u0443\u0448\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u041e\u0421. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0443\u0442\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044f\u00a0<strong>TSC offset<\/strong>. \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f Intel \u0434\u0430\u0435\u0442 \u0447\u0435\u0442\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438 \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.  <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a 9. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f TSC offset (Intel\u00ae 64 and IA-32 Architectures Software Developer\u2019s Manual Volume 3 (3A, 3B, 3C, &amp; 3D): System Programming Guide)  <\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043b\u0430\u0433\u00a0<strong>RDTSC_EXITING<\/strong>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00a0<strong>TSC offset<\/strong>\u00a0\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u043b\u044c\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0434\u0435\u043b\u044c\u0442\u0443 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u00a0<strong>TSC<\/strong><\/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-354365","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354365","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=354365"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354365\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}