Sociálne siete

SecIT.sk na Facebooku SecIT.sk na Google+ SecIT.sk na Twitteri

Podporte nás


V prípade, že Vám obsah nášho portálu niekedy nejakým spôsobom pomohol, či bol pre Vás prínosom prosím podporte jeho chod ľubovoľnou čiastkou. Ďakujeme!

Prihlásenie

Štítky

Vyhľadávanie

You are here

Domov
Upozornenie: Obsah je licenčne chránený a bez písomných súhlasov autora článku a vlastníka webovej stránky nesmie byť v žiadnej forme ďalej kopírovaný a šírený v pôvodnom, či v akokoľvek upravenom stave.

Vývoj ovladačů 1 - obecný úvod

V tomto článku se dozvíte některé základní věci o ovladačích: Co to je ovladač (moje definice), nejdůležitější charakteristiky či způsob načítání ovladače do jádra. Nebudu zde mluvit o ovladačích hardwaru.

Co je to ovladač

Někteří tvrdí, že ovladač je speciální druh programu. S tímto tvrzením bych nesouhlasil, protože ovladače se od obyčejných programů (procesů) hodně odlišují, například v tomto: Každý program má svůj vlastní adresový prostor. To pro ovladače neplatí. Všechny drivery se nachází v tomtéž adresovém prostoru, který je většinou namapován na adresy 0x80000000 - 0xFFFFFFFF. Paměť na těchto adresách je stejná pro každý proces. Procesy k této paměti nemohou standardně přistupovat. Kód procesu je vykonáván prostřednictvím vláken, která mu patří. Kód ovladačů vykonávají rovněž vlákna (kdo jiný také, že?), avšak nejsou to jejich vlastní vlákna. Ovladače si "půjčují" vlákna od procesů. Z toho vyplývá, že ovladač může běžet v kontextech různých procesů. To může být nebezpečné ,rptože se proces, v jehož kontextu kód ovladače vykonáván, mohl pokusit narušit činnost driveru. Jelikož ovladače mají daleko větší moc nad systémem než obyčejné procesy, vzniká tu bezpečnostní riziko. Proto existuje proces s názvem "System" a PID 4, v jehož kontextu mohou ovladače bezpečně vykonávat svůj kód. Tento proces nevykonává nic v uživatelském režimu (ačkoliv jej k tomu pravděpodobně lze donutit). Procesy běží v tzv. uživatelském režimu (user mode, Ring 3), kdežto ovladače v tzv. režimu jádra (kernel mode, Ring 0). Platí, že čím menší číslo Ring módu, tím více privilegií. Omezení privilegií procesů spočívá v tom, že např. nemoou vykonávat některé (privilegované) instrukce či číst nebo měnit paměť jádra. Na druhé straně, pro ovladače neplatí žádná omezení. Ukončení nežádoucích procesů je mnohem snažší než odstranění nežádoucích ovladačů (ovladačů, které nechtějí být odstraněny). To je způsobeno tím, že moc ovladačů nad operačním systémem je neomezená. Soubory EXE a DLL nemůžete smazat, pokud jsou používány v nějakém procesu (přejmenovat je lze). Soubor ovladače (SYS) lze smazat, i když je ovladač zaveden v jádře. Neošetřená výjimka v normálních procesech končí chybovým hlášením, nebo ukončením daného procesu. Neošetřená výjimka v kódu ovladače vede k modré smrti (Blue Screen of Deatch - BSOD). Při psaní ovladače si proto člověk musí dávat mnohem větší pozor než při psaní normálního programu. Při programování ovladačů se musíte často rozmýšlet, zda použijete stránkovanou, nebo nestránkovanou paměť. U normálních procesů vám téměř vždy stačí paměť stránkovaná. To by z výčtu odlišností stačilo. Nyní se podívejme, jak takový ovladač napsat.

Psaní a kompilování ovladače

Pokud chcete vytvořit ovladač, musíte napsat nejen jeho zdrojové kódy, ale přidat ještě dva soubory s některými údaji pro překladač. Prvním z ncih je soubor s názvem MAKEFILE, jehož obsah je následující: !INCLUDE $(NTMAKEENV)\\makefile.def Druhým souborem je SOURCES, který obsahuje údaje o typu vytvářeného souboru (standardně DRIVER, ale jsou i další možnosti), o názvu budoucího ovladače aj. Jeho obsah pro klasický ovladač vypadá takto:

TARGETNAME= <název ovladače>  
TARGETPATH= obj 
TARGETTYPE= DRIVER  
SOURCES= <soubory zdrojáků> 
 INCLUDES= <cesta ke knihovnám> 

Kompilace ovladače je vcelku jednoduchá, i když složitější než kompilace klasického programu. Musíte si nejprve z webu Microsoftu stáhnout "Microsoft Windows Driver Development Kit." Po instalaci se vám ve Start -> Programy vytvoří položka "Development Kits". v nabídce "Build Environments" vyberte operační systém, pro který má být ovladač zkompilován a zvolte, jestli chcete "Free", nebo "Checked" Build (při kompilování "Free" se do ovladače nevkládají debugovací symboly). Otevře se příkazová řádka. Nyní se stačí jen dostat do adresáře se zdrojáky vašeho ovladače a zadat příkaz build < název_ovladače > Pokud nebudou nalezeny ve zdrojovém kódu žádné chyby, překladač vyplivne výsledný SYS soubor. Zdrojový kód ovladače musí mít některé náležitosti. Musí obsahovat alespoň tuto rutinu:

#include < ntddk.h > 
NTSTATUS DriverEntry(
   IN PDRIVER_OBJECT DriverObject, 
   IN PUNICODE_STRING RegPath) 
DriverObject je ukazatel na strukturu, která obsahuje základní informace o ovladači. RegPath je umístění klíče s informace o ovladači v Registrech. Pokud totiž chcete načíst ovladač do jádra, musí být o něm záznam v Registrech. Rutina DriverEntry je inicializační rutina. Pokud vrátí STATUS_SUCCESS, ovladač je načten do jádra. Pokud ne, ovladač do jádra načten není. Přesněji řečeno, ovladač si v případně vrácení něčeho jiného než STATUS_SUCCESS pobude v jádře, dokud neskončí DriverEntry. Velká většina datových typů, struktur a funkcí, které asi budete potřebovat, je deklarována v knihovně ntddk.h.

Načtení ovladače do jádra

Je několik možností. Na tomto místě uvedu jen jednu - tu nejspárvnější a nejpoctivější.

 Var  hSCM : THandle;  
        hService : THandle;  
Begin  
hSCM:=OpenSCManager(
                   Nil,
                   Nil,
                   SC_MANAGER_ALL_ACCESS);  
If hSCM = 0 Then  
    Exit;  
// Vytvoření záznamu o ovladači v Registrech  
hService:=CreateService(
                 hSCM,  
                 < název ovladače >,
                 < popis >, 
                  SERVICE_ALL_ACCESS,   
                  // Typ služby - zde ovladač jádra
                  SERVICE_KERNEL_DRIVER,
                  // Jak spouštět ovladač. 
                  // Zde je to "na příkaz"                  
                  SERVICE_DEMAND_START,  
                  SERVICE_ERROR_NORMAL,  
                  < soubor ovladače >,  
                  Nil,  Nil,  Nil,  Nil,  Nil);
 If (hService = 0) And 
    (GetLastError <> ERROR_SERVICE_EXISTS) Then  
    begin  
    CloseServiceHandle(hSCM); 
    Exit; 
    end; 
CloseServiceHandle(hSCM);  
If hService > 0 Then  
    begin  
    // Loadujem ovladač! Teď se provede DriverEntry
    If Not StartService(hService,0,Dummy) Then  
        begin 
        CloseServiceHandle(hService); 
        Exit; 
        end; 
    CloseServiceHandle(hService); 
    end; 
end; 

Závěr

Tak to by bylo obecné povídání. V příštích dílech se podíváme na specifické problémy při tvorbě ovladačů a na jejich řešení. Nemyslím, že by tento článek změnil váš názor na obtížnost psaní ovladačů. Psaní ovladačů není tak těžké - jen to může být trochu nezvyk pro ty¨, co programují ve Windows API. Tady jsou totiž většinou úplně jiné funkce - které ještě neznáte. To se ale po pár set řádcích rychle napraví. Psaní ovladačů také nutí k větší přesnosti uvažování. Najednou není jedno, zda k určité paměti přistupuje více procesů najednou, náhle záleží na počtu procesorů, na verzi OS... a na mnoha dalších věcech, které si člověk neuvědomí, dokud nezačne ovladač psát.

Komentáre

Ahoj,
a jak rozchodit driver na XP 64 sp2, hazi to chybu 0x000004fb - ERROR_DRIVER_BLOCKED. Nevis jak na to? Je potreba podepsany ovladac?
Dik.
Palo.

Ahoj,

s XP x64 jsem nikdy moc nepracoval, ale myslím, že je to tam stejné jako na 64bitových Vistách a Windows 7. Tedy potřebuješ digitálně podepsaný driver. Samozřejmě je driver nutné také zkompilovat pro platformu x64 (například přes "x64 Free Build Environemnt" ve Start menu v Windows Driver Kits -> WDK... -> Build Environemnts -> Windows Vista).

Pokud si chceš s ovladači jenom hrát (což je asi tvůj případ), zkus se při bootování přepnout do režimu pro ladění (při bootování F8 a z menu vybrat položku "Režim ladění" či "Debug mode"). Postup je podobný jako při cestě do Nouzového režimu.

Při režimu ladění Windows nevyžadují digitálně podepsané ovladače.

ovladač pro umax astraslim as6000 na win8.1 64 by někdo dokázal napsat? ať to nemusime hodnit přez virtualbox... :-(

Ono by se asi dalo vyjít z ovladače na nějakou starší verzi Windows (jestli to z Vašeho komentáře dobře chápu, tak takový ovladač existuje). Pokud tedy existuje verze ovladače pr onějaké 64bitové verze Windows. Ale já na to bohužel nemám čas.

tak ja mám dojem, že je jen pro 32.. v té době ještě 64 ani moc nejeli... a všude píšou, že jedinné reseni je virtual box vyrobce nereaguje pouze sdelil, ze tento vyrobek nepodporuje win 8.1 tim to skoncilo... :-( sam nemam sanci neco upravit (netusim jak na to).. ale stacilo by to mit nejaky obecný win ovladac, co by delal nahled a scan v barve s moznosti volby dpi.. nevim jak moc je to pracne.. ale hodne se po tom lidi ptaji a zlobi se na umax, ze je to vyrobce pro zlost jen vyrobej a uz nepodporujou.... :-(

Z binárky 32bit ovladače se 64bit snadno neuděláte, na to by bylo třeba mít přístup ke zdrojovým kódům. A jelikož s každým scannerem obvykle přichází jeho vlastní ovaldač, bez nějž nefunguje, nepředpokládám, že by se snadno dalo napsat něco jako obecný ovladač, co by uměl zmíněné funkce.

Pokud to chápu dobře, to zařízení už je dost staré... a nevydávání ovladačů pro nové verze OS je standardní metoda výrobců, jak uživatele donutit si koupit nový produkt.


Podporte nás


Páčil sa Vám tento článok? Ak áno, prosím podporte nás ľubovoľnou čiastkou. Ďakujeme!


ITC manažer Security-portal.cz Spamy.cz PHP Fushion Soom.cz
Hoax.cz Antivirove centrum Crypto-world.info SPYEMERGENCY.com