<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Guardant &mdash; Хотелось бы примеров]]></title>
	<link rel="self" href="https://forum.guardant.ru/feed/atom/topic/32" />
	<updated>2011-06-07T07:04:56Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.guardant.ru/topic/32/</id>
		<entry>
			<title type="html"><![CDATA[Re: Хотелось бы примеров]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/212/#p212" />
			<content type="html"><![CDATA[<p>Все верно, оба подхода можно использовать. Однако, первый (с подсчетом КС на этапе разработки) не получится использовать, если приложение после компиляции накрывается автозащитой.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-06-07T07:04:56Z</updated>
			<id>https://forum.guardant.ru/post/212/#p212</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Хотелось бы примеров]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/210/#p210" />
			<content type="html"><![CDATA[<p>Спасибо за пример, суть понятна! Я думал несколько о другом спсосбе, когда КС участка кода сверяется со значением, предварительно вычисленым на этапе разработки. Потому, что просто считать КС определённого участка из разных мест приложения, и сравнивать значения между собой - поможет только от модификации кода непосредственно в памяти. Хотя никто не мешает просто использовать полученое значение суммы в каких-нибудь жизненно-важных для приложения расчётах.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-06-05T18:03:41Z</updated>
			<id>https://forum.guardant.ru/post/210/#p210</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Хотелось бы примеров]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/209/#p209" />
			<content type="html"><![CDATA[<p>Пример:<br /></p><div class="codebox"><pre><code>void func1()
{
    BYTE    *pStartAddress, *pEndAddress;
    // ...
    __asm {
        lea    EAX, StartMark; 
        mov pStartAddress, EAX;
        lea    EAX, EndMark; 
        mov pEndAddress, EAX;
    } 
    
    CalcCheckSum(pStartAddress, (pEndAddress - pStartAddress));
    // ...
    
    StartMark:
    // Код, целостность которого контролируется
    EndMark:

    // ...
}</code></pre></div><p>Обращаю внимание на CalcCheckSum(). Крайне желательно использовать собственную функцию подсчета контрольной суммы участка памяти. Чем она будет проще тем лучше. Она не должна быть похожа на распространенные функции подсчета контрольных сумм, чтобы ее было сложнее найти. Лучше, если таких функций будет несколько и разных. И работать они будут в разных потоках.</p><p>Остальные мои замечания (по поводу изменения после компиляции) также в силе.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-06-03T13:30:45Z</updated>
			<id>https://forum.guardant.ru/post/209/#p209</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Хотелось бы примеров]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/181/#p181" />
			<content type="html"><![CDATA[<p>Добрый день!</p><div class="quotebox"><blockquote><p>6. Воспользуйтесь алгоритмом цифровой подписи. Алгоритм ECC160 позволяет подписывать произвольные данные с помощью функции GrdSign. Лучше всего, чтобы это были данные, которые возникают в приложении естественным образом (так называемая естественная энтропия): данные, которые пользователь вводит в программу с клавиатуры, движения мышки, значения из баз данных, полученные по запросу пользователя.</p></blockquote></div><p>Схематичный пример, как подписывать данные и проверять подпись есть в <a href="https://www.guardant.ru/download/lessons/Guardant_ESP_Lesson_033.pdf">Уроке 3.3</a> обучающих материалов. В нем используется естественный источник энтропии - пользовательский ввод с клавиатуры.</p><p>По аналогии можно встроить процедуры генерации подписи / ее проверки в свое приложение, используя любой другой источник случайных данных для подписи (часто удобно использовать текущие значения каких-либо переменных при обработке данных или сами эти данные).</p><p>Обращаю внимание на то, что в примере для проверки подписи использована функция GrdVerifySignSource(), представляющая собой аналог библиотечной функции GrdVerifySign(), но доступная в исходном коде. Это позволяет встроить ее код в собственное приложение, перемешав дополнительно с кодом &quot;полезного&quot; функционала (для усложнения анализа и исключения &quot;вырезания&quot; кода проверки подписи).</p><div class="quotebox"><blockquote><p>9. Подсчитывайте хэш важных участков кода приложения. Это мощное средство защиты от модификации хакером кода приложения. Предварительно вы подсчитываете хэш тех мест в программе, в которых производятся вызовы функций API, анализируются выходные данные функций и принимаются решения о дальнейшей работе приложения.</p></blockquote></div><p>Чуть позже набросаю пример. Отмечу, однако, сразу, что сравнение хеша кода с образцом можно использовать только когда исполняемый код не преобразуется никак после компиляции. Проще говоря, не используются всякого рода пакеры и протекторы (к примеру, наша Автозащита).</p><p>Тем не менее, теоретически, можно считать хеш критических участков кода во время исполнения и следить за тем, чтобы он не менялся. Хотя такой подход и не даст 100%-ной защиты от модификации, но может оказаться эффективным в ряде случаев.</p>]]></content>
			<author>
				<name><![CDATA[Алексей Перепелов]]></name>
				<uri>https://forum.guardant.ru/user/6/</uri>
			</author>
			<updated>2011-05-31T11:25:10Z</updated>
			<id>https://forum.guardant.ru/post/181/#p181</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Хотелось бы примеров]]></title>
			<link rel="alternate" href="https://forum.guardant.ru/post/166/#p166" />
			<content type="html"><![CDATA[<p>В документации упоминаются такие приёмы защиты:</p><div class="quotebox"><blockquote><p>9. Подсчитывайте хэш важных участков кода приложения. Это мощное средство защиты от модификации хакером кода приложения. Предварительно вы подсчитываете хэш тех мест в программе, в которых производятся вызовы функций API, анализируются выходные данные функций и принимаются решения о дальнейшей работе приложения.</p></blockquote></div><p>и</p><div class="quotebox"><blockquote><p>6. Воспользуйтесь алгоритмом цифровой подписи. Алгоритм ECC160 позволяет подписывать произвольные данные с помощью функции GrdSign. Лучше всего, чтобы это были данные, которые возникают в приложении естественным образом (так называемая естественная энтропия): данные, которые пользователь вводит в программу с клавиатуры, движения мышки, значения из баз данных, полученные по запросу пользователя.</p></blockquote></div><p>Проиллюстируйте пожалуйста их хотя бы простейшими примерами. Не могу понять, как можно просчитать хэш запущеного кода, и как проверять подпись случайных данных.</p>]]></content>
			<author>
				<name><![CDATA[romik]]></name>
				<uri>https://forum.guardant.ru/user/14/</uri>
			</author>
			<updated>2011-05-26T10:24:09Z</updated>
			<id>https://forum.guardant.ru/post/166/#p166</id>
		</entry>
</feed>
