Драйвер - внутренняя реализация.

Тема в разделе "WASM.BEGINNERS", создана пользователем ajak, 23 май 2008.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Привет!!! Вот сушествует куча драйверов для открытия порта lpt под винду. А какова его техническая реализация? Что и куда нужно записать, изменить, по какому адресу, чтоб порт открылся и не выкидывало исключения. Подскажите что почитать по этому делу. Спасибо.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну блин там порты есть, выводишь в них байт и на нужных контактах появляется положительный потенциал относительно земли у лпт разъема. загугли, было прикольные статьи на эту тему
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    не я про защиту говорю, зашиту винды, что-то слышал про карту доступа, вот где-она?
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ajak
    в TSS
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Аа.. я недочитал)
    Тогда давай уж разберемся -драйвер драйвером, он в ринг0 работает и там доступ ко всем портам есть.
    А из ринг3 обращаться к устройствам напрямую - это, мягко говоря, некорректно с точки зрения логики многозадачной ОС )
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Это неточнобы некорректно, это просто невозможно
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну я имею в виду если предварительно ринг0 кодом разрешить ввод/вывод в порты в карте ввода-вывода в tss
     
  8. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    во во. Что за ТСС ,кде это что это как расшифровывается. Понятно что добраться туды мона только через драйвер.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://www.wasm.ru/forum/viewtopic.php?id=17030
     
  10. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Я так понял, что там делается с помошью недокументированных функция ядра, а как зделать с документированными, открыть доступ к порту. Или я не прав?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для открытия доступа необязательно вообще в режим ядра входить.
     
  12. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Clerk как так. Только через драйвер и всё.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    1. NtSetInformationProcess(ProcessUserModeIOPL)
    Необходима привилегия SeTcbPrivilege, как её получить непонятно. Можно отключить проверку привилегий атомарным патчем загруженного ядра.
    2. NtSystemDebugControl(SysDbgSysReadIoSpace)
    Плохая совместимость с версиями ОС, неизвестно будет ли это работать в Висте.
    3. Модификация налету TSS первого процессора, для остальных не удастся получить физический адрес TSS, поэтому прямой I/O откроется для первого процессора.
     
  14. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Патчинг ядро, ммммм.......... это опасно :)
    Просто у меня 4 исходника драйверов разных, и я так и немогу понять где самая главная финька которая и открывает доступ порту а так строк 60-80 кода во всех. :dntknw: В 2-х есть ассемблерные вставки, какие-то манипуляции с адресами и регистрами. Так и не пойму где тот самый код или функция которая разблокирует порты. Мне нужен только lpt. При запросе google TSS - очень мало линков выдаёт. Это навкрное тоже не документировано.
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Всё просто и документировано. Покажи дров.
     
  16. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Код (Text):
    1. // inpout32drv.cpp : Defines the entry point for the DLL application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include "hwinterfacedrv.h"
    6. #include "resource.h"
    7. #include "conio.h"
    8. #include "stdlib.h"
    9.  
    10. void _stdcall Out32(short PortAddress, short data);
    11. short  _stdcall Inp32(short PortAddress);
    12. int inst();
    13. int start();
    14.  
    15. char str[10];
    16. int vv;
    17.  
    18. HANDLE hdriver;
    19. char path[MAX_PATH];
    20. HINSTANCE hmodule;
    21. SECURITY_ATTRIBUTES sa;
    22. int sysver;
    23.  
    24. int Opendriver(void);
    25. void Closedriver(void);
    26.  
    27. BOOL APIENTRY DllMain( HINSTANCE  hModule,
    28.                        DWORD  ul_reason_for_call,
    29.                        LPVOID lpReserved
    30.                      )
    31. {
    32.  
    33.     hmodule = hModule;
    34.     switch(ul_reason_for_call)
    35.     {
    36.     case DLL_PROCESS_ATTACH:
    37.         sysver = SystemVersion();
    38.         if(sysver==2)
    39.         {
    40.             Opendriver();
    41.         }
    42.     break;
    43.     case DLL_PROCESS_DETACH:
    44.         if(sysver==2)
    45.         {
    46.             CloseHandle(hdriver);
    47.         }
    48.     break;
    49.     }
    50.     return TRUE;
    51. }
    52.  
    53. /***********************************************************************/
    54.  
    55. void Closedriver(void)
    56. {
    57.     CloseHandle(hdriver);
    58. }
    59.  
    60. void _stdcall Out32(short PortAddress, short data)
    61. {
    62.  
    63.     switch(sysver)
    64.     {
    65.     case 1:
    66.             _outp( PortAddress,data);
    67.     break;
    68.  
    69.     case 2:
    70.             unsigned int error;
    71.             DWORD BytesReturned;        
    72.             BYTE Buffer[3];
    73.             unsigned short * pBuffer;
    74.             pBuffer = (unsigned short *)&Buffer[0];
    75.             *pBuffer = LOWORD(PortAddress);
    76.             Buffer[2] = LOBYTE(data);
    77.  
    78.             error = DeviceIoControl(hdriver,
    79.                             IOCTL_WRITE_PORT_UCHAR,
    80.                             &Buffer,
    81.                             3,
    82.                             NULL,
    83.                             0,
    84.                             &BytesReturned,
    85.                             NULL);
    86.     break;
    87.     }
    88.  
    89.    
    90. }
    91.  
    92. /*********************************************************************/
    93.  
    94. short _stdcall Inp32(short PortAddress)
    95. {
    96.     BYTE retval;
    97.     switch(sysver)
    98.     {
    99.  
    100.     case 1:
    101.     retval = _inp(PortAddress);
    102.     return retval;
    103.     break;
    104.     case 2:
    105.         unsigned int error;
    106.         DWORD BytesReturned;
    107.         unsigned char Buffer[3];
    108.         unsigned short * pBuffer;
    109.         pBuffer = (unsigned short *)&Buffer;
    110.         *pBuffer = LOWORD(PortAddress);
    111.         Buffer[2] = 0;
    112.         error = DeviceIoControl(hdriver,
    113.                             IOCTL_READ_PORT_UCHAR,
    114.                             &Buffer,
    115.                             2,
    116.                             &Buffer,
    117.                             1,
    118.                             &BytesReturned,
    119.                             NULL);
    120.  
    121.         return((int)Buffer[0]);
    122.  
    123.     break;
    124.     }
    125. return 0;
    126. }
    127.  
    128. /*********************************************************************/
    129.  
    130. int Opendriver(void)
    131. {
    132.     hdriver = CreateFile("\\\\.\\hwinterface",
    133.                                  GENERIC_READ | GENERIC_WRITE,
    134.                                  0,
    135.                                  NULL,
    136.                                  OPEN_EXISTING,
    137.                                  FILE_ATTRIBUTE_NORMAL,
    138.                                  NULL);
    139.    
    140.     if(hdriver == INVALID_HANDLE_VALUE)
    141.         {
    142.        
    143.        
    144.         if(start())
    145.         {
    146.             inst();
    147.             start();
    148.  
    149.              hdriver = CreateFile("\\\\.\\hwinterface",
    150.                                  GENERIC_READ | GENERIC_WRITE,
    151.                                  0,
    152.                                  NULL,
    153.                                  OPEN_EXISTING,
    154.                                  FILE_ATTRIBUTE_NORMAL,
    155.                                  NULL);
    156.  
    157.         }
    158.        
    159.        
    160.        
    161.         return 1;
    162.         }
    163. return 0;
    164. }
    165.  
    166. /***********************************************************************/
    167.  
    168. int inst()
    169. {
    170.  
    171.     SC_HANDLE  Mgr;
    172.     SC_HANDLE  Ser;
    173.  
    174.  
    175.     GetSystemDirectory(path , sizeof(path));
    176.     HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
    177.     if(hResource)
    178.     {
    179.         HGLOBAL binGlob = LoadResource(hmodule, hResource);
    180.    
    181.         if(binGlob)
    182.         {
    183.             void *binData = LockResource(binGlob);
    184.        
    185.             if(binData)
    186.             {
    187.                 HANDLE file;
    188.                 strcat(path,"\\Drivers\\hwinterface.sys");
    189.                
    190.                 file = CreateFile(path,
    191.                                   GENERIC_WRITE,
    192.                                   0,
    193.                                   NULL,
    194.                                   CREATE_ALWAYS,
    195.                                   0,
    196.                                   NULL);
    197.  
    198.                 if(file)
    199.                 {
    200.                     DWORD size, written;
    201.  
    202.                     size = SizeofResource(hmodule, hResource);
    203.                     WriteFile(file, binData, size, &written, NULL);
    204.                     CloseHandle(file);
    205.  
    206.                 }
    207.             }
    208.         }
    209.     }
    210.  
    211.  
    212.     Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);
    213.         if (Mgr == NULL)
    214.         {                           //No permission to create service
    215.             if (GetLastError() == ERROR_ACCESS_DENIED)
    216.             {
    217.                 return 5;  // error access denied
    218.             }
    219.         }  
    220.         else
    221.         {
    222.            Ser = CreateService (Mgr,                      
    223.                                 "hwinterface",                        
    224.                                 "hwinterface",                        
    225.                                 SERVICE_ALL_ACCESS,                
    226.                                 SERVICE_KERNEL_DRIVER,            
    227.                                 SERVICE_SYSTEM_START,              
    228.                                 SERVICE_ERROR_NORMAL,              
    229.                                 "System32\\Drivers\\hwinterface.sys",  
    230.                                 NULL,                              
    231.                                 NULL,                              
    232.                                 NULL,                              
    233.                                 NULL,                              
    234.                                 NULL                              
    235.                                 );
    236.  
    237.  
    238.  
    239.  
    240.         }
    241.  
    242. CloseServiceHandle(Ser);
    243. CloseServiceHandle(Mgr);
    244.  
    245.     return 0;
    246. }
    247. /**************************************************************************/
    248. int start(void)
    249. {
    250.     SC_HANDLE  Mgr;
    251.     SC_HANDLE  Ser;
    252.  
    253.     Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);
    254.  
    255.         if (Mgr == NULL)
    256.         {                           //No permission to create service
    257.             if (GetLastError() == ERROR_ACCESS_DENIED)
    258.             {
    259.                 Mgr = OpenSCManager (NULL, NULL,GENERIC_READ);
    260.                 Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE);
    261.                 if (Ser)
    262.                 {    // we have permission to start the service
    263.                     if(!StartService(Ser,0,NULL))
    264.                     {
    265.                         CloseServiceHandle (Ser);
    266.                         return 4; // we could open the service but unable to start
    267.                     }
    268.                    
    269.                 }
    270.  
    271.             }
    272.         }
    273.         else
    274.         {// Successfuly opened Service Manager with full access
    275.  
    276.                 Ser = OpenService(Mgr,"hwinterface",GENERIC_EXECUTE);
    277.                 if (Ser)
    278.                 {
    279.                     if(!StartService(Ser,0,NULL))
    280.                     {
    281.                         CloseServiceHandle (Ser);
    282.                         return 3; // opened the Service handle with full access permission, but unable to start
    283.                     }
    284.                     else
    285.                     {
    286.                         CloseServiceHandle (Ser);
    287.                         return 0;
    288.                     }
    289.  
    290.                 }
    291.  
    292.         }
    293.  
    294. return 1;
    295. }
     
  17. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    ТАк что кто-нить скажет где главный код?
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ajak
    Сотри эту погань, и приаттачь сам дров hwinterface.sys
    [Мне влом гуглить]
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    READ_PORT_UCHAR/WRITE_PORT_UCHAR - вот главные функции
     
  20. SysProger

    SysProger New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    127