<?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>Delphi &#8211; PT ESC</title>
	<atom:link href="/tag/delphi/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Wed, 30 Sep 2026 19:19:58 +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>Delphi &#8211; PT ESC</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Реверсим Delphi без IDR</title>
		<link>/reversing-delphi-without-idr/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 16:38:11 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d1%80%d0%b5%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%bc-delphi-%d0%b1%d0%b5%d0%b7-idr/</guid>

					<description><![CDATA[🛠 Реверсим Delphi без IDR Когда активно занимаешься реверсом, рано или поздно возникает ситуация, когда на твоем пути появляется исполняемый файл на Delphi. Анализ объектов в Delphi требует особого подхода, и вручную…]]></description>
										<content:encoded><![CDATA[🛠 <strong>Реверсим Delphi без IDR</strong><br />
<br />
Когда активно занимаешься реверсом, рано или поздно возникает ситуация, когда на твоем пути появляется исполняемый файл на Delphi. Анализ объектов в Delphi требует особого подхода, и вручную это делать сложно. Однако такой анализ можно значительно ускорить с помощью автоматизации, если знать, как именно устроена структура объектов.<br />
<br />
🕵️ <strong>Первый шаг при анализе Delphi</strong> — не забыть переключить параметр компилятора в <code>Options</code> → <code>Compiler Options</code> → <code>Compiler</code>, тогда IDA будет лучше обрабатывать вызовы функций.<br />
<br />
Классы в Delphi создаются через функцию <code>ClassCreate</code>, которая получает на вход указатель на структуру класса и вызывает в нем функцию <code>Tobject_NewInstance</code> путем вычитания оффсета из указателя на VMT. <br />
<br />
👀<strong> Сама структура класса в Delphi выглядит следующим образом</strong> (<em>пример на скриншоте 1</em>):<br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">
struct DelphiClassInternal
{
  DWORD* vmt;
  DWORD* InterfaceTable; используется только для интерфейсов
  DWORD* PAutoTable; 
  DWORD* PInitTable;  
  DWORD* TypeInfo;
  DWORD* FieldTable;
  DWORD* MethodTable;
  DWORD* DynamicMethodTable;
}
</code></span></pre><br />
<br />
💼 Рассмотрим содержимое полей <code>TypeInfo</code>, <code>MethodTable</code> и <code>FieldTable</code> подробнее, поскольку в них больше всего полезной для анализа информации.<br />
<br />
➡️ <strong>TypeInfo</strong><br />
<br />
В Delphi каждый тип объекта имеет свой идентификатор. Как видно на скриншоте 2, для нашего объекта выставлен идентификатор 7 — тип <code>Class</code>. В зависимости от этого типа, для объекта указывается соответствующий контекст. Для классов это информация о <code>Property</code> и указатель на родительский тип. Зная имя <code>Property</code>, нетрудно понять и разметить <code>Get/Set-функции</code>. Восстановление этих имен позволяет сильно упростить восприятие некоторых блоков кода. <em>Пример на скриншоте 3</em>.<br />
<br />
➡️ <strong>MethodTable</strong><br />
<br />
Внимательный читатель заметит, что <em>на скриншоте 1</em> присутствуют имена некоторых методов. Достать их можно, заглянув в таблицу опубликованных (Published) методов (текущего и родительского классов). Delphi не хранит информацию о других типах методов: приватных, защищенных и публичных. Помимо имени, там приводятся: возвращаемый тип, количество аргументов, их типы и имена. <br />
<br />
<strong>Псевдоструктуру метода можно представить так</strong> (<em>пример на скриншоте 4</em>):<br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">
struct CMArg
{
  DWORD* TypeInfo;
  WORD   UNK;
  BYTE   NameLen;
  char   Name&#91;];
  BYTE   UNK2&#91;3];
}
struct ClassPubMethod
{
   WORD   EntrySize;
   DWORD* MethodPtr;
   BYTE   NameLen;
   char   Name&#91;];
   WORD   W_UNK1;
   DWORD* ReturnType;
   WORD   W_UNK2;
   BYTE   ArgCount;
   CMArg  Args&#91;];
}
</code></span></pre><br />
<br />
Из-за механизма наследования методов в Delphi восстановление даже части имен методов имеет большую пользу, если сделать это глобально, для всех классов. Затем это можно использовать среди прочего и для генерации структуры VMT класса с осмысленными именами. <em>Пример — на скриншоте 5</em>.<br />
<br />
➡️ <strong>FieldTable</strong><br />
<br />
Заглянув в <code>Class</code> → <code>FieldTable</code>, можно найти большое количество информации о переменных (<em>пример на скриншоте 6</em>). Представлена она может быть в двух вариантах: <br />
<br />
<strong>1. </strong>В виде имени, оффсета и номера типа переменной (из таблицы типов). Первые два байта в <code>FieldTable</code> — количество элементов в этой таблице, следующие четыре — указатель на таблицу типов.<br />
<br />
<strong>2.</strong> В виде имени, оффсета и указателя на тип переменной (таблица начинается сразу после таблицы из п. 1). <br />
<br />
<strong>Структура переменных имеет следующий вид:</strong><br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">
struct VarTypeTable
{
  WORD   Count;
  DWORD* Entries&#91;];
}
struct ClassVar
{
  DWORD* TypeInfo;
  WORD   VarOffset;
  WORD   UNK;
  BYTE   NameLen;
  char   Name&#91;];
}
struct TableClassVar
{
  WORD VarOffet;
  WORD UNK;
  WORD TableTypeNum;
  BYTE NameLen;
  char Name&#91;];
}
</code></span></pre><br />
<br />
Исходя из полученной информации о переменных можно составить структуру класса (нужно не забыть, что переменные также наследуются из родительских классов). <em>Пример — на скриншоте 7</em>.<br />
<br />
🤔 <strong>Резюме</strong>: в Delphi присутствует большое количество RTTI-информации, за счет которой можно относительно просто разметить большое количество функций или восстановить структуру классов для упрощения статического анализа.

<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11-1024x1024.jpg 1024w, /wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11-300x300.jpg 300w, /wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11-150x150.jpg 150w, /wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11-768x768.jpg 768w, /wp-content/uploads/2024/09/photo_72@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11-1024x1024.jpg 1024w, /wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11-300x300.jpg 300w, /wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11-150x150.jpg 150w, /wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11-768x768.jpg 768w, /wp-content/uploads/2024/09/photo_73@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11-1024x1024.jpg 1024w, /wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11-300x300.jpg 300w, /wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11-150x150.jpg 150w, /wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11-768x768.jpg 768w, /wp-content/uploads/2024/09/photo_74@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11-1024x1024.jpg 1024w, /wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11-300x300.jpg 300w, /wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11-150x150.jpg 150w, /wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11-768x768.jpg 768w, /wp-content/uploads/2024/09/photo_75@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="666" src="/wp-content/uploads/2024/09/photo_76@27-09-2024_16-38-11-1024x666.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_76@27-09-2024_16-38-11-1024x666.jpg 1024w, /wp-content/uploads/2024/09/photo_76@27-09-2024_16-38-11-300x195.jpg 300w, /wp-content/uploads/2024/09/photo_76@27-09-2024_16-38-11-768x499.jpg 768w, /wp-content/uploads/2024/09/photo_76@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11-1024x1024.jpg 1024w, /wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11-300x300.jpg 300w, /wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11-150x150.jpg 150w, /wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11-768x768.jpg 768w, /wp-content/uploads/2024/09/photo_77@27-09-2024_16-38-11.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>

<br />
<br />
<span class="hashtag">#TI</span> <span class="hashtag">#Delphi</span> <span class="hashtag">#Reverse</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
