13.11.1998 Bielsko-Biala (UPS! 13 piatek ;) )
Y0 ALL !!!
Witam wszystkich ponownie ... Hmmm zastanawialem sie co by w tym FAQ zlamac ... hehe padlo na CrackMe 2.0 od MiB/Cruehead. Chyba nie bede omawial jak zlamac jakies komercyjne programy, bo pojawiaja sie coraz to nowe wersje i mozna miec klopot z zdobyciem koniecznego Soft-u ;).
Programik ma proste zabezpieczenie - tylko samo HASLO - Nie powinniscie miec problemu ze zlamaniem go - wiec zanim przeczytasz opis zlamania - sprobuj SAM !!!! Jesli Ci sie nie uda to zapraszam do lektury ;))
Co potrzebne - Oczywiscie wystarczy nasz ukochany SoftICE !!!
Hmmm ... Jesli bede pisal nastepnego FAQ to chyba opisze jak zlamac cos bez debuggera (tzn. WDASM + HEX-edytor).
Do crakingu wystarczy inteligencja, znajomosc ASM-a i umiejetnosc poslugiwania sie narzedziami (Debugger, Disassembler i HEX-edytor), jesli nie posiadasz tych cech to ... idz lepiej pograj sobie w QUAKE'a - to Ci sie bedzie bardziej podobalo ;)) Natomiast posiadajac te cechy mozesz bez problemu zostac crackerem - na poczatku bedzie trudno ... kazde zabezpieczenie bedzie stanowilo dla Ciebie wyzwanie - i wlasnie o to chodzi - zeby uzywac szarych komorek - kazde zabezpieczenie, ktore SAM zlamiesz bedzie powodem do dumy, i da Ci pelna satysfakcje ;)) Jesli przeczytacz gdzies pelno wzorcow zabezpieczen i jak je lamac, i wykujesz na pamiec to nie bedziesz mial z crackingu zadnej przyjemnosci, wiec wszystko proboj lamac SAM !!!!!!! Po pewnym czasie zaczniesz dostrzegac pewne wzorce zabezpieczen, a jeszcze pozniej bedziesz czul sie jak profesjonalista - twoj debugger zastapi Ci dziewczyne ... bedziesz uwazal go za swego najlepszego przyjaciela, a kazdy kawalek kodu bedzie dla Ciebie znajomy !!!
Jesli: chcesz zadac pytanie/przeslac kase/masz jakies sugestie/jestes szefem browaru/firmy computerowej to pisz na adres :tomroy@kki.net.pl tomroy@polbox.com lub tomroy@friko6.onet.pl ;)
UWAGA !!!
Musze sie zorientowac czy te moje wypociny ktos czyta, wiec jesli zalezy Ci na wydaniu kolejnych czesci (nie obiecuje !!!) to napisz na ktorys z powyzszych adresow Napisz obojetnie co - wazne tylko zebym wiedzial ze czytales to FAQ ;)) Mozesz napisac jakies sugestie ;) np. ze to co pisze jest niezrozumiale/zrozumiale i musze/nie_musze zmieniac stylu, a moze zauwazyles jakies bledy ???
Uwaga! przysylac tylko do konca 1998 !!!
Jesli uwazasz ze FAQ jest do Dupy ... to go nie czytaj. Nie odpowiadam za nie zgodne z prawem uzycie wiadomosci tutaj nabytych!!! Jesli nie rozumiesz tego co tu napisalem to sie nie przejmuj bo przyznam ze troche sie zapetlilem i mozliwe ze to napisalem nie zrozumiale :)
Tyle wstepu ... przechodzimy do konkretow ;) .......
1. Uruchamiamy CrackMe ver 2.0 ... klikamy Help/Enter Password i wpisujemy jakies dowolne HASLO np. ja wpisalem "tomek"
2. Wchodzimy do S-ice'a (Ctrl+d) ... ustawiamy breakpoint na GetDlgItemTextA :
bpx getdlgitemtexta
Heh ... prawdopodobnie za kazdym razem gdy lamiesz program pod W95 (SERIAL lub NAZWA/SERIAL) to ustawiasz breakpointy na GetDlgItemTextA i GetWindowTextA ... nie lepiej byloby np. za pomoca jednego slowa (komendy) ustawic breakpointy na obydwie funkcje ??? ... Mozesz to zrobic tak : w WINICE.DAT (w linijce inicjalizacyjnej), no chyba ze chcesz jednorazowo, wpisac komende :
macro break = "bpx getdlgitemtexta; bpx getwindowtexta"
teraz wystarczy ze wpiszesz komende <break> i masz ustawione breakpointy na tych dwoch popularnych funkcjach !!! pomiedzy codzyslowami mozesz wpisywac dowolne komendy ... tzn. ze mozesz np. dodawac kolejne funkcje, ktore maja sie kryc pod komenda <break>.
4. Teraz wychodzimy z S-ice (F5) ... i znowu w nim jestesmy ;) ... Jak zwykle wciskamy F11 zeby znalezc sie w miejscu skad zostala wywolana funkcja GetDlgItemTextA (teraz jestesmy w USER32.DLL). Jak wiecie z poprzedniego FAQ ustawiamy teraz breakpoint na komorke pamieci w ktorej program przechowuje nasze HASLO (chyba nie musze tlumaczyc jak znalezc ta komorke) no wiec :
bpm 0040217E
naciskamy F5 ... i znowu w S-ice ;) ... Zobaczmy gdzie sie znalezlismy :
00401371 MOV AL,[ESI] <------------|
>>>>00401373 TEST AL,AL |
00401375 JZ 00401390 |
00401377 INC BYTE PTR [00402118] |
0040137D CMP AL,41 |
0040137F JB 00401385 |
00401381 CMP AL,5A ;Petelki {|
00401383 JAE 00401388 |
00401385 INC ESI |
00401386 JMP 00401371 <------------|
00401388 CALL 004013B2 |
0040138D INC ESI |
0040138E JMP 00401371 <------------|
OK. Wyladowalismy w miejscu ">>>>" ... No chyba nie powiesz mi ze nie wiesz co robi powyzszy kawalek kodu ????? Jesli tak to odsylam do FAQ nr. 2 !!! Wiec teraz moje HASLO - "tomek" zamienia sie na "TOMEK".
5. Przechodzimy do nastepnych linijek :
POP ESI
CALL 00401399
przechodzimy przez "POP ESI" (F10) i zeby zobaczyc co jest wewnatrz procedury (00401399) naciskamy F8 ... Oto co w niej jest :
00401399 XOR EBX,EBX (1)
0040139B XOR EDI,EDI (2)
0040139D MOV CL,[EDI+004021A3] (3) <--------|
004013A3 MOV BL,[ESI] (4) |
004013A5 TEST BL,BL (5) |
004013A7 JE 004013B1 (6) |
004013A9 XOR BL,CL (7) ;PETLA {|
004013AB MOV [ESI],BL (8) |
004013AD INC ESI (9) |
004013AE INC EDI (10) |
004013AF JMP 0040139D (11) <--------|
004013B1 RET (12)
Linijka (1) to oczywiscie zerowanie rejestru EBX ... Linijka (2) to (znowu oczywiscie) zerowanie EDI ... Natomiast co w linijce (3) ??? hmmm ... zobaczmy co jest pod tym adresem :
d edi+004021A3
W oknie danych wyskoczylo cos takiego : Messing_in_bytes ... Chyba ten string nie siedzi tam bez celu ??? ... No wiec w (3) przy kazdym obiegu PETLI do CL jest ladowany kolejny znak tego stringu (bo przy kazdym obiegu inkrementowane jest EDI) !!! ... a co w linijce (4) ??? ... do BL ladowany jest (przy kazdym obiegu PETLI) kolejny znak z naszego HASLA !!! (bo ESI takze jest inkrementowane). Linijka (5) sprawdza czy aktualny znak w naszym HASLE (BL - aktualny znak) jest NULL, jesli tak, to skok z (6) do (12) czyli konca procedury. Linijka (7) XOR-uje dwie wartosci (w BL i CL) i wynik idzie do BL, a nastepnie z BL do [ESI] (8) - ESI wskazuje na adres naszego HASLA (konkretnie kolejnego znaku w tym HASLE ... przy kazdym obiegu PETLI), nastepnie inkrementowane (powiekszane o 1 - jakby ktos nie wiedzial ;) ) jest ESI (9) oraz EDI (10) oraz skok do poczatku petli (11) (czyli do (3)). Hmmmm ... co powoduje caly ten wycinek kodu ??? ... Otoz w wyniku jego wykonania pod adresem wskazywanym przez ESI (przedtem bylo tam nasze HASLO) znajduje sie nasze HASLO zXOR-owane ze stringiem : Messing_in_bytes !!! Dla mnie to bedzie :
T XOR M = .
O XOR e = *
M XOR s = >
E XOR s = 6
K XOR i = "
Czyli takie COS : .*>6"
6. Naciskamy F5 ... i jestesmy tutaj :
004013B8 XOR EDI,EDI (1)
004013BA XOR ECX,ECX (2)
004013BC MOV CL,[00402118] (3)
004013BE MOV ESI,[ESP+04] (4)
004013C2 MOV EDI,00402150 (5)
>>>>004013C7 REPZ CMPSB (6)
004013C9 RET (7)
Wyladowalismy w miejscu ">>>>" Na poczatek zerowanie EDI (1) oraz ECX (2) Linijka (3) powoduje ze do CL zapisywana jest ilosc znakow w twoim HASLE !!! hmmm a co w (4) ??? ... do ESI wkladana jest wartosc &&&&&& zXORowanego HASLA, czyli : .*>6" ,a w (5) do EDI idzie to co jest pod adresem 00402150 ... a co pod nim jest ???
d 00402150
otrzymamy ze po tym adresem jest takie cos : .,76;=(.=&.1-;7> W linii (6) wystepuje porownywanie dwoch stringow pod adresami DS:ESI oraz ES:EDI ... porownywanie konczy sie kiedy skoncza sie wszystkie znaki w obydwoch stringach (REPZ - powtarzaj dopoki zero). No i (7) to powrot z funkcji.
7. przechodzimy przez RET (F10) oto gdzie jestesmy :
0040123C ADD ESP,04 (1)
0040123F TEST CL,CL (2)
00401241 JZ 0040124A (3)
00401243 CALL 00401349 (4)
(1) nie ma znaczenia. (2) sprawdza czy w CL jest jakas wartosc rozna od zera ... jesli jest rozna to skok w (3) nie nastepuje a jezeli 0 to skok jest ;) ... hmmm ale co ta flaga (ZF - jesli ustawiona to zero) oznacza ??? co ja zmienia ??? i po co to jest robione ??? ... I tutaj jest najwazniejszy punkt zabezpieczenia !!! Hmmm tutaj trzeba troche pomyslec ... zobaczcie jeszcze raz na instrukcje REPZ CMPSB w poprzednim punkcie ... porownywanie (bo to jest zadaniem tej instrukcji) znakow nastepuje datad az w CX (tu wystarczy CL) bedzie 0 (CL jest za kazdym razem dekrementowane - zmniejszane o 1 !!!) ... czyli instrukcja ta jest wykonywana dopoki nie skoncza sie znaki w ES:EDI lub aktualnie porownywane znaki (z ES:EDI i DS:ESI) sie roznia !!! Jesli wszystkie znaki z ES:EDI sa rowne ze znakami z DS:ESI to twoje haslo jest poprawne i flaga ZF zostaje ustawiona (ligiczna 1). To by bylo na tyle ze starego kodu ... wrocmy do obecnego ... Linijka (1) jest nie wazna - choc warto zaznaczyc ze zmienia ona flage ZF na nie ustawiona (logiczne 0) !!! ... pewnie pomyslales to poco byla ustawiana przy REPZ CMPSB ??? ... Otoz jak sie zaraz przekonasz nie ma to wiekszego znaczenia, czy flaga ZF jest tam ustawiana czy nie (nie mowie ze tamta instrukcja jest nie wazna - jest bardzo wazna - wazne, ze ustawia wartosc w CL na 0 lub nie !!!). W linijce (2) jak juz wiesz jest sprawdzane czy w CL jest jakas wartosc rozna od zera ... ale teraz od czego uzaleznione jest to czy jest tam zero czy nie ??? juz wyjasniam : przed instrukcja REPZ CMPSB w CL byla wartosc ktora okreslala z ilu znakow sklada sie nasze HASLO ... a teraz pomysl jaka wartosc siedzi w CL po instrukcji REPZ CMPSB ??? otoz ta instrukcja jest wykonywana tyle razy ile jest znakow w twoim HASLE, czyli CL razy !!! przy czym CL po kazdorazowym wykonaniu instrukcji jest dekrementowane, az w koncu (jesli wszystkie znaki pasuja) CL osiaga wartosc 0, natomiast nigdy nie osiagnie zera gdy twoje HASLO jest zle, bo to dekrementowanie przerwie sie (cala instrukcja REPZ CMPSB zakonczy dzialanie) i wyladujesz z wartoscia w CL ktora bedzie liczba znakow w twym HASLE minus te ktore pasuja do wzorca. Np. jesli haslo jest "cracking" a ty wpiszesz "cractom" to w CL znajdzie sie 7-4 czyli 3 !!! Wniosek jest taki : jesli podales dobre haslo to flaga ZF jest ustawiona (przed instrukcja (1) !!!) po instrukcji (1) zmienia sie na nieustawiona (taka juz jest wlasciwosc instrukcji ADD ;) ) i teraz jezeli bylo prawidlowe HASLO to (CL=0) to po wykonaniu instrukcji (2) flaga ZF zostanie ponownie ustawiona !!! i nastapi skok (3) (JZ - skok jesli zero (ZF=1)) do procedury wypisujacej ze podalismy dobre HASLO !!! a jesli podalismy zle to zostanie wywolany CALL (4), ktory spowoduje podanie informacji ze mamy zle HASLO !!! UFFF !!! ... najgorsze wyjasnienie mam juz za soba ... mam nadzieje ze zrozumieliscie ;)).
8. No dobra ... powiedzialem jak program sprawdza czy podalismy dobre HASLO czy zle, ale teraz, to co nas najbardziej interesuje, jak uzyskac to HASLO ??? Przeanalizujmy jeszcze raz co jest robione z naszym HASLEM :
a) Zamienienie wszystkich liter w HASLE na wielkie.
b) zXOR-owanie HASLA ze stringiem "Messing_in_bytes"
c) jesli ta uzyskana wartosc jest rowna temu : .,76;=(.=&.1-;7> to mamy prawidlowe HASLO !!! Jak wiec je zdobyc ??? Pamietasz z FAQ nr 2 wlasnosc XOR-a ??? jesli nie to odsylam ... jesli ja znasz to nie powinienes miec klopotu z adnalezieniem prawidlowego HASLA ... wystarczy tylko zXOR-owac wartosc : .,76;=(.=&.1-;7> z Messing_in_bytes i otrzymamy dobre haslo - chyba wiesz dlaczego ???
No wiec wpisujemy komendy :
? 1F2C3736 ^ 4D657373 // .,76 XOR Mess
52494445 RIDE
? 3B3D2819 ^ 696E675F // ;=(. XOR ing_
52534F46 RSOF
? 3D261A31 ^ 696E5F62 // =&.1 XOR in_b
54484553 THES
? 2D3B373E ^ 79746573 // -;7> XOR ytes
544F524D TORM
UWAGA !!! Stawiam pivo temu kto wyczai jak w S-ice odrazu zXOR-owac obydwa stringi (bez rozbijania na grupy po 4 bajty !!!) No ... wystarczy teraz tylko zlaczyc wszystkie wyniki i powstanie prawidlowe HASLO !!!!! Czyli : RIDERSOFTHESTORM
HASLO mozesz zapisac malymi literami bo i tak sa one potem konwertowane na duze litery !!! Pozostaje tylko wpisac HASLO i dostajemy gratulacje ;)))))
A teraz UWAGA !!! ... za "zadanie domowe" macie zrozumiec dlaczego po wpisaniu HASLA skladajacego sie z jednej (jakiejkolwiek) litery, lub z liter poczatkowych prawidlowego HASLA np. "riderso", program podaje ze wprowadzilismy poprawne HASLO ?????????????????? hehe ... mam wyrzuty sumienia ze zadaje wam zbyt malo "zadania domowego" wiec jeszcze zlamcie ten program tak by mozna bylo wpisac dowolne haslo (banalne zadanie no ale coz...), wprawdzie autor zastrzegl ze patche sa nie dozwolone, ale dla potrzeb tego FAQ zrobimy wyjatek ;)). Wiec HEX-edytory w ruch ... i piszcie patcha.
UPS! zostalo mi troche miejsca wiec sprobuje zrobic krotkie wprowadzenie do S-ice'a ;) Bo widze, ze najwiecej problemow macie wlasnie z nim ;)
Oto (przyblizony) widok na okno S-ice'a !!!
|-----------------------------------------------------------------------------| | <<<<<Rejestry i flagi>>>>> | | EAX=00000074 EBX=0063FD46 ECX=80090480 EDX=8008E0E8 ESI=0040217E | | EDI=0063FCFC EBP=0063FCF4 ESP=0063FCDC EIP=00401373 o d I s z a p c | | CS=0137 DS=013F SS=013F ES=013F FS=2E97 GS=0000 | |-----------------------------------------------------------------------------| | | | | | < > | |-------------------------------------------------byte--------------PROT--(0)-| | <<<<<Okno danych>>>>> | |13F:00000000 9E 0F CB 00 65 04 70 00-16 00 02 D7 63 0D 51 03 ....e.p.....c.Q.| |13F:00000010 65 04 70 00 54 FF 00 F0-8B EA 00 F0 33 EA 00 F0 e.p.T.......3...| |13F:00000020 00 00 AF 14 D2 08 2D 0F-3A 00 02 D7 52 00 02 D7 ......-.:...R...| |13F:00000030 0C 2A 4E DA 82 00 02 D7-9A 00 02 D7 65 04 70 00 .*N.........e.p.| |13F:00000040 0E 00 F9 14 4D F8 00 F0-41 F8 00 F0 22 25 5C FD ....M...A..."%\.| |-----------------------------------------------------------------------------| | <<<<<Okno kodu>>>>> | |137:00401371 8A06 MOV AL,[ESI] | |137:00401373 84C0 TEST AL,AL | |137:00401375 7419 JZ 00401390 | |137:00401377 FE0518214000 INC BYTE PTR [00402118] | |137:0040137D 3C41 CMP AL,41 | |137:0040137F 7204 JB 00401385 | |137:00401381 3C5A CMP AL,5A | |137:00401383 7303 JAE 00401388 | |137:00401385 46 INC ESI | |137:00401386 EBE9 JMP 00401371 | |137:00401388 E825000000 CALL 004013B2 | |137:0040138D 46 INC ESI | |137:0040138E EBE1 JMP 00401371 < >| |---------------------------CRACKME2!CODE+0371--------------------------------| | <<<<<Okno komend>>>>> | |:bpx getdlgitemtexta | |: | |-------Enter a command (H for help)----------------------------------Crackme2|
Zaczynamy :
1) W "Rejestry i flagi" - EAX=000... itd. to chyba wszystko jasne ??? w ostatniej linijce : CS=0137 DS=01... to rejestry segmentowe Jesli podczas wykonywania jakiejs instrukcji ma sie zmienic wartosc jakiegos rejestru to jest on podswietlony. Po prawej literki :
o to flaga OF - Overflow flag d to flaga DF - Direction flag i to flaga IF - Interrupt enable flag s to flaga SF - Sign flag z to flaga ZF - Zero flag a to flaga AF - Auxiliary flag p to flaga PF - Parity flag c to flaga CF - Carry flag
Jesli dana flaga jest ustawiona to literka sie podswietla i zamienia na duza litere np. w przykladowym widoku ustawiona jest tylko flaga IF .
2) Puste miejsce pomiedzy "Rejestry i flagi" oraz "Okno danych" to okno w ktorym mozesz obserwowac rozne wartosci ktore okreslasz przy pomocy komendy <watch>.
3) W "oknie danych" po lewej sa adresy poszczegolnych komorek pamieci przedstawione w postaci Segment:offset, oczywiscie wiadomo ze aktualny segment jest taki jak w DS !!! Widac ze offsety zmnieniaja sie co 10h. Nastepnie jest 16 bajtow, posrodku przedzielone kreska, a potem ich reprezentacja znakowa (ASCII) ... przy czym jesli nie da sie przedstawic danej liczby hexadecymalnej (bajtu) w postaci znakowej to stawiany jest znak '.' (kropka).
4) "Okno kodu" chyba najbardziej nas interesuje. Tak samo jak w poprzednim oknie po lewej sa adresy. Aktualny segment jest w CS !!! Offsety zmieniaja sie w zaleznosci od dlugosci (w bajtach) poszczegolnych instrukcji. Nastepna liczba to hexadecymalna reprezentacja instrukcji. Nastepnie jest instrukcja wraz z operandami. Instrukcja, ktora ma sie wlasnie wykonac (po nacisnieciu F10 czy F8) jest podswietlona.
5) "Okno komend" sluzy do wpisywania komend za pomoca ktorych sterujemy S-icem.
W dolnym prawym rogu mamy nazwe programu ktorego kod wlasnie analizujemy !!! Tak samo jak ten napis ponad "Okno komend" (CRACKME2!C..). Przewijaniem okien strujemy za pomoca myszy lub klawiatury : Mysza przy pomocy strzalek po prawej stronie okna.Natomiast klawiatura : Ctrl+strzalka w gore(czy w dol) lub Ctrl+PgUp(czy PgDn) steruje przewijaniem okna kodu. Alt+strzalka w gore(czy w dol) lub Alt+PgUp(czy PgDn) steruje przewijaniem okna danych.
Jesli nie znasz dzialania jakiejs komendy to wpisz komende <help> - krotki opis wszystkich komend - lub <help komenda> np. <help macro> - aby uzyskac pomoc o konkretnej komendzie. Oczywiscie wszystko po angielsku, ale nawet jesli go nie znasz powinienes zalapac o co chodzi ;).
A teraz wyjasnie dzialanie "kilku" podstawowych komend w kolejnosci alfabetycznej (UWAGA!!! ... to nie wszystkie komendy - jest ich o wiele wiecej !!!):
<a adr> - Pozwala zmienic instrukcje (ASM) pod adresem "adres" na jakas inna. np. <a 024E3A34> ... po tej komendzie S-ice kaze nam wpisac jakas instrukcje ASM np.
<0028:00002345 XOR EDI,EDI>
... sama komenda bez parametrow <a> edytuje instrukcje ASM pod aktualnym (podswietlonym) miejscem w "oknie kodu".
<bc nr> - Kasuje breakpoint o numerze "nr" ... komenda <bc *> kasuje wszystkie aktualnie ustawione breakpointy.
<bd nr> - Wylacza breakpoint (nie kasuje !!!) breakpoint o numerze "nr" ... <bd *> wylacza wszystkie.
<be nr> - Ta komenda wlaczamy uprzednio wylaczone breakpointy ... albo jeden o numerze "nr" albo wszystkie <be *>
<bl> - Listuje wszystkie breakpointy np. w wyniku bedzie takie cos:
00) BPX USER32!GetDlgItemTextA 01) * BPMB #0030:0040217E RW DR3
gwiazdka oznacza ze dany breakpoint jest wylaczony !!!
<bpm adr> - Ustawia breakpoint na dostepie do jakiejs komorki pamieci np. <bpm DS:903B94A3>.
<bpx nm> - Ustawia breakpoint na wywolaniu jakiejs funkcji np. znajome <bpx getdlgitemtexta> UWAGA!!! zeby z tego zkorzystac musisz zaladowac odpowiednie symbole tzn. odblokowac niektore DLL-e w WINICE.DAT takie jak USER32.DLL, KERNEL32.DLL i GDI32.DLL
<cls> - czysci okno komend.
<code> - argument on/off ... jesli "on" to w oknie kodu po lewej stronie kazdej instrukcji pokazuje sie jej odpowiednik hexadecymalny, a jezeli off to nie pokazuje.
<color> - Niezbyt wazna ... ale ustawia kolory roznych czesci S-ice jak text, ramki i inne takie ;) Jako argumenty podajesz wartosci hexadecymalne kolorow poszczegolnych czesci ... bez argumentow pokazuje aktualne kolory.
<d adr> - Pokazuje dane (hexadecymalne i ASCII) pod adresem "adr" w oknie danych.
<db...> - Instrukcje <db> <dd> <dl> <ds> <dt> <dw> zmieniaja format danych w oknie danych np. <db> - dane w postaci bajtow ... <dw> - dane w postaci slow (word). Na naszym przykladowym ekranie mamy dane w postaci bajtow.
<e adr> - Edytuje dane (w oknie danych) pod adresem "adr".
<eb...> - Instrukcje <eb> <ed> <el> <es> <et> <ew> : Edytuja dane (w oknie danych) pod adresem "adr" w odpowiednim formacie danych np. byte lub word (bajt lub slowo).
<faults> - on/off ... jesli "on" to S-ice przerywa wykonywanie programu jesli ten popelni jakis blad. UWAGA!!! czasami (jesli nie jestes programista i nie wyszukujesz bugow) to lepiej ja wylaczyc bo jesli juz S-ice przerwie wykonywanie tego programu to czasem trudno z niego wyjsc !!!
<fkey> - sluzy do definiowania innych kombinacji klawiszy (do wykonywania poszczegolnych zadan) niz standardowe.
<g adr> - bez parametrow dziala tak jakbys wyszedl z S-ice (F5) ... natomiast z parametrem - wykonuje program az do adresu "adr" (wtedy S-ice przerywa).
<h> - <h> = <help>
<lines> - okresla w ilu liniach ma sie zmiescic okno S-ice'a (ilosc linii musi byc wieksza lub rowna 25 !!!)
<macro> - definiuje makro - jesli wpisujesz n razy n komend to mozesz zdefiniowac makro ktore Ci to ulatwi. np. <macro tom = "lines 50; code on; bpx getwindowtexta">
<r> - edytuje wartosci rejestrow np. <r ebx=777>
<rs> - powoduje pokazanie ekranu programu, po nacisnieciu jakiegokolwiek klawisza nastepuje powrot do Sic-e.
<s> - poszukuje w pamieci jakiejs danej ... np. <s 0 L FFFFFFFF 'mNICH'> , aby znalezc nastepna komorke wystarczy samo <s> (bez parametrow).
<t> - powoduje to samo co F8 ... czyli wykonanie pojedynczej instrukcji (bez wchodzenia w funkcje itp.).
<watch> - wprowadza dodatkowa jednostke do "obserwacji" . np. <watch esp+04> - bedzie (w dodatkowym oknie) pokazywalo wartosc esp+04 (nie to co jest pod adresem ESP+04 tylko rzeczywista wartosc np. jesli ESP ma wartosc C0F15E94 to ESP+04 bedzie C0F15E98 !!!)
<wc...> - <wc> : wlacza/wylacza okno kodu
<wd> : wlacza/wylacza okno danych
<wr> : wlacza/wylacza okno rejestrow i flag
<ww> : wlacza/wylacza okno watch-a
Heh... to by bylo na tyle tych komend - reszte musisz sam wykombinowac jak dzialaja ;).
Jeszcze na koniec jeden problem z S-ice'm ... wiele osob ma z tym problem i mnie pytalo wiec musze o nim wspomniec ;). Jesli nacisniesz Ctrl+D i nic sie nie pojawi a W95 kompletnie sie zawiesi albo cos podobnego to masz ten sam problem. Problem jest zwiazany (prawie na pewno) z karta graficzna ... musisz sam dopasowac odpowiednie ustawienia w "Display Adapter Setup" ... Ustaw na "Standard VGA"/"Standard Display Adapter (VGA)" nastepnie zaznacz pod spodem "Universal Video Driver..." w wiekszosci przypadkow powinno zadzialac ;).
Acha ! i zawsze staraj sie zdobyc najnowsza wersje S-ice'a ma on dodatkowe sterowniki graficzne ... a poza tym dodatkowe ciekawe funkcje !!!!!
To by bylo na tyle ... pamietaj : im wiecej bedziesz lamal zabezpieczen tym wiekszej nabierzesz wprawy !!!!!!!!!!!!!!
Linki (UWAGA! wszystkie strony po angielsku!) :