Hmm, sam też się uczyłem od Gynvaela w sumie to był mój jedyny autorytet, chyba 11 lat temu się od niego nauczyłem asm i inżynierii wstecznej.
Język to tylko tools, mówisz że chcesz zobaczyć jak się rzeczy dane robi w C#, czyli co masz na myśli?
W sumie to tu się rozchodzi o znajomość bardziej technologii, chcesz coś zrobić czy to w C# czy C to musisz zrozumieć jak coś działa napisać algorytm, to tylko bajty danych, które trzeba obrobić, jeśli plik ma jakiś header to go obsługujesz tam masz informacje gdzie co jest w tym pliku, czy jest kompresowane, tu język nie ma znaczenia.
Czy to http protokół jest tekstowym, no w C# są lepsze frameworki do obsługi, ale oba działają na tej samej zasadzie robisz połączenie tcp wysyłasz stringa i odbierasz stringa, połączenie się kończy :>
Im niżej poziomowy język tym lepiej czasem, czasem gorzej, jeśli chcesz modyfikować sobie kernel windowsa/linuxa to lepiej ten C/C++ i teraz Rust(w sumie będę musiał go w końcu opanować).
Ja uwielbiam takie dziwne rzeczy, których inni ludzie nigdy nie zrozumieją.
Mam przykładowo grę minesweeper i chcę znaleźć funkcję, która odpowiada za sprawdzanie czy dane pole jest z miną i mnie to nie ważne jaki język ktoś użyje da się przewidzieć jak coś powinno działać np. mamy planszę 2 wymiarową i funkcja sprawdzająca jeśli taka istnieje powinna najprawdopodobniej przyjmować dwa parametry koordynaty x i y planszy.
Sprawdzimy także jaki kompilator ktoś użył najczęściej jest tak, że używa jakiegoś systemu wywołań funkcji jak fastcall stdcall.
Wiedząc jak są przekazywane parametry np. fastcall to są w rejestrach rcx, rdx, r8, r9, zwykle pierwszy to jakiś obiekt jest this wskaźnik, to można sprawdzić czy następne dwa rdx i r8 zawierają wartość odpowiednio x i y, dodatkowo czy jesteśmy w adresie pamięci, który jest w przedziale załadowanego modułu naszej gry.
I jak znajdziemy stan procesora, który spełnia nasze warunki taki jak x położenie, y położenie i adres w przedziale naszego modułu czyli RIP rejestr odpowiada za to.
To miejsce w kodzie jakie znajdziemy to będzie chwila przed wywołaniem funkcji, która jest funkcją, która sprawdza czy na danej planszy jest mina wywołując do tego funkcję.
I mając lub nie mając kodu źródłowego tworząc takie heurystyki idzie dość łatwo wywnioskować gdzie co jest w kodzie i potem można przystąpić do analizy wstecznej zwanej reverse engineeringiem, tłumaczymy dziwne instrukcje kodu dla przykładu mamy jakąś operację co dodaje do siebie elementy z jakiegoś wskaźnika, najprawdopodobniej bufora, przechodzi co 4 bajtów co każde dodanie czyli myślimy że to będzie array intów, przy każdym też inkrementuje rejestr i na końcu robi dzielenie przez ten rejestr i jako człowiek trzeba wydedukować, że obliczyliśmy średnią arytmetyczną i to jest co funkcja wynkonuje, jest do dość żmudne i trudne, ale można odtworzyć każdy kod jaki istnieje i możemy modyfikować wszystko czego zapragniemy.