C# - Console.WriteLine -> String Probleem

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • sh4d0wman
  • Registratie: April 2002
  • Laatst online: 12:38

sh4d0wman

Attack | Exploit | Pwn

Topicstarter
Ik probeer recursive een specifieke "value" onder verschillende registry keys uit te lezen. Dat gaat bijna perfect....

Regedit formaat:

De registry key:
HKLM\\Software\\MyApplication\\1234567\\Static

De registry data onder Static:
Name, Type, Value
(Default) , REG_SZ, "C:\program files\myapp\test.dll"
"ThreadingModel" , REG_SZ, "Both"

Na enig puzzelen krijg ik de volgende output:
HKLM\\Software\\MyApplication\\1234567\\Static
C:\program files\myapp\test.dll

Probleem:
Ik wil alleen output printen als de waarde een DLL is maar het print nu ook andere extensies. Dus ik dacht: file extension filter/string match.

Regel 43: Console.WriteLine werkt met een object voor zover ik MSDN begrijp.
Enige tips hoe ik dit ombouw zodat ik de string extensie kan testen?

(In Python liep ik weer op een ander probleem stuk dus nu toch maar een post aangemaakt.)

Code
Ik heb main weg gelaten, die geeft alleen de root key mee en print help info. Het gaat om de functie "PrintKeyValues".

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public static void SearchSubKeys(RegistryKey root, String searchKey)
{
    //loop through all subkeys contained under the current key
    foreach (string keyname in root.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key = root.OpenSubKey(keyname))
            {
                if (keyname == searchKey) PrintKeyValues(key);

                SearchSubKeys(key, searchKey);
            }
        }
        catch (Exception)
        {
             //Ignore for example
        }
    }
}

public static void PrintKeyValues(RegistryKey key)
{
    //***** Original code:
    //Console.WriteLine("Registry key found: {0} contains {1} values", key.Name, key.ValueCount);

    //+++++ Modified: only print key name
    Console.WriteLine("{0}", key.Name, key.ValueCount);

    foreach (string valuename in key.GetValueNames())
    {
        if (key.GetValue(valuename) is String)
        {

            //***** original code: (format (Reg_NAME) and (Reg_VALUE)
            //Console.WriteLine(" Value : {0} = {1}", valuename, key.GetValue(valuename));
                    
            //+++++ Modified: only print DLL lines
            //bool endsInPeriod = valuename.EndsWith(".dll");
            //if (endsInPeriod)
       
            //+++++ Modified: Skip 0 (Reg_NAME) Only print 2nd (Reg_VALUE) and break as we only need the first value
            Console.WriteLine("{1}", valuename, key.GetValue(valuename));
            break;        
        }
    }
}

This signature has been taken down by the Dutch police in the course of an international lawenforcement operation.

Beste antwoord (via sh4d0wman op 08-03-2018 14:57)


  • whoami
  • Registratie: December 2000
  • Laatst online: 10-05 19:14
Als je enkel de value wil printen als de filename een .dll extensie heeft, dan zou je eens moeten kijken naar de Path.GetExtension method
Tegenwoordig is het hipper om het weer met is te doen (met ]pattern matching dan :P )

Zo dus:

C#:
1
2
3
4
5
6
7
if( key.GetValue(valueName) is string s )
{
    if( Path.GetExtension(s).Equals(".dll", StringComparison.OrdinalIgnoreCase) )
    {
           Console.WriteLine(s);
    }
}

[ Voor 69% gewijzigd door whoami op 06-03-2018 20:54 ]

https://fgheysels.github.io/

Alle reacties


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:23

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Ik snap je probleem niet goed?

C#:
1
2
3
//+++++ Modified: Skip 0 (Reg_NAME) Only print 2nd (Reg_VALUE) and break as we only need the first value
Console.WriteLine("{1}", valuename, key.GetValue(valuename));
break;

Waarom dat gedoe met "skip 0" en weet-ik-wat?

C#:
1
2
3
//Print Reg_VALUE and break as we only need the first value
Console.WriteLine(key.GetValue(valuename));
break;


En desnoods gebruik je het as keyword.

Verder zou ik de value maar 1 keer lezen (en dus niet steeds GetValue aanroepen) en dus met 't voorgenoemde as-keyword casten en in een variabele mikken en dan vervolgens, veiligheidshalve, op die variabele controleren of de cast gelukt is (null check) en de string überhaupt iets bevat en daarna kijken of 'ie eindigt op .dll (met een StringComparison.OrdinalIgnoreCase argument). En dan ben je er volgens mij?

Heel dat original/modified en commented-out code maakt 't er niet veel overzichtelijker op. Dus wat is je vraag nu precies en kun je 't beperken (zoals ik bovenstaand doe) tot de échte relevante(!) kern?

[ Voor 79% gewijzigd door RobIII op 06-03-2018 17:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10-05 19:14
Als je enkel de value wil printen als de filename een .dll extensie heeft, dan zou je eens moeten kijken naar de Path.GetExtension method
Tegenwoordig is het hipper om het weer met is te doen (met ]pattern matching dan :P )

Zo dus:

C#:
1
2
3
4
5
6
7
if( key.GetValue(valueName) is string s )
{
    if( Path.GetExtension(s).Equals(".dll", StringComparison.OrdinalIgnoreCase) )
    {
           Console.WriteLine(s);
    }
}

[ Voor 69% gewijzigd door whoami op 06-03-2018 20:54 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 14:23

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

whoami schreef op dinsdag 6 maart 2018 @ 20:49:
Als je enkel de value wil printen als de filename een .dll extensie heeft, dan zou je eens moeten kijken naar de Path.GetExtension method
Die heb ik overwogen, maar vond ik "semantisch" niet helemaal lekker omdat je hiermee insinueert dat alle strings die je in die registersleutel vindt paden zijn. Then again; het kan ook geen kwaad want in essentie zal het in dezelfde gevallen .dll returnen en in het geval van edge-cases is bij nader inzien Path.GetExtension misschien nog wel beter ook d:)b
whoami schreef op dinsdag 6 maart 2018 @ 20:49:
Tegenwoordig is het hipper om het weer met is te doen (met ]pattern matching dan :P )
Helemaal eens! :D Geen idee hoe 't komt maar VS moet me er ook steeds op wijzen; ik kan daar maar niet aan wennen :P IDE007 IDE0019 als ik me niet vergis :P
Ja, zoiets postte ik in eerste instantie ook maar heb ik verwijderd i.v.m. een vis en eten voor morgen enzo :+

[ Voor 8% gewijzigd door RobIII op 06-03-2018 21:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • sh4d0wman
  • Registratie: April 2002
  • Laatst online: 12:38

sh4d0wman

Attack | Exploit | Pwn

Topicstarter
whoami schreef op dinsdag 6 maart 2018 @ 20:49:
C#:
1
2
3
4
5
6
7
if( key.GetValue(valueName) is string s )
{
    if( Path.GetExtension(s).Equals(".dll", StringComparison.OrdinalIgnoreCase) )
    {
           Console.WriteLine(s);
    }
}
Bedankt! Hier kom ik al wat verder mee en het was een stuk begrijpelijker dan RobIII hehe (no offence).
Inmiddels heb ik het werkend gekregen in Python dus zal later nog eens kijken of ik C# ook helemaal werkend kan krijgen.

Ik heb nooit leren programmeren en kan 90% van de tijd uit de voeten met bestaande tools/scripts. Soms is er echter niks dus dan val ik terug op voorbeeld-code welke het dichste in de buurt van mijn benodigde functionaliteit komt.

Dat muteer ik dan stapje voor stapje met behulp van een debugger en google/msdn totdat ik de output krijg die ik nodig heb. (vandaar ook altijd een shitload aan comments in de code)

Niet de meest effectieve manier maar ik heb nu geen tijd over om 1 taal goed te leren. Globaal snap ik de flow meestal wel maar "the devil is in the details". Maar ik lees liever dan dat ik moet schrijven....

Het enige wat het moet doen is een bepaalde vulnerability opsporen dus zolang het dat doet maakt de taal of "nette code" mij op dit moment niet uit. Mijn custom tool collectie is dan ook een grote variatie aan talen :P

This signature has been taken down by the Dutch police in the course of an international lawenforcement operation.