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

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

msm
Jako ciekawostka -> to już drugi taki wątek, pierwszy od razu został wyrzucony (link do helionu & post z proxy).
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

Dobry troll :D

n0name_l
To raczej przejaw kunsztu specow od marketingu. :P
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 :)

Gynvael Coldwind
  • Rejestracja:ponad 21 lat
  • Ostatnio:25 dni
  • Lokalizacja:Zurich, Switzerland
  • Postów:457
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):

Kopiuj
//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


peace,
gynvael.coldwind//vx "Imagination is more important than knowledge..." Albert Einstein
edytowany 2x, ostatnio: Gynvael Coldwind
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):

Kopiuj
//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

M2
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 3 lata
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 :)

NZ
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:93
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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)