Techniki twórców złośliwego oprogramowania. Elementarz programisty [D.Farbaniec]

0

Dzień Dobry

Czy ktoś miał pod ręką ww. książkę od tego Pana? Czy jest godna polecenia?

Pozdrawiam

1

Dobry troll :D

0

Chciałem dowiedzieć się o wartości merytorycznej tej książki. Nie mam nic wspólnego z marketingem tej książki

0

Mam tą książkę i są tam ciekawe kody źródłowe.
Dużo programowania niskopoziomowego i systemowych zagadnień.
Za taką cenę na pewno się przyda :)

11

Hey,

Sprawiłem sobie e-booka zaraz po premierze i przeczytałem sporo + przejrzałem resztę.

TL;DR IMO: Tematyka bardzo fajna i kody na pewno zainteresują osoby początkujące w tym temacie. Tekst i przywiązanie do szczegółów generalnie na poziomie słabej jakości tutoriala netowego - mam wrażenie, że redaktor prowadzący nie przyłożył się do pracy z autorem nad zadbaniem o detale, ewentualnie została pominięta korekta techniczna. Jeśli chodzi o kod to widać, że autor starał się go dobrze napisać, natomiast sporo dziwnych konstrukcji się wkradło. Część tematów też jest bardzo "po łebkach" opisana.
Czyli gdyby włożono w to jeszcze trochę pracy na poziomie korekty technicznej i ogólnej redakcji, to wyszła by bardzo fajna książeczka (ale tak się nie stało).

Kilka przykładów rzeczy, które zwróciły moją uwagę (note: to nie jest wszystko co zwróciło moją uwagę, a jedynie 3 przykłady):

"SF (ang. Sign Flag) — znacznik zmiany znaku. Ustawiany, gdy zmienił się znak, czyli najstarszy bit (bit znaku) przyjął wartość 1."
Pierwsza część zdania sugeruje, że SF jest ustawiane jak znak się zmienił, a druga, że jest ustawiane, jak najstarszy bit wyniku został ustawiony - te stwierdzenia są ze sobą sprzeczne (wg. pierwszego wynikiem (-1)+1 będzie SF=1, bo znak się zmieni, a wg drugiej części zdania SF=0, bo MSB będzie 0). Prawdziwa jest druga część zdania ofc.

Dalej, na stronach 34-36 jest przykładowy kod, którego większość stanowi copy-pasjtowa obsługa błędów (tj. każda linia to if(!udało_się) { skopiowane 2-4 linie error handlingu }). Jest trochę wzorcy, które można by użyć żeby nie kopiować ciągle error handlingu, tylko wrzucić go w jedno miejsce. Ale OK, coś takiego też można zobaczyć w przykładach na MSDN - być może autor chciał napisać kod w podobnym stylu.
Ale, powstaje pytanie czemu w kodzie na stronach 49-50 autor zmienia zdanie i zaczyna stosować inne podejście - if(udało_się) { if(udalo_się_coś_innego) { if(.... } } } } } } } - czyli rekursywne tworzenie sub-bloków w przypadku sukcesu.
Oba podejścia wyglądają dość dziwnie, tj. imo można by ten kod lepiej napisać.

Ostatnim przykładem niech będzie ten kod (strona 56):

//bytes.h
//tablica bajtów pliku do uruchomienia
BYTE buffer[] = { 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00
};

Pierwsza, mniej rzucająca się w oczy kwestia, to definiowanie tablicy w pliku .h (definiowanie funkcji lub wartości zmiennych w plikach nagłówkowych powoduje błędy linkera jeśli dany plik jest includowany przez więcej niż jeden plik .c/.cpp).
Natomiast albo ta tablica nie miała być wypełniona zerami, a autor zapomniał wkleić odpowiedni bytecode (nie wnikałem w kod na tyle by to stwierdzić), albo chciał nabić pół strony tekstu. I nie, nie jest to kwestia niewiedzy, że można zerowanie tablicy zapisać lepiej, bo na stronie 81 korzysta z triku CHAR tab[SIZE] = {0} do wyzerowania innej tablicy.

Generalnie są to szczegóły, tj. jak pisałem na początku - tematyka jest bardzo fajna. Po prostu osobiście po książce spodziewał bym się również lepszej jakości kodu i zarówno przywiązania jak i wejścia w głębsze detale.

Jeśli chodzi o opisywanie rzeczy "po łebkach", przykładem jest podrozdział "Antyodpluskwianie", w którym autor zaprezentował tylko jedną, najprostszą metodę (IsDebuggerPresent) bez choćby odnośnika do materiałów w których można więcej o temacie poczytać (tych trików jest cała masa).
Analogicznie poddział "Zabezpieczenie przed zmianami jądra Windows" w którym są dwa (które zresztą nie do końca technicznie mi pasują) zdania na temat patch guarda.

Szczerze, to sądzę, że Dawid mógłby dużo lepiej tą książkę zrobić, ale zabrakło mu dobrych recenzentów i dobrego redaktora prowadzącego, jak i przyłożenia do szczegółów, jak i pewnego rozmachu, od strony autora.

P.S. Marketing na stronie Helionu jak zwykle pisze bzdury, e.g. "Sięgnij po wiedzę, która pozwoli Ci skutecznie odpierać wszelkie ataki!" - generalnie ta uwaga nie ma nic wspólnego z tą książką (tj. książka jest na zupełnie inny temat).

P.S.2. Jak wspomniałem - tematyka ciekawa, więc fajnie by było gdyby wyszła za jakiś czas druga, dopracowana, wersja tej książki.

ym2c

0

@Gynvael Coldwind Bardzo dziękuje za poważną i wyczerpującą odpowiedź.

1
Gynvael Coldwind napisał(a):

Ostatnim przykładem niech będzie ten kod (strona 56):

//bytes.h
//tablica bajtów pliku do uruchomienia
BYTE buffer[] = { 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00
};

Pierwsza, mniej rzucająca się w oczy kwestia, to definiowanie tablicy w pliku .h (definiowanie funkcji lub wartości zmiennych w plikach nagłówkowych powoduje błędy linkera jeśli dany plik jest includowany przez więcej niż jeden plik .c/.cpp).
Natomiast albo ta tablica nie miała być wypełniona zerami, a autor zapomniał wkleić odpowiedni bytecode (nie wnikałem w kod na tyle by to stwierdzić), albo chciał nabić pół strony tekstu. I nie, nie jest to kwestia niewiedzy, że można zerowanie tablicy zapisać lepiej, bo na stronie 81 korzysta z triku CHAR tab[SIZE] = {0} do wyzerowania innej tablicy

Tablica bajtów jest wstawiona z zerami, aby użytkownik mógł sobie tam wkleić bajty swojego pliku, który ma być uruchomiony. Zera są tam wstawione jako wzorzec pokazujący w jaki sposób należy wkleić tablicę bajtów.

Dzięki @Gynvael Coldwind za bezstronną opinię o treści książki i wskazanie co mogłem zrobić lepiej.

Pozdrawiam, Dawid Farbaniec

0

Witam,
Pozwolę sobie trochę odkopać tego posta i zapytać a raczej poprosić o jakąś literaturę, ksiązki o podobnej tematyce jak książka tutaj opisywana. Po polsku zapewne nic nie ma ale może być też po angielsku :)

0

Nie wiem o czym jest ta książka, ale jak chcesz coś o analizie malware/reversowaniu to te dwie mi kiedyś polecali ludzie zajmujący się tym:
http://www.amazon.com/Practical-Malware-Analysis-Dissecting-Malicious/dp/1593272901
http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817

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