Download as pdf
Download as pdf
You are on page 1of 22
‘ZPRAKTYKL iil. asp. Pawel Olber biegly = zakresu badart informatyesnych Laboratorium Kryminalistycenego Komendy Wojew6dzkiej Poiej w Olsztynie pawel.olher@ol.policja gop! Wykorzystanie skryptow programu EnCase Forensic w kryminalistycznych badaniach cyfrowych nosnikow danych Streszczenie Celem niniejszej pracy jest przedstawienie uzytkownikowi programu EnCase Forensic skladni jezyka pro- gramowania EnScript, umodliwiajacego tworzenie wiasnych rozwiazah programistycznych, a takee przed- stawienie mozliwosci jego wykorzystania w kryminalistycznych badaniach cyfrowych nosnikéw danych, \W celu zrozumienia omawianego zagadnienia opis elementow ww. jgzyka programowania poparty zostat praktycznymi, autorskimi pr2ykadami. Prayktady zamieszczone w ninie}szej pracy pozwalaja na zrozumienie kodu istniejgcych juz skryptow, zawartych m.in. w taw. dokumentacji EnCase API. Dokumentacja ta jest najlepszym Zrédtem pozwalajgcym na zdobycie szczegdtowych informacji o kiasach ww. jezyka progra- mowania, ich sktadowych i funkcjach. Poza ww. dokumentem, w sieci Internet znajduje sig wiele aplikacji tworzonych przez pasionatéw jezyka programowania EnScript, kt6re ulatwiaja pisanie wlasnych skryptéw oraz stanowia cenne Zr6dio informacji inspiracji. Zaleta poznania ww. jezyka programowania jest mozliwosé tworzenia wlasnych rozwiazari programistycznych, pozwalajacych na automatyzacig realizowanych zadari \wykonywanych w ramach przeprowadzanych analiz sledezych, co jest bardzo istotnym elementem w pracy Informatyka éledezego. ‘Stowa kluezowe EnCase Forensic, EnCase API, EnScript Wprowadzenie i cel pracy Niniejsza publikacja zawiera oméwienie j@zyka pro- ‘gramowania EnScript zdetiniowanego w programie EnCase Forensic, ktory jest jednym z najbardziej ce- nionych na Swiecie programéw z informatyki sledeze} (computer forensic). Przeprowadzone badania doty- zace ww. jezyka programowania, oparte sq w szcze- gélnoSci na pracy w programie EnCase Forensic, KtOry ma wbudowane wiasne srodowisko programistyczne oraz zawiera skrypty stuzace do automatyzacii cza~ sochtonnych analiz Sledczych. Srodowisko progra- mistyozne ww. programu jest bardzo proste i brakuje w nim wielu preydatnych funkaii stuzacych do forma- towania kodu Zrédtowego. Diatego tez przyktadowe skrypty prezentujace sktadnie jezyka EnScript napi- sane zostang przy uzyciu aplixacji Microsoft Visual C++ Express skonfigurowane| w sposob umozlivia- acy wspéldziatanie z programem EnCase. Program Microsoft Visual G++ Express pozwala na zachowanie czyteine| | przejrzystej struktury tworzonych skrypt6w, co ulatwia ich analize i zrozumienie oraz uniknigcie bledow programistycznych. Informacje dotyczace sktadhni jgzyka programowania EnScript zgromadzone zostana przede wszystkim w wyniku analizy kodéw 2rédtowych skrypt6w, zawartych w tzw. dokumentacii ‘API programu EnCase Forensic. Ponadto przeprowa- dzona zostanie analiza dostepnych w sleci Internet skrypt6w, ktére sq tworzone przez pasionatéw ww. Jezyka programowania. W pierwszej czesci artykutu przedstawione zostang podstawowe informacje i pojecia dotyczace jezyka programowania EnScript. Nastepnie przedstawiony zostanie prosty program, ktéry bedzie punktem wy/- cia do tworzenia bardziej skomplikowanych aplikaci. W dalszej kolejnoSci wyjagnione zostang elementy sktadni jezyka programowania EnScript, w szczegol- osci podstawowe typy danych, zmienne zlozone, instrukcje sterujace, operacje na zmiennych, a takee zagadhnienia dotyczace programowania obiektowego. Na koriou przedstawione zostana autorskie rozwiaze- nia programistyczne, powstate na potrzeby realizowa- ‘nych opinii kryminalistycznych. Celem staran podjgtych przez autora jest oméwie- nie jgzyka programowania EnScript zdefiniowanego w programia EnCase Forensic i przedstawienie jego PROBLEMY KRYMINALISTYK! 289(2) 2015, 15 ZPRAKTYKI mozliwosei_w kryminalistycznych badaniach cytro- wych nognik6w danych. informacje zawarte w publl- kagii powinny byé przydatne dia oséb zaimujacym sig informatyka sledeza w tworzeniu autorskich narzedzi analitycznych stuzacych do automatyzacii czasochton- nych czynnosci wykonywanych w trakcie przeprowa- dzanych analiz, Przedmiotowa publikacja wydaje sie 0 tyle istotna, Ze w resorcie brakuje specjalistycznych szkolefi dotyczacych omawianego zagadnienia. EnScript - informacje podstawowe EnScript jest obiektowym jezykiem programowania opartym na sktadni dw6ch jezykéw: C++ i Java. Jezyk ten pozwala na automatyzacje realizowanych zadaf ‘oraz uproszczenie wielu czasochtonnych czynnosci przeprowadzanych w trakcie wykonywanych analiz, ‘Sledczych, takich jak np. wyszukiwanie i analizowanie konkretnych typow dokumentéw, przetwarzanie oraz ‘ekstrakcja danych zapisanych w réznego rodzaju pli- kach, tworzenie zbiorow zawierajacych funkcje skrotu itd. Korzystanie z tego jezyka programowania umoz- liwia rownie® przetwarzanie informac|i wyselekcjono- wanych w wyniku przeprowadzonej analizy danych, ktore zostaly dodane do zaktadek (bookmarks) lub rekordéw (records). EnScript - sktadnia jezyka Rozpoczecie nauki tworzenia_skryptow w jezyku EnSoript wymagazapoznaniauzytkownikaz podstawo- \wymi zagadnieniami oraz terminologia dotyczacq pro- gramowania. W artykule oméwione zostang rownie2: struktura programu, przebieg przetwarzania sktado- \wych oraz funkoji programu. Poznanie ww. zagadnion jest bardzo istotne, poniewaz utatwi uzytkownikowi zrozumienie Kodu Zrédtowego tworzonych przez niego aplikagji oraz pozwoli na skuteczna analizg istnieja- ych juz skrypt6w, min. domysinie zdefiniowanych w programie EnCase oraz dostepnych w sieci Internet. Biate znaki Blate znaki . spacje, tabulatory oraz znaczniki no- we) lini, nie maja znaczenia w kodzie érédtowym i sa ignorowane przez kompilator ~ program wykonujgcy kompilacje, czyli tlumaczenie kodu érédiowego na igzyk maszynowy. Komentarze Dowolny fragment kodu érédiowego programu moze byé objety komentarzem. Komentarz jest calkowicie ‘gnorowany przez kompliator, natomiast moze byé praydatny dia piszacego i czytajqcego kod. Komentarze stosowane sq w celu opisu, wyjaénienia Pewnych fragmentow kodu programy, oddzielenia jednej czeéci kodu od drugiej oraz oznaczania funkcji W jezyku EnScript istnieja dwa dostepne sposoby ko- mentowania kodu: liniowe oraz blokowe. Prayktad: class Mainclass { void Main(CaseClass c) { J) Prayktad konentarza Liniowego. p Praykiad konentarza blokonego, ktorym moina obja¢ wiele 1inii. ” Dyrektywa include W jezyku EnScript zapis include to taw. dyrektywa = informacja 0 dotgczeniu do kompilowanego pliku ‘Zrédiowego zawartosci wskazanego pliku 0 rozsze- reniu enscript, okreslanego jako biblioteka. Biblioteki zawieraja funkcje, z ktorych mozna korzystaé w pliku ‘Zrédlowym. Nazwe pliku podaje sig bez rozszerzenia, Prayktad: This script is 2 modification of “sweep Enterprise” of Encase VA. Report all bugs and queries to technical support@guidancesoftuare.com TUT "7 snelude include include Dyrektywa typelib W jezyku EnScript zapis typelip umozliwia dotgeze- nie do Kompilowanego pliku Zrédtowego zawartosci wskazanego pliku, tzw. biblioteki pochodzace| z 20 wnetrznej aplikacii, np. programéw z pakietu Microsoft Office. Prayktad: 6SI_Basic” ‘GST_SweepCaseLib’ ‘GST_DefaultNodules typelib Excel "Excel sheet” typelib Scripting "scripting. Filesystenodject™ #iFdeF Excel class Nainclass { void Main() { systenclass: :Clearconsole(); Createtxcel(); y Void Createtxcel() { Excel: Application app; iF (app-Create()) { app. SetVisible( true); Excel: :Horkbooks books = app.Workbooks(); Excel::Werkbook book = books.Add(); Excel:Sheets sheets = hook.Worksheets(); Excel: :Wordshe sheet = Excel::Worksheet 'ypeCast (sheets. item(1)); Excel::Range cells = sheet.cells(): ‘AddTable(cells); AddPiechart(sheet) ; 16 PROBLEMY KRYMINALISTYK! 288(2) 2015, ZPRAKTYKI Konsola Konsola jest w rzeczywistoéci plikiem, ktérego za- wartosé wySwietlana jest w oknie podgladu programu EnCase Forensic. Konsola dostepna jest po weisnig- clu zaktacki ,Console” (dot. V6) lub za pomocg menu: View -> Console (dot. V7) i umozliwia wyswietlanie wszelkiego rodzaju komunikatow oraz innych tresci, np. informacji o przebiegu dziafania programu W celu ‘wySwietlenia komunikatu w konsoli nalezy postuzyé sig poleceniem WriteLine(). Pierwszy program Tradycyjne ksiazki 0 programowaniu zaczynaja nauke programowania od przedstawienia aplikacii wy- ‘wietlajacej w konsoli lub na ekranie monitora zdanie: Hello World". Tradycia ta zostanie zachowana takze iW niniejsze} publikacj. Pierwszy program bedzie punktern wyjscia do bardziej ztozonych aplikac, ktore ozwoia zrozumies sktadnig jezyka EnScript Prayktad: class Mainclass { void Main(CaseClass c) { Console.WriteLine( "ello World"); Hello world Gtowna klasa programu Program napisany w jezyku EnScript jest zbiorem zmiennych, defini i wywolen funk. Kazdy skrypt Uutworzony w programie EnCase ma klase o nazwie MainCiass, wewnatrz kt6rej znajdule sie funkcja Main, przyimujaca jako parametr zmienng typu CaseCiass, ktéra jest odpowiednikiem sprawy utworzone} przez Uuzytkownika programu. Wewntrz klasy giéwne| MainClass definiowane sa pozostate Klasy i funkoje. Po uruchomieniu skryptu program EnCase lokalizuje obiekt typu MainClass 1 wywotuje jego konstruktor. Zagadnionia dotyczqce konstruktoréw przedstawione zostang w dalsze| czeSci publikacji. Nastepnie ww. obiekt veywotuje funkcje Main, ktéra poprzedzona jest stowem kluczowym void. Oznacza to, Ze funkoja ta nie zwraca Zadnych danych. Na koniec program EnCase uuruchamia destruktor klasy MainOlass i ostatecznie uusuwa obiekt klasy glowne). W tym miejscu program kofczy dziatanie. Pojecie zmiennej i podstawowe typy danych Zmienna (variable) to micjsce w pamigci opera- cyine| Komputera przechowujace pojedyncza wartosé okreslonege typu. Kazda zmienna ma nazwe, dzi¢ki kt6re] mozna sie do nie] odwotywat. Przed pierwszym uzyciem zmienng nalety zadeklarowaé, a wigc. po- informowaé Kompilator, Ze pod taka nazwa kryje sig zmienna danego typu. Sktadnia deklaracii zmienne} wygigda nastepuiaco: typ nazna_zmienne} ~ wartosé_zmiennej ‘Typ oktesla rodzaj informaci, jakie mozna przecho- \wywaé w zmienne}. Moga to byé np. liczby catkowite, rzeczywiste, tekst (czyli taricuchy znakéw, strings). Nazwa zmiennej powinna dobrze okreslaé jej znacze- nie’ spetniaé pewne kryteria. Oto najwaaniejsze z nich: + nazwa 2miennej powinna byé stowem lub skro- tem, okteslaiacym je przeznaczenie + nazwa moze sig sktadaé z matych i wielkich liter, ‘a takze cytr i znaku podkresienia. Nalezy pamig- taé, Ze nazwa zmiennej nie moze zaczynaé si¢ ‘0d cytry. W odréznieniu od innych jezyk6w pro- ‘gtamowania w nazwie zmiennej mozna utywaé znakovr narodowych, np. liter 6 czy 2. Jezyk EnScript obstuguje rézne typy danych natyw- nie, co oznacza, Ze konwersje pomigdzy rG2nymi typa- mi danych wykonywane sq automatycznie oraz uzycie dane| okreSionego typu dopuszczaine jest w kazdym kontekscie. Przyktad: class Mainclass { void Main(CaseClass c) { // deklaracja zmiennej "i" // przypisanie wartosci 1 do zmienne} nei= ay // wyswietlenie zanartosei zmiennej * Console.WriteLine(") = + 4); 1/ dodanie wartosei 1 do uprzednio 7/ 2deFiniouane} zmienne} errer Console.WriteLine("i =" + i); Podstawowe typy danych Typy danych okreslaja sposéb_uzycia pamigci w programie. Okresiajac typ danych, praekazuje sig kompilatorow’informacie, jak utworzyé okrestony trag- ment pamigci, a takze w jaki spos6b wykonaé na nim operacje. Dane réznych typow rézniq sie szybkosciq dziatania, rozmiarem zajmowanej pamigct i oczywiscie ‘tunkcjonainogcia, np. sq dane, ktore wolno mnozyé przez siebie, ale | takie, dla ktérych operaoja mnozenia rie istieje — choéby teksty. PROBLEMY KRYMINALISTYKI 283(2) 2015 7 ‘ZPRAKIYKI char Zmienna typu char przechowuje jeden znak. Do zmiennej tego typu mozna przypisaé znaki UNICODE © kodach od 0 do 65535. Zmienne typu char moga byé przypisane do zmiennych typu catkowitego int i odwrotnie, zmienne typu catkowitego moga byé przypisane do zmiennych znakowych. W przypadku ‘takiego zablegu EnScript dokonuje konwersji znak6w zgodhnie z kodowaniem ASCII. W kodzie ASCII mata litera .a” ma przypisana wartosé 97. Gdy do zmienne| typu char zostaje preypisany znek, to w rzeczywistoSci jest on liczba z zakresu od 0 do 255. Nalezy jednak zdawaé sobie sprawe z réznicy pomigdzy wartoscia a znakiem, np.:5 5” nie jest tym samym, poniewaz 5 jest wartoécia, natomiast ,5" jest znakiem ima wariosé 53, tak jak w praypadku liter ,a", ktora ma wartosé 97. Prayklad: class Mainclass { void Main(CaseClass c) { 1 Przypisante Liceby 82 do ziennej int intis // Wysuietlenie zanartosci amienne} ‘i Console.WriteLine(": =” + i); 11 Br2ypisanie zmisnnej “4 17 typu char char a= 43 60 amienn // WySuietlente zanartoget antennes *a Console.WriteLine("2 = + a); 11 Przypisanie znaku do zmiennej typu char char b= 'v'y 1) Wyswietlenie zanartosci zmiennej 'b’ Console.WeiteLine(*b =" + b); 11 Pr2ypisanie zniennej "b' do zmienne} "J" int $= by J) Wyswietlenie zawartogci zmiennej ‘3 Prayktad: class MainClass { void Main(CaseClass c) { 1/ Usunigcie zawartosci_konsoli SystemClass: :Clearconsole(); 1/ Pr2ypisanie wartosci do 2mienne} $1 String s1 = “ello%3 // Pr2ypisanie wartosci do zmiennej s2 String 52 = " World"; 1/ Insenna $1 uryskuje wartose “Hello Moria” sl= 614 52; 1/ Inienna si uzyskuje wartoSé "Hello World.” sleste ss 7/ Praejécie do nowego wiersza sl=st+ \03 11 Wysusetlenie wynikén konsoli Console.Write(s1); Hello World. Ciggi znakéw moga zawieraé znaki_ speciaine. W celu wykorzystania znak6w specjalnych w tekscie nalezy postuzyé sie znakiem ukosnika (backslash). Do ‘grupy znakéw specjainych zaliczamy: tabulator, uko- nik, pojedynozy cudzyst6w, znak kori lini Prayktad: class Mainclass { void Main(CaseClass c) { SystemClass::Clearconsole(); String $1 = “Tabulator \t, ukosnik \\, & pojedynczy cudzystow \", anak korica Linii. \n"3 Console.WeiteLine(") = "+ 3)5 Console.Write(st); » } Wynik: Wynik: Tabulator —_, ukosnik \, pojedynczy cudzyst6n String Zmienna typu String przechowuje ciagi znakow (tokst), na KtGrych mozna wykonywaé wiele operacji. Ciggi znak6w moga byé ze soba taczone za pomoca ‘zak kofce Linki Istnieje réwniez mozliwosé umieszozenia w tekScie dodatkowych znakéw specjainych z tablicy UNICODE, ‘np. znaku towarowego ®. Znak ten nalezy zapisaé Z ukosnikiem w postaci szesnastkowe}’. 1) Tablica UNICODE dostepna jest min. pod acresem: httov/unicode-table.com/en/. 18 PROBLEMY KRYMINALISTYK! 289(2) 2015, ZPRAKTYKI Prayktad: class Mainclass ( void Nain(CaseClass ¢) { systenClass: :ClearConsole(); String 51 = “To jest znak towaroiy Console.Write(st); \woone"; String s2 = “Litera alfabetu rosyiskiego: & 0818"; Console.Wnite(s2); To jest anak tovarowy: @ Litera alfabetu rosyjskiego: A Poniewaz wszystkie znaki w cudzystowie sq zna- cczace, w tym rownie? biate znaki, nie mozna wstawié nowego wiersza w Srodku taficucha, Prayktad!: class Mainclass { void Main(CaseClass c) { systemlass: :Clearconsole(); J] Niepranidiony sposdb 51 = "To jest bardzo dtugi tekst, ktérego nie moina zapisywaé u ten sposéb. Préba uruchonienia skryptu zakoniczy sig bieden"; Aby polgezyé bardzo dtugie ciagi znakow, wystarczy umiescié je w cudzystowie, jeden pod drugim. Ciggi znak6w zostang poigczone w czasie kompilacii pro- gramu. W przypadku bardzo dlugich ciag6w znak6w nie nalezy uzywaé operatora tqczenia .+", poniewaz spowoduje to niepotrzebne wydtuzenie czasu kompi- lagji programu, Prayktad: class Mainclass { void Main(CaseClass c) { SystenClass: :ClearConsole(); J/ Prawidtoue potaczenie bardzo élugich 2nakow s1 = "To jest bardzo dtugi tekst, ktéry zostat zapisany prawidtowo. \n Uruchonienie skryptu zakoriczy sig sukcesen."; console.weitetine(si); i Wynil To jest bardzo dlugi tekst, ktéry zostat zapisany praxidtowo. Uruchomienie skryptu zakofczy sig sukcesem. Ciagi znak6w mogq byé traktowane jako tabli ca znak6w i adresowane indywidualnie. Uwaga: Indeksowanie tablicy odbywa sig zawsze od 0. Ostatni ‘element ma indeks réwny rozmiarowi tablicy — 1. Prayktad: class Mainclass { void Main(CaseClass c) { systemclass: :ClearCansole(); String 5 = "1224597800 Console.WriteLine("Picrnotny clag: "+ 5)3 J) wyswietlenie Licaby 1 Console.WriteLine("Pisrwszy 2nak ciggu s[@] = 5 ae 1) busta linia Console.ueitel ine(” ); 1] Mistauienke enaku °X' na pierwsza pozycie ste] = x5 U/-5 = X234567890 Console.Wnitetine(Niowy cigg: Console.Wniteline("Picrwotry ciag. +5); + 8)5 Pierwotny ciag: 1234567890 Pierwszy znak clagu: 1 Nowy ciag: x234567890 Pierwszy znak ciagu: X Numeryezne typy danych W jezyku EnScript dostepnych jest siedem typow numerycznych. Typy numeryczne maja staly rozmiar, niezaleznie od procesora i platformy. CzeSé typow umerycznych ma podobne nazwy, rézniq sig one jedynie pierwsza itera u. W jgzyku EnScript jest to tak zwany modyfikator, prey uzyciu ktérego mozna nieco wplywaé na zakres danych, Ktore mozna zapisywaé w zmiennych. Modytikator to nic innego jak okreslenie réznych odmian jednego typu. Modytikator u okre- sla, Ze dany typ reprezentuje jedynie dane dodatnie. Wezystkie numeryczne typy danych jezyka EnScript zostaty przedstawione w postaci tabelaryczne| | po- sortowane wg rozmiaru danych, jakie moga przecho- wywat (tab. 1) PROBLEMY KRYMINALISTYK! 289(2) 2015, 19 ZPRAKTYEI Tabela 1 Zestawienie numerycznych typéw denych Typ_| Rozmiar (8) Min, wartosé Max. wartosé Short 2 “32768 32767 Ushort 2 0 65535 Int 4 “2147489648 2147489647 int 4 0 4294967295 Long 8 -9228372082559808613 (9228372032559808512 long 8 ° 118446744065119617025 Double 8 “1.79 14308 1.79" 164308 Prayktad: Wynik: class MainClass { void main(CaseClass ¢) { // Usunigete zavartoses konsolé SystenClass: :ClearConsole(); 11 Imienna typu short Short short_min_value = -327685 short short max_value = 32767; Console.WriteLine("Min. wart. zmienne) typu & “short! wynosi: "+ short_min_value) ; Console.WriteLine("Hax. wart. zmienne} typu & shont! wynosi: "+ short_max_value); Console-WriteLine( 7 11 Imienna typu ushort Ushort ushort_min value = 0; short ushort_nax_value = 65535; Console-WriteLine("Hin. wart. zmienne} typu # “usfiont wynosi: ” + ushort_min_value); Console.kriteLine("viax. wart. zmienne) typu & short" wynosi: " + ushort_max_value) ; Console-WriteLine(” a an 1 tmsenna typu int pt dnt_in_value = -21a7a83648; int dintlmax_value = 2147483647; Console-WriteLine("Hin. wart. zmienne} typu & int! wynosi: "+ Int_min_value); Console.kriteLine( "vax. wart. 2mienne} typu & int" wynosi: "+ int_max_value); ds Console.WriteLine(* 11 2wienna typu unit Unit unst_ain value = @5 Unit unitsax_value = 4294967295; Console.WriteLine("Hiin. wart. zmiennej typu & “unit” wynosi: "+ unit_ein_value); Console.briteLine("Max. wart. zmienne} typu & “unit! wynosi: "+ unit_sax_value); Console.WriteLine(*=----- ds Console writeLine(s1); Min, wart. zmiennej typu ‘short’ wynosi: Max. wart. zmiennej typu ‘short’ wynosi: 32767 zmienne} typu znienne} typu Min. wart. zmiennej typu ‘int’ wynosi: -2147883688 Max. wart. zmiennej typu ‘int* wynosi: 2147483647 Min. wart. zmiennej typu Max. wart. zmienne} typu " 4298967295 void Ten specjalny, tzw. pusty, typ danych uzywany jest, do wskazania, Ze funkcja nie zwraca Zacinego wyniku. Praykiad zastosowania ww. typu zostat rowniez przed- stawiony podczas omawiania funkcji Prayktad: class Mainclass { void Nain(CaseClass c) { 1/ Usuniecte zawartosci konsoli systemClass: :Clearconsole(); U1 Wywodanie funkeji NoData(); Nopata(); 11 wywoRanie Funkcji Retunnoata() 114 pr2ypisanie zurécone} wartosci do 1 amienne} ‘text! String test = Returabata(); Console.writeLine(text); ) // Funkcja typu void - nie zwraca 2adnych 1 wartoses void Nobata(}{ y Console.WriteLine("Funkcja NoReturn() nie & y zaraca Zadne} wartosci."); > 20 PROBLEMY KRYMINALISTYKI 288(2) 2015 ZPRAKTYKL 11 Funkeja typu String - String Returnbata(){ String msg = "Funkcja Returndata() zwraca & zaraca tekst wartosé zmienne} typu String return msgs d FunkcJa NoReturn() nie zwraca tadnej wartosci. FunkcJa Returnbata() zwraca wartosé zmienne} typu String. variant Zmienna typu variant preechowuje dane dowoinego typu. Zawiera rowniez odniesienie do obiektu repre- zentujgcego przypisang wartosé, ktéry jest dostepny za pomoca funkcji Type). Prayktad: class MainClass ( Void Main(CaseClass c) { 1/ Usunigcie zawartosci konsoli systemclass: :ClearConsole(); 11 Deklaracja zmiennych typu variant Variant vi = "wits", v2 = 100, va = 2.5} Console.WeiteLine("Znienna typu + vi-Type().Name() +" = ° + v4); Console.unitetine("znienna typu” & + v2.Type().Name() + °° + v2); Console.WriteLine("Znienns typu" & + vB.Type().Name() +" =" + v3)3 Zmienna typu String = witaj Zaienna typu int ~ 100 Zaienna typu double = 2,5 bool Najprostszym, ale bardzo czesto uzywanym type danych jest typ logiczny. Do jego okregienia stuzy sto- wo kluczowe boo! (skrot od Boolean — boole’owsk, logiczny). Do zmiennej typu logicznego mozemy przy- pisaé wytgcznie wartosé true (1) lub false (0). Zmienna tego typu najczescie| stosuje sig do okresienia, czy jest coS wiaczone czy wylaczone, prawdziwe lub falszywe. Przyktad: class MainClass { // Metoda, ktéra zmienia wartosé 1 msennes ‘b' na false void Zmien(bool 8b) { b= false; y void Main() { // Klasa Main 1 Usunigcse zawartosei konsoli SystemClass::ClearConsole(); // Praypisanie wartosci ‘true’ do zmienne} b bool b = trues Console.WriteLine('Wartose znnienne} # logiczne} b=" +b); Bmien(b);// Zniana wartosci zmiennej °b* Console.WeiteLine("wartosé zanienne} b & po amianie: " +b); // Jeteli warunek jest prandziny 2ostanie 11 wyswietlony konunikat if (=e) { Console-WniteLine("Warunek 'b = 8" jest & prawdziny")s > > » Wynik: Wartos¢ zmiennej logiczne} b = 1 Wartosé zmienne} b po zmianie: @ Warunek "b= @° jest prawdziwy Zmienne ztozone Typ wyliczeniowy Wyliczeniowy typ danych umoziwia powiazanie nazw z liczbami. Wyliczenie deklaruje sie za pomoca stowa kluczowego enum (pochodzacego z jezyka C), Kt6re automatycznie numeryje liste statych, nadajac im wartoSci: 0, 1, 2 itd, Deklaracja typu wyliczeniowe- 0 przypomina deklaracie struktury. ‘enum nazwa_typu { stata.1 [= wartosé], -) | Domysina wartosé plerwszej state] w zbiorze typu wyliezeniowego wynosi 0. Wartosé kazde| nastepne| stale| prayjmuje wartose wieksza 0 1 od wartosci state] poprzedzajacej. Kazda ze stalych moze zostaé zdefi- niowana z okreslona wartoscia. Jezeli ktoraé 2 warto- Sci nie zostanie podana, to zostanie ona wyliczona na padstawie wartosel poprzednia} PROBLEMY KRYMINALISTYKI 288(2) 2015 24 ZPRAKTYKI Prayktad: class Mainclass { JJ Deklaracja typu wyliczeniowego ‘enum Liczby { 11 Nazwy stadych Jeden, I1 Wartose = 0 Daa, WI wartose = 1 Tray = 20, U1 Wartose = 20 eatery, 11 Wartosé = 22 Page = Tray +10 // wWartose = 30 ¥ void Main(CaseClass c) { 1/ Usunigcte zaartosci konsoli SystemClass: :Clearconsole() ; Console.WniteLine( "wartosé =" + Liezby::Jeden); Console.WriteLine( “vartose =" + Licaby::0wa) Console.WeiteLine( “wartose = Trey) 5 Console.WriteLine( "wartose Wynik: wartose Wartosé Wartosé arto! Wartosé @ 1 20 a 0 Nazwe state| typu wyliczeniowego mozna uzyskaé poprzez jej wartosé. W tym calu nalezy postuzyé sig statyczng funkeja 0 nazwie Source Text(). Prayktad: class Mainclass ( enum Liczby { eden, 11 Wartose = @ Dea, 17 wartose = 1 Tray = 20, 17 Wartosé = 20 catery, 17 Wartose = 21 Pige = "Trey + 10 // Wartose = 32 > void Main(CaseClass c) ( 1 Usunigcie zawartosci konsoli SystenClase: :Clearconsole(); Console.kriteLine( “Nazwa state}: " + Liczby: :SourceText(@)); Console.Kriteline("iiazna state}: " + Liezby: sSourceText(1)); Console.WeiteLine( "Nazwa state}: " # + Liczby: :SourceText(2e)); Console-WriteLine("Nazwa states: " & 4 Liezby: Console-WriteLine( + Liczby: Tablice Tablica jest struktura zlozong z okreslone| liczby elementéw tego samego typu. Wszystkie elementy tablicy umieszczane sa w pamigci komputera razem w jednym miejscu i do kazdego elementu mozna odwotaé sig za pomoca nazwy tablicy oraz indeksu ‘okresiajacego numer danego olementu. o 1 239 4 § Tablice tworzy sig za pomoca stowa Kluczowe- go typedef, po kiérym okreSia sig rodzaj danych Przechowywanych w tablicy. Po utworzeni tablicy modna zadeklarowaé oraz zainicjowaé zmienng typu tablicowego. typedef typ_tablicy StringArray; Prayktad: class Mainclass { 11 Utworzenie dwéch tablic typedef String(] Stringarrays typedef int[] Intarrays void Main(CaseClass c) { JJ Beklaracja zanienne} tablicowe} ‘nazwisko Stringarray nazwisko(3); 11 Pr2ypisanie wartosci nazwisko[9] nazwisko[3] nazwisko[2] = ikulsie"s 1/ veklaracts zmnienne} tablicowe} “Iiczba" IntArray iezba(3)s 7] braypisanie wartosc Liczba[e] Hezba(] Mezbat2} = 3; 22 PROBLEMY KRYMINALISTYKI 268(2) 2015 ZPRAKTYKI 1/ wyswletlenie zawartosel tablicy foreach (String s in nazwisko){ Console.WriteLine(s); > Console.WiteLine("Iiczba[2) = + Mezba[2}); Wynik: Kowalski, Nowak bluse Lezba[2] = 3 Istnigje mozliwosé inicjalizaciitablicy w momencie jel deklaracj. Po nazwie tablicy nalezy w nawiasach Klamrowych ((}) podaé wartosé kolejnych elementow tablicy. Na podstawie liczby wartoSci inicjalizujaoych kompilator automatycznie zdefiniuje rozmiar tablicy. typ tablicy nazwa_zmiennej {index[@], index[2], Prayktad: class Mainclass { 1/ Utworzente tablicy typedeF Stringl] Stringérrays void Main(caseclass c) ¢ 1/ deklaracia amienne} tablicowe) Ui Inicjalizacja annienn: Stringarray nazwisko {°Kowslski", Mikulski" ;} Nowak", J] MySwietlenie zawartosei tablicy foreach (String s in nazwisko) { Console. writeLine(s); + Wynik: Kowalski Nowak Mikulski Tablice wielowymiarowe W jezyku EnScript mozna utworzy6 tablicg znacznie bbardziej zlozong — na przykiad tabliog dwuwymiarowa, t6rq_mozna graficznie zobrazowat w nastepujacy sposdb: oaonso Tablica dwuwymiarowa zostanie utworzona za omoca instrukgji sterujgce| foreach, ktéra zostanie ‘oméwiona w dalszej czesci pracy. Rozmiar tablicy dwuwymiarowe} okreslany jest przez liczbe wierszy i kolumn. Prayktad: class Mainclass { 11 Utworzenie tablicy ‘typeder int[] IntArrays 77 Uivorzenie znienne} tablicowe) ‘multiarray’ ‘typede? Intarray[] multiarrays void Main(Caseclass ¢) { // Okresienie rozmiaru tabeli multiarray (2); 1) Utworzenie trzech tabel, kolejno w katde} 77 komérce tabeli ‘multiarray" 1 Wynik: powstante tablicy dwumymiarowes foreach (Intarray ain a) { 2 = new Intarray(2)3 } // Inicjalizacja tabeli duuwymiarowe) ‘a[0] 0] = 1 safe)[2} = 25 a[2][0] = 35 la] [a] = 45 Ant Index = 0, ‘drugitndex = J] WySwietlenie zawartosci tabeli foreach (Intarray a in a) { Index = 0; foreach (int i in a) Console.WeiteLine("\tn[” + Index + "[" & ‘+ drugiInéex +") =" + 1)5 Grugitndex++s y Indexes mfe]{e] = 1 nfe}(o] = 2 mfe}[a] = 3 mfe]ta] = 4 PROBLEMY KRYMINALISTYK! 289(2) 2015 23 ZPRAKTYKI Instrukeje sterujace W kazdym jezyku programowania istnieja instrukcje pozwalajace na sterowanie wykonywaniem program, Instrukoje wykorzystuje sig prey podejmowaniu decy- 2. Koniecznosé stosowania instrukcji wynika stad, 2@ kodowane algorytmy tylko w prostych przypadkach sq czysto sekwencyjne, wykonywane linia po lini w kole|- 1noSci ich wystepowania. Bardzo czesto kolejne kroki algorytmu sq zalezne od speinienia pewnego warunku lub kilku warunkow. Instrukeja warunkowa if Instrukoja if pozwala wykonaé: Kod programu tylko \wtedy, dy spetniony jast okreslony warunek. Dziatanie \ww. instrukoji sprowadza sig wigc do sprawdzenia wa- runku i, Jesli zostanie stwierdzona jego prawdziwosé, \wykonania wskazanego bloku kodu. Dzigki pewine| mo- dyfikacii instrukcji if modliwe jest okreslenie polecer ktére zostang wykonane, ady warunek nie zostanie speiniony. Taka zmodyfikowana instrukcjg warunkowa ‘okresia sig jako if... else. Najprostsza forma instrukcj if wyglada nastepujaco: if (warunek) instrukcjo_1 [else instrukeja_2] Prayktad: class Mainclass { void Main(CaseClass c) { 17 Deklaracja zmiennej int $= 2 1/ beklaracja zmiennej *s* String $= "Wits"; 11 30814 ‘2 wykonaj instrukede af (a) Console.Writeline( “Wartosé zntennes & “a néwna sie 2")3 11 30814. 's" wykonay instrukeje af (s) Console.Kriteline(s); af (@ ee 3) // 3esii ‘a! = 3 Console.Kriteline(s); else { // w przecivnym raze Console.kriteline( "Wartose zmienne) & a” Jest roina od 3°)3 } ) y Waynik: Wartose zmiennej ‘2’ réwna sig 2 Witay Wartosé zmienna ‘a' jest réina od 3 Instrukeja while Instrukeja while jast blokiem instrukcji, ktére wyko- nywane sq az do momentu, gdy wyrazenie kontroine (warunek) awréci wartos¢ false. Sktadnia ww. instruc jest nastepujaca: while (warunek) instrukeja Prayktad: class Mainclass { void Main(caseClass c) { int 4 = @; // Deklaracja zmiennej "i" white (4 ¢ 10) // Sprandzente warunku Console.Weste(i +"); 1) Instrukeja Wynik: 0123456789 Instrukeja do... while Instrukcja do... while jest modyfikacia ww. patil while. Réznica to moment sprawdzania warunku peti = w petli while warunek jest sprawdzany na poczatiu, w peti do... while ~ na koficu. Petia do... while wyko- ‘na Zawsze co najmniej jeden przebieg. Sktadnia ww. instrukoj jest nastepujaca do (instrukcja) while (warunek); Prayktad: class Mainclass { void Main(CaseClass c) { int d= 10; // Deklaracja zmiennej i" do ¢ Console.mrite(t + ° "); 4) Instrukeja Yuhile (4 > 0); // Sprawdzente warunku 10987654321 24 PROBLEMY KRYMINALISTYKI 268(2) 2015, ZPRAKTYKL Instrukeja for Instrukcja for taczy w sobie trzy dziatania peti inicjaizacie (poprzedzajaca plerwsza iteracjg), spraw- dzenie warunku oraz zmiang wartosci. Pierwsza instrukcja to inicjalizacia zmiennej kontrolujacel wyko- ‘nywanie peti, Druga instrukcja to sprawdzenie warun- ku, Trzecia instrukoja to akcja ~ zazwyczaj umieszcza sig tu inkrementacje (++) albo dekrementacie (~) zmienne| kontrolujace| petle. Sktadnia ww. instrukcjl jest nastepujaca: {for (inicjalizacja; warunek; krok) instrukcja; Prayktad: class Mainclass { void Main(CaseClass ¢) { for (int 4 = 0; 4 < 105 i44) { Console.write(i +"); // Instrukeja o123456789 Instrukeja foreach Instrukeja foreach pozwala na sekwencyine prze- gladanie réznych zbioréw danych, np.: tablic, list ‘Skladnia ww. instrukgj jest nastepuiaca: foreach (typ_etenentu nazwa in kolekcja) instrukejo Prayktad: class Mainclass { enum Tydzdeh { // Wyliczeniony typ danych Poniedziazek = 13 torek, Sroda, Couartek, Pigtek, Sobota, Niedziela } void Main(CaseClass ¢) { foreach (Tydziei d) { __// Petla foreach Console.WriteLine(Tydzien: ‘sourceText(d) oF + +d); Wynik: Poniedziatek = 1 torek Sroda = 3 Cenartek = Piatek = 5 Sobota = 6 Niedziela = 7 Instrukeja forall Instrukcja forall pozwala na sekwencyjne przeglg- danie réznych zbioréw danych, podobnie jak instrukcja foreach. Réznica pomigdzy ww. instrukcjami wystepu- je podczas przetwarzania zbioréw danych w postaci struktury drzewa, ktore w_ jgzyku programowania EnScript sq obiektami NodeClass. Dziatanie instrukcji forall zostanie przedstawione w dalsze] czesci pracy, Podezas omawiania réznic w jezyku EnScript zdefi- niowanego w wersji 6 i 7 programu EnCase. Sktadnia instrukcji forall jest nastepujaca: forall (typ_etementu nazwa in koLekcja) “nstrukejo Instrukeje: break, continue Wewnatrz dowolne} konstrukoji tworzace) patie, moina sterowaé je) przsbiegiem za pomoca instrukcj break i continue. Instrukcja break powoduje opusz- czenie peti, bez wykonywania pozostalych zawar- tych w nie] instrukcj. Natomiast instrukcja continue zatrzymuje wykonanie aktuaine) iteracii, powodujac owrét do poczatku peti w celu rozpoczecia Nowe] iteraci. Prayktad: class MainClass { void Main(CaseClass ¢) { for (int d= a5 4 < 345 L449) { Console.writeLine(i); GH) Console.WriteLine("Zatrzynanie bietace) & Hteracfi i powrst do poczatku"); + A= 8) ( Console.WeiteLine("Petla zostata & preerwana 1 dalsze cyfry: 7,8,9,18 & nie zostang wyswietlone"); break; y PROBLEMY KRYMINALISTYKI 299(2) 2015 ZPRAKTYKL Wynike: Zatrzymanie bie2gcej iteracji i pourét do poczatku. 5 6 Petla zostata przerwana 4 dalsze cyfr3 7,8,3,18 nie zostana wyswietione. Instrukeja switch Instrukeja switch wybiera jeden z fragmentow kodu na podstawie wartosci wyrazenia calkowite- go. Instrukcja oblicza wartosé podanego wyrazenia i porownuje z podanymi wartosciami. W instrukeji tej sprawdzana jest tyiko relacja rownosci, nie ma moz- liwosci wykorzystania innych relacji. Jesli ktéras ze sprawdzanych wartoscijest rowna wartosci wyrazenia, to program przechodzi do podanych dale} instrukeji i wykonuje wszystko do korica bloku, tak diugo, az na- potka instrukcjg break. Jesli zadna 2 wartosci nie jest réwna wartosci wyrazenia, to wykonywane sa instruk- ie przy stowie kluczowym default. Skladnia instrukeji switch jest nastepulaca’ switch (wyrazenie) < case wartosé_catkowita 1: instrukeja; breaks case nartosé_catkowita 2: instrukcja; break; case wartosé_catkowita_3: instrukcja; breaks Case wartose_catkowita 4: instrukeja; break; ia) default: instrukcjo; r Prayktad: class Mainclass ( void Main(CaseClass c) { int Liczba = 45 switen(1iezba) { case @: Console-Write("Znienna "Liczba’ & na wartose: 0"); break; case 1: Console-Weite("Znienna ‘Iiczba’ & 1°) break; 2mienna ‘Liczba* ma wartosé: 4 Operacje na zmiennych Operacje na zmiennych dokonywane sq przy uzy- i operatoréw. Operator dziata na jednym lub Kiku ‘arqumentach, a wynikiem jego driatania jest zupetnie nnowa wartosé. Argumenty maja inna postaé niz 2wykie \wywolania funkcii, ale rezultat jest w obu przypadkach taki sam. Operatory w jezyku EnScript mozna podzie- lié na dwie grupy ze wegledu na liczbg argumentow, na ktérych dziatala. Wyrdznia sig wigc operatory unarne = wymagajace jednego argument - oraz binarne ~ wymagajace dwéch argumentéw. Operatory unarne Operatory unarne wystepujace w jgzyku progra- mowania EnScript, przedstawione zostana w formie tabeli. Regula jest, Ze operatory te znajdula sie przed ‘wyrazeniom. Wyjatek stanowig operatory y+" I", ktére rowniez moga wystepowaé po wyrazerniu, 2 Zestawionio oparator6w unamnych Opis ‘Tworzenie nowego obiektu ‘Okresienie typu obiektu f Negacja logiczna ~ zwraca zanegowang wartose wyrazenia Inkrementacja — zwigksza wartosé zmionna} Dekrementacja - zmniejsza wartosé zmiennej Unarny minus — study do zmiany 2naku wyrazenia ~ | Negacjabitowa — zwraca zmionna 2 zanegowanym bitamni Operatory binarne Operatory binarne wystepuiace w jgzyku progra- mowania EnScript, réwniez przedstawione zostang w formie tabeli. Operatory binarne wystepuia pomig- dzy wyrazeniami. Operatory binarne mozna podzielié na operatory: arytmetyczne, bitowe, logiczne, rela, przypisania oraz zasiegu. cose gains “esto! “Tabola 3 Zestawinie operatorbw zaslagu ase ee es ae ma wartose: 3"); break; cose Ar Console.drite("Zaienno ‘2iczba! @ Dereferenda, call wyfuskani,uzyekanie me wartose: &")p breaks step do pewne) wertosc : ‘Stuty do uzyskania dostepu do funke 7 statyozne| ) 26 PROBLEMY KRYMINALISTYKI 288(2) 2015 ‘ZPRAKTYKI Tabela 4 Zestawienie operatoréw aryimetycznych Programowanie obiektowe Kaédy program (skrypt) programu EnCase sklada Tabela 6 Zestawienie operatoréw logicznych Operator Opis 88 _| tloczyn logiczny | Suma logiczna Tabela 7 Zestawienis operatorow relaci Operator Opis =| Oznacza: mnieisze 04... > | Oznacza: wieksze oa. (Oznacza: mniejsze lub rowne 2 Oznacza: wieksze lub rowne z. Oznacza: rowne 2. t= | Oznacza: wine od. Tabela 8 Zestawienie operator6w preypisania Operator Opis Przypisuje zmienne} p0 lewej stronie wartosé wyrazenia prawe) strony Sluéa do skrécenia zapisu operaci Ktore rmodna zapisat pray uzyciu operatorow arytmetycznych oraz bitowych omEG oe sig z jednej lub wielu klas. W dotychezasowych przy- + | Dodawanie kladach byla to tyko jedna klasa 0 nazwie MainClass. =| Odeimowanie class Mainclass { 5 ma void Main(CaseClass c) { 7a | Damen Console.Writetine("*e220 Kore"); % | Operator rszty z dziolonia > t ‘Tabola 5 Zestawionio operatordw bltowych Operator is Klasy oa Klasy sq opisami obiektow, czyli bytow progra- << __| Prassunigcie bitowe w lowo mistycznych, kt6re moga przechowywa6 cane oraz >> __ | Przesunigcie bitowe w prawo. wkonywae polecone przez programiste zadania, ‘chomatyczny szkielet Klasy wyglqda nastepuk Woczyn bi ityezny sy wyglada nastepujgco: 2 see class nazwa_klasy { 1 [Suma btowa H/erese Rasy } Obiekt, ktory zostat stworzony na podstawie dane| klasy nazywany jest jej instancja. Obiekt tworzy sig przy uzyclu operatora new. Klasa jest jak gdyby ma~ tryca stuzaca do tworzenia obiektéw. Informuje ona wirtuaing maszyna, jak nalezy utworzyé obiekt kon- kretnego typu. Kazdy obiekt utworzony na podstawie klasy moze mieé unikalne wartosci skiadowych. Na prayktad mona u2yé klasy 0 nazwie Pies, do stwo- renia kiku réznych obiektow, z ktorych kazdy bedzie 1p. innej rasy. Prayktad: class Mainclass ( old Makn(Casectass ©) { [vtworzenie nowych obiektow typu Pies Pies pies i = now Pies(); Pies pies2 = new Pies(); Pies ples_3 = new Pies()3 Sk1adowe oblektdu - informacje o obiektach ples 5 piesa. pies. pies 2.wielkosé = 40; pies_2-rasa = "sokser"s pies_2:nazwa = "Kolec"; pies 3.wielkosé = 30; pies _3-rasa = "Seagle” Pies 3-nazwa = "Rowin"; » 1] Utworzenie klasy Pies’ class Pies { ine whelkases String rasa; String nazwas , » PROBLEMY KRYMINALISTYK! 299(2) 2015 27 ZPRAKTYKL Powyészy preyktad zawiera trey zmienne referen- cyjne 0 nazwach: pies_1, ples_2 | pies_3. Zmienne referencyine zawieraja bity reprezentujace sposéb dotarcia do danego obiektu. Mozna uzyé operatora kropki () wraz ze zmienng referencyjna, aby uzyskaé dostep do sktadowych obiektu. Uzycie operatora kropki wraz ze zmienna referencyina mozna wyobrazi¢ sobie jako naciskanie przycisku na pilocie sterujacym konkretnym obiekter, Funkeje Klasy, oprécz pél prechowujacych dane, zawieraia takée funkcje, kt6re wykonujq zapisane przez pro- gramistg operacje. Funkcje moga modyfikowaé dane i zwracaé rézne wartosci. Wywotanie funkcji polega ‘na wpisaniu jej nazwy w programie. W momencie napotkania wywotania funkcji program przechodzi do wykonania Kodu funkcji. Kiedy funkcja sig koniozy, program wraca do miejsca je| wywotania. Sktadnia deklaraci funkoji wyglada nastepujaco: typ nazwa (dekLaracja orgumentéw) fC instrukcje; } Prayktad: class Mainclass { // deklaracja plerwsze} funkc}1 bezargumentowes Void Wysuietl() { Console.WeiteLine( "Hello World"); y J) deklaracja drugie} funkeJi_z argunenten void PobterzTekst(string text) { Consele.WriteLine(text) ; y J} deklaracja trzecte} funkcj1 2 2 argumentanl Ji neracajaca wartose catkonita int Suma(int a, int BL ints a+b; return ¢} y void Main(CaseClass ¢){ //Funkeja g2éuna ‘Main’ kolejno wszystkich funkedi byswietl(); PoblerzTekst ("Tekst przekazywany do funkeji & ‘Jako argunent”); int @ = Suma(3,7); Console.WriteLine(a); Wynik: Hello World Tekst przekazary do funkcji jako argument w Funkcje okreslaja réwniez czynnosci, jakie obiokt jest w stanie wykonaé. Prayktad: class Mainclass { void Main(CaseClass c) { {/tworzenie obieku Pies pies1 = new Paes()3 // Skiadoue obiektu ~ informacje pies_1.wielkosé = 50; pies_lsrasa = "Husky"s pies_linazwa = “Sorys"s pies_1.szczekaj(); » // utworzente klasy “Pies? class Pies ( int wielkosé; String rasa; String nazwa; // Funkeja ~ zachowante obiekty void saczekaj() { Console.hriteLine(Viaul slau! d y y Wynik: Hau! Hau! Funkeje statyczne Funkoje skladowe Klasy moga byé zadeklarowane jako statyczne. Funkcje te mozna wywolaé nawet wte- dy, gdy nie istnieje jeszcze zaden obiekt klasy. Do na- zwy Kiasy statyczne| odwotujemy sie poprzez nazwe tej kiasy oraz operatora zasiegu (::). Stowo kluczowe static pozwala wywolywaé funkejg bez koniecznosci postugiwania sig obiektem tej klasy. Funkcja statyczna Umozliwia dziatanie, ktore nie zalezy od skladowych, a zatem nie wymaga uzycia obiektu Prayktad: class Mathclass { // Kase NathClass J] deFinicsa funkeji statyczne} static long Potega(long x) ¢ return x * xi y } class Matnclass { Void Main(CaseClass c) { 11 Wywo2ante Funkeji statyczne} Console-WriteLine("S do potegi 2 =" # + WatnClass: :Potega(S))s 28 PROBLEMY KRYMINALISTYK! 286(2) 2015 ‘ZPRAKTYRI Wynik: Wynik: 5 do potegi 2 = 25 50 Husky Borys, Konstruktor Konstruktor jest specjaing funkcja wykonywang, podczas tworzenia obiektu. Konstruktor zawiera kod, ktory zostaje wykonany w momencie uZycia operato- ra new. Innymi stowy, Konstruktor zawiora instrukcje wykonywane w momencie tworzenia nowego obiektu. Funkcja bedaca konstruktorem nigdy nie zwraca zZad- nego wyniku i musi mieé nazwe zgodna z nazwa klasy. class nazwa_hlosy { nazwa kLasy(){ 77 kod konstruktora p 2 Kaida tworzona klasa ma konstruktor, nawet jesli nie zostanie on napisany przez programiste. W takim przypadku konstruktor zostanie stworzony przez kom- pilator. Podstawowa cecha Konstruktora jest to, iz jest on wykonywany, zanim obiekt zostanie skojarzony z odwolaniom. W wigkszosci przypadkéw konstruktor uzywany jest do inicjalizacji stanu obiektu, ezyli do okreslenia wartogci jego skladowych. Prayktad: class MainClass { void Main(CaseClass ¢) { {]Utiorzenie ebieku Pies pies_1- now Pies(); // Wysnietlenie cech obiektu Console. hriteLine(pies_1.wielkos¢); Console.hiteline(pies_1-rasa); Console.WiteLine(pies_1.nazwa); + 11 ueworzente Klasy class Pies { int wielkoses String rasa; String nazwa; Pies() { // Konstruktor Pies 1] Okreglente wartosel obsektu wielkosé = 503 rasa = "Husky"s nazwa = "Sorys"; void szczekaj() { Console.WriteLine("Wau! Hau!"); y y y Driedziczenie Dziedziczenie to jeden z fundamentw progra- mowania obiektowego. Umotliwia sprawne i tatwo wykorzystanie juz raz napisanego kodu czy budowa~ rie hierarchii klas przejmujacych swoje wlasciwosci. Dziedziozenie polega na budowaniy nowych klas nna bazie juz istniejacych. Kazda taka nowa klasa przeimuje zachowanie i wiasciwoSci klasy bazowe). Projektujac klasy prey wykorzystaniu dziedzicze- nia, nalezy umiescié wspdiny kod w klasle bazowe, ‘a nastepnie poinformowaé klasy wyspecializowane, i konkrotna wspélna (bardziej abstrakcyina) klasa, jest ich klasa bazowa. W przypadku, gdy jedna klasa dziedziczy po drugiej, to klasa potomna dziedziczy po klasie bazowe). Potocznie mowi sig, ze klasa potomna rozszerza kiase bazowa. Relacja dziedziczenia ozna- cza, £e klasa potomna dziedziczy po klasie bazowe) W jgzyku EnScript dziedziczenie wyrazane jest 2a omoca dwukropka (:) a cata definicja schematycznie wygiada nastepuiaco: class hlasa_potonna:klasa bazowa { / wngtrze klasy D Masy pote ene [ies] Rye. 1. Prayktad dziodziczenia, Prayktad: class MainClass { void Main(CaseClass ¢) { // Utworzenie obiektu lekarza rodzinnego 11 wtrybuty LekarzRodzinny lekarz = new LekarzRedzinny(); Lekarz.pracujelDonu = true; Lekarz-pracujeWSzpitalu = trues Console.nriteLine(*Lekarz rodzinny: ")s Console.writelsne(*Pracuje w dom: "4 @ Lekar2. pracujewbomu); racuje w szpitalu: "+ & ekarz.pracujenSzpitelu) ; Console.WriteLine( PROBLEMY KRYMINALISTYKI 288(2) 2015 29 ZPRAKTYKI Console.WriteLine( Porada lekarza: ~) ekarz.podajPorade(); y 1) Klasa bazowa class Lekarz { Lekar2: boo pracujelbomu; void leczPacientat) { Console.WriteLine( "Lecry pacjenta"); > d J/ Klasy podstawowe: LekarzRodzinny, Chirurg, 11 ktére dziedzicza po Klasse Lekarz Class Lekar2Rodzinny:Lekarz { bool pracujeWbonu; void podagPorade() { Console:WrsteLine(“Pacjent musi roaywae & witaming C5 y y class Chérurg:Lekarz ( void zrébNacigcie() { Console.WriteLine( "wykonuje nacigcie"); y y » Wynik: Lekarz rodzinny: Pracuje w dom: 1 Pracuje w szpitalu: 2 Porada lekarza: Pacjent musi zatywaé witaning C Graficzny interfejs uzytkownika (GUI) Wykorzystujac obiekty, mozna tworzyé zaawan- sowane aplikacje dziatajace w oparciu o graficeny interfejs uzytkownika. Tworzac graticany interfejs uzyt- kownika, nalezy pamigtaé, Ze sktada sig on wiasnie Z obiektow: przycisk6w, etykist, pol tekstowych itd. ktore maja wlasne sktadowe oraz funkeje. W ninie)- szym artykule przedstawione zostanq jedynie dwa przyktady grafieznego interfojsu uzytownika. Prayktad: ye. 2. Przykladowe okno dialogawe (abiek) Kod zrodtowy wyswietlajacy ww. okno: class InputDialogclass: ialogclass { GroupBoxClass Group; StringéditClass Stringtaits InputDialogClass(Dialogclass parent, String &s): Dialogclass(parent, ‘sroupsoxciass Exanpie"), Group(this, “Dane dsobone”, START, START, & 258, 42, 8), StringEdit(this, “Podaj svoje Amie: 15, 208, 12, @, s, 255, 0) 135, 8 { y > class Mainclass { void Main() { ‘string s; InputDialogclass diag(null, s); diag. Execute(); y , Graficzny interfejs uzytkownika zwiqzany jest Z_przechwytywaniem zdarzef generowanych przez uzytkownika. W programie EnCase Forensic v.6 za przechwytywanie zdarzen, np. Klknigcie przez uzytkownika przycisku, odpowiedzialna jest klasa EventClass, za8 w wersji 7 ww. programu klasa HandlerClass. e Uzytkowniku kliknates preycisk Cag Rye. 4. Okno 2 komunikatem vryéwietlone po Klknigciy przycisku "Kiki 30 PROBLEMY KRYMINALISTYK! 286(2) 2015 ZPRAKTYKI Kod zrédlowy wyswietlajacy ww. okna i prze- chwytujacy zdarzenia: class ButtonDiagClass: Dialogclass { ButtonClass Button; ButtonDiaiClass(DialogClass parent = null) Dialogclass(parent, "Sutton Deno"), Button(this, "KLiknij 1°, START, START, & 75, 30, 0) If Przycisk £ } virtual void Childevent(const EventClass Bevent) { // Obstuguje zdarzenie kLikniecia DialogClass: :childevent(svont); SF (Button.Watches(event)) { // WySuietla komunikat Errormessage(“Ulytkouniku Kliknates & przycisk")3 y } » class MainClass ( void Madn() { ButtonDiagClass bd(); bbd.Execute(): > D: Listy potaczone, struktura drzewa W celu zrozumionia sposobu wyswietlania oraz prze- twarzania danych w programie EnCase pomocne jest zrozumienie struktury drzewa oraz struktury list potaczonych. Lista potaczona jest to struktura danych sktadajaca sig z elementow przystosowanych do taczenia sie ze ‘sobq w miarg potrzeb. Elementy listy nazywane 4 ‘wezlami (node). Listy potaczone wystepuja w trzech ‘odmianach: lista potaczona pojedynezo, lista potaczo- na podiw6jnie oraz drzewo. Drzewo jest najbardzie} zlozona odmiang_listy taczone| oraz podstawowa struktura danych wykorzy- stywang w programie EnCase stuzaca do prezentowa- nia danych w oknie struktury danych (A). Orzewo to skoficzony 2biér weztow (nodes) oraz liéci leaf nodes) Z wyr6inionym weziem giéwnym. (wierzchotkier) Root —______| Wezel glowny i (ang. root node) Folder 1 {Jee Folder (odarzewo) LY Jptix2 Folder 2 Pik Ti (ang. ieafnode) Folder3 Rye. 5. Struktura danych w postaci drzowa, zwanym korzeniem (root node) i pozostatymi weziami (wierzchotkami) podziolonymi na podzbiory, bedacymi Poddrzewami giéwnego drzewa. Kazde poddrzewo ma sw6j korzes, ktéry z kolei ma swoje poddrzewa itd., a zater wezot jest korzeniom pewnego poddrze- wa, LiSé jest to wezet (element) drzewa, kt6ry nie ma potomkow, np. plik lub pusty folder. Czesto lisémi sq \wezly najbardziej oddalone od korzenia, Za przedstawienie danych w programie EnCase w postaci drzewa odpowiada klesa NodeClass: Wigkszosé kias programu EnCase dziedziczy skta- dowe i funkcje ww. Klasy. Wybrane funkcje Klasy NodeClass, tj Parenti), FirstChild), LastChild), Next), umozliwiala preetwarzanie danych w postaci struktury drzewa. Prayktad class Nodeclass { NodeCiass(parent = null); // konstruktor NodeClass Firstchild(); NodeClass Lastchild(); Nodeclass Next(); NodeClass Parent(); EnCase Forensic v.6 i 7 ~ podstawowe réinico w jezyku EnScript Jezyk programowania EnScript jest jezykiem nie- kompatybilnym, co oznacza, ze skrypty napisane W programie EnCase Forensic v.6 nie bedq driataly w najnowsze] wersji programu. Jedynym wyisciem, jakie pozostaje uzytkownikowi programu EnCase v.7, jest przopisanie skryptow z wersji 6 w taki spos6b, aby dziataly one w najnowsze| wers|i programu. Przed rzystapieniem do aktualizagii skryptéw warto poznaé Podstawowe roznice wystepulgce w jezyku EnScript 2definiowanym w obydwu wersjach programu EnCase Forensic. lteracja danych Podstawowa réznica w jezyku EnScript zdefiniowa- nym w ww. wersiach programu EnCase Forensic wy- nika ze sposobu przetwarzania danych widniejgcych \w programie w postaci struktury drzewa. W programie EnCase v.6 w celu przetworzenia danych nalezy uzyé jadne| z dw6ch instrukcji sterujacych: foreach lub forall Instrukcja steruiaca foreach, pozwala na uzyskanie dostepu do wezystkich wierzchotkow wezta olowne- 90, natomiast instrukcja forall pozwala na uzyskanie dostepu do wszystkich elementow struktury drzewa. ve class Mainclass { void Main(CaseClass c) { forall (EntryClass entry in c.EntryRoot()) { Consolle.uritel ine(entry.Name()); y y y PROBLEMY KRYMINALISTYKI 288(2) 2015 3

You might also like