<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Guardant &mdash; Архитектура Loadable Code]]></title>
	<link rel="self" href="https://forum.guardant.ru/feed/atom/topic/20" />
	<updated>2011-12-07T07:34:38Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.guardant.ru/topic/20/</id>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/600/#p600" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Alexey_Donskoy пишет:</cite><blockquote><div class="quotebox"><cite>Алексей Перепелов пишет:</cite><blockquote><p>загружаться должен любой код, ключи шифрования и подписи которого соответствуют тем, что в маске</p></blockquote></div><p>Стандартный способ программирования ясен, но вот используются ли какие средства защиты от банального чтения взломщиком кода из микроконтроллера? Да и возможно ли это вообще -&nbsp; есть ведь JTAG...</p></blockquote></div><p>Чтение взломщиком кода из микроконтроллера не удастся. Возможность доступа к микроконтроллеру через интерфейс JTAG отключается на стадии производства.</p>]]></content>
			<author>
				<name><![CDATA[Кирилл Ковлежов]]></name>
				<uri>https://forum.guardant.ru/user/9/</uri>
			</author>
			<updated>2011-12-07T07:34:38Z</updated>
			<id>https://forum.guardant.ru/post/600/#p600</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/599/#p599" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Алексей Перепелов пишет:</cite><blockquote><p>загружаться должен любой код, ключи шифрования и подписи которого соответствуют тем, что в маске</p></blockquote></div><p>Стандартный способ программирования ясен, но вот используются ли какие средства защиты от банального чтения взломщиком кода из микроконтроллера? Да и возможно ли это вообще -&nbsp; есть ведь JTAG...</p>]]></content>
			<author>
				<name><![CDATA[Alexey_Donskoy]]></name>
				<uri>https://forum.guardant.ru/user/296/</uri>
			</author>
			<updated>2011-12-06T19:17:23Z</updated>
			<id>https://forum.guardant.ru/post/599/#p599</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/229/#p229" />
			<content type="html"><![CDATA[<p>Нет, стандартных механизмов для этого не предусмотрено, так как загружаться должен любой код, ключи шифрования и подписи которого соответствуют тем, что в маске. Жестко привязывать его к версии тоже нельзя, так как может потребоваться &quot;откатиться&quot; на предыдущую в случае чего.</p><p>В качестве решения можно попробовать именовать загружаемый файл GCEXE соответствующим образом или добавить в его начало собственную переменную с версией.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-06-09T12:39:48Z</updated>
			<id>https://forum.guardant.ru/post/229/#p229</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/228/#p228" />
			<content type="html"><![CDATA[<p>Продолжаем развивать тему. :)</p><p>Можно ли как-то узнать версию кода, находящегося во внешнем GEXE-файле, чтобы принимать решение о загрузке его в ключ? Из дескриптора ячейки кода такое значение получить можно, а вот &quot;новее&quot; или &quot;старее&quot; код в файле - не известно.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-06-09T12:28:40Z</updated>
			<id>https://forum.guardant.ru/post/228/#p228</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/214/#p214" />
			<content type="html"><![CDATA[<p>Именно против брутфорса и хотелось использовать. Например, деактивировать алгоритм, используемый автозащитой или (совсем жестоко) ячейку загружаемого кода.</p><p>Поробую сделать GcaPI_Update (жаль только, что она учитывает StatusUnchangeable).</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-06-07T09:36:19Z</updated>
			<id>https://forum.guardant.ru/post/214/#p214</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/213/#p213" />
			<content type="html"><![CDATA[<p>Нет, прямого доступа к EEPROM получить из загружаемого кода не удастся.</p><p>Такие функции, наверное, были бы полезны, если нужно в случае чего деактивировать весь функционал ключа. Передал мысль разработчикам. Однако эти функции будут добавлены, если потребуется еще какое-то изменение микропрограммы.</p><p>Тем не менее сейчас можно использовать функцию GcaPI_Update(). К примеру, при подозрении на брутфорс выполнять XOR всех определителей алгоритмов с каким-нибудь вектором. А при необходимости их &quot;активировать&quot; - выполнять повторный XOR с тем же вектором.</p><p>А информацию об истории вызовов можно также хранить в защищенной ячейке / не инициализируемой области RAM.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-06-07T07:27:50Z</updated>
			<id>https://forum.guardant.ru/post/213/#p213</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/211/#p211" />
			<content type="html"><![CDATA[<p>Не обнаружил во внутреннем API ключа Code функций активации/деактивации ячеек и алгоритмов. Значит ли это, что такие операции нужно выполнять через прямой доступ к определителям?</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-06-06T09:16:00Z</updated>
			<id>https://forum.guardant.ru/post/211/#p211</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/157/#p157" />
			<content type="html"><![CDATA[<p>Спасибо, вполне приемлемая цифра!</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-20T14:09:31Z</updated>
			<id>https://forum.guardant.ru/post/157/#p157</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/155/#p155" />
			<content type="html"><![CDATA[<p>На передачу 1Кб в одну сторону сейчас уходит порядка 40 мс.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-05-20T13:08:34Z</updated>
			<id>https://forum.guardant.ru/post/155/#p155</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/153/#p153" />
			<content type="html"><![CDATA[<p>Продолжаем вопросы по загружаемому коду. </p><p>Понятно, что выходной буфер функции GrdCodeRun шифруется и подписывается где-то в драйвере, и затем передаётся в ключ, а ответ ключа расшифровывается и помещается во входной буфер. Как влияет размер буферов ввода/вывода на скорость обмена с ключем, хотя бы порядок цифр? Если это какие-то микро-мили-секунды, то можно считать, что не влияет.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-20T07:04:47Z</updated>
			<id>https://forum.guardant.ru/post/153/#p153</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/144/#p144" />
			<content type="html"><![CDATA[<p>Да, все верно. Размер входного и выходного буферов передается в байтах.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-05-18T12:01:01Z</updated>
			<id>https://forum.guardant.ru/post/144/#p144</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/143/#p143" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>Ещё вопрос по загружаемому коду. Правильно ли я понимаю, что при вызове функции</p><div class="codebox"><pre><code>int GRD_API GrdCodeRun(
HANDLE  hGrd,
DWORD   dwAlgoName,
DWORD   dwP1,
DWORD   *pdwRet,
DWORD   dwDataFromDongleLng,
void    *pDataFromDongle,
DWORD   dwDataToDongleLng,
void    *pDataToDongle,
void    *pReserved ); </code></pre></div><p>параметры <strong>dwDataFromDongleLng</strong> и <strong>dwDataToDongleLng</strong> всегда должны содержать размер буфера <strong>в байтах</strong>, не зависимо от того, каким типом он объявлен в программе?</p><p>Объявляю в коде ключа</p><p>extern DWORD idata[] ALIGNED; <br />extern DWORD odata[] ALIGNED; </p><p>а в основной программе</p><p>DWORD abInBuffer[128], abOutBuffer[128];</p><p>При вызове</p><div class="codebox"><pre><code> nRet = GrdCodeRun(GrdDongle.GetHandle(),
                        0x01,                   // dwAlgoName
                        1,                        // dwP1
                        &amp;dwRet,              // pdwRet
                        0,                        // dwDataFromDongleLng
                        NULL,                  // pDataFromDongle
                        1,                        // dwDataToDongleLng
                        abOutBuffer,       // pDataToDongle
                        NULL);                // pReserved</code></pre></div><p>в ключ попадает один байт, а при вызове</p><div class="codebox"><pre><code> nRet = GrdCodeRun(GrdDongle.GetHandle(),
                        0x01,                   // dwAlgoName
                        1,                        // dwP1
                        &amp;dwRet,              // pdwRet
                        0,                        // dwDataFromDongleLng
                        NULL,                  // pDataFromDongle
                        sizeof(DWORD),  // dwDataToDongleLng
                        abOutBuffer,       // pDataToDongle
                        NULL);                // pReserved</code></pre></div><p>всё работает корректно.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-18T11:54:52Z</updated>
			<id>https://forum.guardant.ru/post/143/#p143</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/103/#p103" />
			<content type="html"><![CDATA[<p>Спасибо, интересная идея! Именно от использования dwP1 и хотелось уйти, слишком уж явно её &quot;видно&quot;.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-17T07:44:21Z</updated>
			<id>https://forum.guardant.ru/post/103/#p103</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/101/#p101" />
			<content type="html"><![CDATA[<p>Добрый.</p><p>Если нет необходимости обновлять модули загружаемого кода по-отдельности (и при прочих равных), то для повышения сложности анализа загружаемого кода (по принципу черного ящика), думаю, имеет смысл объединить все в один загружаемый код и передавать номер реально вызываемой функции в составе буфера ввода-вывода (не через dwP1), может быть даже не в &quot;чистом&quot; виде.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-05-17T07:34:19Z</updated>
			<id>https://forum.guardant.ru/post/101/#p101</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Архитектура Loadable Code]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/98/#p98" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>Подскажите, как с точки зрения разработчиков правильно поместить в ключ типа Code несколько функционально независимых модулей кода? Править адреса в makefile, и &quot;разносить&quot; модули по flash-памяти, или сделать одну main-функцию, а модули вызывать как показано в примере &quot;04 - Using Subfunctions&quot; через switch-case?</p><p>С уважением,<br />Михаил</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-17T06:36:58Z</updated>
			<id>https://forum.guardant.ru/post/98/#p98</id>
		</entry>
</feed>
