<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Guardant &mdash; Уголок OpenSource]]></title>
		<link>https://forum.guardant.ru/topic/79/</link>
		<atom:link href="https://forum.guardant.ru/feed/rss/topic/79" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Уголок OpenSource».]]></description>
		<lastBuildDate>Tue, 01 Oct 2024 15:55:17 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/5274/#p5274</link>
			<description><![CDATA[<p>Фиксация изменения состава USB устройств.<br /></p><div class="codebox"><pre><code>unit grdKeyDetector;

interface

uses
  Messages, Windows;

const

  GUID_CLASS_USBHUB: TGUID = &#039;{f18a0e88-c30c-11d0-8815-00a0c906bed8}&#039;;
  GUID_CLASS_USB_DEVICE: TGUID = &#039;{A5DCBF10-6530-11D2-901F-00C04FB951ED}&#039;;
  GUID_CLASS_USB_HOST_CONTROLLER: TGUID = &#039;{3ABF6F2D-71C4-462a-8A92-1E6861E6AF27}&#039;;

  DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class
  DBT_DEVICEARRIVAL           = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE    = $8004; // device is gone


type

  _DEV_BROADCAST_DEVICEINTERFACE_A = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: array [0..0] of AnsiChar;
  end;
TDevBroadcastDeviceInterface = _DEV_BROADCAST_DEVICEINTERFACE_A;
PDevBroadcastDeviceInterface = ^_DEV_BROADCAST_DEVICEINTERFACE_A;



  TDeviceOperation = (doInsert, doRemove);
  TDeviceChangeEvent = procedure(Sender: TObject; VID, PID: Word; const Serial, GUID:
    string; Operation: TDeviceOperation) of object;


  TgrdKeyDetector = class(TObject)
  private
    FWndHandle: HWND;
    FClassGUID: TGUID;
    FNotifyHandle: Pointer;
    FOnChange: TDeviceChangeEvent;

    procedure SetClassGUID(const Value: TGUID);
    procedure Close;
    procedure Open;
    procedure WndProc(var aMsg: TMessage);
    function ParseDeviceName(Mask, Text: string; Params: array of Pointer): Boolean;
  protected
    procedure DoDeviceChange(Event: Integer; Device: PDevBroadcastDeviceInterface);


  public
    constructor Create;
    destructor Destroy; override;
    property ClassGUID: TGUID read FClassGUID write SetClassGUID;
    property OnChange: TDeviceChangeEvent read FOnChange write FOnChange;
  end;

implementation

uses
  Forms, SysUtils, Classes;

constructor TgrdKeyDetector.Create;
begin
  inherited;
  FWndHandle := AllocateHWnd(WndProc);
  FClassGUID := GUID_CLASS_USB_DEVICE;
  Open;

end;

destructor TgrdKeyDetector.Destroy;
begin
  Close;
  DeallocateHWnd(FWndHandle);

end;

procedure TgrdKeyDetector.DoDeviceChange(Event: Integer;
  Device: PDevBroadcastDeviceInterface);
var
  VID, PID: Word;
  Serial, GUID: string;
const
  USBDeviceNameMask = &#039;\\?\USB#Vid_%x&amp;Pid_%x#%s#%s&#039;;
begin
  if (Device.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE) and Assigned(FOnChange)
    and ParseDeviceName(USBDeviceNameMask, PChar(@Device.dbcc_name), [@VID, @PID,
    @Serial, @GUID]) then
    case Event of
      DBT_DEVICEARRIVAL: FOnChange(Self, VID, PID, Serial, GUID, doInsert);
      DBT_DEVICEREMOVECOMPLETE: FOnChange(Self, VID, PID, Serial, GUID, doRemove);
    end;
end;

procedure TgrdKeyDetector.Close;
begin
  if FNotifyHandle &lt;&gt; nil then
    UnregisterDeviceNotification(FNotifyHandle);
end;

procedure TgrdKeyDetector.Open;
var
  Info: TDevBroadcastDeviceInterface;
begin
  Info.dbcc_size := SizeOf(TDevBroadcastDeviceInterface);
  Info.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  Info.dbcc_classguid := FClassGUID;
  FNotifyHandle := RegisterDeviceNotification(FWndHandle, @Info,
    DEVICE_NOTIFY_WINDOW_HANDLE); end;

function TgrdKeyDetector.ParseDeviceName(Mask, Text: string;
  Params: array of Pointer): Boolean;
var
  PText, PMask, First: PChar;
  V, Index: Integer;
  Token: Boolean;
  Ch: Char;
begin
  Result := False;
  Text := Trim(Text);
  if (Text = &#039;&#039;) or (Mask = &#039;&#039;) then Exit;
  PText := PChar(Text);
  PMask := PChar(Mask);
  Token := False;
  Index := 0;
  while PMask^ &lt;&gt; #0 do begin
    if Token then begin
      Token := False;
      case UpCase(PMask^) of
        &#039;X&#039;: begin
            if not (PText^ in [&#039;0&#039;..&#039;9&#039;, &#039;a&#039;..&#039;f&#039;, &#039;A&#039;..&#039;F&#039;]) then Exit;
            V := 0;
            repeat
              case PText^ of
                &#039;0&#039;..&#039;9&#039;: V := V * 16 + Ord(PText^) - Ord(&#039;0&#039;);
                &#039;a&#039;..&#039;f&#039;: V := V * 16 + Ord(PText^) - Ord(&#039;a&#039;) + 10;
                &#039;A&#039;..&#039;F&#039;: V := V * 16 + Ord(PText^) - Ord(&#039;A&#039;) + 10;
              else
                Break;
              end;
              if V &gt; MaxWord then Exit;
              Inc(PText);
            until False;
            if Index &gt; High(Params) then Exit;
            PWord(Params[Index])^ := V;
            Inc(Index);
          end;
        &#039;S&#039;: begin
            First := PText;
            Ch := UpCase(PMask[1]);
            while (PText^ &lt;&gt; #0) and (UpCase(PText^) &lt;&gt; Ch) do
              Inc(PText);
            if Index &gt; High(Params) then Exit;
            SetString(PString(Params[Index])^, First, PText - First);
            Inc(Index);
          end;
        &#039;%&#039;: begin
            if PText^ &lt;&gt; &#039;%&#039; then Exit;
            Inc(PText);
          end;
      else
        Exit;
      end
    end
    else
      if PMask^ = &#039;%&#039; then
        Token := True
      else
        if UpCase(PMask^) &lt;&gt; UpCase(PText^) then
          Exit
        else
          Inc(PText);
    Inc(PMask)
  end;
  Result := True;
end;

procedure TgrdKeyDetector.SetClassGUID(const Value: TGUID);
begin
  if not IsEqualGUID(FClassGUID, Value) then begin
    FClassGUID := Value;
    Close;
    Open;
  end;
end;

procedure TgrdKeyDetector.WndProc(var aMsg: TMessage);
begin
  with aMsg do
    if (Msg = WM_DEVICECHANGE)
      and ((wParam = DBT_DEVICEARRIVAL) or (wParam = DBT_DEVICEREMOVECOMPLETE)) then try
      DoDeviceChange(wParam, PDevBroadcastDeviceInterface(lParam));
    except
      if Assigned(ApplicationHandleException) then
        ApplicationHandleException(Self)
      else
        raise;
    end
    else
      DefWindowProc(FWndHandle, Msg, wParam, lParam);
end;
end.</code></pre></div><p>Как использовать:</p><div class="codebox"><pre><code>uses
  ...grdKeyDetector;
...
  TfrmMain = class(TForm)
  private
    fKD: TgrdKeyDetector;
    procedure KOnChanged(Sender: TObject; VID, PID: Word;
      const Serial, GUID: string; Operation: TDeviceOperation);
  public
    procedure Start();
    procedure Stop();
  public
    { Public declarations }
  end;
...
procedure TfrmMain.Start();
begin
  if not Assigned(fKD) then begin
    fKD := TgrdKeyDetector.Create;
    fKD.OnChange := KOnChanged;
  end;
end;

procedure TfrmMain.Stop();
begin
  if Assigned(fKD) then
    FreeAndNil(fKD);
end;

procedure TfrmMain.KOnChanged(Sender: TObject; VID, PID: Word; const Serial,
  GUID: string; Operation: TDeviceOperation);
var
  fStr: string;
begin
  case Operation of
    doInsert: fStr := &#039; Inserted!&#039;;
    doRemove: fStr := &#039;Removed!&#039;;
  end;
  ShowMessage(fStr);
end;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (vlad-mal)]]></author>
			<pubDate>Tue, 01 Oct 2024 15:55:17 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/5274/#p5274</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/4570/#p4570</link>
			<description><![CDATA[<p>Как указано в документации, под Wine (Linux) не требуется устанавливать &quot;стандартные&quot; драйверы ключей, а требуется совсем другое. Недокументированным способом определения среды Wine является определения наличия метода wine_get_version() в ntdll.dll.</p><br /><p>Функция для писателей инсталлятров:</p><p>1. Delphi<br /></p><div class="codebox"><pre><code>function IsWinePresent(): boolean;
var
  fHandle: HMODULE;
begin
  Result := False;
  fHandle := GetModuleHandle(&#039;ntdll.dll&#039;);
  if fHandle = 0 then Exit;
  Result :=  Assigned(GetProcAddress(fHandle, &#039;wine_get_version&#039;));
end;</code></pre></div><p>2. NSIS<br /></p><div class="codebox"><pre><code>Function IsItWine ; Если Wine, то возвращает в $0 не 0, иначе - 0.
  System::Call &quot;kernel32::GetModuleHandle(t &#039;ntdll.dll&#039;) i .s&quot;
  System::Call &quot;kernel32::GetProcAddress(i s, t &#039;wine_get_version&#039;) i .r0&quot;
FunctionEnd</code></pre></div><p>Пример использования (полный код инсталлятора NSIS):</p><div class="codebox"><pre><code>OutFile &quot;tst01.exe&quot;
 
Section

  Push $0

  Call IsItWine 
    IntCmp $0 0 notWine
      MessageBox MB_OK &quot;Wine&quot;
      Goto next 
    notWine:
      MessageBox MB_OK &quot;Not Wine&quot;
    next:
  Pop $0
  
SectionEnd

Function IsItWine ; Если Wine, то возвращает в $0 не 0, иначе - 0.
  System::Call &quot;kernel32::GetModuleHandle(t &#039;ntdll.dll&#039;) i .s&quot;
  System::Call &quot;kernel32::GetProcAddress(i s, t &#039;wine_get_version&#039;) i .r0&quot;
FunctionEnd</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (vlad-mal)]]></author>
			<pubDate>Tue, 23 Nov 2021 12:23:44 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/4570/#p4570</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/3557/#p3557</link>
			<description><![CDATA[<p>Реализуйте, пожалуйста, на форуме функционал &quot;спойлер&quot;.</p><p>Тогда можно было бы здесь размещать достаточно объемный и полезный исходный код, не замусоривая ветку, и без опасения, что ресурс, с которого можно загрузить данные, перестанет быть доступен.</p>]]></description>
			<author><![CDATA[null@example.com (vlad-mal)]]></author>
			<pubDate>Wed, 22 Feb 2017 23:16:25 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/3557/#p3557</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/3232/#p3232</link>
			<description><![CDATA[<p>Пример загружаемого кода с реализацией алгоритмов проверки цифровой подписи и обмена открытыми ключами по алгоритму Diffie-Hellman на эллиптических кривых ECC-256 (кривая NIST).<br /><span style="color:#0000ff">Ссылка на загрузку</span> - <a href="http://rgho.st/8PKBPYCmV">http://rgho.st/8PKBPYCmV</a>.</p><p>Файл main.c достаточно подробно прокомментирован.</p>]]></description>
			<author><![CDATA[null@example.com (Sergey_85)]]></author>
			<pubDate>Tue, 23 Aug 2016 18:04:55 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/3232/#p3232</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/3212/#p3212</link>
			<description><![CDATA[<p>Пример загружаемого кода с генератором случайных чисел по алгоритму Вихрь Мерсенна (MT19937) <a href="http://rgho.st/6tmRygx85">http://rgho.st/6tmRygx85</a>.<br />Подробнее об алгоритме - <a href="https://ru.wikipedia.org/wiki/Вихрь_Мерсенна">https://ru.wikipedia.org/wiki/Вихрь_Мерсенна</a></p><p>Обратить внимание на <span style="color:#0000ff">#define START_SEED 0x00001105</span></p><p>В примере генерируется массив из 10 даблов. Тестовые значения:<br /><em>0.81733006001853614000<br />0.99906089971751466000<br />0.51035437255873217000<br />0.13153290984489324000<br />0.03541634837990075700<br />0.99246953450899322000<br />0.62570870356301511000<br />0.06259194576707481600<br />0.41071051112625528000<br />0.13477367491805314000</em></p>]]></description>
			<author><![CDATA[null@example.com (Sergey_85)]]></author>
			<pubDate>Wed, 10 Aug 2016 08:25:24 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/3212/#p3212</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/2572/#p2572</link>
			<description><![CDATA[<p><a href="https://forum.guardant.ru/uploads/opensource/GrdWriteMask.zip">Пример</a> для записи маски в ключ с помощью Guardant API (из SDK 7.0) на Embarcadero RAD Studio XE7.</p>]]></description>
			<author><![CDATA[null@example.com (Антон Тихиенко)]]></author>
			<pubDate>Fri, 13 Mar 2015 08:12:52 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/2572/#p2572</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/356/#p356</link>
			<description><![CDATA[<p>Проект динамической библиотеки <a href="https://forum.guardant.ru/uploads/opensource/grdwine-054.tar.gz">GrdWine</a> для работы с ключами под Wine.<br />Взят из DK и выложен отдельно для удобства разработчиков и конечных пользователей, работающих под Wine.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 09 Aug 2011 07:16:35 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/356/#p356</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/355/#p355</link>
			<description><![CDATA[<p>Библиотека Guadrant API 5.52 для linux (<a href="https://forum.guardant.ru/uploads/opensource/libgrdapi_x86.tar">x86</a>, <a href="https://forum.guardant.ru/uploads/opensource/libgrdapi_x86_64.tar">x86_64</a>).<br />Взята из DK и выложена отдельно для удобства разработчиков под linux.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 09 Aug 2011 07:03:50 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/355/#p355</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/310/#p310</link>
			<description><![CDATA[<p>Консольная утилита <a href="https://forum.guardant.ru/uploads/opensource/ECC160_PairGenerator.zip">ECC160_PairGenerator</a> без исходника (EXE).<br />Предназначена для генерации ключевых пар для алгоритма ECC160, реализованного в электронных ключах.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Thu, 14 Jul 2011 12:07:53 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/310/#p310</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/294/#p294</link>
			<description><![CDATA[<p>Консольная утилита <a href="https://forum.guardant.ru/uploads/opensource/grdinfotool.tar">grdinfotool</a> (для linux) с исходником на C и makefile.<br />Предназначена для получения информации о прописанных правилах для ключей и базовых сведений о системе.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 13:29:53 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/294/#p294</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/293/#p293</link>
			<description><![CDATA[<p>Утилита <a href="https://forum.guardant.ru/uploads/opensource/codeutil.zip">codeutil</a> с исходником на С# и проектом MSVS10.<br />Предназначена для работы с загружаемым кодом. Умеет записывать в ключ маску в формате NSD (версии до 5.52), находить в ней ячейки с загружаемым кодом, записывать в ключ свой код в формате GCEXE (в выбранный дескриптор загружаемого кода, в соответствии с маской), а также выполнять этот загружаемый код, подавая ему на вход произвольные данные.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 13:07:52 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/293/#p293</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/292/#p292</link>
			<description><![CDATA[<p>Консольная утилита <a href="https://forum.guardant.ru/uploads/opensource/chknsk.zip">chknsk</a> с исходником на C (кроссплатфоремнный код), проектом MSVS9 и makefile.<br />Предназначена для поиска и получения информации об установленных ключах Guardant. Удобно искать HID ключи, так как не требуется установка драйвера.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 12:48:28 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/292/#p292</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/291/#p291</link>
			<description><![CDATA[<p>Библиотека <a href="https://forum.guardant.ru/uploads/opensource/writemask.zip">writemask</a> с исходником и примером использования на C++, проектом для MSVS9.<br />Предназначена для формирования маски ключа вручную (как массива байтов) для последующей записи в ключ при помощи Guardant API.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 11:44:00 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/291/#p291</guid>
		</item>
		<item>
			<title><![CDATA[Re: Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/290/#p290</link>
			<description><![CDATA[<p>Заголовочный файл <a href="https://forum.guardant.ru/uploads/opensource/structures.h">structures.h</a> с определениями констант и структур, которых нет в grdapi.h, но которые встречаются в документации.</p>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 11:37:20 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/290/#p290</guid>
		</item>
		<item>
			<title><![CDATA[Уголок OpenSource]]></title>
			<link>https://forum.guardant.ru/post/288/#p288</link>
			<description><![CDATA[<p>В этом топике будут выкладываться некоторые полезные инструменты (преимущественно с исходником) и просто интересные примеры кода. Их можно использовать при разработке собственной защиты на основе Guardant API, а также при диагностике электронных ключей.</p><p>Желание поделиться собственными наработками и опытом приветствуется!</p><p>Все необходимо сопровождать кратким описанием: что это, для чего и как может быть использовано. Автор ответственен за актуальность и сопровождение собственного кода. Критика со стороны не принимается. Только вопросы и предложения по дальнейшей разработке и развитию.</p><p>Все свое предлагается публиковать под лицензией <a href="http://en.wikipedia.org/wiki/WTFPL#cite_note-fsf-0">WTFPL</a>.</p><p><strong>Доступно для скачивания:</strong><br /></p><ul><li><p><a href="https://forum.guardant.ru/post/290/#p290">structures.h</a> - некоторые константы и структуры из документации</p></li><li><p><a href="https://forum.guardant.ru/post/291/#p291">writemask</a> - библиотека для формирования маски ключа вручную (кроссплатформенная)</p></li><li><p><a href="https://forum.guardant.ru/post/292/#p292">chknsk</a> - утилита для поиска ключей и получения информации о них (кроссплатформенная)</p></li><li><p><a href="https://forum.guardant.ru/post/293/#p293">codeutil</a> - утилита для загрузки и вызова загружаемого кода (windows)</p></li><li><p><a href="https://forum.guardant.ru/post/294/#p294">grdinfotool</a> - утилита для сбора базовых сведений при техподдержке и диагностике (linux)</p></li><li><p><a href="https://forum.guardant.ru/post/310/#p310">ECC_Gen</a> - генератор ключевых пар для алгоритма ECC160 (windows)</p></li><li><p><a href="https://forum.guardant.ru/post/355/#p355">libgrdapi.a</a> - библиотека Guardant API 5.52 для linux</p></li><li><p><a href="https://forum.guardant.ru/post/356/#p356">GrdWine</a> - проект библиотеки GrdWine для работы с ключами в среде Wine</p></li></ul>]]></description>
			<author><![CDATA[null@example.com (Алексей Перепелов)]]></author>
			<pubDate>Tue, 05 Jul 2011 08:59:54 +0000</pubDate>
			<guid>https://forum.guardant.ru/post/288/#p288</guid>
		</item>
	</channel>
</rss>
