c - Hvordan udtrækker du standard registreringsværdi typen fra en legitim ukendt værditype?

Indlæg af Hanne Mølgaard Plasc

Problem



Baggrund



Jeg bemærker, at der er mange legitime ukendte værdityper i HKEY\_LOCAL\_MACHINE i Windows 10. Dette er blot nogle få af dem:



  • 0x100000
     [HKEY\_LOCAL\_MACHINESYSTEMDriverDatabaseDriverPackageshidbthle.inf\_amd64\_55f7f576bf549669ConfigurationsHidBthLE.NTDevice] "WUDF"

  • 0x200000
      [HKEY\_LOCAL\_MACHINESYSTEMControlSet001ControlClass{4d36e96c-e325-11ce-bfc1-08002be10318}ConfigurationResetDriver] "DevLoader"

  • 0x40007
     [HKEY\_LOCAL\_MACHINESYSTEMDriverDatabaseDriverPackagescdrom.inf\_amd64\_21e18060f597c313Configurationscdrom\_installServicescdrom] "AutoRunAlwaysDisable"

  • 0xffff0009
      [HKEY\_LOCAL\_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Interfaces{0176DBBA-3617-44FF-BA79-90375AAC4B6A}Properties{a111f1f4-5923-47c0-9a68-d0bafb577901}004] "(Default)"

  • 0xffff000d
      [HKEY\_LOCAL\_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Filters{171C5016-3D19-4CB2-9556-63E586EE5010}Properties{a111f1f7-5923-47c0-9a68-d0bafb577901}002] "(Default)"

  • 0xffff100d
      [HKEY\_LOCAL\_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Filters{E475CF9A-60CD-4439-A75F-0079CE0E18A1}Properties{a111f1f0-5923-47c0-9a68-d0bafb577901}052] "(Default)"

  • 0xffff2012
      [HKEY\_LOCAL\_MACHINESYSTEMSetupUpgradeNetworkDriverBackupControlNetworkSetup2Clients{54494F4E-5441-4B53-CCB9-061A6EC4BF6E}Properties{a111f1f1-5923-47c0-9a68-d0bafb577901}002] "(Default)"



Interessant nok tolker NirSoft RegScanner værditypen 0xffff0009 som REG\_FULL\_RESOURCE\_DESCRIPTOR (0x09). [29]


Eftersom de foruddefinerede konstanter defineret i 'winnt.h' (se nedenfor) ikke er mere end en byte, er min midlertidige konklusion, at vi skal OG værditypen rapporteret af RegQueryValueEx () med 0x000000ff . Jeg er dog ikke sikker på dette. [30]


#define REG\_NONE                    ( 0ul ) // No value type
#define REG\_SZ                      ( 1ul ) // Unicode nul terminated string
#define REG\_EXPAND\_SZ               ( 2ul ) // Unicode nul terminated string
                                            // (with environment variable references)
#define REG\_BINARY                  ( 3ul ) // Free form binary
#define REG\_DWORD                   ( 4ul ) // 32-bit number
#define REG\_DWORD\_LITTLE\_ENDIAN     ( 4ul ) // 32-bit number (same as REG\_DWORD)
#define REG\_DWORD\_BIG\_ENDIAN        ( 5ul ) // 32-bit number
#define REG\_LINK                    ( 6ul ) // Symbolic Link (unicode)
#define REG\_MULTI\_SZ                ( 7ul ) // Multiple Unicode strings
#define REG\_RESOURCE\_LIST           ( 8ul ) // Resource list in the resource map
#define REG\_FULL\_RESOURCE\_DESCRIPTOR ( 9ul ) // Resource list in the hardware description
#define REG\_RESOURCE\_REQUIREMENTS\_LIST ( 10ul )
#define REG\_QWORD                   ( 11ul ) // 64-bit number
#define REG\_QWORD\_LITTLE\_ENDIAN     ( 11ul ) // 64-bit number (same as REG\_QWORD)


Opdateringer



Jeg har lige fundet nogle diskussioner om dette på internettet:



  • https://github.com/williballenthin/python-registry/issues/31

  • https://github.com/williballenthin/python-registry/issues/62



For nogle værdityper, f.eks. 0xffff100d , OG med 0x000000ff , jeg får 0x0d . Problemet er, at der ikke findes standardværdityper, der er defineret som 0x0d i Windows header-filer. [31] [32]


Jeg har stadig en mistanke om, at der er en måde at konkludere standardværdien typen fra en legitim ukendt værdi type.


Vær opmærksom på, at jeg ikke forsøger at forstå, hvordan dataene skal fortolkes. Jeg taler om, hvordan man udpakker standard registreringsværdi typen fra en legitim ukendt registreringsværdi type.


Dette påvirker, hvordan vi skal behandle en værditype returneret af RegQueryValueEx () i vores kode. Målet er måske ikke, at lektionen konkluderer med, at en ukendt værditype er ukendt, vi skal yderligere teste værditypen med en bitmask. [33]


Spørgsmål



Hvordan udtrækkes standard registreringsværdi typen fra en legitim ukendt værditype?

Bedste reference


registreringsdatabasystemet ikke fortolker (og ikke kontrollerer) værdien af ​​nøglen Type. det gemmer eller indlæser det som DWORD data. Som resultat kan vi i princippet bruge enhver værdi for type med data. sig for eksempel vi kan gøre


HKEY hKey;
if (!RegOpenKeyExW(hRootKey, lpSubKey, 0, KEY\_SET\_VALUE, &hKey))
{
    RegSetValueExW(hKey, 0, 0, 0x87654321, (PBYTE)L"demo", sizeof(L"demo"));
    DWORD ticks = GetTickCount();
    RegSetValueExW(hKey, L"TickCount", 0, 0x12345678, (PBYTE)&ticks, sizeof(ticks));
    RegCloseKey(hKey);
}


Vi kan med andre ord bruge typer 0x87654321 og 0x12345678 i stedet for REG\_SZ og REG\_DWORD. enhver værdi for type er en legitim. Type er kun et tip til den aktuelle datatype. men vi kan f.eks. også gemme streng med REG\_DWORD type eller DWORD med REG\_SZ type. vi kan gemme 0 eller ikke 0-afsluttende streng



  Sådan udtrækkes standard registreringsværdi typen fra en legitim
  ukendt værdi type?



legitime her overskydende ord. i almindelighed - ingen måde. hvis du ikke ved hvad her gemmes og hvilken følelse af dette. vi siger kan vise værdi som REG\_BINARY - genfortolket byte.


til et andet eksempel, i win10 jeg ser under


HKEY\_LOCAL\_MACHINE
  SYSTEM
    Setup
      Upgrade
        NetworkDriverBackup
          Control
            NetworkSetup2
              Clients
                {54494F4E-5441-4B53-CCB9-061A6EC4BF6E}
                  Properties
                    {a111f1f0-5923-47c0-9a68-d0bafb577901}


flere undernøgler med værdier, hvilken type er 0xFFFF0012 og 0xFFFF0019 på trods af faktiske værdidata er REG\_SZ (let synlig at dette er 0-terminerende unicode strings)
0xFFFF0012 og 0xFFFF0019 - dette er nogle yderligere oplysninger for dem der forstår denne nøglesans. de ved (hardcode) at de faktiske data her er 0-termanated wide char string. og brug Type som nogle yderligere oplysninger (flag?). alligevel - hvis nøgle/værdi ukendt for dig - hvordan du kan bruge det værdier, hvis du ikke forstår det. selvom kend format. til visning i UI - kun indstilling raw hex view