<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Guardant &mdash; Архитектура Loadable Code]]></title>
		<link>https://forum.guardant.ru/topic/20/</link>
		<atom:link href="https://forum.guardant.ru/feed/rss/topic/20/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Архитектура Loadable Code».]]></description>
		<lastBuildDate>Wed, 07 Dec 2011 07:34:38 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/600/#p600</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Кирилл Ковлежов)]]></author>
			<pubDate>Wed, 07 Dec 2011 07:34:38 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/600/#p600</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/599/#p599</link>
			<description><![CDATA[<div class="quotebox"><cite>Алексей Перепелов пишет:</cite><blockquote><p>загружаться должен любой код, ключи шифрования и подписи которого соответствуют тем, что в маске</p></blockquote></div><p>Стандартный способ программирования ясен, но вот используются ли какие средства защиты от банального чтения взломщиком кода из микроконтроллера? Да и возможно ли это вообще -&nbsp; есть ведь JTAG...</p>]]></description>
			<author><![CDATA[null@example.com (Alexey_Donskoy)]]></author>
			<pubDate>Tue, 06 Dec 2011 19:17:23 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/599/#p599</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/229/#p229</link>
			<description><![CDATA[<p>Нет, стандартных механизмов для этого не предусмотрено, так как загружаться должен любой код, ключи шифрования и подписи которого соответствуют тем, что в маске. Жестко привязывать его к версии тоже нельзя, так как может потребоваться &quot;откатиться&quot; на предыдущую в случае чего.</p><p>В качестве решения можно попробовать именовать загружаемый файл GCEXE соответствующим образом или добавить в его начало собственную переменную с версией.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Thu, 09 Jun 2011 12:39:48 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/229/#p229</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/228/#p228</link>
			<description><![CDATA[<p>Продолжаем развивать тему. :)</p><p>Можно ли как-то узнать версию кода, находящегося во внешнем GEXE-файле, чтобы принимать решение о загрузке его в ключ? Из дескриптора ячейки кода такое значение получить можно, а вот &quot;новее&quot; или &quot;старее&quot; код в файле - не известно.</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Thu, 09 Jun 2011 12:28:40 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/228/#p228</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/214/#p214</link>
			<description><![CDATA[<p>Именно против брутфорса и хотелось использовать. Например, деактивировать алгоритм, используемый автозащитой или (совсем жестоко) ячейку загружаемого кода.</p><p>Поробую сделать GcaPI_Update (жаль только, что она учитывает StatusUnchangeable).</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Tue, 07 Jun 2011 09:36:19 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/214/#p214</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/213/#p213</link>
			<description><![CDATA[<p>Нет, прямого доступа к EEPROM получить из загружаемого кода не удастся.</p><p>Такие функции, наверное, были бы полезны, если нужно в случае чего деактивировать весь функционал ключа. Передал мысль разработчикам. Однако эти функции будут добавлены, если потребуется еще какое-то изменение микропрограммы.</p><p>Тем не менее сейчас можно использовать функцию GcaPI_Update(). К примеру, при подозрении на брутфорс выполнять XOR всех определителей алгоритмов с каким-нибудь вектором. А при необходимости их &quot;активировать&quot; - выполнять повторный XOR с тем же вектором.</p><p>А информацию об истории вызовов можно также хранить в защищенной ячейке / не инициализируемой области RAM.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 07 Jun 2011 07:27:50 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/213/#p213</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/211/#p211</link>
			<description><![CDATA[<p>Не обнаружил во внутреннем API ключа Code функций активации/деактивации ячеек и алгоритмов. Значит ли это, что такие операции нужно выполнять через прямой доступ к определителям?</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Mon, 06 Jun 2011 09:16:00 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/211/#p211</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/157/#p157</link>
			<description><![CDATA[<p>Спасибо, вполне приемлемая цифра!</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Fri, 20 May 2011 14:09:31 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/157/#p157</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/155/#p155</link>
			<description><![CDATA[<p>На передачу 1Кб в одну сторону сейчас уходит порядка 40 мс.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Fri, 20 May 2011 13:08:34 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/155/#p155</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/153/#p153</link>
			<description><![CDATA[<p>Продолжаем вопросы по загружаемому коду. </p><p>Понятно, что выходной буфер функции GrdCodeRun шифруется и подписывается где-то в драйвере, и затем передаётся в ключ, а ответ ключа расшифровывается и помещается во входной буфер. Как влияет размер буферов ввода/вывода на скорость обмена с ключем, хотя бы порядок цифр? Если это какие-то микро-мили-секунды, то можно считать, что не влияет.</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Fri, 20 May 2011 07:04:47 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/153/#p153</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/144/#p144</link>
			<description><![CDATA[<p>Да, все верно. Размер входного и выходного буферов передается в байтах.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Wed, 18 May 2011 12:01:01 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/144/#p144</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/143/#p143</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Wed, 18 May 2011 11:54:52 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/143/#p143</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/103/#p103</link>
			<description><![CDATA[<p>Спасибо, интересная идея! Именно от использования dwP1 и хотелось уйти, слишком уж явно её &quot;видно&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Tue, 17 May 2011 07:44:21 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/103/#p103</guid>
		</item>
		<item>
			<title><![CDATA[Re: Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/101/#p101</link>
			<description><![CDATA[<p>Добрый.</p><p>Если нет необходимости обновлять модули загружаемого кода по-отдельности (и при прочих равных), то для повышения сложности анализа загружаемого кода (по принципу черного ящика), думаю, имеет смысл объединить все в один загружаемый код и передавать номер реально вызываемой функции в составе буфера ввода-вывода (не через dwP1), может быть даже не в &quot;чистом&quot; виде.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 17 May 2011 07:34:19 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/101/#p101</guid>
		</item>
		<item>
			<title><![CDATA[Архитектура Loadable Code]]></title>
			<link>https://forum.guardant.ru/post/98/#p98</link>
			<description><![CDATA[<p>Добрый день!</p><p>Подскажите, как с точки зрения разработчиков правильно поместить в ключ типа Code несколько функционально независимых модулей кода? Править адреса в makefile, и &quot;разносить&quot; модули по flash-памяти, или сделать одну main-функцию, а модули вызывать как показано в примере &quot;04 - Using Subfunctions&quot; через switch-case?</p><p>С уважением,<br />Михаил</p>]]></description>
			<author><![CDATA[null@example.com (romik)]]></author>
			<pubDate>Tue, 17 May 2011 06:36:58 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/98/#p98</guid>
		</item>
	</channel>
</rss>
