<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dotnet &#8211; PT ESC</title>
	<atom:link href="/tag/dotnet/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Wed, 30 Sep 2026 19:20:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>/wp-content/uploads/2026/09/cropped-cropped-large_icon-32x32.png</url>
	<title>dotnet &#8211; PT ESC</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>.NET Reactor: эволюция защиты с 6.7 до 7.0 и методы снятия обфускации</title>
		<link>/net-reactor-the-evolution-of-protection-from-6-7-to-7-0-and-methods-for-removing/</link>
		
		<dc:creator><![CDATA[global_author]]></dc:creator>
		<pubDate>Mon, 03 Mar 2025 18:06:33 +0000</pubDate>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[avlab]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[obfuscation]]></category>
		<category><![CDATA[sandboxteam]]></category>
		<guid isPermaLink="false">/net-reactor-%d1%8d%d0%b2%d0%be%d0%bb%d1%8e%d1%86%d0%b8%d1%8f-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d1%8b-%d1%81-6-7-%d0%b4%d0%be-7-0-%d0%b8-%d0%bc%d0%b5%d1%82%d0%be%d0%b4%d1%8b-%d1%81%d0%bd%d1%8f%d1%82/</guid>

					<description><![CDATA[.NET Reactor: эволюция защиты с 6.7 до 7.0 и методы снятия обфускации 🔄 .NET Reactor — это мощный инструмент для защиты исполняемых файлов, написанных на С#, от декомпиляции и обратного инжиниринга. Он…]]></description>
										<content:encoded><![CDATA[<p><strong>.NET Reactor: эволюция защиты с 6.7 до 7.0 и методы снятия обфускации</strong> 🔄</p>
<p>.NET Reactor — это мощный инструмент для защиты исполняемых файлов, написанных на С#, от декомпиляции и обратного инжиниринга. Он предоставляет различные методы обфускации и лицензирования, обеспечивая безопасность интеллектуальной собственности разработчиков. </p>
<p>Но, как это обычно бывает, применяется он не только в благих целях: экспертам антивирусной лаборатории PT ESC часто попадаются вредоносные файлы, защищенные от анализа именно .Net Reactor.</p>
<p>🔓 <strong>Как защищен?</strong></p>
<p>.NET Reactor использует несколько уровней защиты для предотвращения декомпиляции и анализа кода:</p>
<p><strong>• NecroBit IL Code Protection:</strong> заменяет CIL-код методов на зашифрованный, делая невозможной декомпиляцию и восстановление исходного кода.</p>
<p><strong>• Виртуализация кода:</strong> преобразует исходный код в набор инструкций отличный от .NET IL, которые интерпретируются во время выполнения виртуальной машиной, что затрудняет анализ и восстановление оригинального кода.</p>
<p><strong>• Обфускация потока управления (Control Flow Obfuscation):</strong> преобразует код методов в запутанную структуру, усложняя понимание логики программы и затрудняя работу декомпиляторов (<em>пример — на скриншоте 1</em>).</p>
<p><strong>• Шифрование строк (String Encryption):</strong> шифрует строки в коде, предотвращая их чтение и анализ, что усложняет понимание функциональности приложения, как показано <em>на скриншоте 2</em>.</p>
<p><strong>• Антиотладочные механизмы (Anti Debug):</strong> внедряет проверки на наличие отладчиков, завершая процесс при их обнаружении, что препятствует динамическому анализу приложения. </p>
<p>🆕 <strong>Что нового?</strong></p>
<p>• Поддержка .NET 6.0: обеспечивает защиту для новейших приложений на этой платформе.</p>
<p>• Улучшения в виртуализации кода и Control Flow Obfuscation обеспечивают дальнейшее повышение надежности и сложности обфускации.</p>
<p>• Скрытие содержимого объединенных приложений .NET Core, 5.0, 6.0 предотвращает просмотр содержимого с помощью инструментов, таких как ILSpy / dnSpy.</p>
<p>🧐 <strong>Как анализировать?</strong></p>
<p>Несмотря на сложность защиты, существуют инструменты, которые облегчают жизнь реверсерам.<br />
NETReactorSlayer — мощный инструмент для реверса приложений, обфусцированных с помощью .NET Reactor. Его главные фишки:</p>
<p>• дешифровка NecroBit — восстанавливает CIL-код из зашифрованных методов;</p>
<p>• удаление прокси и оберток — очищает код от мусора, добавленного обфускатором (<em>смотрите на скриншоте 3</em>);</p>
<p>• декодирование строк и ресурсов — возвращает читаемые строки, зашифрованные в приложении;</p>
<p>• обход антиотладки и защиты от изменения кода.</p>
<p>Однако начиная с версии 6.9 изначальная версия Net Reactor Slayer перестала справляться с деобфускацией защиты даже с базовыми параметрами. Благодаря открытому исходному коду и довольно большому комьюнити, в pull requests можно найти исправленный код, который прекрасно отрабатывает даже на самой свежей версии обфускатора.</p>
<p>Но вот с виртуализированным кодом не все так гладко: Net Reactor Slayer с ним не справляется. Если вам повезло и файл был защищен версией <code>6.9.0.0</code>, то можно не тратить время на ручной анализ виртуальной машины, а применить VMAttack — инструмент для девиртуализации приложений .NET, в котором есть поддержка этой версии .NET Reactor. А если не повезло — проще всего проанализировать файл по его поведению, например с помощью PT Sandbox.</p>
<p>☝️ <strong>Вывод</strong></p>
<p>.NET Reactor остается одним из самых популярных обфускаторов для .NET. С каждой версией защита усложняется, особенно за счет виртуализации. Если собираетесь его анализировать — запасайтесь терпением и хорошими инструментами.</p>
<figure class="wp-block-image"><img width="1024" height="320" src="/wp-content/uploads/2025/03/photo_214@03-03-2025_18-06-33-1024x320.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_214@03-03-2025_18-06-33-1024x320.jpg 1024w, /wp-content/uploads/2025/03/photo_214@03-03-2025_18-06-33-300x94.jpg 300w, /wp-content/uploads/2025/03/photo_214@03-03-2025_18-06-33-768x240.jpg 768w, /wp-content/uploads/2025/03/photo_214@03-03-2025_18-06-33.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="601" src="/wp-content/uploads/2025/03/photo_215@03-03-2025_18-06-33-1024x601.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_215@03-03-2025_18-06-33-1024x601.jpg 1024w, /wp-content/uploads/2025/03/photo_215@03-03-2025_18-06-33-300x176.jpg 300w, /wp-content/uploads/2025/03/photo_215@03-03-2025_18-06-33-768x451.jpg 768w, /wp-content/uploads/2025/03/photo_215@03-03-2025_18-06-33.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p><span class="hashtag">#avlab</span> <span class="hashtag">#sandboxteam</span> <span class="hashtag">#dotnet</span> <span class="hashtag">#obfuscation</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Где искать сетевые индикаторы компрометации на Windows?</title>
		<link>/where-to-look-for-network-indicators-of-compromise-on-windows/</link>
		
		<dc:creator><![CDATA[oUth0R]]></dc:creator>
		<pubDate>Mon, 12 Aug 2024 17:03:49 +0000</pubDate>
				<category><![CDATA[Incident Response]]></category>
		<category><![CDATA[dfir]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[hunt]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[triage]]></category>
		<category><![CDATA[win]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%b3%d0%b4%d0%b5-%d0%b8%d1%81%d0%ba%d0%b0%d1%82%d1%8c-%d1%81%d0%b5%d1%82%d0%b5%d0%b2%d1%8b%d0%b5-%d0%b8%d0%bd%d0%b4%d0%b8%d0%ba%d0%b0%d1%82%d0%be%d1%80%d1%8b-%d0%ba%d0%be%d0%bc%d0%bf%d1%80%d0%be/</guid>

					<description><![CDATA[Где искать сетевые индикаторы компрометации на Windows? Например, в кэше DNS 💡 Кэш DNS — механизм кэширования записей соответствия доменных имен IP-адресам (и не только). Он нужен для того, чтобы система каждый…]]></description>
										<content:encoded><![CDATA[<p><strong>Где искать сетевые индикаторы компрометации на Windows?</strong> Например, в кэше DNS 💡</p>
<p>Кэш DNS — механизм кэширования записей соответствия доменных имен IP-адресам (и не только). Он нужен для того, чтобы система каждый раз не обращалась к DNS-серверам за этой информацией. Посмотреть содержимое кэша можно с помощью команды <code>ipconfig /displaydns</code>, <strong>но не спешите это делать</strong>.</p>
<p>У каждой DNS-записи есть параметр TTL (time to live), который определяет, как долго запись остается действительной. По истечении TTL запись «протухает» — и система вновь вынуждена запрашивать данные у DNS-сервера.</p>
<p>Windows хранит перечень кэшированных доменов в виде связного списка, а запрос содержимого кэша состоит из двух этапов: на первом этапе с помощью системного вызова <code>DnsGetCacheDataTable</code> формируется полный список кэшированных доменов, затем для каждого домена из списка происходит резолв из кэша с помощью системного вызова <code>DnsQuery</code> с флагом <code>DNS_QUERY_NO_WIRE_QUERY</code>. Таким образом для каждого кэшированного домена из кэша извлекаются соответствующие ресурсные записи: A, AAAA, TXT и так далее.</p>
<p>😐 <strong>Здесь-то и кроется подвох</strong>. Если домен содержится в списке кэшированных, а его TTL истекло, то команда <code>ipconfig /displaydns</code> не только не покажет такой домен в списке, но и удалит его из списка кэшированных доменов, тем самым уничтожив потенциальные улики.</p>
<p>Чтобы получить полный список кэшированных доменов (даже «протухших»), можно использовать вызов <code>DnsGetCacheDataTable</code>. Ниже приведен скрипт для <code>PowerShell</code>, реализующий эту функцию:</p>

<pre class="wp-block-code"><span><code class="hljs language-powershell">
<span class="hljs-built_in">Add-Type</span> <span class="hljs-literal">-TypeDefinition</span> <span class="hljs-string">@"
using System;
using System.Runtime.InteropServices;

namespace DnsCache
{
    &#91;StructLayout(LayoutKind.Sequential)]
    public struct DnsCacheEntry
    {
        public IntPtr PNext;
        public IntPtr Name;
        public ushort Type;
        public ushort DataLength;
        public uint Flags;
    }

    public class Program
    {

        &#91;DllImport("dnsapi.dll")]
        public static extern void DnsGetCacheDataTable(ref DnsCacheEntry entry);
        public static void GetCache()
        {
            DnsCacheEntry a = new DnsCacheEntry();
            DnsGetCacheDataTable(ref a);
            while (true)
            {
                Console.WriteLine("RR name: {0}", Marshal.PtrToStringAuto(a.Name));
                if (a.PNext == IntPtr.Zero) break;
                a = Marshal.PtrToStructure&lt;DnsCacheEntry&gt;(a.PNext);
            }

        }
    }
}
"@</span>
&#91;<span class="hljs-type">DnsCache.Program</span>]::GetCache()
</code></span></pre>

<p>Попробуйте выполнить этот скрипт, а потом сравните с результатами вызова <code>ipconfig /displaydns</code> (именно в таком порядке).</p>
<p>Happy hunting!</p>
<p><span class="hashtag">#tips</span> <span class="hashtag">#hunting</span> <span class="hashtag">#win</span> <span class="hashtag">#dfir</span> <span class="hashtag">#dotnet</span> <span class="hashtag">#triage</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
