Zabezpieczenie aplikacji offline.

Zabezpieczenie aplikacji offline.
BR
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:4
0

Cześć,
tworzę aktualnie prostą aplikację i nie mogę wymyślić rozwiązania jednego z kluczowych problemów.
Chciałbym aby aplikacja działała tylko na 1 komputerze i przez określony czas.
Wpadłem na pomysł aby stworzyć tablicę która będzie zawierać klucz licencyjny, date wyłączenia programu oraz numer seryjny dysku twardego. Utworzona tablica zostałaby przekonwertowana na jsona i zahashowana.
Niestety nie mam zielonego pojęcia w jaki sposób mógłbym zahashować taki ciąg znaków i ponownie odczytać jego wartości w celu porównania.
Bardzo proszę o wskazówki w jaki sposób mogę zakodować ten ciąg aby jego odkodowanie sprawiło jak największą trudność potencjalnego intruzowi.

CZ
fajny wirus fajny
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4

Niestety nie mam zielonego pojęcia w jaki sposób mógłbym zahashować taki ciąg znaków i ponownie odczytać jego wartości w celu porównania.

Nie da się. Robi sie to tak, ze hashujesz ponownie te dane które cię interesują i dopiero wtedy porównujesz hashe :)

Niestety generalnie jak ktoś będzie chciał, to obejdzie to zabezpieczenie w mgnieniu oka, patchując aplikacje i dodając sobie jumpa który ominie cały ten twój check.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 2 komentarze
Bartosz Wójcik
Kolizja, szyfrowanie, hashowanie, obfuskacja - to wszystko to samo :) (tak mówią eksperci z CERT-u)
PerlMonk
Czyli mogę zrobić sumę md5 z binarki o wielkości 60 MB i wysłać klientowi tylko sumę, żeby sobie znalazł kolizję? Dobre! A ile transferu to zaoszczędzi. Wyobraźmy sobie ściąganie obrazów ISO w ten sposób :]
Azarien
no właśnie nie bardzo zaoszczędzi, bo kolizji może być wiele - więc trzeba by je znaleźć wszystkie i dodać minimum potrzebnych danych by ujednoznacznić o którą kolizję chodzi. tyle że to się wtedy nazywa "kompresja bezstratna" i nie sądzę by taki algorytm był znacząco bardziej efektywny od znanych algorytmów, a na pewno będzie tragicznie powolny.
PerlMonk
Trochę tutaj teoretyzowałem, ale nie byłby to zły pomysł. Mógłbyś przesłać komuś sumę md5, rozmiar i typ pliku (np. 1 = wave, 2 = iso... ). Co prawda procesor musiałby się naliczyć, ale dalej transfer byłby oszczędzony :D . W każdym razie na razie ciężko się do tego odnieść jeśli jest mało znanych nam kolizji.
Azarien
ale to nadal jest po prostu rodzaj algorytmu bezstratnej kompresji - i nie sądzę by się okazał aż tak wspaniały w porównaniu do istniejących.
BR
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:4
0

"Niestety generalnie jak ktoś będzie chciał, to obejdzie to zabezpieczenie w mgnieniu oka, patchując aplikacje i dodając sobie jumpa który ominie cały ten twój check "

jest jakiś sposób aby się przed tym uchronić ew. utrudnić?

edytowany 3x, ostatnio: Brattanek
Bartosz Wójcik
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
1

Nie tędy droga. Amatorskie implementacje zabezpieczeń padają jak muchy. Polecam się ze swoim rozwiązaniem jeśli chodzi o 32 bitowe, natywne aplikacje C++.

Jak odczytać sprzętowy ID:

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/GetHardwareId%20-%20sprzetowy%20identyfikator

Czy licencja jest zablokowana na sprzętowy ID:

https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/IsKeyHardwareIdLocked%20-%20czy%20klucz%20jest%20zablokowany%20na%20sprzetowy%20identyfikator

Jak ustawić własny algorytm generacji sprzętowego ID (np. w oparciu o jakieś własne, zewnętrzne komponenty sprzętowe):

  1. https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/HARDWARE_ID_CALLBACK%20-%20wlasna%20procedura%20identyfikatora%20sprzetowego

  2. https://github.com/PELock/PELock-Software-Protection-and-Licensing-SDK/tree/master/Examples/Polish/1.%20System%20licencyjny/SetHardwareIdCallback%20-%20wlasna%20procedura%20identyfikatora%20sprzetowego

Ogólnie SDK zawiera tonę metod utrudniających złamanie aplikacji.

Jakie są wady takich systemów jak mój? Nie lubią się z antywirusami, które tagują wszystko co nie jest czystym exekiem (a nawet czasami czyste exeki tagują jako malware) jako false-positive detection. Jak sobie z tym poradzić? Na public wypuszczać wersje demo z brakującym kodem (#ifdef twoim przyjacielem), a dla klientów zabezpieczone wersje z adnotacją, że AV może się przyczepić i żeby to zignorować.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Nie wiem czy polecałbym akurat Puloka, ale @Bartosz Wójcik ma tu rację, że takie chałupnicze zabezpieczenia niewiele dadzą. Tzn pytanie przed kim chcesz to zabezpieczać, ale akurat ominięcie takiego checka jest trywialne i jeśli serio chcesz się jakoś zabezpieczyć, to musisz to zrobić inaczej.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
BO
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:93
0
Shalom napisał(a):

Nie wiem czy polecałbym akurat Puloka, ale @Bartosz Wójcik ma tu rację, że takie chałupnicze zabezpieczenia niewiele dadzą. Tzn pytanie przed kim chcesz to zabezpieczać, ale akurat ominięcie takiego checka jest trywialne i jeśli serio chcesz się jakoś zabezpieczyć, to musisz to zrobić inaczej.

Wy macie tak już z natury, czy też po prostu... edukacji wam brakuje? :)

wystarczy w kilku miejscach sprawdzać - tak fragmentarycznie, w etapach;
i teraz możecie sobie skakać i wycinać - powodzenia życzę.

A jeśli miałoby to być tak całkiem super, no to trzeba pomieszać kod zabezpieczeń z tym funkcjonalnym,
i sytuacja łamacza jest już zupełnie beznadziejna, bo po wycięciu/ominięciu zabezpieczeń program zacznie źle działać:
bzdury będzie produkował - w najlepszym przypadku, bo zwykle będzie się zupełnie sypał, zawieszał, wywalał błędy krytyczne - system go zamknie i tyle.

Bartosz Wójcik
Robiłem projekt dla klienta (porzucone oprogramowanie wymagające aktualizacji), gdzie w binarnej aplikacji miałem ponad 1000 miejsc spatchowanych w ponad 20 bibliotekach i głównym exeku. Część zautomatyzowana, część ręcznie. Śnij sobie dalej o tym, że dasz w 5 miejscach tego samego checka, albo zwiesisz aplikację i nikt nie dojdzie do tego co jest tego źródłem.
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:4 dni
  • Postów:3561
0

A cóż to za wybitny program, że wymaga takich zabezpieczeń ?
W mojej własnej ocenie jest odwrotna proporcjonalność rzeczywistej wartości programu *) i podobnych technik.

*) wartość w oczach twórcy jest wykładniczą funkcją czasu


Bo C to najlepszy język, każdy uczeń ci to powie
Bartosz Wójcik
To może być nawet kółko i krzyżyk, masz problem, że chce się zabezpieczyć przed nieuczciwymi użytkownikami?
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
4
Brattanek napisał(a):

tworzę aktualnie prostą aplikację
Chciałbym aby aplikacja działała tylko na 1 komputerze i przez określony czas.

Ja powiem, że jest jeszcze gorzej.
Czy na google play lub Apple Store największą plagą jest hackowanie aplikacji?
NIE! Największą plagą jest klonowanie aplikacji.
Jak ktoś wpadnie na dobry prosty pomysł, to za 6mc sklepy zalane są klonami (zwykle gorszymi), a przed tym chroni jedynie złożoność produktu.

Wątpię, by twoja aplikacja, była na tyle atrakcyjna i skomplikowana, by ktoś kto ma odpowiednie umiejętności chciał ją hackować.
Skoro jest prosta to bardziej prawdopodobne jest to, że ktoś ją sam napisze od zera, albo już to zrobił, bo jak klasyk mówi: "wszystko co proste zostało już zrobione".

Dlatego jak chcesz bawić się w licencje i zabezpieczenia, to nie kombinuj za bardzo.
Najlepiej olać temat.
Jak już to robić, to ja po prostu bym wykorzystał OpenSSL, by klucz licencyjny był po prostu podpisem elektronicznym jakiś danych licencjobiorcy (nazwa licencjobiorcy) i totalnie olał kwestię łatwości hackowania.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
Bartosz Wójcik
Świetna porada, nie wnosząca nic do poziomu zabezpieczenia. W twoim durnym pomyśle podmieniłbym tylko klucz publiczny i samemu generował klucze. Jak kiedyś wydasz komercyjne oprogramowanie z takim schematem - wyślij mi linka.
BR
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:4
0

Bardzo dziękuje za wszystkie wypowiedzi. Aplikacja którą tworzę będzie działała tylko i wyłącznie na Linuxie dlatego rozwiązanie PELock się nie sprawdzi.
Generalnie dopiero zaczynam przygodę z C++ ponieważ wymyśliłem aplikację która uprości wykonywanie pewnych działań i wiem, że będzie w stanie pomóc nie tylko mi ale też kilku innym osobą z branży. Zazwyczaj wszystko załatwiałem w PHP i tam kwestie licencji były dużo prostsze ze względu na uruchamianie skryptów na moim serwerze.
Aplikację będę miał zamiar sukcesywnie rozbudowywać a wiem, że najłatwiej nauczyć się języka mając cel i do niego dążyć. Zabezpieczenie aplikacji jest właśnie jednym z tych celów. Nie chciałbym aby w przyszłości śmigała po internecie bo jakiś gamoń ominie wszystko 1 trickiem. Moim celem nie jest stworzenie aplikacji dla korporacji która na braku zabezpieczeń straci X euro tylko zabezpieczenie się przed amatorem który coś tam umie w komputer.

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
5
Brattanek napisał(a):

Generalnie dopiero zaczynam przygodę z C++

Szczerze to wszyscy się tego domyślaliśmy.
Głownie początkujący, bujają w obłokach, rozmyślają o wielkich sukcesach swoich dzieł i zanim je zrealizują, zamartwiają się, że ktoś ukradnie im pomysł, więc szukają różnych zapieczeń.
Nie zrobiłeś jeszcze kroków A B C, a już planujesz X Y Z.

Ci bardziej doświadczenie bardziej bawią się w open source, co pokazuje absurd zabezpieczeń.
Ba znam parę płatnych produktów, które są open source.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Wy macie tak już z natury, czy też po prostu... edukacji wam brakuje?

@bonifacy widzę troll znowu atakuje i znowu wypowiada sie na tematy o których nie ma pojecia... A Bartowi na pewno brakuje edukacji, w końcu wcale nie żyje od lat z pisania softu do zabezpieczania binarek xD

wystarczy w kilku miejscach sprawdzać - tak fragmentarycznie, w etapach; i teraz możecie sobie skakać i wycinać - powodzenia życzę.

Oh sweet summer child. Ludzie na CTFach dla zabawy robią takie rzeczy:
https://www.robertxiao.ca/hacking/dsctf-2019-cpu-adventure-unknown-cpu-reversing/
https://github.com/p4-team/ctf/tree/master/2018-09-29-dragonctf/chains-of-trust
https://github.com/p4-team/ctf/tree/master/2018-08-18-whitehat/re04

a ty myślisz ze dodanie kilku checków w róznych miejscach w czymś pomoże xD
Gdybyś miał jakiekolwiek pojęcie w temacie, to zasugerowałbyś może jedyną z nielicznych faktycznie dość ciężkich metod (i tak do połamania ale dużym kosztem) czyli jakiś vmprotect - generowanie customowej maszyny wirtualnej i enkodowanie binarki za pomocą jej instrukcji. Tylko że tutaj koszt wydajnościowy może być nie do zaakceptowania.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
kq
iirc Denuvo to więcej checków podczas całego uruchomienia programu i łamią to aż miło. To jedynie opóźnia złamanie, a nie uniemożliwia.
Bartosz Wójcik
Ci geniusze z Denuvo nie dość, że kupili wersję personal VMprotecta i używali jej jako wersji firmowej (producent VMprotect na rosyjskim forum pisał o nieuczciwości firmy Denuvo) to nawet nie zbadali ani samego zabezpieczenia, żeby zorientować się, że VMprotect wcale nie należy do topowych wirtualizerów. Teraz zatrudnili nawet Duncana Ogilive (mr. exodia) autora debuggera x64dbg i siedzi we Wrocku i klepie im tego przegranego gniota. Ostatnio jakiś typ na twitchu pisał dewirtualizera do VMprotecta w parę dni.
BR
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:4
0

Czyli rozumiem, że najważniejsza jest umowa licencyjna a nie same zabezpieczenia?
Trochę się dzisiaj pobawiłem i zauważyłem, że wszystkie stringi jak i parametry które przekazuje np. do system() są widoczne nawet przy otwarciu skompilowanego pliku notatnikiem. Pokazywanie np. z jakim API pod jakim adresem łączy się aplikacja lub parametry które przekazuje się do funkcji wydaje się być bardzo nierozsądne. Tym bardziej że to wszystko zapisane jest plain textem pośród krzaków.
Czy można z tym faktem coś zrobić?

edytowany 1x, ostatnio: Brattanek
Bartosz Wójcik
Ta, umowa licencyjna kogoś powstrzyma, żeby Ci zajumać oprogramowanie, na pewno jakiś Pajeet z Bangladeszu się tym przejmie. Co do stringów to wrzuć sobie je do https://www.stringencrypt.com
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Czy można z tym faktem coś zrobić?

Można sobie szyfrować stringi i deszyfrować w trakcie działania programu, ale to niewiele pomaga. Bo mozesz użyć jakiegoś strace albo ltrace albo debuggera albo jeśli aplikacja stuka po http gdzieś to wiresharka i i tak zobaczysz przynajmniej endpointy.
Popatrz sobie np. na https://www.cert.pl/news/single/nymaim-atakuje-ponownie/ masz tu przykład malware które celowo jest wlaśnie pozabezpieczane przed analizą ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
1

Ważniejsze jest czego sam oczekujesz?
Jeśli chcesz uczyć się reverse engineering itp, to wtedy możesz próbować dla własnej zabawy.

Jeśli chcesz zrobić to by naprawdę zabezpieczyć swoją aplikację, to tracisz czas, bo:

  • sam napisałeś, że aplikacja jest prosta, ergo prościej będzie napisać własną (zapewne lepszą), jeśli ktoś stwierdzi, że warto
  • takie zabezpieczania częściej są wielkim bólem głowy niż skuteczne. Było tak już wiele razy, że DRM-y uczciwym użytkownikom psuły krew, a ci co korzystali z piratów mieli pełnowartościowy produkt 3 miesiące po premierze.
  • jako początkujący powinieneś się skupić na rozwijaniu umiejętności w obszarach, na których ci zależy. Jeśli zależy ci na rozwijaniu swojej aplikacji, to zdobywaj na niej doświadczenie. Zapewniam cię, że dużo wody w Wiśle upłynie, zanim ktoś stwierdzi, że warto kupić twoją aplikację, a jeszcze więcej, zanim ktoś stwierdzi, że warto ją hackować.

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
BO
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:93
0

Shalom'on: ty wywaliłeś się już kompletnie w temacie 'wyszukiwania haseł w zbiorze literek', więc nie pogrążaj się.

Ostatecznie mogę wam nawet podesłać mój stary program,
a wtedy zobaczymy, czy złamiecie zabezpieczenie (przed kopiowaniem):
robimy zakład że nie dacie rady - stawiam całe 10 zł?

edytowany 1x, ostatnio: bonifacy
Shalom
Jeszcze raz: nie spamuj w wątkach o których nie masz pojęcia, bo będziemy się musieli pożegnać za trolling.
Shalom
Ale nikt nie broni ci zalożyć wątku, wrzucić tam swojego programu i wyznaczyc nagrodę za jego złamanie. Za 10zł to jestem pewien ze taki @msm poświeci 3 minuty zeby go połamać :)
BO
a niby po co miałbym się trudzić zakładaniem nowego wątk, skoro ty go zaraz zablokujesz lub skasujesz?
Shalom
Zakładaj, będziemy się mogli pośmiać a @msm zarobi 10zł, same plusy :) A poprzedniego wątku ani nie skasowałem ani nie zablokowałem, tylko przeniosłem do odpowiedniego działu...
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
2

Tak z ciekawości jak tam z twoimi podstawowymi umiejętnościami?
Czy używasz/znasz

  • debugera
  • kontroli wersji (git)
  • wzorce projektowe: fabryka, obserwator, wizytator
  • piszesz testy do swojego kodu

Im wyżej masz odpowiedzi "nie znam, nie używam", tym gorzej.
W przypadku debuggera każdy musi znać to narzędzie, ale im ktoś leszy tym bardziej używa testów niż debugera.
Początkujący często nie używają, bo nie mają pojęcia o istnieniu takiego narzędzia.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Bartosz Wójcik
Typ pyta jak zabezpieczyć soft, a ty mu robisz egzamin z testowania i projektowania oprogramowania? Jak ktoś się ciebie pyta gdzie jest piekarnia, bo chce kupić bułkę to robisz mu wykład o rodzajach pszenicy, czy wie jak się ją sadzi i kiedy, czy wie jak używać kombajnu do jej zbiorów i czy wie co to Monsanto?
MarekR22
Sam napisał, że jest początkujący. Początkujący mają tendencje do machania motyką na słońce. To pytanie ma go nakierować na właściwy kierunek nauki. Jeśli nie zna nie używa, któregokolwiek z tych punktów (wysoce prawdopodobne), to nasze nauki na temat zabezpieczenia aplikacji nic mu nie dadzą i są stratą czasu dla obu stron. Poza tym "Tak z ciekawości" zwykle jest zapowiedzią stwierdzania nie na temat.
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)