C# 7z Qlocker i nie tylko. Szybki program do sprawdzania haseł (Random, async)

0

Witam. Jak się domyślacie jestem ofiarą hakerów, na szczęście miałem kopię zapasową większości plików, ale uparłem się, że znajdę hasło ;-) (wiem, wiem, bez sensu, tysiące lat, ale czemu nie spróbować). Sprawdzałem wiele programów do dekodowania 7z, w tym hashcat, ale idzie to strasznie topornie, programy działają bardzo wolno. Wyskrobałem więc coś własnoręcznie i póki co, jest to najszybszy program jaki mam. Może przy Waszej pomocy uda się z niego coś wykrzesać więcej. Zaznaczam, że nie chcę toczyć dyskusji o bezsensie mojego uporu w szukaniu hasła, tylko o rozwiązaniach mogących ulepszyć mój pomysł.
Póki co wiadomo (tak wyczytałem) i takie mam założenia, że hasło składa się z 32 znaków, charset zawiera: 0-9, a-z, A-Z, co czyni bardzo dużą ilość kombinacji. Iterowanie kolejno haseł jest totalnie bez sensu, podobnie jak moja gra w "totka" też, ale wydaje się ona sensowniejszym wyjściem. Czyli, generujemy losowo hasło i sprawdzamy. Poprawne hasło zapisywane jest do pliku MyPassword.txt w folderze Output. Program używa 7z w wersji 21.03 x64 i póki co działa dużo szybciej od 19.00. W programie użyłem opcji t, do testowania nie x do rozpakowywania, bo to jest szybsze a i tak daje ExitCode=0 w przypadku trafienia hasła i ExitCode=2 w przypadku błędnego hasła (sprawdzone ;-) ).
Zrobiłem 3 opcje, pierwsza ładuje randomowe hasło bezpośrednio do 7z, druga pobiera wygenerowane hasła z pliku Dictionary.txt, trzecia tworzy Dictionary.txt. Do tworzenia haseł (opcja 1 i 3) użyłem Hashset celem eliminowania duplikatów, ale jeszcze nie trafił mi się duplikat, więc dorobiłem możliwość wyłączenia Hashsetu, bo wydaje mi się, że przy długim działaniu programu Hashset znacznie spowalnia działanie.
Hasła sprawdzone w opcji 2 zapisywane są w pliku Done.txt w folderze Dictionary, w kodzie opisałem dlaczego zapisuję co któreś zrobione hasło. Plik do rozkodowania znajduje się w folderze Coded i musi nosić nazwę Coded.7z.
Odnośnie Dictionary.txt, wydaje się to być fajna opcja, bo można szybko wygenerować dużą ilość haseł sprawdzonych pod kątem powtórzeń i można potem te hasła bez sprawdzania Hashsetu przemleć przez program. Problemem jest jednak rozmiar pliku, więc wykombinowałem, że można w obrębie jednego hasła zrobić permutacje (procedury napisałem, ale ich nie włączyłem). Z jednego hasła z Dictionary.txt można osiągnąć nawet 10080 kombinacji (permutacje albo 7 znaków w haśle, albo 7 fragmentów hasła). W ten sposób można znacznie zwiększyć ilość sprawdzanych haseł przy danym rozmiarze pliku haseł "wyjściowych". Do rozważenia czy warto.
Program wykorzystuje Async/Await, co pozwala na jednoczasowe uruchomienie kilku, kilkunastu procesów 7z jednoczasowo, ilość procesów możliwa do określenia przy starcie. Na wolnych komputerach czasem wisiało mi nawet 20 i więcej procesów, na szybkich nawet przy ustawionym 20, program nie był w stanie uruchomić więcej niż 5-7 procesów, ale i tak miałem wydajność bardzo dobrą, na moim starym lapku przerabia ok. 700 haseł na minutę ładując bezpośrednio do 7z (jeden proces przerabia około 250 haseł), na szybkim stacjonarnym wyciągałem około 3000/min, czasem więcej przy wielu procesach ;-).
W czasie działania wyświetlane są ilość haseł sprawdzonych, hasło sprawdzane, ilość powtórzonych haseł, ExitCode, Ilość innych ExitCode niż 2, ilość błędów programu, prędkość, ilość procesów/ustawiony max procesów. Trochę mniej info jest przy opcji 3. No i chyba tyle na teraz...
Załączam spakowany skompilowany przez VS program, oczywiście trzeba mieć zainstalowane .NET, nie będę załączał jednoplikowej wersji, bo waży 67MB, po spakowaniu ok.20MB, dorzuciłem też plik Program.cs z kodem. W folderze Coded jest jeden z moich spakowanych plików, jakiś mem z FB, grafika, nie ma strachu ;-) , gdyby komuś przez przypadek wygenerowało się hasło, stawiam flachę...

Jeśli macie też jakieś oficjalne, szybkie, szybsze programy do tej roboty, to też czekam na info.
P.S. w C# bawię się krótko, generalnie programuję hobbystycznie, więc proszę o wyrozumiałość w zakresie mojego "profesjonalizmu".
Pozdrawiam i miłej zabawy.MaszynaAsync.7z

1

I mówisz że twój program napisany w c# jest szybszy od hashcat'a, który ma dodatek potrafi korzystać z mocy GPU? Nie bardzo mi się chce w to wierzyć.

0

Przynajmniej w próbach które podejmowałem tak wyszło. hashcat robił coś koło 300 sprawdzeń na minutę i z tego co mi się wydaje nie robił tego w wielu wątkach, poza tym nie mam kompa z czystym linuxem, tylko malinki, a to co robiłem, robiłem w VirtualBoxie. Z tego co się zdążyłem zorientować 7z ma coś takiego jak "cost factor", w moim przypadku 19, co znaczy że do odkodowania trzeba wykonać 2^19 iteracji. Jeśli sprawdzanie kodu odbywa się "szeregowo" marnuje się sporo czasu (ponoć celowe działanie mające na celu utrudnienie brute force). Przy użyciu async jak napisałem odpala się równolegle kilka procesów, co znacznie przyspiesza sprawdzanie, ale obciąża procek w 100%. Jeśli masz możliwość porównania prędkości to też jestem ciekaw.
BTW, miałem, baaaa, mam plan użycia samego algorytmu obliczania CRC z hasha w moim programie i też zrobić to w async, ale za cholerę nie mogę go zlokalizować w plikach źródłowych 7z.

1

Nie chcesz tego wrzucić na https://github.com zamiast zipy rozsyłać? :P

0

Nie bawiłbym się w łamanie hasła bo to bez sensu. Wolałbym edytować plik wykonywalny, który sprawdza hasła – tam jest pewnie jakiś „IF” więc należałoby tylko zmienić instrukcję asemblera „je” na „jne”….
http://en.wikipedia.org/wiki/HIEW#/media/File:Hiew-hex.jpeg

0

;-) jak napisałem, bawię się w programowanie hobbystycznie, nie umieszczałem nic do tej pory na githubie, myślałem, że tak będzie łatwiej zwłaszcza jeśli chodzi o strukturę folderów. Ale skoro tak mówisz, spróbuję. ;-P
Edit: @ple obawiam się, że to nie wyjdzie, problem w tym, że 7z nie tylko zabezpiecza hasłem, ale i koduje plik, bez hasła odkodowanie nie jest możliwe, nawet przy wyłączeniu "IF'a".

0

Witam.
Tym razem taki temat. W sumie jest to ciągle próba rozkodowania QLockera, za pomocą Hashcata i mojego programu z wcześniejszego pytania. Program został poddany spory przeróbką i teraz działa jako "nakładka" dla Hashcata. Program generuje listę haseł 32-znakowych i uruchamia Hashcata. Ale dziś nie o tym.
Póki co używam do generowania haseł RNGCryptoServiceProvider, już wywaliło mi kilka fałszywie pozytywnych, Hashsetu nie używam, bo do tej pory nic się nie zdublowało podczas pojedynczej sesji, ale nie mam pewności co do kolejnych uruchomień "generatora". Szukałem sposobu na zapisywanie i sprawdzanie haseł, ale za dużo danych ;-) a w hashach kolizje mogą się pojawiać. Zacząłem więc szukać jakiegoś algorytmu tworzenia haseł, przewidywalnego i powtarzalnego, który można uruchomić od ostatniej "wartości". No i chyba znalazłem. Najprostszy algorytm Xn=(aX0 + c) mod m. Dla c=3, a=1, i m=M+1 gdzie M jest maksymalną liczbą losowaną, przy założeniu, że M+1 % 3 != 0 algorytm działa dobrze, w sprawdzanych zakresach (do paru tysięcy, więc dalej też powinien).
Problem pojawia się jednak w C#, nawet jak zadeklaruje się double m, przy liczbach rzędu 62^32 C# traci dokładność i rozkłada cały pomysł. Generalnie do 62^8 jest ok. Pomysł miałem taki, aby wygenerować liczbę i przeliczyć ją na system 62-jkowy (hasło 32 znakowe 0-9+A-Z+a-z), a w następnej sesji podać hasło, przerobić je na 10-tny i użyć jako seed'a (X0). Hasło 8-znakowe, nawet maksymalne z samych 'z' wchodzi i działa, póki co zrobiłem z 10-tny na 62-jkowy, jakieś pomysły, żeby obejść ograniczenia obliczeń na double???
Wydaje się, że po konwersji 62^32 na string, wartość 2272657884496751488845238209201680422446063209228378570752, czyli 2.27*10^57 jest ok, ale pracując na double nie można do tej wartości nic dodać, a trzeba dodać 1 (żeby było M+1, i chyba po dodaniu spełni się też kryterium podzielności, m powinien się dzielić z resztą 2;-) ).
Dziękuję z góry za pomoc.

0

No to duży update, zrobiłem kalkulator liczący liczby z dokładnością do 2,147,483,647 miejsc, dodatkowo z tych dużych liczb generuje 32-znakowe hasła używając algorytmu Lehmera i w drugą stronę, z 32 znakowego hasła robi odpowiadającą mu liczbę. Proszę o konstruktywne opinie ;-) i porady, co jeszcze można zrobić aby przyspieszyć obliczenia.

https://github.com/Arduan77/Miki-Calculator

1

@Arduan: o matko... wszystko w jednej klasie😐 Ifologia, metody długie jak głupota antyszczepionkowców, nazwy metod z d**y aka MikiListMul, MikiListSub - WTF?

Brak używania nowoczesnych wyrażeń języka....

Nie programuj w święta, bo bug się rodzi 😁😂

0

@.andy: Ale działa... ;-) Okej, okej, wiem i przyjmuję krytykę, ale nie jestem "uczonym" programistą, uczę się w trakcie pisania, stąd prośba o krytykę i pomoc w poprawieniu kodu, aby spełniał choćby kryteria "nowoczesnych wyrażeń języka". Nazwy metod w mojej wizji miały odzwierciedlać ich funkcję, w zacytowanym przypadku Miki - nazwa programu, ListMul - mnożenie list, tak jak ListAdd - dodawanie list. Tak sobie przyjąłem, bo chciałem odróżnić dodawanie stringów (MikiAdd) od dodawania list MikiListAdd, metody wywoływanej wielokrotnie w innych metodach (odejmowania, mnożenia, dzielenia...). BTW, Miki to nie tylko akronim, chciałem umieścić tu trochę prywaty, dla syna, który zaraził mnie C#, a nie zdążył mi wszystkiego przekazać.

1

Nie ma potrzeby aby dodawać nazwę programu, czy inne sztuczne rzeczy do nazw zmiennych, klas itd.

Nic to nie wnosi, a jedynie utrudnia czytanie/odnalezienie się dla kogoś, kto widzi taki kod pierwszy raz

0

Okej, poprawię przy okazji jakichś wnoszących w działanie / prędkość programu poprawkach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1