Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
projekty:lic_key_crack [2025/05/07 14:37] – created administrator | projekty:lic_key_crack [2025/05/16 17:31] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
+ | ======= Security: Wstęp do inżynierii wstecznej ======= | ||
+ | |||
+ | Inżynieria wsteczna to proces analizowania i rozkładania na części składowe oprogramowania, | ||
+ | |||
+ | > Inżynieria wsteczna (ang. reverse engineering) to proces wydobywania wiedzy lub przeprojektowywania systemów na podstawie dostępnych, | ||
+ | Źródło: [[https:// | ||
+ | |||
+ | === Zwartość pliku main2.c === | ||
+ | |||
+ | W niniejszym przykładzie zaprezentowano kod źródłowy prostego programu, który weryfikuje poprawność wprowadzonego klucza licencyjnego. Program wczytuje wprowadzone dane znak po znaku i porównuje je z kluczem referencyjnym. Na końcu, w zależności od wyniku porównania, | ||
+ | |||
+ | <code c main.c> | ||
+ | #include < | ||
+ | |||
+ | int main() { | ||
+ | char key[100]; | ||
+ | char valid[] = " | ||
+ | int i = 0; | ||
+ | int match = 1; | ||
+ | int ch; | ||
+ | |||
+ | printf(" | ||
+ | | ||
+ | // Read input manually, character by character | ||
+ | while (i < 100) { | ||
+ | ch = getchar(); | ||
+ | if (ch == ' | ||
+ | key[i] = 0; | ||
+ | break; | ||
+ | } | ||
+ | key[i] = ch; | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | // Compare each character manually | ||
+ | i = 0; | ||
+ | while (valid[i] != 0 && key[i] != 0) { | ||
+ | if (valid[i] != key[i]) { | ||
+ | match = 0; | ||
+ | break; | ||
+ | } | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | // Also check if lengths match | ||
+ | if (valid[i] != key[i]) { | ||
+ | match = 0; | ||
+ | } | ||
+ | |||
+ | // Output result | ||
+ | if (match) { | ||
+ | const char *msg = " | ||
+ | for (i = 0; msg[i] != 0; i++) { | ||
+ | putchar(msg[i]); | ||
+ | } | ||
+ | } else { | ||
+ | const char *msg = " | ||
+ | for (i = 0; msg[i] != 0; i++) { | ||
+ | putchar(msg[i]); | ||
+ | } | ||
+ | } | ||
+ | getchar(); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | === Zmiana jednego bitu === | ||
+ | |||
+ | Dokładnie tak zmiana jednego bitu powoduje że program przyjmie jakikolwiek klucz a mimo to wyświetli komunikat access granted. Jestem świadomy że ten program można złamać prostym narzędziem strings, ale nie o to w tej prezentacji chodzi. Poniżej zdjęcie dwóch debuggerów po lewej program oryginalny po prawej jego wersja z zmianą. Zaznaczyłem na ilustracji miejsce w którym trzeba zmienić jedn bit aby złamać program. | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | [[https:// | ||
+ | |||
pliki: | pliki: | ||
- | {{ : | + | {{ : |
- | {{ : | + | |
- | {{ : | + | {{ : |
+ | |||
+ | {{ : |