From 661b930ae8db37fb39d4bb3c51c3376941d34606 Mon Sep 17 00:00:00 2001 From: Brian Carrier <carrier@sleuthkit.org> Date: Thu, 13 Oct 2011 11:22:34 -0400 Subject: [PATCH] Revert "Cleaning up to make way for version 3" This reverts commit e9c3a4a209df0846b4fda14b07e92cb2447f426f. --- NEWS.txt => CHANGES.txt | 0 COPYING | 340 ++ INSTALL.txt | 39 + Makefile | 30 + README-LIVE.txt | 119 + TODO.txt | 58 + base/.perltidyrc | 5 + base/autopsy.base | 879 +++++ base/make-live-cd.base | 153 + configure | 475 +++ docs/sleuthkit-informer-13.txt | 410 +++ global.css | 19 + help/blank.html | 25 + help/caseman.html | 161 + help/data_mode.html | 97 + help/file_category.html | 99 + help/file_mode.html | 221 ++ help/fs_mode.html | 46 + help/general.html | 103 + help/grep.html | 70 + help/grep_lim.html | 75 + help/hash_db.html | 141 + help/index.html | 11 + help/int_mode.html | 29 + help/menu.html | 37 + help/meta_mode.html | 93 + help/sequencer.html | 49 + help/srch_mode.html | 68 + help/temp.html | 10 + help/timezones.html | 508 +++ help/tl.html | 183 + lib/.perltidyrc | 5 + lib/Appsort.pm | 399 +++ lib/Appview.pm | 291 ++ lib/Args.pm | 927 +++++ lib/Caseman.pm | 4161 +++++++++++++++++++++++ lib/Data.pm | 927 +++++ lib/Exec.pm | 91 + lib/File.pm | 2310 +++++++++++++ lib/Filesystem.pm | 170 + lib/Frame.pm | 336 ++ lib/Fs.pm | 171 + lib/Hash.pm | 947 ++++++ lib/Kwsrch.pm | 954 ++++++ lib/Main.pm | 357 ++ lib/Meta.pm | 789 +++++ lib/Notes.pm | 1110 ++++++ lib/Print.pm | 390 +++ lib/Timeline.pm | 1425 ++++++++ lib/Vs.pm | 8 + lib/define.pl | 39 + lib/search.pl | 51 + man/man1/autopsy.1 | 163 + pict/back_pix.jpg | Bin 0 -> 305 bytes pict/but_addnote.jpg | Bin 0 -> 1332 bytes pict/but_alloc_list.jpg | Bin 0 -> 1852 bytes pict/but_export.jpg | Bin 0 -> 2056 bytes pict/but_force.jpg | Bin 0 -> 1079 bytes pict/but_indexdb.jpg | Bin 0 -> 1568 bytes pict/but_lookup.jpg | Bin 0 -> 1458 bytes pict/but_new_name.jpg | Bin 0 -> 1435 bytes pict/but_next.jpg | Bin 0 -> 1336 bytes pict/but_ok.jpg | Bin 0 -> 881 bytes pict/but_prev.jpg | Bin 0 -> 1574 bytes pict/but_replace.jpg | Bin 0 -> 1273 bytes pict/but_report.jpg | Bin 0 -> 1339 bytes pict/but_search.jpg | Bin 0 -> 1118 bytes pict/but_view.jpg | Bin 0 -> 931 bytes pict/but_viewcont.jpg | Bin 0 -> 1924 bytes pict/favicon.ico | Bin 0 -> 1406 bytes pict/file_b_alldel.jpg | Bin 0 -> 1789 bytes pict/file_b_allfiles.jpg | Bin 0 -> 1658 bytes pict/file_b_check.jpg | Bin 0 -> 474 bytes pict/file_b_expand.jpg | Bin 0 -> 2292 bytes pict/file_b_hide.jpg | Bin 0 -> 2112 bytes pict/file_b_md5list.jpg | Bin 0 -> 2716 bytes pict/file_h_acc_cur.jpg | Bin 0 -> 1413 bytes pict/file_h_acc_link.jpg | Bin 0 -> 1153 bytes pict/file_h_chg_cur.jpg | Bin 0 -> 1409 bytes pict/file_h_chg_link.jpg | Bin 0 -> 1148 bytes pict/file_h_cre_cur.jpg | Bin 0 -> 1389 bytes pict/file_h_cre_link.jpg | Bin 0 -> 1103 bytes pict/file_h_del_cur.jpg | Bin 0 -> 941 bytes pict/file_h_del_link.jpg | Bin 0 -> 694 bytes pict/file_h_gid_cur.jpg | Bin 0 -> 953 bytes pict/file_h_gid_link.jpg | Bin 0 -> 725 bytes pict/file_h_meta_cur.jpg | Bin 0 -> 1080 bytes pict/file_h_meta_link.jpg | Bin 0 -> 911 bytes pict/file_h_mod_cur.jpg | Bin 0 -> 1364 bytes pict/file_h_mod_link.jpg | Bin 0 -> 1100 bytes pict/file_h_nam_cur.jpg | Bin 0 -> 1097 bytes pict/file_h_nam_link.jpg | Bin 0 -> 834 bytes pict/file_h_siz_cur.jpg | Bin 0 -> 1007 bytes pict/file_h_siz_link.jpg | Bin 0 -> 749 bytes pict/file_h_uid_cur.jpg | Bin 0 -> 923 bytes pict/file_h_uid_link.jpg | Bin 0 -> 685 bytes pict/file_h_wr_cur.jpg | Bin 0 -> 1336 bytes pict/file_h_wr_link.jpg | Bin 0 -> 1014 bytes pict/hashdb_h_alert.jpg | Bin 0 -> 2419 bytes pict/hashdb_h_ig.jpg | Bin 0 -> 2640 bytes pict/hashdb_h_nsrl.jpg | Bin 0 -> 1147 bytes pict/int_b_calc.jpg | Bin 0 -> 1824 bytes pict/int_b_valid.jpg | Bin 0 -> 1660 bytes pict/int_h_data.jpg | Bin 0 -> 2058 bytes pict/int_h_img.jpg | Bin 0 -> 2005 bytes pict/int_h_str.jpg | Bin 0 -> 1553 bytes pict/int_h_tl.jpg | Bin 0 -> 1124 bytes pict/int_h_unalloc.jpg | Bin 0 -> 2398 bytes pict/logo.jpg | Bin 0 -> 39208 bytes pict/main_t_dat_cur.jpg | Bin 0 -> 2140 bytes pict/main_t_dat_link.jpg | Bin 0 -> 1821 bytes pict/main_t_fil_cur.jpg | Bin 0 -> 2312 bytes pict/main_t_fil_link.jpg | Bin 0 -> 2002 bytes pict/main_t_fil_org.jpg | Bin 0 -> 1416 bytes pict/main_t_ftype_cur.jpg | Bin 0 -> 2081 bytes pict/main_t_ftype_link.jpg | Bin 0 -> 1764 bytes pict/main_t_ftype_org.jpg | Bin 0 -> 1340 bytes pict/main_t_img_cur.jpg | Bin 0 -> 2353 bytes pict/main_t_img_link.jpg | Bin 0 -> 2044 bytes pict/main_t_img_org.jpg | Bin 0 -> 1487 bytes pict/main_t_met_cur.jpg | Bin 0 -> 2151 bytes pict/main_t_met_link.jpg | Bin 0 -> 1832 bytes pict/main_t_met_org.jpg | Bin 0 -> 1399 bytes pict/main_t_srch_cur.jpg | Bin 0 -> 2497 bytes pict/main_t_srch_link.jpg | Bin 0 -> 2184 bytes pict/menu_b_add.jpg | Bin 0 -> 2208 bytes pict/menu_b_analyze.jpg | Bin 0 -> 2758 bytes pict/menu_b_back.jpg | Bin 0 -> 2410 bytes pict/menu_b_cancel.jpg | Bin 0 -> 1632 bytes pict/menu_b_ccls.jpg | Bin 0 -> 1933 bytes pict/menu_b_close.jpg | Bin 0 -> 2495 bytes pict/menu_b_cnew.jpg | Bin 0 -> 1768 bytes pict/menu_b_copen.jpg | Bin 0 -> 1913 bytes pict/menu_b_fs.jpg | Bin 0 -> 1924 bytes pict/menu_b_hashdb.jpg | Bin 0 -> 2257 bytes pict/menu_b_hcls.jpg | Bin 0 -> 1921 bytes pict/menu_b_help.jpg | Bin 0 -> 1484 bytes pict/menu_b_hnew.jpg | Bin 0 -> 1745 bytes pict/menu_b_ifnew.jpg | Bin 0 -> 3564 bytes pict/menu_b_inew.jpg | Bin 0 -> 1831 bytes pict/menu_b_int.jpg | Bin 0 -> 2108 bytes pict/menu_b_menu.jpg | Bin 0 -> 1846 bytes pict/menu_b_next.jpg | Bin 0 -> 2327 bytes pict/menu_b_note.jpg | Bin 0 -> 1871 bytes pict/menu_b_ok.jpg | Bin 0 -> 1355 bytes pict/menu_b_ref.jpg | Bin 0 -> 1672 bytes pict/menu_b_rem.jpg | Bin 0 -> 1681 bytes pict/menu_b_seq.jpg | Bin 0 -> 2451 bytes pict/menu_b_tl.jpg | Bin 0 -> 2545 bytes pict/menu_h_cdet.jpg | Bin 0 -> 1537 bytes pict/menu_h_cnew.jpg | Bin 0 -> 2960 bytes pict/menu_h_hdet.jpg | Bin 0 -> 1506 bytes pict/menu_h_hnew.jpg | Bin 0 -> 1856 bytes pict/menu_h_idet.jpg | Bin 0 -> 1553 bytes pict/menu_h_inew.jpg | Bin 0 -> 1808 bytes pict/menu_t_cg_cur.jpg | Bin 0 -> 3648 bytes pict/menu_t_cg_link.jpg | Bin 0 -> 3340 bytes pict/menu_t_cg_org.jpg | Bin 0 -> 19559 bytes pict/menu_t_hg_cur.jpg | Bin 0 -> 3573 bytes pict/menu_t_hg_link.jpg | Bin 0 -> 3260 bytes pict/menu_t_hg_org.jpg | Bin 0 -> 2418 bytes pict/menu_t_hm_cur.jpg | Bin 0 -> 3736 bytes pict/menu_t_hm_link.jpg | Bin 0 -> 3361 bytes pict/menu_t_hm_org.jpg | Bin 0 -> 2462 bytes pict/sanit_b_norm.jpg | Bin 0 -> 1448 bytes pict/sanit_b_san.jpg | Bin 0 -> 1558 bytes pict/sanitized.jpg | Bin 0 -> 18357 bytes pict/srch_b_lorig.jpg | Bin 0 -> 1963 bytes pict/srch_b_lun.jpg | Bin 0 -> 2180 bytes pict/srch_b_str.jpg | Bin 0 -> 2111 bytes pict/srch_b_un.jpg | Bin 0 -> 2445 bytes pict/tab_close.jpg | Bin 0 -> 1357 bytes pict/tab_help.jpg | Bin 0 -> 1253 bytes pict/tl_t_data_cur.jpg | Bin 0 -> 2906 bytes pict/tl_t_data_link.jpg | Bin 0 -> 2580 bytes pict/tl_t_notes_link.jpg | Bin 0 -> 2216 bytes pict/tl_t_notes_org.jpg | Bin 0 -> 1715 bytes pict/tl_t_tl_cur.jpg | Bin 0 -> 2844 bytes pict/tl_t_tl_link.jpg | Bin 0 -> 2518 bytes pict/tl_t_view_cur.jpg | Bin 0 -> 2681 bytes pict/tl_t_view_link.jpg | Bin 0 -> 2351 bytes xcode/autopsy.xcodeproj/project.pbxproj | 138 + 182 files changed, 20712 insertions(+) rename NEWS.txt => CHANGES.txt (100%) create mode 100644 COPYING create mode 100644 INSTALL.txt create mode 100644 Makefile create mode 100644 README-LIVE.txt create mode 100644 TODO.txt create mode 100755 base/.perltidyrc create mode 100644 base/autopsy.base create mode 100644 base/make-live-cd.base create mode 100755 configure create mode 100644 docs/sleuthkit-informer-13.txt create mode 100644 global.css create mode 100644 help/blank.html create mode 100644 help/caseman.html create mode 100644 help/data_mode.html create mode 100644 help/file_category.html create mode 100644 help/file_mode.html create mode 100644 help/fs_mode.html create mode 100644 help/general.html create mode 100644 help/grep.html create mode 100644 help/grep_lim.html create mode 100644 help/hash_db.html create mode 100644 help/index.html create mode 100644 help/int_mode.html create mode 100644 help/menu.html create mode 100644 help/meta_mode.html create mode 100644 help/sequencer.html create mode 100644 help/srch_mode.html create mode 100644 help/temp.html create mode 100644 help/timezones.html create mode 100644 help/tl.html create mode 100755 lib/.perltidyrc create mode 100644 lib/Appsort.pm create mode 100644 lib/Appview.pm create mode 100644 lib/Args.pm create mode 100644 lib/Caseman.pm create mode 100644 lib/Data.pm create mode 100644 lib/Exec.pm create mode 100644 lib/File.pm create mode 100644 lib/Filesystem.pm create mode 100644 lib/Frame.pm create mode 100644 lib/Fs.pm create mode 100644 lib/Hash.pm create mode 100644 lib/Kwsrch.pm create mode 100644 lib/Main.pm create mode 100644 lib/Meta.pm create mode 100644 lib/Notes.pm create mode 100644 lib/Print.pm create mode 100644 lib/Timeline.pm create mode 100644 lib/Vs.pm create mode 100644 lib/define.pl create mode 100644 lib/search.pl create mode 100755 man/man1/autopsy.1 create mode 100644 pict/back_pix.jpg create mode 100644 pict/but_addnote.jpg create mode 100644 pict/but_alloc_list.jpg create mode 100644 pict/but_export.jpg create mode 100644 pict/but_force.jpg create mode 100644 pict/but_indexdb.jpg create mode 100644 pict/but_lookup.jpg create mode 100644 pict/but_new_name.jpg create mode 100644 pict/but_next.jpg create mode 100644 pict/but_ok.jpg create mode 100644 pict/but_prev.jpg create mode 100644 pict/but_replace.jpg create mode 100644 pict/but_report.jpg create mode 100644 pict/but_search.jpg create mode 100644 pict/but_view.jpg create mode 100644 pict/but_viewcont.jpg create mode 100644 pict/favicon.ico create mode 100644 pict/file_b_alldel.jpg create mode 100644 pict/file_b_allfiles.jpg create mode 100644 pict/file_b_check.jpg create mode 100644 pict/file_b_expand.jpg create mode 100644 pict/file_b_hide.jpg create mode 100644 pict/file_b_md5list.jpg create mode 100644 pict/file_h_acc_cur.jpg create mode 100644 pict/file_h_acc_link.jpg create mode 100644 pict/file_h_chg_cur.jpg create mode 100644 pict/file_h_chg_link.jpg create mode 100644 pict/file_h_cre_cur.jpg create mode 100644 pict/file_h_cre_link.jpg create mode 100644 pict/file_h_del_cur.jpg create mode 100644 pict/file_h_del_link.jpg create mode 100644 pict/file_h_gid_cur.jpg create mode 100644 pict/file_h_gid_link.jpg create mode 100644 pict/file_h_meta_cur.jpg create mode 100644 pict/file_h_meta_link.jpg create mode 100644 pict/file_h_mod_cur.jpg create mode 100644 pict/file_h_mod_link.jpg create mode 100644 pict/file_h_nam_cur.jpg create mode 100644 pict/file_h_nam_link.jpg create mode 100644 pict/file_h_siz_cur.jpg create mode 100644 pict/file_h_siz_link.jpg create mode 100644 pict/file_h_uid_cur.jpg create mode 100644 pict/file_h_uid_link.jpg create mode 100644 pict/file_h_wr_cur.jpg create mode 100644 pict/file_h_wr_link.jpg create mode 100644 pict/hashdb_h_alert.jpg create mode 100644 pict/hashdb_h_ig.jpg create mode 100644 pict/hashdb_h_nsrl.jpg create mode 100644 pict/int_b_calc.jpg create mode 100644 pict/int_b_valid.jpg create mode 100644 pict/int_h_data.jpg create mode 100644 pict/int_h_img.jpg create mode 100644 pict/int_h_str.jpg create mode 100644 pict/int_h_tl.jpg create mode 100644 pict/int_h_unalloc.jpg create mode 100644 pict/logo.jpg create mode 100644 pict/main_t_dat_cur.jpg create mode 100644 pict/main_t_dat_link.jpg create mode 100644 pict/main_t_fil_cur.jpg create mode 100644 pict/main_t_fil_link.jpg create mode 100644 pict/main_t_fil_org.jpg create mode 100644 pict/main_t_ftype_cur.jpg create mode 100644 pict/main_t_ftype_link.jpg create mode 100644 pict/main_t_ftype_org.jpg create mode 100644 pict/main_t_img_cur.jpg create mode 100644 pict/main_t_img_link.jpg create mode 100644 pict/main_t_img_org.jpg create mode 100644 pict/main_t_met_cur.jpg create mode 100644 pict/main_t_met_link.jpg create mode 100644 pict/main_t_met_org.jpg create mode 100644 pict/main_t_srch_cur.jpg create mode 100644 pict/main_t_srch_link.jpg create mode 100644 pict/menu_b_add.jpg create mode 100644 pict/menu_b_analyze.jpg create mode 100644 pict/menu_b_back.jpg create mode 100644 pict/menu_b_cancel.jpg create mode 100644 pict/menu_b_ccls.jpg create mode 100644 pict/menu_b_close.jpg create mode 100644 pict/menu_b_cnew.jpg create mode 100644 pict/menu_b_copen.jpg create mode 100644 pict/menu_b_fs.jpg create mode 100644 pict/menu_b_hashdb.jpg create mode 100644 pict/menu_b_hcls.jpg create mode 100644 pict/menu_b_help.jpg create mode 100644 pict/menu_b_hnew.jpg create mode 100644 pict/menu_b_ifnew.jpg create mode 100644 pict/menu_b_inew.jpg create mode 100644 pict/menu_b_int.jpg create mode 100644 pict/menu_b_menu.jpg create mode 100644 pict/menu_b_next.jpg create mode 100644 pict/menu_b_note.jpg create mode 100644 pict/menu_b_ok.jpg create mode 100644 pict/menu_b_ref.jpg create mode 100644 pict/menu_b_rem.jpg create mode 100644 pict/menu_b_seq.jpg create mode 100644 pict/menu_b_tl.jpg create mode 100644 pict/menu_h_cdet.jpg create mode 100644 pict/menu_h_cnew.jpg create mode 100644 pict/menu_h_hdet.jpg create mode 100644 pict/menu_h_hnew.jpg create mode 100644 pict/menu_h_idet.jpg create mode 100644 pict/menu_h_inew.jpg create mode 100644 pict/menu_t_cg_cur.jpg create mode 100644 pict/menu_t_cg_link.jpg create mode 100644 pict/menu_t_cg_org.jpg create mode 100644 pict/menu_t_hg_cur.jpg create mode 100644 pict/menu_t_hg_link.jpg create mode 100644 pict/menu_t_hg_org.jpg create mode 100644 pict/menu_t_hm_cur.jpg create mode 100644 pict/menu_t_hm_link.jpg create mode 100644 pict/menu_t_hm_org.jpg create mode 100644 pict/sanit_b_norm.jpg create mode 100644 pict/sanit_b_san.jpg create mode 100644 pict/sanitized.jpg create mode 100644 pict/srch_b_lorig.jpg create mode 100644 pict/srch_b_lun.jpg create mode 100644 pict/srch_b_str.jpg create mode 100644 pict/srch_b_un.jpg create mode 100644 pict/tab_close.jpg create mode 100644 pict/tab_help.jpg create mode 100644 pict/tl_t_data_cur.jpg create mode 100644 pict/tl_t_data_link.jpg create mode 100644 pict/tl_t_notes_link.jpg create mode 100644 pict/tl_t_notes_org.jpg create mode 100644 pict/tl_t_tl_cur.jpg create mode 100644 pict/tl_t_tl_link.jpg create mode 100644 pict/tl_t_view_cur.jpg create mode 100644 pict/tl_t_view_link.jpg create mode 100644 xcode/autopsy.xcodeproj/project.pbxproj diff --git a/NEWS.txt b/CHANGES.txt similarity index 100% rename from NEWS.txt rename to CHANGES.txt diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..5b6e7c66c2 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/INSTALL.txt b/INSTALL.txt new file mode 100644 index 0000000000..ef406a4845 --- /dev/null +++ b/INSTALL.txt @@ -0,0 +1,39 @@ + Autopsy Forensic Browser + http://www.sleuthkit.org/autopsy + + Brian Carrier [carrier@sleuthkit.org] + Last Update: March 2010 + + +Installation +----------------------------------------------------------------------------- +1. Install The Sleuth Kit (see README for download locations). This + includes doing a 'make install' so that the executables and files + are installed in a single directory. Note that this does not + currently work natively on Windows. It will work using Cygwin, but + you must install and build The Sleuth Kit in Cygwin and not use the + Win32 executables that are available on the sleuthkit.org website. + +2. Untar the Autopsy file. + +3. Run 'make'. It will try to locate the grep and strings utilities. + If any are not found, it will prompt you for the location. It will + also search for the TSK installation. + +4. The install script will ask if you have the NIST National Software + Reference Library (NSRL). If you do, you will need to enter the + path of it. The NSRL is available from www.nsrl.nist.gov. + +5. You will be prompted for the Evidence Locker location. This is the + base directory where all cases will be stored. You must create this + directory on your own. + + +Live Analysis +------------------------------------------------------------------------------ +Type 'make live' or run the 'make-live-cd' script to build the 'live-cd' +directory. The 'live-cd' directory can be burned to a CD. + +------------------------------------------------------------------------------ +Brian Carrier [carrier@sleuthkit.org] + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..3a6334c196 --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +all: + @sh ./configure + +conf.pl: + @sh ./configure + +live: conf.pl + ./make-live-cd + +indent: + cd lib; perltidy -b *.pm *.pl + cd base; perltidy -b autopsy.base + +clean: + rm -f ./autopsy + rm -f ./make-live-cd + rm -f ./conf.pl + rm -f ./config.tmp + rm -f ./config2.tmp + rm -rf ./live-cd/ + rm -f ./lib/*.bak + rm -f ./base/*.bak + find . -name ".DS_Store" | xargs rm -f + find . -type f -perm +g+x,o+x,u+x | xargs chmod -x + grep "curtskver=" ./configure + grep "VER" ./lib/define.pl + find . -name ".*" | grep -v perltidy + +release: + find . -name "CVS" | xargs rm -rf diff --git a/README-LIVE.txt b/README-LIVE.txt new file mode 100644 index 0000000000..df1aaabdc6 --- /dev/null +++ b/README-LIVE.txt @@ -0,0 +1,119 @@ + Autopsy Forensic Browser + http://www.sleuthkit.org/autopsy + + Live Analysis Mode + + Last Updated: January 2005 + + +What is Live Analysis? +-------------------------------------------------------------------- +Live analysis is, in my mind, an investigation that occurs using +the software resources of the suspect system. An example scenario +of this is when a suspect system is found running, a CD is placed +into it, and commands are run. If the suspect system is powered +down and booted from a bootable Linux CD (or similar), then the +investigation is a dead analysis. + +This is most commonly done when investigating a server or other +computer that is suspected of being compromised, but verification +is needed before it can be powered down. Using The Sleuth Kit and +Autopsy will prevent the access times on individual files from being +updated (although the raw device's A-time will be) and can bypass +most rootkits that hide files and directories. + + +What are the Issues with Live Analysis? +-------------------------------------------------------------------- +Live analysis is not ideal because you are relying on the suspect +system, which can lie, cheat, and steal. In addition to the potential +of getting false information from the operating system you will +also overwrite memory and maybe swap space during the investigation. + +If you are interested in examining the memory of the system, you +should probably acquire that before you begin a live analysis. + +An issue with doing live analysis with Autopsy is that it requires +Perl, which is a large program and will likely need to depend on +libraries and other files on the suspect system. + + +How do I make a CD with Autopsy on it? +-------------------------------------------------------------------- + +You will want to have a trusted CD for a live analysis, and autopsy +makes that fairly easy. Compile autopsy as you would for a normal +dead analysis installation. Then execute 'make live' in Autopsy. +This script will make a 'live-cd' sub-directory in the autopsy directory, +which contains a copy of autopsy and copies of TSK executables, grep, +strings, perl etc: + + # make live + Making base directory (./live-cd/) + Copying executables + Copying autopsy files + Creating configuration file using existing settings + +Try the 'make static' with TSK to see if you can make static +executables for your platform. + +The 'live-cd' directory has a 'bin' directory where additional +executables can be copied to and then the whole directory can be +burned to a CD. + + +How Do I Use the CD? +-------------------------------------------------------------------- + +After the CD has been created and there is a system suspected of +being compromised, then it is time to take advantage of the new +features. There are two scenarios for live analysis. The first +scenario uses a network share from a trusted system that you can +write to. In this case, autopsy is run as normal and you specify +the evidence locker directory as the mounted disk. The evidence +locker is specified with '-d': + + # ./autopsy -d /mnt/ev_lock 10.1.32.123 + +The above would start autopsy, use '/mnt/ev_lock/' as the evidence +locker and would allow connections from 10.1.32.123 (where the +investigator would connect from using an HTML browser). Remember that +we do not want to write to the suspect system, so we should only use +a network share and not a local directory in this scenario. + +The second scenario does not use an evidence locker and does not +intentionally write any data to disk. This scenario does not need +the network share and each of the devices (or partitions) that will +be analyzed are specified on the command line using the '-i' flags. +The '-i' flag requires three arguments: the device, the file system +type, and the mounting point. For example, to examine the '/dev/hda5' +and '/dev/hda8' partitions on a Linux system, the following could +be used: + + # ./autopsy -i /dev/hda5 linux-ext3 / -i /dev/hda8 linux-ext3 /usr/ \ + 10.1.32.123 + +The file system type must be one of the types that are supported +by TSK. The remote IP address must also be given, otherwise you +will have to use a browser on the suspect system and that will write +data to the disk. + +When you use the '-i' flag, then autopsy will start in the 'Host +Manager' view where you can select the image that you want to +analyze. You will skip the case and host configuration. The default +case name will be 'live', the default host name is 'local', and the +default investigator name is 'unknown'. + + +Additional Information +-------------------------------------------------------------------- +I wrote a more detailed explanation of the live analysis mode of +Autopsy version 2.00 in the 13th issue of The Sleuth Kit Informer. +Some of this document is taken from the Informer issue. + + http://www.sleuthkit.org/informer/sleuthkit-informer-13.html + + +-------------------------------------------------------------------- +Copyright (c) 2004 by Brian Carrier. All Rights Reserved +Brian Carrier [carrier <at> sleuthkit <dot> org] diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000000..d8a262840f --- /dev/null +++ b/TODO.txt @@ -0,0 +1,58 @@ +Remove HFS check in autopsy.base when HFS support is standard. + +Look into adding the unallocated partiion space when an image is added. +Look into integrating clamshell or other AV + +There is an error when viewing the event sequencer notes about +initialized in "ne". + +test date search + +Add SHA-1 to more places (images, lookups etc.) + +Get "Can't ignore signal CHLD, forcing to default." message with +file type sorting (BUG: 919829). + +Figure out details around having Perl on the live analysis CD. +(BUG: 919831) + + +-------------------- FILE MODE ---------------------------- +- Make a file system depend seperator for / or \ + +- check for tar during install + - List contents like HTML does now + +--------------------- SEARCH ----------------------------- +- new mode where searching is done on output of 'icat' of allocated + inodes + +- Bug: if the string that matches a keyword starts with spaces, then + the 'index' function returns the idx to the start of the spaces and not + the substring. (BUG 842858) + +--------------------- TIMELINE ----------------------------- + + +--------------------- LOGGING ----------------------------- +- New Report Creation: + +- Add pulldown in notes for common things: + - New MD5 / SHA-1 + - Part of rootkit + - Suspected child porn + - known child porn + +--------------------- SORTER ----------------------------- +- Should sorter be at the host level instead of image, with output +files appended to each other? + +- Allow one to browse output files + +--------------------- GENERAL ----------------------------- +- Add foremost +- link in meta data to list just unallocated / used +- Make data bases updatable in the host details view +- Option to mount images in loopback when it is a Linux system +- read config files in autopsy itself and not everytime ... +- Make a way to kill intensive processes (searching, fls) diff --git a/base/.perltidyrc b/base/.perltidyrc new file mode 100755 index 0000000000..f1f2e71a01 --- /dev/null +++ b/base/.perltidyrc @@ -0,0 +1,5 @@ +-i=4 # indent of 4 +-pt=2 # paren tightness +-sbt=2 # square paren tightness +-bt=2 # curly paren tightness +-nsfs # no space after semi in for loop diff --git a/base/autopsy.base b/base/autopsy.base new file mode 100644 index 0000000000..3b3bbdc7f2 --- /dev/null +++ b/base/autopsy.base @@ -0,0 +1,879 @@ +# +# autopsy gui server +# Autopsy Forensic Browser +# +# +# This file requires The Sleuth Kit +# www.sleuthkit.org +# +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# +# refer to Security Considerations in README for a description of the +# cookie authentication +# + +require 5.008; + +use strict; +use Socket; + +use Main; +use Print; +require Fs; +require Caseman; + +require 'conf.pl'; +require 'lib/define.pl'; + +# Import variables from conf.pl +use vars '$LOCKDIR', '$INSTALLDIR', '$PICTDIR'; +use vars '$SANITIZE_TAG', '$SANITIZE_PICT'; +use vars '$USE_STIMEOUT', '$STIMEOUT', '$CTIMEOUT'; +use vars '$SAVE_COOKIE', '$GREP_EXE', '$FILE_EXE'; +use vars '$NSRLDB'; + +# Default port +my $port = 9999; + +# Default 'remote' host +my $rema = 'localhost'; + +$| = 1; + +$::LIVE = 0; +$::USE_NOTES = 1; +$::USE_LOG = 1; + +sub usage { + print +"\n\nusage: $0 [-c] [-C] [-d evid_locker] [-i device filesystem mnt] [-p port] [remoteaddr]\n"; + print " -c: force a cookie in the URL\n"; + print " -C: force NO cookie in the URL\n"; + print " -d dir: specify the evidence locker directory\n"; + print " -i device filesystem mnt: Specify info for live analysis\n"; + print " -p port: specify the server port (default: $port)\n"; + print " remoteaddr: specify the host with the browser (default: $rema)\n"; + exit 1; +} + +my $cook_force = 0; + +my $vol_cnt = 0; + +# Were options given? +while ((scalar(@ARGV) > 0) && ($ARGV[0] =~ /^-/)) { + my $f = shift; + + # Evidence Locker + if ($f eq '-d') { + if (scalar(@ARGV) == 0) { + print "Missing Directory\n"; + usage(); + } + + my $d = shift; + + # We need to do this for the tainting + # We don't need to check for special characters in this case because + # all commands will be run with the same permissions as the + # original user. We will check for the obvious ';' though + if ($d =~ /;/) { + print "Illegal argument\n"; + exit(1); + } + + # If the path is relative, autopsyfunc will get screwed up when + # this is run from a directory other than where autopsyfunc is + # so force full paths + elsif ($d !~ /^\//) { + print "The evidence locker must be full path (i.e. begin with /)\n"; + exit(1); + } + elsif ($d =~ /(.*)/) { + $LOCKDIR = $1; + } + } + + # Force no cookie + elsif ($f eq '-C') { + $::USE_COOKIE = 0; + $cook_force = 1; + } + + # force a cookie + elsif ($f eq '-c') { + $::USE_COOKIE = 1; + $cook_force = 1; + } + + elsif ($f eq '-i') { + $::LIVE = 1; + $::USE_LOG = 0; + $::USE_NOTES = 0; + $::SAVE_COOKIE = 0; + + if (scalar(@ARGV) < 3) { + print "Missing device, file system, and mount point arguments\n"; + usage(); + } + + my $vol = "vol" . $vol_cnt; + $vol_cnt++; + + my $dev = shift; + if ($dev =~ /($::REG_IMG_PATH)/) { + $dev = $1; + } + else { + print "invalid device: $dev\n"; + usage(); + } + + unless ((-e "$dev") || (-l "$dev")) { + print "Device ($dev) not found\n"; + usage(); + } + + my $fs = shift; + if ($fs =~ /($::REG_FTYPE)/) { + $fs = $1; + } + else { + print "invalid file system: $fs\n"; + usage(); + } + unless ((exists $Fs::root_meta{$fs}) + && (defined $Fs::root_meta{$fs})) + { + print "File system not supported: $fs\n"; + usage(); + } + $Caseman::vol2ftype{$vol} = "$fs"; + + my $mnt = shift; + if ($mnt =~ /($::REG_MNT)/) { + $mnt = $1; + } + else { + print "invalid mount point: $mnt\n"; + usage(); + } + $Caseman::vol2mnt{$vol} = "$mnt"; + $Caseman::vol2cat{$vol} = "part"; + $Caseman::vol2itype{$vol} = "raw"; + $Caseman::vol2start{$vol} = 0; + $Caseman::vol2end{$vol} = 0; + + # This makes me nervous ... + $Caseman::vol2par{$vol} = $vol; + $Caseman::vol2path{$vol} = "$dev"; + $Caseman::vol2sname{$vol} = "$dev"; + } + + # Specify a different port + elsif ($f eq '-p') { + if (scalar(@ARGV) == 0) { + print "Missing port argument\n"; + usage(); + } + + my $p = shift; + if ($p =~ /(\d+)/) { + $p = $1; + } + else { + print "invalid port: $p\n"; + usage(); + } + if (($p < 1) || ($p > 65535)) { + print "invalid port: $port\n"; + usage(); + } + $port = $p; + } + + else { + print "Invalid flag: $f\n"; + usage(); + } +} + +# remote address +if (scalar(@ARGV) > 0) { + $rema = shift; +} + +# Get remote address +my @acl_addr; # Array of host addresses +my $hn; # Host name +my $tmp; +if ($rema =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/) { + $acl_addr[0] = pack('C4', ($1, $2, $3, $4)); + $hn = $rema; +} +else { + ($hn, $tmp, $tmp, $tmp, @acl_addr) = gethostbyname($rema); + unless (defined $tmp) { + print "Host not found: $rema\n"; + usage(); + } +} + +# Determine the address that will be used to access this server +my $lclhost; +my @ta = unpack('C4', $acl_addr[0]); + +my $bindaddr; + +# If we are being accessed by localhost, we need that and not the hostname +if ( ($ta[0] == 127) + && ($ta[1] == 0) + && ($ta[2] == 0) + && ($ta[3] == 1)) +{ + $lclhost = "localhost"; + $bindaddr = $acl_addr[0]; + + # Force no cookie to be used unless we already set this value + # with arguments + $::USE_COOKIE = 0 unless ($cook_force == 1); +} +else { + $lclhost = `/bin/hostname`; + chop $lclhost; + + $bindaddr = INADDR_ANY; + + # Force a cookie to be used unless we already set this value + # with arguments + $::USE_COOKIE = 1 unless ($cook_force == 1); +} + +# Verify the variables defined in the configuration files +check_vars(); + +# Remove the final '/' from TSKDIR if it exists +$::TSKDIR = $1 + if ($::TSKDIR =~ /(.*?)\/$/); + +# +# Verify that all of the required executables exist +# +check_tools(); + + + +# Currently, HFS is in beta and not enabled by default. +# Autopsy has been configured for it though, so disable it if +# the user has not compiled support into TSK. remove this when +# HFS support is standard. +# This redirects stderr to stdout so we can easily capture it +my $out = `\'$::TSKDIR/fls\' -f list 2>&1`; +unless ($out =~ /hfs/) { + for (my $i = 0; $i < @Fs::types; $i++) { + if ($Fs::types[$i] eq "hfs") { + $Fs::types[$i] = ""; + last; + } + } +} + + + +# remove environment stuff that we don't need and that could be insecure +# We allow basic bin directories for CYGWIN though, since they are +# required for the CYGWIN dlls +my $UNAME = ""; +if (-e "/bin/uname") { + $UNAME = "/bin/uname"; +} +elsif (-e "/usr/bin/uname") { + $UNAME = "/usr/bin/uname"; +} + +my $ispathclear = 1; +if (($UNAME ne "") && (`$UNAME` =~ /^CYGWIN/)) { + $ENV{PATH} = '/bin:/usr/bin:/usr/local/bin'; + $ispathclear = 0; +} +else { + $ENV{PATH} = ''; +} +delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; + +my $date = localtime; + +if ($::LIVE == 0) { + + # Remove the final '/' if it exists + $LOCKDIR = $1 + if ($LOCKDIR =~ /(.*?)\/$/); +} + +# Setup socket +my $proto = getprotobyname('tcp'); +socket(Server, PF_INET, SOCK_STREAM, $proto) + or die "Error creating network socket: $!"; + +setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1) + or die "Error setting network socket options (reuse): $!"; + +setsockopt(Server, SOL_SOCKET, SO_KEEPALIVE, 1) + or die "Error setting network socket options (keep alive): $!"; + +bind(Server, sockaddr_in($port, $bindaddr)) + or die "Error binding to port $port (is Autopsy already running?): $!"; + +listen(Server, SOMAXCONN) + or die "Error listening to socket for connections: $!"; + +my $magic; # magic authentication cookie +my $cook_file; +my $cookie_url = ""; + +if ($::USE_COOKIE == 1) { + + # Try for a real random device, or use rand if all else fails + if (-e "/dev/urandom") { + my $r; + open RAND, "</dev/urandom" or die "can not open /dev/urandom"; + read RAND, $r, 4; + $magic = unpack "I", $r; + read RAND, $r, 4; + $magic .= unpack "I", $r; + close RAND; + } + else { + $magic = int(rand 0xffffffff) . int(rand 0xffffffff); + } + + $cookie_url = "$magic/"; + + # Save to file in case the stdout gets overwritten + if ($SAVE_COOKIE == 1) { + $cook_file = "$LOCKDIR/.$port.cookie"; + if (open COOK, ">$cook_file") { + chmod 0600, "$cook_file"; + print COOK "$magic\n"; + close COOK; + } + else { + print "WARNING: Cannot open file to save cookie in ($cook_file)"; + } + } +} + +print <<EOF; + +============================================================================ + + Autopsy Forensic Browser + http://www.sleuthkit.org/autopsy/ + ver $::VER + +============================================================================ +EOF + +if ($::LIVE == 0) { + print "Evidence Locker: $LOCKDIR\n"; +} +else { + print "Live Analysis Mode\n"; +} +if ($ispathclear == 0) { + print +"\nCYGWIN Mode (Internal path contains /bin, /usr/bin, and /usr/local/bin)\n\n"; +} + +print <<EOF2; +Start Time: $date +Remote Host: $rema +Local Port: $port + +Open an HTML browser on the remote host and paste this URL in it: + + http://$lclhost:${port}/${cookie_url}$::PROGNAME + +Keep this process running and use <ctrl-c> to exit +EOF2 + +Print::log_session_info("Starting session on port $port and $hn\n"); + +# Set the server alarm +$SIG{ALRM} = \&SIG_ALARM_SERVER; +$SIG{INT} = \&SIG_CLOSE; + +# setting this to ignore will automatically wait for children +$SIG{CHLD} = 'IGNORE'; + +# Wait for Connections +while (1) { + + alarm($STIMEOUT) if ($USE_STIMEOUT == 1); + + my $raddr = accept(CLIENT, Server); + next unless ($raddr); + my ($rport, $riaddr) = sockaddr_in($raddr); + + die "Error creating child" unless (defined(my $pid = fork())); + + if (0 == $pid) { + open(STDOUT, ">&CLIENT") or die "Can't dup client to stdout"; + + # open(STDERR, ">&CLIENT") or die "Can't dup client to stdout"; + open(STDIN, "<&CLIENT") or die "Can't dup client to stdin"; + $| = 1; + + my @rip = unpack('C4', $riaddr); + + # Check ACL + foreach $tmp (@acl_addr) { + if ($tmp eq $riaddr) { + spawn_cli($riaddr); + close CLIENT; + exit 0; + } + } + + forbid("$rip[0].$rip[1].$rip[2].$rip[3]"); + Print::log_session_info("ERROR: Unauthorized Connection from: " + . "$rip[0].$rip[1].$rip[2].$rip[3]\n"); + + close CLIENT; + exit 1; + } + else { + close CLIENT; + } +} + +# Error messages +sub forbid { + my $ip = shift; + $ip = "" unless defined ($ip); + + print "HTTP/1.0 403 Forbidden$::HTTP_NL" + . "Content-type: text/html$::HTTP_NL$::HTTP_NL" + . "<html><center>\n" + . "<h2>Access Denied</h2>\n" + . "<h3>Your connection from: $ip has been logged</h3>\n" + . "</center></html>$::HTTP_NL$::HTTP_NL$::HTTP_NL"; + + return; +} + +sub bad_req { + print "HTTP/1.0 404 Bad Request$::HTTP_NL" + . "Content-type: text/html$::HTTP_NL$::HTTP_NL" + . "<html><body><center>\n" + . "<h2>Invalid URL<br><tt>" + . shift() + . "</tt></h2>\n" + . "</center></body></html>" + . "$::HTTP_NL$::HTTP_NL$::HTTP_NL"; + + return; +} + +# Alarm Functions +sub SIG_ALARM_CLIENT { + Print::log_session_info("Connection timed out\n"); + close CLIENT; + exit 1; +} + +sub SIG_ALARM_SERVER { + print "Server Timeout ($STIMEOUT seconds), Exiting\n"; + Print::log_session_info("Server Timeout ($STIMEOUT seconds), Exiting\n"); + exit 0; +} + +# Close the system down when Control-C is given +sub SIG_CLOSE { + + # delete the cookie file + if (($::USE_COOKIE == 1) && ($SAVE_COOKIE == 1)) { + unlink "$cook_file"; + } + + print "End Time: " . localtime() . "\n"; + Print::log_session_info("Ending session on port $port and $hn\n"); + exit 0; +} + +# Pass the remote IP address as the argument for logging +sub spawn_cli { + + # Set timeout for 10 seconds if we dont get any input + alarm($CTIMEOUT); + $SIG{ALRM} = \&SIG_ALARM_CLIENT; + + while (<STDIN>) { + + last if (/^\s+$/); + + if (/^GET \/+(\S*)\s?HTTP/) { + my $url = $1; + my $script; + my $args; + + if (/\x0d\x0a$/) { + $::HTTP_NL = "\x0d\x0a"; + } + else { + $::HTTP_NL = "\x0a"; + } + + # Magic Cookie + # If we are using cookies, then the url should be: + # cookie/autopsy?var=val ... + if ($::USE_COOKIE == 1) { + + if ( ($url =~ /^(\d+)\/+([\w\.\/]+)(?:\?(.*))?$/) + && ($1 == $magic)) + { + $script = $2; + $args = $3; + } + else { + my @rip = unpack('C4', shift()); + Print::log_session_info("ERROR: Incorrect Cookie from: " + . "$rip[0].$rip[1].$rip[2].$rip[3]\n"); + forbid("$rip[0].$rip[1].$rip[2].$rip[3]"); + return 1; + } + } + + # if we aren't using cookies, then it should be: + # autopsy?var=val ... + else { + if ($url =~ /^\/?([\w\.\/]+)(?:\?(.*))?$/) { + $script = $1; + $args = $2; + } + else { + bad_req($url); + return 1; + } + } + + if ($script eq $::PROGNAME) { + $args = "" unless (defined $args); + + # Turn timer off + alarm(0); + + my $has_ref = 0; + while (<STDIN>) { + last if (/^\s+$/); + if (/^Referer: /) { + $has_ref = 1; + last; + } + } + + if (($has_ref == 0) && ($args ne "")) { + Print::log_session_info("ERROR: Missing referer value"); + forbid(); + return 1; + } + + # Print status + print "HTTP/1.0 200 OK$::HTTP_NL"; + ::main($args); + } + elsif ($script eq "global.css") { + show_file($script); + } + + # Display the sanitized picture or reference error + elsif ($script eq $::SANITIZE_TAG) { + Appview::sanitize_pict($args); + return 1; + } + + # Display a picture or help file + elsif (($script =~ /^(pict\/[\w\.\/]+)/) + || ($script =~ /^(help\/[\w\.\/]+)/)) + { + show_file($1); + } + elsif ($script eq 'about') { + about(); + } + + # I'm not sure why this is needed, but there are reqs for it + elsif ($script eq 'favicon.ico') { + show_file("pict/favicon.ico"); + } + else { + bad_req($url); + Print::log_session_info("Unknown function: $script\n"); + return 1; + } + return 0; + } + } # end of while (<>) + +} # end of spawn_cli + +# Print the contents of a local picture or help file +sub show_file { + my $file = "$INSTALLDIR/" . shift; + + if (-e "$file") { + print "HTTP/1.0 200 OK$::HTTP_NL"; + + open FILE, "<$file" + or die "can not open $file"; + + if ($file =~ /\.css$/i) { + print "Content-type: text/css$::HTTP_NL$::HTTP_NL"; + } + elsif ($file =~ /\.jpg$/i) { + print "Content-type: image/jpeg$::HTTP_NL$::HTTP_NL"; + } + elsif ($file =~ /\.gif$/i) { + print "Content-type: image/gif$::HTTP_NL$::HTTP_NL"; + } + elsif ($file =~ /\.ico$/i) { + print "Content-type: image/ico$::HTTP_NL$::HTTP_NL"; + } + elsif ($file =~ /\.html$/i) { + print "Content-type: text/html$::HTTP_NL$::HTTP_NL"; + } + else { + print "HTTP/1.0 404 Bad Request$::HTTP_NL" + . "Content-type: text/html$::HTTP_NL$::HTTP_NL" + . "<html>\n" + . "<head><title>Error</title></head>\n" + . "<h2><center>Unknown Extension</h2>\n" + . "</center></html>$::HTTP_NL$::HTTP_NL$::HTTP_NL"; + exit(1); + } + + while (<FILE>) { + print "$_"; + } + close(FILE); + + print "$::HTTP_NL$::HTTP_NL"; + } + else { + print "HTTP/1.0 404 Bad Request$::HTTP_NL" + . "Content-type: text/html$::HTTP_NL$::HTTP_NL" + . "<html>\n" + . "<head><title>Error</title></head>\n" + . "<h2><center>File Not Found</h2>" + . "</center></html>$::HTTP_NL$::HTTP_NL$::HTTP_NL"; + exit(1); + } + + return; +} + +sub about { + + print "HTTP/1.0 200 OK$::HTTP_NL" + . "Content-type: text/html$::HTTP_NL$::HTTP_NL"; + + my $tskver = ::get_tskver(); + + print <<EOF; + +<html> +<head><title>About Autopsy</title></head> + +<body BGCOLOR=#CCCC99> + +<center><h2>About Autopsy</h2> + <br> + <img src=\"pict/logo.jpg\" alt=\"Logo\"> + <br><br> + <b>Version</b>: $::VER + <br> + <tt><a href="http://www.sleuthkit.org/autopsy/">http://www.sleuthkit.org/autopsy/</a></tt> + <br> + <tt><a href="http://www.sleuthkit.org/informer/">http://www.sleuthkit.org/informer/</a></tt> +</center> + + +<h3>Credits</h3> +<UL> + <LI>Code Development: Brian Carrier (carrier at sleuthkit dot org) + <LI>Interface Assistance: Samir Kapuria + <LI>Mascot: Hash the Hound +</UL> + +<h3>Configuration</h3> +<b>The Sleuth Kit</b>:<br> + URL: <a href="http://www.sleuthkit.org/sleuthkit/"> + <tt>http://www.sleuthkit.org/sleuthkit/</tt></a><br> + Installation Location: <tt>$::TSKDIR</tt><br> + Version: $tskver<br> +<b>Evidence Locker</b>: <tt>$LOCKDIR</tt><br> +<b>grep</b>: <tt>$GREP_EXE</tt><br> +<b>file</b>: <tt>$FILE_EXE</tt><br> +<b><a href="http://www.nsrl.nist.gov/">NIST NSRL</a></b>: <tt>$NSRLDB</tt><br> + +</body></html> + +EOF + return 0; +} + +### Check that the required tools are there +sub check_tools { + + # Sleuth Kit execs + unless (-x $::TSKDIR . "/icat") { + print "ERROR: Sleuth Kit icat executable missing: $::TSKDIR\n"; + exit(1); + } + unless (-x $::TSKDIR . "/istat") { + print "ERROR: Sleuth Kit istat executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/ifind") { + print "ERROR: Sleuth Kit ifind executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/ils") { + print "ERROR: Sleuth Kit ils executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/fls") { + print "ERROR: Sleuth Kit fls executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/ffind") { + print "ERROR: Sleuth Kit ffind executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/blkcat") { + print "ERROR: Sleuth Kit blkcat executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/blkcalc") { + print "ERROR: Sleuth Kit blkcalc executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/blkls") { + print "ERROR: Sleuth Kit blkls executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/img_stat") { + print "ERROR: Sleuth Kit img_stat executable missing\n"; + exit(1); + } + unless (defined $::FILE_EXE) { + print "ERROR: File executable location not defined in config file\n"; + exit(1); + } + unless (-x "$::FILE_EXE") { + print "ERROR: File executable ($::FILE_EXE) missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/fsstat") { + print "ERROR: Sleuth Kit fsstat executable missing\n"; + exit(1); + } + unless (defined $::MD5_EXE) { + print "ERROR: MD5 executable location not defined in config file\n"; + exit(1); + } + unless (-x "$::MD5_EXE") { + print "ERROR: md5 executable ($::MD5_EXE) missing\n"; + exit(1); + } + if ($::SHA1_EXE ne "") { + unless (-x "$::SHA1_EXE") { + print "ERROR: sha1 executable missing\n"; + exit(1); + } + } + unless (-x $::TSKDIR . "/srch_strings") { + print "ERROR: Sleuth Kit srch_strings executable missing\n"; + exit(1); + } + + if ($::LIVE == 0) { + unless (-x $::TSKDIR . "/sorter") { + print "ERROR: Sleuth Kit sorter executable missing\n"; + exit(1); + } + unless (-x $::TSKDIR . "/hfind") { + print "ERROR: Sleuth Kit hfind executable missing\n"; + print + " You likely have an old version of The Sleuth Kit or TASK\n"; + exit(1); + } + } + + unless (-x "$GREP_EXE") { + print "ERROR: grep executable missing\n"; + exit(1); + } +} + +# check values that should be defined in the configuration files +# This will show incomplete installations +sub check_vars { + unless ((defined $::TSKDIR) && ($::TSKDIR ne "")) { + print "ERROR: TSKDIR variable not set in configuration file\n"; + print " This could been caused by an incomplete installation\n"; + exit(1); + } + + unless (-d "$::TSKDIR") { + print "Invalid Sleuth Kit binary directory: $::TSKDIR\n"; + exit(1); + } + + return if ($::LIVE == 1); + + # Verify The evidence locker directory + unless ((defined $LOCKDIR) && ($LOCKDIR ne "")) { + print "ERROR: LOCKDIR variable not set in configuration file\n"; + print " This could been caused by an incomplete installation\n"; + exit(1); + } + + unless (-d "$LOCKDIR") { + print "Invalid evidence locker directory: $LOCKDIR\n"; + exit(1); + } +} diff --git a/base/make-live-cd.base b/base/make-live-cd.base new file mode 100644 index 0000000000..08c66e9f37 --- /dev/null +++ b/base/make-live-cd.base @@ -0,0 +1,153 @@ +# +# This makes a directory ($CD) with the needed files to burn to +# a CD for live analysis +# +# Current limitations are that Perl needs to be on the suspect system and +# that it uses the untrusted Perl files. + +require 'conf.pl'; +use vars '$USE_STIMEOUT', '$STIMEOUT', '$CTIMEOUT', '$SAVE_COOKIE'; +use vars '$GREP_EXE', '$TSKDIR'; + + +my $CD = "./live-cd/"; + +# Make the directories +if (-d "$CD") { + print "Live CD directory already exists ($CD)\n"; + print "Plese delete and run this again\n"; + exit (1); +} + +print "Making base directory ($CD)\n"; +die "Error making Live CD directory ($CD)" + unless (mkdir "$CD", 0775); + +die "Error making Live CD binaries directory ($CD)" + unless (mkdir "$CD/bin/", 0775); + + +print "Copying executables\n"; + +# Copy the executables +die "Missing grep executable ($GREP_EXE)" + unless (-x "$GREP_EXE"); +`cp '$GREP_EXE' '$CD/bin/grep'`; +die "Error copying grep executable" + unless (-x "$CD/bin/grep"); + + +die "Missing MD5 executable ($::MD5_EXE)" + unless (-x "$::MD5_EXE"); +`cp '$::MD5_EXE' '$CD/bin/md5sum'`; +die "Error copying MD5 executable" + unless (-x "$CD/bin/md5sum"); + +# Sleuth Kit Binaries +die "Missing Sleuth Kit Directory ($TSKDIR)" + unless (-d "$TSKDIR"); + +foreach my $exec ("blkcalc", "blkcat", "blkls", "blkstat", "ffind", "fls", "fsstat", + "icat", "ifind", "ils", "istat", "srch_strings", "img_stat", "mmls") { + + die "Missing Sleuth Kit executable ($exec)" + unless (-x "$TSKDIR/$exec"); + + `cp '$TSKDIR/$exec' '$CD/bin/$exec'`; + + die "Error copying Sleuth Kit executable ($exec)" + unless (-x "$CD/bin/$exec"); +} + + +# Make a fake file +open FILE, ">$CD/bin/file" or die ("Error creating Live CD file exec"); +print FILE "#!./bin/perl\n"; +print FILE "print STDOUT \"File Type Not Supported During Live Analysis\n\";\n"; +close FILE; +`chmod +x "$CD/bin/file"`; + + +# Copy the autopsy directories +print "Copying autopsy files\n"; +`cp -r help "$CD"`; +`cp -r lib "$CD"`; +`cp -r pict "$CD"`; + + +# Get the path for Perl from the current autopsy +open AUT, "<./autopsy" or die ("Error opening normal autopsy exec"); +my $perl; +while (<AUT>) { + $perl = $_; + last; +} +close AUT; + +if ($perl =~ /^#!(\S+)/) { + $perl = $1; +} else { + die "Error parsing Perl location from autopsy" +} + + +# Copy the perl exec +# @@@ I'm not sure if just copying the bin is enough ... +die "Missing Perl executable ($perl)" + unless (-x "$perl"); + +`cp '$perl' '$CD/bin/perl'`; + +die "Error copying perl executable" + unless (-x "$CD/bin/perl"); + + +# Make a new autopsy +open AUT, ">$CD/autopsy" or die ("Error opening Live CD autopsy exec"); + +print AUT "#!./bin/perl -wT\n"; +print AUT "use lib '.';\n"; +print AUT "use lib './lib/';\n"; + + +open BASE, "<./base/autopsy.base" or die ("Error opening base autopsy"); + +print AUT $_ + while (<BASE>); + +close (AUT); +close (BASE); + +`chmod +x "$CD/autopsy"`; + + +print "Creating configuration file using existing settings\n"; + +# Make the configuration file +open CONF, ">$CD/conf.pl" or die ("Error opening Live CD Config file"); + +print CONF "# Configuration file for Live CD version of Autopsy\n"; +print CONF "# http://www.sleuthkit.org/autopsy\n"; +print CONF "# Created on ".localtime()."\n\n"; + +# Variables +print CONF "\$USE_STIMEOUT = $USE_STIMEOUT;\n"; +print CONF "\$STIMEOUT = $STIMEOUT;\n"; +print CONF "\$CTIMEOUT = $CTIMEOUT;\n"; +print CONF "\$SAVE_COOKIE = $SAVE_COOKIE;\n"; + +print CONF "\n"; +print CONF "\$INSTALLDIR = './';\n"; +print CONF "\$NSRLDB = '';\n"; +print CONF "\$LOCKDIR = './read-only-live-version/';\n"; + +print CONF "\n"; +print CONF "# System Utilities\n"; +print CONF "\$GREP_EXE = './bin/grep';\n"; +print CONF "\$FILE_EXE = './bin/file';\n"; +print CONF "\$MD5_EXE = './bin/md5sum';\n"; +print CONF "\$TSKDIR = './bin/';\n"; + +close CONF; + +print "\n"; diff --git a/configure b/configure new file mode 100755 index 0000000000..72d5c84f00 --- /dev/null +++ b/configure @@ -0,0 +1,475 @@ +#!/bin/sh + +# Minimum version of TSK that is required +minver="3.1.0"; + +# The last released version of TSK +curtskver="3.1.1"; + +# Configuration script for the Autopsy Forensic Browser +# +# Brian Carrier [carrier@sleuthkit.org] +# +# Copyright (c) 2003-2008 by Brian Carrier. All rights reserved +# +# Copyright (c) 2001-2003 by Brian Carrier, @stake. All rights reserved +# +# Copyright (c) 2001 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +# Directories to search in +dirs='/usr/local/bin/ /usr/bin/ /usr/ccs/bin/ /bin/ /usr/ucb/bin/ /sbin/ /usr/sbin/ /usr/local/sbin/' + + +echo "" +echo " Autopsy Forensic Browser Installation" +echo "" + + + +############################################################################# +# create conf.pl +############################################################################# + + +conf='conf.pl' + +rep="" +if (test -f $conf) then + echo "A configuration file already exists, overwrite? (y/n):"; + read rep; +else + rep="y" +fi + +if (test "$rep" = "y") then + + +# First add the variables that are static +# +# DEFAULT USER SETTINGS +# +echo '# Autopsy configuration settings' > $conf +echo '' >> $conf +echo '# when set to 1, the server will stop after it receives no' >> $conf +echo '# connections for STIMEOUT seconds. ' >> $conf +echo '$USE_STIMEOUT = 0;' >> $conf +echo '$STIMEOUT = 3600;'>> $conf + +echo '' >> $conf +echo '# number of seconds that child waits for input from client' >> $conf +echo '$CTIMEOUT = 15;' >> $conf + +echo '' >> $conf +echo '# set to 1 to save the cookie value in a file (for scripting)' >> $conf +echo '$SAVE_COOKIE = 1;' >> $conf + + +############################################################################# +# INSTALLATION DIRECTORY +############################################################################# +echo '' >> $conf; +echo \$INSTALLDIR = \'$PWD/\'\; >> $conf; + + +# Now add the variables that need user interaction + +# +# FIND THE UTILITIES +# +echo '' >> $conf +echo '' >> $conf +echo '# System Utilities' >> $conf + + + +# +# GREP +# +echo '' +echo '---------------------------------------------------------------' +echo '' +found=0 +for d in $dirs + do if (test -x ${d}grep) then + echo \$GREP_EXE = \'${d}grep\'\; >> $conf; + echo "grep found: ${d}grep"; + grepexe="${d}grep"; + found=1; + break; + fi; +done + +# Prompt if not found +if (test $found -eq 0) then + echo 'ERROR: grep utility not found'; + echo 'Enter location of executable:'; + while (test 1 -eq 1) + do read grepexe; + if (test -x "$grepexe") then + echo \$GREP_EXE = \'$grepexe\'\; >> $conf; + break; + else + echo 'grep was not found (try again):'; + fi; + done +fi + + +# +# FILE +# +found=0 +for d in $dirs + do if (test -x ${d}file) then + echo \$FILE_EXE = \'${d}file\'\; >> $conf; + echo "file found: ${d}file"; + found=1; + break; + fi; +done + +# Prompt if not found +if (test $found -eq 0) then + echo 'ERROR: file utility not found'; + echo 'Enter location of executable:'; + while (test 1 -eq 1) + do read fileexe; + if (test -x "$fileexe") then + echo \$FILE_EXE = \'$filexe\'\; >> $conf; + break; + else + echo 'file was not found (try again):'; + fi; + done +fi + +# +# MD5 +# +found=0 +for d in $dirs + do if (test -x ${d}md5) then + echo \$MD5_EXE = \'${d}md5\'\; >> $conf; + echo "md5 found: ${d}md5"; + found=1; + break; + elif (test -x ${d}md5sum) then + echo \$MD5_EXE = \'${d}md5sum\'\; >> $conf; + echo "md5 found: ${d}md5sum"; + found=1; + break; + fi; +done + +# Prompt if not found +if (test $found -eq 0) then + echo 'ERROR: md5/md5sum utility not found'; + echo 'Enter location of executable:'; + while (test 1 -eq 1) + do read md5exe; + if (test -x "$md5exe") then + echo \$MD5_EXE = \'$md5exe\'\; >> $conf; + break; + else + echo 'md5 was not found (try again):'; + fi; + done +fi + + +# +# SHA-1 +# +found=0 +for d in $dirs + do if (test -x ${d}sha15) then + echo \$SHA1_EXE = \'${d}sha\'\; >> $conf; + echo "sha1 found: ${d}sha1"; + found=1; + break; + elif (test -x ${d}sha1sum) then + echo \$SHA1_EXE = \'${d}sha1sum\'\; >> $conf; + echo "sha1 found: ${d}sha1sum"; + found=1; + break; + fi; +done + +if (test $found -eq 0) then + echo 'WARNING: sha1/sha1sum utility not found'; + echo \$SHA1_EXE = \'\'\; >> $conf; +fi; + + + +############################################################################# +# The Sleuth Kit +############################################################################# + +echo '' >> $conf +echo '' >> $conf +echo '# Directories' >> $conf + +echo '' +echo '---------------------------------------------------------------' +echo '' +echo 'Searching for Sleuth Kit Installation.' +found=0 +for d in $dirs + do if ((test -x ${d}fls) && (test -x ${d}ffind) && (test -x ${d}blkstat) && \ + (test -x ${d}blkls) && (test -x ${d}blkcat) && \ + (test -x ${d}mmls) && (test -x ${d}mmstat) && \ + (test -x ${d}fsstat) && (test -x ${d}img_stat) && \ + (test -x ${d}istat) && (test -x ${d}ifind) && \ + (test -x ${d}icat) && (test -x ${d}ils) && \ + (test -x ${d}srch_strings) && \ + (test -x ${d}mactime) && (test -x ${d}sorter)) then + echo \$TSKDIR = \'${d}\'\; >> $conf; + tskdir=${d}; + echo "Found in: ${d}"; + found=1; + break; + fi; +done + +if (test $found -eq 0) then + echo 'Sleuth Kit tools were not found in the standard install locations.' + echo 'If you have not installed them, do so now and configure autopsy again.' + echo 'If you have installed them in a non-standard location, then' + echo ' enter the "bin" directory now:' + + while (test 1 -eq 1) + do read tskdir; + if ((test -x ${tskdir}/fls) && (test -x ${tskdir}/ffind) && (test -x ${tskdir}/blkstat) && \ + (test -x ${tskdir}/blkls) && (test -x ${tskdir}/blkcat) && \ + (test -x ${tskdir}/mmls) && (test -x ${tskdir}/mmstat) && \ + (test -x ${tskdir}/fsstat) && (test -x ${tskdir}/img_stat) && \ + (test -x ${tskdir}/istat) && (test -x ${tskdir}/ifind) && \ + (test -x ${tskdir}/icat) && (test -x ${tskdir}/ils) && \ + (test -x ${tskdir}/srch_strings) && \ + (test -x ${tskdir}/mactime) && (test -x ${tskdir}/sorter)) then + echo \$TSKDIR = \'${tskdir}\'\; >> $conf; + break; + else + echo 'TSK tools were not found or incomplete (try again):'; + fi; + done +fi; + +# Test for latest version +ver=`"${tskdir}/fls" -V | awk '/The Sleuth Kit ver / {print $5}'`; +echo " Version $ver found"; + + +if (test "$ver" '<' "$minver") then + echo "Your version of The Sleuth Kit is not current enough - $minver is needed"; + if (test "$ver" '>' "0.0.0") then + exit 1; + fi; +elif (test "$ver" '<' "$curtskver") then + echo ''; + echo "*** NOTE: A more recent version ($curtskver) of The Sleuth Kit Exists ***" + echo " [Press Enter to Continue]"; + read foo; + +else + echo ' Required version found'; +fi + + + +# NSRL +echo '' +echo '---------------------------------------------------------------' +echo '' +echo 'The NIST National Software Reference Library (NSRL) contains' +echo 'hash values of known good and bad files.' +echo ' http://www.nsrl.nist.gov' +echo '' +echo 'Have you purchased or downloaded a copy of the NSRL (y/n) [n]' +read rep; +if (test "$rep" = "y") then + + echo 'Enter the directory where you installed it:' + while (test 1 -eq 1) + do read nsrldir; + if (test "$nsrldir" = "cancel") then + echo \$NSRLDB = \'\'\; >> $conf; + break; + fi; + if (test -f "${nsrldir}/NSRLFile.txt") then + echo ' NSRL database was found (NSRLFile.txt)'; + echo \$NSRLDB = \'${nsrldir}/NSRLFile.txt\'\; >> $conf; + + if (test -f "${nsrldir}/NSRLFile.txt-md5.idx") then + echo ' NSRL Index file found (NSRLFile.txt-md5.idx)'; + else + echo ' NSRL Index file not found, do you want it created? (y/n) [n]:' + read rep; + if (test "$rep" = "y") then + echo '' + echo '-------------- begin hfind output --------------' + "${tskdir}/hfind" -i nsrl-md5 "${nsrldir}/NSRLFile.txt"; + echo '--------------- end hfind output ---------------' + echo '' + fi; + fi; + break; + else + echo 'The NSRL was not found (the directory should have NSRLFile.txt in it)'; + echo 'Enter a new directory (or cancel to stop):'; + fi; + done +else + echo \$NSRLDB = \'\'\; >> $conf; +fi; + +############################################################################# +# EVIDENCE LOCKER +############################################################################# +mdone=0 +echo '' +echo '---------------------------------------------------------------' +echo '' +echo 'Autopsy saves configuration files, audit logs, and output to the' +echo 'Evidence Locker directory.' +echo '' +echo 'Enter the directory that you want to use for the Evidence Locker:'; +read locker; +if (test -d "${locker}") then + echo " $locker already exists" +else + echo ''; + echo "WARNING: $locker does not exist" + mdone=1 +fi + +echo \$LOCKDIR = \'${locker}\'\; >> $conf; + +fi + +# Start of non-conf.pl file configuration + +############################################################################# +# Setup Perl locations +############################################################################# +found=0; + +for d in $dirs + do if (test -x ${d}perl) then + if (test -n "`${d}perl -v 2> /dev/null | awk '/This is perl/ {print $0}'`") then + ver=`${d}perl -e 'print $];'`; + if (`${d}perl -e 'exit( $] >= 5.008);'`) then + echo "old version of perl found: ${d}perl (version $ver) -- continuing"; + else + echo "perl found: ${d}perl (version $ver)"; + echo "#!${d}perl -wT" > ./config.tmp; + echo "#!${d}perl" > ./config2.tmp; + perlexe="${d}perl"; + found=1; + break; + fi; + fi; + fi; +done + +# If it wasn't found, then prompt for it. +if (test $found -eq 0) then + echo 'ERROR: perl not found or the incorrect version found'; + while (test 1 -eq 1) + do echo 'Enter location of perl executable:'; + read perlexe; + if (test -x "$perlexe") then + if (test -n "`$perlexe -v 2> /dev/null | awk '/This is perl/ {print $0}'`") then + ver=`$perlexe -e 'print $];'`; + if (`$perlexe -e 'exit( $] >= 5.008);'`) then + echo "This version of Perl is too old, 5.8.0 or older needed"; + else + echo "Correct version found"; + echo "#!${perlexe} -wT" > ./config.tmp; + echo "#!${perlexe}" > ./config2.tmp; + found=1; + break; + fi; + else + echo "Perl found, but is not working. Try another"; + fi; + else + echo "file not found"; + fi + done +fi + +# Check if this version of Perl supports large files +if (test -z "`$perlexe -V 2> /dev/null | awk '/USE_LARGE_FILES/ {print $0}'`") then + echo '' + echo ' NOTE: It appears that your Perl does not support large files.'; + echo ' You therefore will not be able to analyze images larger than 2GB.'; + echo ' Download the source version from www.cpan.org and compile a new version.'; + echo " [Press Enter to Continue]"; + read foo; + echo '' +fi; + +# Get current working directory for lib +echo "use lib '$PWD/';" >> ./config.tmp +echo "use lib '$PWD/lib/';" >> ./config.tmp + +if (test -f ./autopsy) then + echo "autopsy already exists, overwrite? (y/n):"; + read rep; + if (test "$rep" = "y") then + cat ./config.tmp base/autopsy.base > ./autopsy + cat ./config2.tmp base/make-live-cd.base > ./make-live-cd + else + echo ' original version was kept'; + fi +else + cat ./config.tmp base/autopsy.base > ./autopsy + cat ./config2.tmp base/make-live-cd.base > ./make-live-cd +fi +chmod 0755 ./autopsy +chmod 0755 ./make-live-cd + +# cleanup +rm -f ./config.tmp +rm -f ./config2.tmp + + +############################################################################# +# CLEANUP +############################################################################# +echo '' +echo '---------------------------------------------------------------' +echo '' +echo "Execute the './autopsy' command to start with default settings." +echo '' + diff --git a/docs/sleuthkit-informer-13.txt b/docs/sleuthkit-informer-13.txt new file mode 100644 index 0000000000..24d55bb371 --- /dev/null +++ b/docs/sleuthkit-informer-13.txt @@ -0,0 +1,410 @@ + The Sleuth Kit Informer + + http://www.sleuthkit.org/informer + http://sleuthkit.sourceforge.net/informer + + Brian Carrier + carrier at sleuthkit dot org + + Issue #13 + March 15, 2004 + + + +CONTENTS +-------------------------------------------------------------------- +- Introduction +- What's New? +- Call For Papers +- Did You Know? +- UNIX Incident Verification With Autopsy + + + +INTRODUCTION +-------------------------------------------------------------------- + +I'm almost done! Releasing version 2.00 of Autopsy that is. I'm +polishing up the final changes and documentation and it will be +released later this week. March 19 is the birthday of Autopsy and +The Sleuth Kit's predecessor, TCTutils, also the goal release date +for version 2.00. + +This issue of the Informer will focus on the new live analysis +feature of (the unreleased) Autopsy. This issue also has a lot +entries in the "What's New?" category because we are on a bimonthly +schedule. If you missed getting the February issue of The Informer +and have lessons to share with people then make sure you read the +Call For Papers section so that you can learn how to submit articles +of your own. + + + +WHAT'S NEW? +-------------------------------------------------------------------- +A new version (1.68) of The Sleuth Kit was released. It contains +a couple of bug fixes. There have been discussions on the +sleuthkit-developers list about what new functions should be added +to the next big version 2.00 release. Michael Cohen has been looking +into support for disk images, split images, RAID images, and other +non-raw formats. David Collett has been looking into output formats +for TSK tools so that they can be imported into databases. + +Version 2.00 of Autopsy will be released later this week. I'm +adding the final touches and documentation and the goal is to release +it on March 19, which is the 3 year anniversary of the first release +of Autopsy and TCTutils. Version 2.00 has a new internal design +and has live analysis features (see below article). If you can't +wait for a few days and want one of the beta copies, let me know. + +Guido Metzner has been translating The Sleuth Kit Informer into +German. If anyone else is translating this, let me know and I'll +add a link. + + http://www.guframe.de/sleuthkit.html + + +I started to provide a GPG signature of the source code as it is +released. I have meant to do this for ages. This can help to +ensure that the code being downloaded has not been modified by an +attacker. + + + +CALL FOR PAPERS +-------------------------------------------------------------------- + +I posted a call for papers on the website in late January for +people that are interested in writing articles for the Informer. +Here is the relevant section: + +The Sleuth Kit Informer is looking for articles on open source tools +and techniques for digital investigations (computer / digital +forensics) and incident response. Articles that discuss The Sleuth +Kit and Autopsy are appreciated, but not required. Example topics +include (but are not limited to): + +- Tutorials on open source tools +- User experiences and reviews of open source tools +- New investigation techniques using open source tools +- Open source tool testing results + +http://www.sleuthkit.org/informer/cfp.html + + +Writing these articles takes away from my development time of new +tool features, so any help is appreciated. To keep with the incident +verification theme, any articles on the basics of using 'netstat', +'lsof', etc. to look for signs of an intrusion are also welcome for +the next few issues. If we get enough interest, I'll consider going +back to a monthly schedule. + + + +DID YOU KNOW? +-------------------------------------------------------------------- + +Have you ever noticed that the number of occurrences and locations +of keywords for regular expressions in Autopsy are not always +accurate? This came up on one of the mailing lists this past month +and I'll explain it again here. + +Previous issues of The Informer have covered keyword searching, but +the general idea in Autopsy is that it runs the 'strings' command +on the image file and then uses 'grep' to find the keyword. The +'strings' command returns a long ASCII string that grep examines. +If the keyword is found in the string, then grep fill flag the +string and autopsy will search the string to find the exact location +of the keyword. + +This is easy if a non-regular expression is used, but much more +difficult with regular expressions because 'grep' regular expressions +are different from Perl regular expressions. I do not have a way +to convert the grep regular expression to Perl and therefore I only +return the number of big strings that have the keyword and the +location of the start of the big string. There could be more than +one keyword in the string, in which case the total occurrences value +is too small. The location will also be off because it points to +the start of the large string and not the specific keyword. + +If anyone knows of, or wants to write, a grep to perl regular +expression converter, let me know so that we can update this. + + + +UNIX INCIDENT VERIFICATION WITH AUTOPSY +-------------------------------------------------------------------- + +INTRODUCTION + +For a couple of years, I have been saying that Autopsy can be used +to analyze a live system, but it has taken me a while to make it +EASY to use to analyze a live system. When version 2.0 of Autopsy +is released later this week, you will find that it is much easier +to configure so that it runs on a CD-ROM so that you can examine a +system that is suspected of being compromised. This will allow you +to view files that are hidden by rootkits and will not change the +access times on files that are viewed. + +This article will give an overview of how to use the new features +and what features are available for dead analysis are not for live +analysis. I will also show the future work for Autopsy. This +article uses many of the same concepts as the "UNIX Incident +Verification with The Sleuth Kit" article in issue #10 of the +Informer. + +MOTIVATION + +Some may be asking "why would I want a live analysis feature?". +The primary motivation is for a more automated Incident Verification +procedure. We saw in issue #10 of the Informer, that The Sleuth +Kit can be used to verify an incident because it can show files +that are hidden by rootkits and will not update the access times +on files when they are read. Executing a bunch of command line +tools is tedious though and Autopsy can provide a more automated +investigation procedure. + +The basic scenario is that Autopsy and The Sleuth Kit will be burned +to a CD and inserted into a suspect computer. An investigator will +connect to Autopsy on the suspect UNIX computer with her HTML browser +on a trusted laptop and remotely examine the hard disk contents. +If the computer is found to have been compromised, then it can be +taken offline and acquired using normal procedures. + +Recall from issue #10 that I used two guidelines for incident +verification: + + 1. Minimize the amount of trust that you place in the system so + that more accurate information is collected. + + 2. Minimize the amount of data that you change on the system so + that evidence is preserved. + + +CREATING THE CD + +To satisfy guideline #1 from above, we want to minimize the amount +of trust that we place in the system, so we use our own executables. +At a minimum, we need The Sleuth Kit and Autopsy on the CD and you +will probably have additional tools to examine open network ports +and running processes. This has been the most difficult part of +using Autopsy for live analysis because Autopsy relies on a given +directory structure and locations that it can write to. + +It is now very easy with v2. With v2, you compile TSK and Autopsy +on a similar system to the one that will be investigated just like +you do for a dead analysis. Try the 'make static' with TSK to see +if you can make static executables for your platform. After both +Autopsy and TSK have been compiled, you execute the 'make-live-cd' +command in Autopsy. This script will make a 'live-cd' sub-directory +in the autopsy directory, which contains a copy of autopsy and +copies of TSK executables, grep, strings, perl etc: + + # ./make-live-cd + Making base directory (./live-cd/) + Copying executables + Copying autopsy files + Creating configuration file using existing settings + + +The 'live-cd' directory has a 'bin' directory where additional +executables can be copied to and then the whole directory can be +burned to a CD. + + +BASIC USAGE + +After the CD has been created and there is a system suspected of +being compromised, then it is time to take advantage of the new +features. There are two scenarios for live analysis. The first +scenario uses a network share from a trusted system that you can +write to. In this case, autopsy is run as normal and you specify +the evidence locker directory as the mounted disk. The evidence +locker is specified with '-d': + + # ./autopsy -d /mnt/ev_lock 10.1.32.123 + +The above would start autopsy, use '/mnt/ev_lock/' as the evidence +locker and would allow connections from 10.1.32.123 (where the +investigator would connect from using an HTML browser). Remember that +we do not want to write to the suspect system, so we should only use +a network share and not a local directory in this scenario. + +The second scenario does not use an evidence locker and does not +intentionally write any data to disk. This scenario does not need +the network share and each of the devices (or partitions) that will +be analyzed are specified on the command line using the '-i' flags. +The '-i' flag requires three arguments: the device, the file system +type, and the mounting point. For example, to examine the '/dev/hda5' +and '/dev/hda8' partitions on a Linux system, the following could +be used: + + # ./autopsy -i /dev/hda5 linux-ext3 / -i /dev/hda8 linux-ext3 /usr/ \ + 10.1.32.123 + +The file system type must be one of the types that are supported +by TSK. The remote IP address must also be given, otherwise you +will have to use a browser on the suspect system and that will write +data to the disk. + +When you use the '-i' flag, then autopsy will start in the 'Host +Manager' view where you can select the image that you want to +analyze. You will skip the case and host configuration. The default +case name will be 'live', the default host name is 'local', and the +default investigator name is 'unknown'. + + +DIFFERENCES WITH DEAD ANALYSIS + +There are some features that are not available for live analysis +because they write files to the disk. In this section, I am using +the term live analysis for the scenario where there is not a mounted +network share and there is not evidence locker. + +No auditing is performed during a live analysis because there is +no where to write the logs. In the future, if this is needed, then +a method of writing logs to a floppy disk could be configured. +Timelines of file activity cannot be created because they need to +create files. Hash databases are also not currently used, although +they could in the future. It may be difficult to maintain the +latest hash database on the same CD as the latest autopsy and TSK +version though. Notes and event sequencer notes cannot be created. + +Keyword searches can be performed, but the strings file and unallocated +only search cannot be performed because they both require a file +to be created. The search results are also not cached. You can +also not sort files by their type (all executables, all pictures +etc.). In many cases, you would not want to do many of these +operations because they are time intensive and you are generally +looking for obvious and quick evidence during the incident verification. +If you need theses features, then you can use the network share +scenario. + + +SIMILARITIES WITH DEAD ANALYSIS + +Now that we know what is different, I'll cover what is the same. +All of the file mode analysis is the same, except that you cannot +get the file type. The method that is used to compile 'file' in +TSK does not allow autopsy to easily move it around. This behavior +may change in the future. Meta data, data unit, and file system +mode all work as usual. + +You can still export file contents to your trusted laptop because +it uses the HTTP to save the file. So, you can select the export +button on a log file to save a copy. You can also generate ASCII +reports and save them to your local analysis station. + + +GUIDELINE COMPLIANCE + +All of these features may sound great, but lets examine how well +the new Autopsy satisfies the two guidelines. I think it is always +important to compare a new tool or technique against generic +guidelines. + +The first guideline was about not trusting the local system. No +software-based live analysis tool can be 100% independent from the +local system because it always needs to request service from the +operating system. With Autopsy, we use our own copies of the Autopsy +perl code, TSK executables, grep, and strings. + +There is one large problem with the current Autopsy model and it +is because of Perl. Perl is a beast and contains many modules and +libraries. When the 'make-live-cd' script is run, a copy of the +'perl' executable is copied to the 'live-cd' directory, but that +is it. The executable will still need the modules and libraries +on the local system. Solving this may require building a special +version of Perl that is more static. I need to investigate this +more. + +Another method of getting around this limitation is to use the +'perl2exe' program that converts a Perl script to a dynamic executable. +The resulting executable will still rely on dynamic libraries on +the suspect system, but it seems a little cleaner. The perl2exe +program is a commercial tool. + +One of the benefits of the Autopsy design, is that Autopsy did not +exist on the system when it was suspected of being compromised. +Therefore, the attacker will not know that Autopsy will be used to +investigate the system and therefore will be less likely to tamper +with its dependencies. If the investigation tools are running on +the system during the attack, then I would guess that the attacker +will be more likely to tamper with them. + +The second guideline was about modifying data on the system. I +described the features that were removed in the previous section. +This was easy to do because there were functions that write the +logs or notes. Each of those starts with a check to see if logging +is enabled. Timelines and file type sorting were also disabled +because it required writing to disk. + +I can never guarantee that no data will be written from a live +analysis. Memory will be overwritten when the software is loaded +and the access times on dynamic libraries will updated. Running +the tools may require the operating system to write memory to the +page file, which may overwrite data from the attacker. + +This is a shameless plug, but for those that are interested in live +analysis, then you may want to check out a paper that a colleague, +Joe Grand (author of pdd), and I wrote about a hardware device to +acquire memory from a live system. It does not overwrite memory +because there is no process to load and it access the physical +memory directly so it does not rely on the local operating system. +It was recently published in the new Journal of Digital Investigation +(reference is below and that issue of the journal is currently free +to view). + + + +FUTURE WORK + +There is always more to do, and I'll cover that here. + +I would like to also include other system utilities, such as 'ps' or +'netstat' on the CD and allow the Autopsy user to run the commands +from within autopsy. This should be fairly easy, but the difficult +part is that many of the operating systems use different flags for +different tools. + +I would like to start incorporating scripts into the tool (for both dead +and live analysis). This will allow you to more easily detect rootkits +or other signatures. + +The biggest thing that needs future work is using Perl. Autopsy +still relies on the version of Perl on the suspect system and that +could run into problems if an attacker modifies it. Using the +perl2exe tool can reduce the risk, but it is a commercial tool. + + +CONCLUSION + +The live analysis mode of Autopsy allows you to more easily analyze +a system that is suspected of being compromised. It can also be +used to examine a honeypot. Live analysis is not ideal because you +are stilly relying on the suspect operating system for data, but +it is required in some situations. More work needs to be done with +Autopsy so that it depends less on the local system. + + + +REFERENCES +Autopsy + http://www.sleuthkit.org/autopsy/ + +perl2exe + http://www.indigostar.com/perl2exe.htm + +Sleuth Kit + http://www.sleuthkit.org/sleuthkit + +Sleuth Kit Informer #10 + http://www.sleuthkit.org/informer/sleuthkit-informer-10.html + +A hardware-based memory acquisition procedure for digital investigations + Brian D. Carrier and Joe Grand + Volume 1, Issue 1 - Journal of Digital Investigations + http://www.sciencedirect.com/science/journal/17422876 + +-------------------------------------------------------------------- +Copyright (c) 2004 by Brian Carrier. All Rights Reserved diff --git a/global.css b/global.css new file mode 100644 index 0000000000..d44dcca673 --- /dev/null +++ b/global.css @@ -0,0 +1,19 @@ +h3 { + font-size: 18px; + color: #000000; +} +h2 { + font-size: 20px; + color: #000000; +} +h1 { + font-size: 24px; + color: #000000; +} +body { + font-family: Helvetica, Geneva, Arial, sans-serif; + font-size: 14px; + color: #000000; + #background-color: #dedede; +} + diff --git a/help/blank.html b/help/blank.html new file mode 100644 index 0000000000..3e40eb24cf --- /dev/null +++ b/help/blank.html @@ -0,0 +1,25 @@ +<HTML> +<HEAD><TITLE>Blank Page</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + + <p> + + <p> + + <p> + <center> + <h3>HELP!</h3> + Here are the help files for using Autopsy. + + <p>In addition to these files, the <tt>Sleuth Kit Informer</tt> + newsletter could be useful.<br> + The Informer typically goes into more technical details than what + is provided here.</p> + + <p><a href="http://www.sleuthkit.org/informer/" target=\"_blank\"> + http://www.sleuthkit.org/informer/</a></p> + + <p>Send documentation updates to <doc-updates at sleuthkit dot org></p> + +</BODY> +</HTML> diff --git a/help/caseman.html b/help/caseman.html new file mode 100644 index 0000000000..ee4fc315b8 --- /dev/null +++ b/help/caseman.html @@ -0,0 +1,161 @@ +<HTML> +<HEAD><TITLE>Autopsy Case Management Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + + +<CENTER><H2>Case Management</H2></CENTER> +<P> +<H3>Overview</H3> +Autopsy organizes images based on the case and host that they came +from. A case contains one or more hosts (a new case should be +created for each investigation). Each host can contain one or more +images, which correspond to disks or partitions on the host. + + +<P> +<H3>Creating a New Case</H3> +From the Main Menu (at startup) select <U>New Case</U>. You will +have to enter the case name and an optional short description. +The case name must be a valid directory name (no spaces - no +symbols). A list of investigators will also be requested. These +will be used for the audit logs, not for authentication. A directory +with the same name as the case will be created in the Evidence +Locker. To later rename the case, simply rename the directory. + +<P> +For example: +<TABLE CELLSPACING=8> +<TR> + <TD>Case Name:</TD><TD><TT>bankofmars</TT></TD> +</TR> +<TR> + <TD>Case Description:</TD><TD><TT>Theft of $1,000,000,000.01 from The Bank of Mars</TT></TD> +</TR> +<TR> + <TD>Investigators:</TD><TD><TT>gadget</TT></TD> +</TR> +</TABLE> + +<P> +<H3>Adding a New Host</H3> +A Host must then be created in the Case. Select the Case that was +just created from the Case Gallery and enter the Host Gallery. +Select <U>Add Host</U> and enter the host name, a short description, +and time information such as time zone and clock skew. The clock +skew is how many seconds the system was off from a synchronized +clock. Adding a host will create a directory in the case directory +and subdirectories in the host for the images, output data, logs, +and reports. If you do not add a time zone, then it will default to +the time zone of your analysis system. A list of time zones can be +found <a href="timezones.html">here</a>. + +<P> +You can optionally add the path to <A HREF="hash_db.html">hash databases</A>. + +<P> +For example, the 'Bank of Mars' incident could have two hosts +involved: + +<TABLE CELLSPACING=8> +<TR> + <TD>Host Name:</TD><TD><TT>db_server</TT></TD> +</TR> +<TR> + <TD>Host Description:</TD><TD><TT>Main Database Server - Solaris</TT></TD> +</TR> +<TR> + <TD>Timezone:</TD><TD><TT>EST5EDT</TT></TD> +</TR> +<TR> + <TD>Timeskew:</TD><TD><TT>-100</TT></TD> +</TR> +<TR> + <TD>Known Good Database:</TD><TD><TT>none</TT></TD> +</TR> +<TR> + <TD>Known Bad Database:</TD><TD><TT>none</TT></TD> +</TR> +</TABLE> + +<P> +<TABLE CELLSPACING=8> +<TR> + <TD>Host Name:</TD><TD><TT>file_server</TT></TD> +</TR> +<TR> + <TD>Host Description:</TD><TD><TT>Windows File Server - Win 2k</TT></TD> +</TR> +<TR> + <TD>Timezone:</TD><TD><TT>CST6CDT</TT></TD> +</TR> +<TR> + <TD>Timeskew:</TD><TD><TT>0</TT></TD> +</TR> +<TR> + <TD>Known Good Database:</TD><TD><TT>/usr/local/forensics/hash/win2k.txt</TT></TD> +</TR> +<TR> + <TD>Known Bad Database:</TD><TD><TT>/usr/local/forensics/hash/win_hack.txt</TT></TD> +</TR> +</TABLE> + +<P> +<H3>Adding a New Image</H3> +Next, images must be added to the host. Select the host that was +just added from the Host Gallery and enter the Host Manager. Select +<U>Add Image File</U> and a new form is shown. The first text box in +the form is for the path of the image file. If you are importing a +split image, then the extension must be ordered based on the file order. +Supply a '*' in the file name extension where the numbers or letters are. +(i.e. .../image.*). The image file can be +of a full disk or of an individual partition. You must select which +it is though. Before they can analyzed, the images will have to +be located in the evidence locker. You are given a choice to either +create a symbolic link from the current location, to copy the file, +or to move the file from its current location to the host directory. +Select the desired import method. For example: + +<TABLE CELLSPACING=8> +<tr><td>Image Path:</TD><TD><TT>/mnt/sys1/disk2.*</TT></TD></TR> +<tr><td>Type:</td><td><tt>Disk</tt></td></tr> +<tr><td>Import Action:</TD><TD><TT>symlink</TT></TD></TR> +</table> + +<p> +If you are importing a split image, then the next window will confirm the +order of the images. After that, the next window will allow you to specify +or calculate the MD5 for the file. This should be of the full file and if you +are importing a split image then it should be for all files combined. +If you are importing a volume image, then Autopsy will try to determine the +file system type. You will also need to specify the mounting point. This is used for cosmetic purposes only when printing the full path of files. + +<p> +If the image file is a disk image then Autopsy will list all of the partitions and try to determine the file system in each one. You have the option to not import a partition and to change the file system type. + +<P> +<H3>MD5 Values</H3> +Each host has an <TT>md5.txt</TT> file that contains +the MD5 value for files in that directory. Autopsy uses that file +to validate the integrity of files. By default, when a file is +imported into Autopsy, its MD5 will be calculated. If it is already +known, then it can be entered in the 'Add Images' window. + + +<P> +<H3>Host Subdirectories</H3> +Each host has an <TT>images</TT> directory and an <TT>output</TT> +directory. All data generated by Autopsy is saved to the <TT>output</TT> +directory. The theory behind this design, was to allow the <TT>images</TT> +directory to have strict permissions to prevent accidently modifying +the images. Therefore, the <TT>images</TT> directory can have its write +bits removed to prevent modifications. + +<p> +<h3>References</h3> +Issue 2 of <a href="http://www.sleuthkit.org/informer/" target=\"_blank\">The Sleuth Kit Informer</a> discusses case management and how to break a disk image into file system images. + + + +<P><HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/data_mode.html b/help/data_mode.html new file mode 100644 index 0000000000..db2d20eafd --- /dev/null +++ b/help/data_mode.html @@ -0,0 +1,97 @@ +<HTML> +<HEAD><TITLE>Autopsy Data Unit Analysis Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> +<CENTER><H2>Data Unit Analysis</H2></CENTER> + + +<H3>Overview</H3> +<P> +The Data Analysis Mode allows an investigator to view the contents +of an individual data unit. Data units is a generic term used to +describe the areas on the disk that are used to store data. Each +file system calls the data unit a different thing (i.e. Fragments +or Clusters). This mode is most useful when recovering and analyzing +deleted data. + +<H3>Input</H3> +<P> +To view the contents of a specific address, enter it into the text +box on the left-hand side. By default, only one data unit will be +displayed. To view more than one consecutive unit, enter the +number in the text box below. + +<P> +It is common to extract the unallocated space from a file system +image and analyze it for deleted material. The 'blkls' tool in The +Sleuth Kit allows one to extract the data. If interesting data is +found in the 'blkls' file, the next step could be to find its location +in the original image and examine the surrounding data. To do +this, simply calculate which data unit the data was found in (by +dividing the byte offset of the interesting data by the data unit +size (which can be found in <U>Image Details</U>)). Enter that +address into the original text box and select the <U>Unallocated</U> +type. This will find the original location and display it for you. + +<P> +If Autopsy knows about the 'blkls' image, then it can be loaded at any +time by selecting the <U>Load Unallocated</U> button. Then, any +data unit in that file can be examined. + + +<P> +The <B>Lazarus</B> tool was part of <TT>TCT</TT>. It analyzes a chunk +of data and identifies what file type it is and tries to group +consecutive types together. Lazarus numbers its output though starting +with 1. Therefore, instead of subtracting 1 every time you want to view +a data unit identified by Lazarus, simply select the check box. + +<P> +Press the <U>Ok</U> button to display the contents of the address on +the right-hand side of the window. + +<P> +The <U>Allocation List</U> link displays the allocation status of +addresses in intervals of 500. + + +<H3>Viewing</H3> +<P> +After the unit address has been entered, the contents are displayed +in the right-hand side. Filters can be used to view the data in the +desired format (strings, hexdump, ASCII). + +<P> +A report can be generated so that the contents and meta-data about +it will be saved on record. To save the contents locally, press the +<U>Export Contents</U> button. The <U>Add Note</U> button will allow +one to add a comment about the given data unit so that it can be +easily recalled later. + +<P> +The file type is also displayed. This is identified by running +the output through the 'file' command in The Sleuth Kit. + + + +<P> +Autopsy will try to find the meta-data structure that allocated +the unit and display both its address and a file name. This process +is very slow for FAT file systems, so this process is not done by +default during analysis. + +<H3>FAT Notes</H3> +<P> +The Sleuth Kit and Autopsy do not use clusters when dealing with a FAT image. +Only sectors are used. The reason is because FAT does not start +addressing clusters until many sectors into the file system. If +clusters were used to address data units, then there would be no +way to address the sectors in the FAT and secondary FAT. Therefore, +sectors are used for all addresses. NTFS changed the way clusters +were addressed and do not have this problem. See the documentation +in The Sleuth Kit for more details. + + +<P> +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/file_category.html b/help/file_category.html new file mode 100644 index 0000000000..6665c90b68 --- /dev/null +++ b/help/file_category.html @@ -0,0 +1,99 @@ +<HTML> +<HEAD><TITLE>Autopsy File Category Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>File Category Type Analysis Help</H2></CENTER> + +<H3>Overview</H3> +Analyzing large file system images can be very daunting. One way +of identifying files that should be examined is to sort the files based +on file type. This mode of Autopsy will allow one to sort the files +in an image based on type and to exclude known files (i.e. data +reduction). It also allows one to flag files that are known to be bad. + +<H3>Procedure</H3> +The <TT>sorter</TT> document in the <TT>docs</TT> directory of The +Sleuth Kit has more details on the details, but this will provide +an overview of the interface given by Autopsy. + +<P> +The first step is to <U>Sort</U> the image. There are several +options to choose when doing this. The <TT>sorter</TT> tool from +The Sleuth Kit will perform the sorting. There are two major +actions that <TT>sorter</TT> can do: sort files by type and validate +extensions. + +<P> +By default, Autopsy will perform both actions. If you do not want +it to do a given action, deselect it. + + +<P>Within sorting, there are two options: + +<UL> +<LI> The first is to save the output. By default, +details about each file will be added to a category file. For +example, a JPEG image will have the meta data address and image +name saved to the <TT>images</TT> file. By selecting the <U>Save</U> +option, a directory will be created for each category and a copy +of the files will be saved. This could require lots of disk space +(as much as the original image size). + +<LI> The second option is to save unknown file types. There are +configuration files that contain rules about common data types. If +a file is encountered that does not have a rule, it is added to an +<TT>unknown</TT> file. If this is not desired, select the <U>Do Not +Save Unknown</U> option. +</UL> + +<P> +During the sorting process, the <TT>sorter</TT> tool will also examine +the extension of the file. If the file type is known, it has known +extensions, and the file does not have one of those extensions, it will +be added to a <TT>mismatch</TT> file. This can be deselected if it is +not wanted. + + +<H3>Hash Databases</H3> +One easy way of data reduction is to use hash databases. The <TT>sorter</TT> +tool can use three different hash databases. Each can be configured +within Autopsy and used in other screens. + +<UL> + <LI><B>NIST NSRL</B>: The NIST NSRL contains hashes of trusted operating + systems and programs. This is used to ignore known files. Files found + in the NSRL will not be included in the file categories (to save time + when reviewing the files). If the file is in the NSRL and has an + extension mismatch, it will be noted in a special file. + + <LI><B>Ignore Database</B>: This database must be created by the user + and added to the host. It is similar to the NSRL in that it contains + hashes of known good files. They will be ignored in the same way that + those from NSRL are. + + <LI><B>Alert Database</B>: This database must also be created by the + user and added to the host. It contains hashes of files that are + known to be bad and should identified if found in the image. This would + include known rootkits or photographs. Hits from this databases are + found in the <TT>alert</TT> file. +</UL> + +<P> +More details can be found in the <A HREF="hash_db.html">Hash +Database</A> Help. + +<H3>Output</H3> +Currently, there is no way to view the output from within Autopsy. +All data can be found in the <TT>output</TT> directory of the host. +A directory is created for the <TT>sorter</TT> output. View the +<TT>index.html</TT> file and it contains links to the other files. + +<p> +<h3>References</h3> +Issues 3, 4, and 5 of <a href="http://www.sleuthkit.org/informer/" target=\"_blank\">The +Sleuth Kit Informer</a> discussed using the 'sorter' tool. + + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/file_mode.html b/help/file_mode.html new file mode 100644 index 0000000000..ca39d1d342 --- /dev/null +++ b/help/file_mode.html @@ -0,0 +1,221 @@ +<HTML> +<HEAD><TITLE>Autopsy File Analysis Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>File Analysis</H2></CENTER> +<H3>Overview</H3> +The File Analysis mode allows one to analyze an image from the file +and directory perspective. This provides the same interface that users +typically use with a normal computer. This mode will also display +information about deleted files though. + +<P> +This mode will allow one to examine the contents of files and directories +for evidence. It even allows one to perform basic binary analysis by +extracting the ASCII strings from a binary file. The files can also +be sorted by any field. + + +<H3>Directory List</H3> +<P> +The left-hand side window has four main options: +<UL> + <li>Directory Seek + <li>File Name Search + <LI>Hide / Expand Directories + <LI>Show All Deleted Files +</UL> + +<P> +By default, the directory listing is not shown when this mode is +first entered. By select the <U>Expand Directories</U> button, +the full list of directories will be shown. The number of '+' +symbols represent the depth of the directory. As this is an HTML +interface and there is no state management occurring (no cookies +or session id), it would be difficult to have an interface where +one or more directories are expanded yet the rest are collapsed. + +<P> +Selecting the <U>All Deleted Files</U> link will display all of the deleted +files in the image on the right-hand side. + +<P> +There is a text box where a directory (or file) name can be +entered and it will be displayed on the right-hand side. This +makes it easy to jump to a directory without going through the +directory listings. For example, to seek to the 'windows\system32' +folder, you can enter that string into the box instead of scrolling +through the directories. + +<p> +There is also a text box where a pattern of a file name can be +entered and all files that match that pattern will be displayed on +the right-hand side. The search pattern is a Perl regular expression, +so some values, such as '.' or '*' will need to be escaped. The +search is done case insensitive. To find all files that have a JPG +extension, the following could be used "\.jpg". Or to find all files +that begin with a dot, then we could use "^\.". + + +<H3>Directory Contents</H3> +<P> +The window in the upper right-hand side contains the directory +contents. In a file system, a directory allocates data units on +the disk and fills the data units with structures that contain the +name of the file and the address of the meta data structure. This +view parses the file name structures in the directory. It is filled +by either selecting a directory from the left-hand side directory +list or a directory from within the same window. The entries can +be resorted by clicking on any of the header values. + +<P> +The column headers have the following definitions: +<UL> + <LI><B>del</B>: A check in this column represents a deleted file. + See below for a discussion on the different color types of deleted files. + + <LI><B>Type</B>: This column contains the "type" that the file or + directory is. There are two values. The first (<TT>dir</TT>) is the + type according to the directory entry structure. The directory entry + is where the file name is located. The second value (<TT>in</TT>) is + the type according to the meta data structure. + These should be the same except + for deleted files. They are both given to help the investigator + identify if a deleted file has been reallocated or not. For example, + if the meta data structure type is different than the file name + type, then it is likely that one of the structures was reallocated for + a new file. + + <LI><B>Name</B>: The name of the file or directory. Clicking on the + name displays file contents in the bottom window or directory contents + in the same window. For deleted files, no link will exist if the meta + data structure address + has been cleared (which many OS do). To identify the destination of + a UNIX symbolic link, + click on the address at the end of the row. Note that the name + will not be a link if the size of the file is 0 or if the meta data + structure is unknown. + + <LI><B>Modified Time</B>: This column exists for UNIX and NTFS file + systems. It shows the last time that the file data was last modified. + In other words, when was data last written to the data units allocated + by the file. In UNIX, the <TT>utimes()</TT> function can modify this + value vary easily. + + <LI><B>Written Time</B>: This column exists for FAT file systems and + is the time when the file was last written to. Of the three times, + this is the only value that is required by the FAT specification. + + <LI><B>Accessed Time</B>: This column contains the last accessed time of + the file data. On a FAT image, this value is optional and is only + accurate to the day (not hours or seconds). This value can be + modified by the utimes() function in UNIX. + + <LI><B>Changed Time</B>: This column exists for UNIX and NTFS file + systems. It is the last time that the file status (or meta data) was + changed. This is different than the Modified time because modified + deals with the file data and this deals with the descriptive data + in the inode or MFT entry. This value cannot be changed by the + <TT>utimes()</TT> function in UNIX. + + <LI><B>Created Time</B>: This column exists for NTFS and FAT file systems. It + is the time when the file was created. According to the FAT spec, + it is an optional time. + + <LI><B>Size</B>: The size of the file. Note that if the size of the + file is 0, no link will be shown with the name. + + <LI><B>UID</B>: The User ID of the file owner. + + <LI><B>GID</B>: The Group ID of the file owner. + + <LI><B>Meta Data</B>: The file name structures contain a pointer to + the meta data structure that describes the file. This column contains + the address of the structure. Selecting this value + will display the details in the bottom window. + If the value is invalid, then a link will not exist. If it is for + a deleted file name that has a meta data structure with an allocated + status, a "realloc" string will + exist to identify this. + +</UL> +The <U>Add Note</U> link allows you to make a comment about this directory and +have it saved in your personal notes file. + +<P> +The <U>Generate MD5 List</U> +link will generate the MD5 value for every file in the directory and +allow you to save it as a text file. Using fingerprint data bases, +This makes it easy to check for files that were modified by an attacker. + +<P> +The path on top of the window has hyperlinks in it that allow the +user to easily change to a previous directory. + +<P> +There are two different colors used for deleted files. The difference +is based on the status of the data structures in the file. A <FONT +COLOR="red">bright red</FONT> entry means that the file +name data structure is not allocated and the meta data structure +that it points to is also not allocated. This is what we would +expect of a recently deleted file. This means that we can trust +the data we are seeing as long as the meta data structure was not +allocated and unallocated since the deletion. If it is <FONT +COLOR="#800000">darker red</FONT>, then the meta data +structure has been reallocated and the data is most likely not +accurate. + + +<P> +The file size reported by the meta data structure is very important +with The Sleuth Kit. The Sleuth Kit uses this value to identify +how many data units to display. If this size is 0, but the meta +data structure points to data blocks still, they will not be shown. +You can force Autopsy to display the values by selecting the meta +data address and using the 'force' option. + +<P> +To look a file up in one of the <A HREF="./hash_db.html">Hash +Databases</A>, then select the meta data address. That view will +provide an interface to the databases. + +<H3>File Contents</H3> +<P> +The lower right-hand side window displays the contents of a specified +file. The contents can be viewed in either the raw format (which your +browser will not likely display much of if the file is non-ASCII) or +through 'strings'. The strings option is helpful for a quick analysis +of a binary file. + +<P> +Also shown is the file type. This is determined by running the 'file' +command on the output. It uses the magic header and footer values to +guess the file type. If the file type is an image or HTML, an option +will exist to <U>View</U> the data in its interpreted form (i.e. as +a picture or as a web page instead of the raw data). Note that +any HTML that is viewed will be processed in a sanitized environment +that does not load pictures and will not allow one to connect to a +remote site. To view the native picture, select 'Export' and open +the HTML document in another browser. Refer to issue #1 of The Sleuth +Kit Informer for more details on the sanitizing. + +<P> +The <U>Report</U> options create ASCII reports that contain the file +contents as well as data such as MD5 values and dates. + +<P> +The <U>Export</U> button extracts the file out of the image so you can save it +locally and use other tools on it. + +<P> +The <U>Add Note</U> button adds a personal note to the investigator log for +future reference. + +<p> +<h3>References</h3> +Issue 1 of <a href="http://www.sleuthkit.org/informer/" target=\"_blank\">The Sleuth +Kit Informer</a>. + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/fs_mode.html b/help/fs_mode.html new file mode 100644 index 0000000000..ef8ec4d760 --- /dev/null +++ b/help/fs_mode.html @@ -0,0 +1,46 @@ +<HTML> +<HEAD><TITLE>Autopsy Image Details Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Image Details</H2></CENTER> + +<P> +<H3>Overview</H3> +Sometimes there are details about an image that do not correspond to +any file in particular. Those details can likely be found in this +mode. This mode gives the general details of the image and therefore +the contents will vary depending on the file system type. + +<P> +<H3>FFS & EXT2FS</H3> +For the UNIX file systems, this mode will contain the details from +the super block. This generally includes times that the file system +was last mounted and any special flags. It also has the range of +inode addresses and fragment addresses. For advanced file recovery, +you can also identify the group layout and on-disk structure details. +These could be useful for restricting where you search for data. +Files will allocate blocks and fragments in the same Cylinder or +Block group as their inode is in, so your attention can be restricted +to that area. + + +<P> +<H3>FAT</H3> +For FAT file systems, this mode will contain the File Allocation +Table. It will have the cluster runs, which can be selected to +view their contents in <A HREF="data_mode.html">data unit</A> +analysis mode. Or, if the file is fragmented, the pointer can +be selected and the screen will link to the next cluster chain. + + +<P> +<H3>NTFS</H3> +The unique information for an NTFS image is the numerical type +associated with attributes. These values can be dynamic and this +area will identify what they are for that file system. + + +<P> +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/general.html b/help/general.html new file mode 100644 index 0000000000..5d20c6bbde --- /dev/null +++ b/help/general.html @@ -0,0 +1,103 @@ +<HTML> +<HEAD><TITLE>General Autopsy Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>General Autopsy Help</H2></CENTER> +<P> +The Autopsy Forensic Browser is a graphical interface to command +line forensics tools and standard UNIX utilities. It allows +you to perform volume and file system analysis on UNIX and Windows systems. + +<P> +All data are saved in a directory in the Evidence Locker, which +was specified at install time or at run time. See +<A HREF="caseman.html">Case Management</A> +for more information. In the normal mode, Autopsy imports an +image file from a disk or partition. In the live mode, Autopsy +can analyze a running system and does not save any data to the +local disk. + + +<P> +The browser has the following modes: +<UL> + +<LI> +<B><A HREF="file_mode.html">Files</A></B>: +Allows you to browse the image file as a file system and view the +contents of files and directories. This mode even shows deleted +file names and Alternate Data Streams in NTFS images. You can sort +the files and directories on meta data. + +<LI><B><A HREF="meta_mode.html"> +Meta Data</A></B>: +Allows you to analyze the image file by examining the meta data structures. +The address of a structure is entered and the details are shown. +This mode is useful for examining unallocated structures and getting +all details about allocated files (including all data units and +other information such as MD5 value). + + +<LI><B><A HREF="data_mode.html"> +Data Unit</A></B>: +Allows browsing by block number. This is most useful when used +with searching or meta data browsing. The contents of the block +can be displayed in ASCII, hex dump, or through <I>strings(1)</I>. +The meta data structure that has allocated the block will be +displayed (if any) along with the file name (if any). + + +<LI><B><A HREF="srch_mode.html"> +Keyword Search </A></B>: +Search an image file using <I>grep(1)</I> for a given string or regular +expression. The result will be a list of data units that have the +string. Each data unit can be selected to view the contents. + + +<LI><B><A HREF="fs_mode.html"> +Image Details</A></B>: +List the details about the file or volume system. The output of +this mode depends on the file system. Examples of the file system +data include the last mount time, the last mount location, and a +detailed break down of block group information or File Allocation +Table contents. + +<LI><B><A HREF="int_mode.html"> +Image Integrity</A></B>: +The integrity of the data can be validated at any +point by selecting this mode. It uses the values in <TT>md5.txt</TT> to +identify if any data have been modified in the analysis process. + +<LI><B><A HREF="tl.html"> +File Activity Timelines</A></B>: +Autopsy can create timelines of file activity based on the Modified, +Access, and Change (Create in FAT/NTFS) times (MAC). The timeline +will contain details about deleted and allocated content. The +resulting timeline can be either viewed within Autopsy or using +other text viewing tools (WARNING: many HTML browsers do not handle +large tables like a timeline very well so using a text editor is +recommended). + +<LI><B><A HREF="file_category.html"> +File Type Categories</A></B>: +Autopsy can sort the files in an image file based on their file type. +For example, all JPEG and GIF files would be identified as images +and all executable files would be identified. This mode will also +ignore files that are found in hash databases of known good files, +identify files that are found in a hash database of known bad files, +and identify files that have an extension that is not consistent +with their file type. + + +<LI><B>Report Generation</B>: +Each of the above browsing techniques allows a report to be generated. +This report lists the date, md5 value, investigator, and other +context information in a text format. This can be used for record +keeping when deleted blocks of data have been found. + +</UL> + + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/grep.html b/help/grep.html new file mode 100644 index 0000000000..1db6060075 --- /dev/null +++ b/help/grep.html @@ -0,0 +1,70 @@ +<HTML> +<HEAD><TITLE>Autopsy grep Cheat Sheet</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>grep Cheat Sheet</H2></CENTER> + +<H3>Escaped Values</H3> +Autopsy uses the <TT>grep</TT> utility to search an image. grep requires +that some values be "escaped" if they are searched for. Autopsy +will automatically escape those values if the serach is being done for +a <U>non-regular expression</U>. The escaped values include: +<UL> + <LI>\ + <LI>. + <LI>[ + <LI>^ + <LI>$ + <LI>' + <LI>* + <LI>initial - +</UL> + + +<H3>Regular Expressions</H3> +Refer to the man page for 'grep' for more details of creating regular +expressions. Autopsy uses the '-E' flag with 'grep' to specify +extended regular expressions. The following have special meaning +with grep: + +<UL> + <LI><B>[A-Za-z]</B>: Any lower and upper case letter + <LI><B>[:alpha:]</B>: same as above + <LI><B>[0-9]</B>: Any number + <LI><B>[:digit:]</B>: same as above + <LI><B>[0-9A-Za-z]</B>: Any lower and upper case letter or digit + <LI><B>[:alnum:]</B>: same as above + <LI><B>[:space:]</B>: Any white space +</UL> + + +<P> +To specify how many times something can occur, the following are used: +<UL> + <LI><B>?</B>: Optional and can only occur once + <LI><B>*</B>: Optional and can occur more than once + <LI><B>+</B>: Required and can occur more than once +</UL> + +<P> +To specify more than one string to match, use the <B>|</B> operator. + +<H3>Examples</H3> + +<P> +To search for 'Jane Smith' or 'Jack Smith': (Jane)|(Jack) Smith + +<P> +To ensure it matches if a tab is between the first and last name: +(Jane)|(Jack)[:space:]Smith + +<P> +To search for 'Jane Smith' or 'Jane Anne Smith': +Jane( Anne)? Smith + +<P> +or: Jane([:space:]Anne)?[:space:]Smith + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/grep_lim.html b/help/grep_lim.html new file mode 100644 index 0000000000..d8a29d27e5 --- /dev/null +++ b/help/grep_lim.html @@ -0,0 +1,75 @@ +<HTML> +<HEAD><TITLE>Autopsy grep Search Limitations</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2><TT>grep</TT> Search Limitations</H2></CENTER> + +<H3>Overview</H3> +<P> +Keyword searches are very basic in Autopsy. Autopsy uses the +<TT>strings</TT> and <TT>grep</TT> tools on the image and when a +hit is found, it uses <TT>ifind</TT> and <TT>ffind</TT> to identify +the file that has allocated the string. This is a very simple and +basic method of searching and is not ideal. This will cause false +positives and will miss data that crosses a fragmented part of a file. +The limitations are outlined in this file. + +<H3>What Will Be Found</H3> +<TT>strings</TT> is first run on the image and the data is passed +to <TT>grep</TT> to do the actual search. This process will find +ASCII and UNICODE strings that are consecutive anywhere in the file. This is +frequently referred to as the physical layout. For example, it +will find strings in the middle of an allocated sector, in an +unallocated sector, in slack space, and in meta data strutures. +This will find a string that crosses sectors, which is good if the +two sectors are for the same file. + +<P> +This technique leads to several types of false positives. For example, +a string that crosses from the allocated space of a file into the slack +space would be found by <TT>grep</TT>. A string that starts in the slack space +and ends in the allocated space of a file will also be found. A string +that crosses sectors of two different allocated files will also be found. The +user must identify if the hit is an actual hit or a false positive. + +<h3>What Will Be Found, but May Be Confusing</h3> +<p> +If you are searching with regular expressions, then the exact +location and number of hits may not be correctly reported. If the +count is incorrect, then it will be too small. If the location +is incorrect, then it will be too early (and could even be in the +next data unit). The reason that this is in accurate is because +the <tt>grep</tt> tool will return a long string to Autopsy that +will contain one or more occurances of the keyword. Autopsy can +not search the long string to find the exact number and location +of the regular expression keywords like it can for non-regular +expression keywords, so it returns only the starting location of +the long string. + +<H3>What Will NOT Be Found</H3> +The biggest category of 'hits' that will not occur using this technique +is strings in a file that cross fragmented data units. For example, consider +a file that has two clusters allocated, cluster 100 and cluster 150. A +string "mississippi" could have "missi" in the final 5 bytes of cluster 100 +and "ssippi" in the initial 6 bytes of cluster 150. The string exists from +the logial level, but not at the physical level. Therefore, the <TT>grep</TT> +search would not find the string. + +<P> +Although not because of <TT>grep</TT>, Autopsy will also not find +data in the slack space during an unallocated-only search. The +extraction tool for The Sleuth Kit (<TT>blkls</TT>) differentiates +between unallocated sectors in FAT and NTFS and slack space. There +is currently no way in Autopsy to extract the slack space and search +it. Autopsy currently only extracts the unallocated sectors and not +the allocated sectors that may have deleted data in them. + + +<H3>Conclusion</H3> +Autopsy has basic keyword search functionality. Future versions may provide +more features and better search results. In the mean time, it is important +that users understand the abilities and limitations of the tool so that they +can be taken into account during the investigation. +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/hash_db.html b/help/hash_db.html new file mode 100644 index 0000000000..cddb793866 --- /dev/null +++ b/help/hash_db.html @@ -0,0 +1,141 @@ +<HTML> +<HEAD><TITLE>Autopsy Hash Database Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Hash Database Help</H2></CENTER> + +<H3>Overview</H3> +Hash databases are used to quickly identify known good and known +bad files using the MD5 or SHA-1 checksum value. Autopsy uses +three types of hash databases to help the investigator reduce the +number of files that they have to look at. + +<P> +The <B>NIST National Software Reference Library (NSRL)</B> contains +hashes of files that are found in operating systems and software +distributions. These files are <I>known to be good</I> in that they came +from trusted sources and are typically on authorized systems. When +processing files in the image, this database can be used to ignore +files because they are assumed to be known and therefore uninteresting. +The location of this database is configured when Autopsy is installed. +The NSRL must be obtained from NIST at <TT>www.nsrl.nist.gov</TT>. + +<P> +The <B>Ignore Database</B> is a database that the investigator must +create. It is similar to the NIST NSRL in that it contains files +that are <I>known to be good</I> and can be ignored if the user +chooses to do so (only applicable when in <A HREF="file_category.html">File +Type Category Analysis</A>). Examples of files in this category include +system binaries for standard builds. See <A HREF="#db_create">Database +Creation</A> for information on creating this database. Its location +is configured when the host is created and can be edited in the +host configuration file. + +<P> +The <B>Alert Database</B> is a database that the investigator must +create. It contains hashes of <I>known bad</I> files. These are +the files that an investigator wants to know about if they exist +on the system. Examples of this include rootkits or unauthorized +photographs. +When using the <A HREF="file_category.html">File Type Category +Analysis</A>, these files will be saved in a special file. See <A +HREF="#db_create">Database Creation</A> for information on creating +this database. Its location is configured when the host is created +and can be edited in the host configuration file. + + +<H3>Database Uses</H3> +Autopsy uses the hash databases in three ways. + +<UL> + <LI><B><A HREF="file_category.html">File Type Category Analysis</A></B>: The + hash databases are used to identify the <I>known bad</I> files and + ignore the <I>known good</I> files. + + <LI><B><A HREF="meta_mode.html">Meta Data Analysis</A></B>: The hash + databases can be used to identify a file from the meta data view. If + the databases are configured, the hash from a given file can be looked + up by pressing the 'lookup' button. + All three databases can be used in this view. This view can be found + from the File Analysis mode by selecting the meta data address in + the directory listing window. + + <LI><B>Hash Database Manager</B>: From the Host Gallery view, + the Hash Database Manager can be entered. This is where one can + re-index the databases and perform single lookups in any of the + databases. +</UL> + + +<A NAME="db_create"> +<H3>Database Creation</H3> +Currently, Autopsy will only allows one to look entries up in a +hash database. It does not allow one to easily create a database, +but this will describe the process (it is quite simple). + +<P> +Autopsy uses the <TT>hfind</TT> tool from The Sleuth Kit to do the +lookups. This tool requires the database to be indexed so that it +can perform a fast lookup using a binary search algorithm (instead +of a slower sequential search that a tool like grep would do). +When ever a hash database is updated (or created), it must be +indexed. This can be done in Autopsy in the Hash Database Manager +(Note that the database must already be configured though). + +<P> +The NIST NSRL obviously does not have to be created, but it does have +to be indexed before it is used. + +<P> +To make a hash database, we will create a file with the same format +as the <TT>md5sum</TT> command uses. This is just the MD5 hash, +some white space, and the file name. For example:<BR> + + <TT>c4a6761b486de3c6abf7cf2c554289e5 + /bin/ps</TT><P> + +Make a file with this format for every line (it does not have to +be sorted). For example, if you have a trusted system then you can make +a hash database of its system binaries using the following:<BR> + + <TT># md5sum /bin/* /sbin/* > bin-md5.db</TT><P> + +After creation, hash databases must be indexed and sorted (this +includes the NSRL). Databases will be indexed by using the +<TT>hfind</TT> tool. The NSRL database would be indexed with:<BR> + + <TT># hfind -i nsrl-md5 PATH_TO_NSRL/NSRLFile.txt</TT><P> + +A database made by <TT>md5sum</TT> would be indexed with:<BR> + + <TT># hfind -i md5sum bin-md5.db</TT><P> + +Or, if Autopsy has this file configured from when the host was added, +then it can be re-indexed from the Hash Database Manager. + +<H3>Autopsy Configuration</H3> +The alert and ignore databases are stored in the host configuration file +with the headers of 'exclude_db' and 'alert_db'. For example:<BR> + + <TT>alert_db '/usr/local/hash/bad.db'</TT><P> +These entries can be edited at any time. + +<P> +The NSRL database is configured in the <TT>conf.pl</TT> file in the +directory where Autopsy was installed. It has the $NSRLDB variable. +For example:<BR> + + <TT>$NSRLDB = '/usr/local/hash/nsrl/NSRLFile.txt';</TT><P> + +It can be edited, added, and removed at any time (but you must restart +Autopsy). + + +<p> +<h3>References</h3> +Issues 6 and 7 of <a href="http://www.sleuthkit.org/informer/" target=\"_blank\">The +Sleuth Kit Informer</a> discussed hash databases. + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/index.html b/help/index.html new file mode 100644 index 0000000000..c7c46aec4f --- /dev/null +++ b/help/index.html @@ -0,0 +1,11 @@ +<HTML> +<HEAD><TITLE>Autopsy Help</TITLE></HEAD> +<LINK REL="SHORTCUT ICON" HREF="../pict/favicon.ico"> +<FRAMESET COLS="20%,*"> + + <FRAME SRC="menu.html"> + <FRAME SRC="blank.html" NAME="cont"> + +</FRAMESET> + +</HTML> diff --git a/help/int_mode.html b/help/int_mode.html new file mode 100644 index 0000000000..5152b95ad0 --- /dev/null +++ b/help/int_mode.html @@ -0,0 +1,29 @@ +<HTML> +<HEAD><TITLE>Autopsy Integrity Check Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Integrity Check</H2></CENTER> + +<H3>Overview</H3> +It is always important to validate the integrity of images during +an analysis. Autopsy uses the MD5 algorithm to validate images +and other files that are created by Autopsy. + +<P> +The <TT>md5.txt</TT> files contain the MD5 values for files in that +directory. Values are added to it when file system images are +imported into the system or when Autopsy creates the file. This mode +allows one to calculate the MD5 value if it was not created before +and to validate the integrity. + +<P> +When the <U>Image Integrity</U> button is selected from the <U>Host +Manager</U> window, all files will be shown with their MD5 value +if known. Here any image can have its value verified or a new one +created. + + +<P> +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/menu.html b/help/menu.html new file mode 100644 index 0000000000..8b74a86594 --- /dev/null +++ b/help/menu.html @@ -0,0 +1,37 @@ +<HTML> +<HEAD><TITLE>Autopsy Help Topics</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<P><A HREF="general.html" TARGET="cont">General Information</A> + +<P><A HREF="caseman.html" TARGET="cont">Case Management</A> + +<HR> + +<P><A HREF="file_mode.html" TARGET="cont">File Analysis</A> + +<P><A HREF="meta_mode.html" TARGET="cont">Meta Data Analysis</A> + +<P><A HREF="data_mode.html" TARGET="cont">Data Unit Analysis</A> + +<P><A HREF="fs_mode.html" TARGET="cont">Image Details</A> + +<P><A HREF="srch_mode.html" TARGET="cont">Keyword Searching</A> + +<P><A HREF="grep.html" TARGET="cont">grep Cheat Sheet</A> + +<P><A HREF="grep_lim.html" TARGET="cont">grep Search Limitations</A> + +<P><A HREF="tl.html" TARGET="cont">Timelines</A> + +<P><A HREF="sequencer.html" TARGET="cont">Event Sequencer</A> + +<P><A HREF="file_category.html" TARGET="cont">File Type Categories</A> + +<P><A HREF="hash_db.html" TARGET="cont">Hash Databases</A> + +<P><A HREF="int_mode.html" TARGET="cont">Image Integrity</A> + +<P><A HREF="timezones.html" TARGET="cont">Time Zones</A> + +</BODY></HTML> diff --git a/help/meta_mode.html b/help/meta_mode.html new file mode 100644 index 0000000000..3a7475f713 --- /dev/null +++ b/help/meta_mode.html @@ -0,0 +1,93 @@ +<HTML> +<HEAD><TITLE>Autopsy Metadata Analysis Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Metadata Analysis</H2></CENTER> +<H3>Overview</H3> +The Metadata Analysis mode allows the investigator to view the +details of metadata structures. The metadata structures on the +on-disk structures that contain the details of a file, such as +times and pointers to the allocated data units. FFS and EXT2FS +file systems call them inode structures, NTFS file systems call +them Master File Table (MFT) entries (or File Entries), and the +FAT file system calls them directory entries. This mode is useful +for recovering data and getting a detailed look at a file. + +<H3>Input</H3> +To view the contents of a structure, enter the address in the text +box on the left and select <U>Display</U>. + +<P> +The <U>Allocation List</U> button can also be used to view the +allocation status of metadata structures in groups of 500. + +<H3>Viewing</H3> +The structure details are displayed on the right-hand side. +Typically, the metadata structure does not have the name of the +file that uses that structure, so Autopsy will try to locate the +file name. This process is slow with a FAT file system, so it is +not done by default. + +<P> +The <U>File Type</U> is given, which is the output of the 'file' +tool. This tool uses any header information in the file to +guess what its type is. The MD5 value of the file is also given. + +<P> +If Autopsy has been configured to use hash databases, then one can +select which databases to look for the file in. See +<A HREF="hash_db.html">Hash Databases</A> for more details. + +<P> +The rest of the information will vary depending on the file +system type. In general, the allocation status will be given as +well as the size and each data unit that it has allocated. A +link will exist for each data unit that will show its contents. + +<P> +The <U>Report</U> option generates an ASCII report with the structure +details, MD5 values, and dates in it. The <U>View Contents</U> option +displays the allocated data contents as one large file. The <U>Export</U> +option allows one to save the data contents to a file. The +<U>Add Note</U> button allows one to add a comment about this structure so +that it can be later recalled. + +<H3>NTFS Notes</H3> +<P> +NTFS is a much different design than UNIX file systems and the meta +data structures are addressed differently. They typically have +the form of <TT>A-B-C</TT>, <TT>88-128-3</TT> for example. The +<TT>A</TT> value is the address of the file in the Master File +Table, 88 for example. This is similar to the inode value in UNIX. +Each file has several attributes, including at least one in files +for the data. The <TT>B</TT> value is the type of attribute. In +most cases, the data attribute has a type of 128 so this is commonly +seen. But, if you want to see the file name attribute, you could +specify that type and see the contents if you like (it is fairly +boring). The final value, <TT>C</TT>, is the id. Every attribute +has a unique id value. So, if there are multiple attributes with +the same type, you can specify the type. + +<H3>FAT Notes</H3> +<P> +FAT does not give addresses to the directory entry structures. in +FAT, directory entries can be stored anywhere on the disk. They +are stored in the clusters allocated to the parent directory. This +is unlike NTFS or UNIX where the structures are in a large table +that does not move. get around that, + + +<P> +The addressing issue was solved by providing an address to every +32-byte area in the Data Area. Whether that data was currently a +directory entry or not. This makes it easy to find a given address +and scale when new files are created. The downside is that not +every address is possible, so it is likely that you will see jumps +in the address values. See the documentation in The Sleuth Kit +for more details. + + +<P> +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/sequencer.html b/help/sequencer.html new file mode 100644 index 0000000000..6afb01e3e7 --- /dev/null +++ b/help/sequencer.html @@ -0,0 +1,49 @@ +<HTML> +<HEAD><TITLE>Autopsy Event Sequencer Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Event Sequencer</H2></CENTER> + +<H3>Overview</H3> +<P> +In many investigations, evidence is not found in the order that it was +created during the incident. The notes feature in Autopsy allows one to +make notes about certain files, but it does not help one to put a +series of events in order. + +<P> +The Event Sequencer allows the investigator to make notes and comments +about pieces of evidence. Each note must have a time associated with +it. For files and meta data, the times can be one or more of the +MAC times. Other notes can have times entered manually. The sequencer +will sort the events after each is entered so that the investigator can +quickly identify where there are gaps in the findings. + +<H3>Adding an Event</H3> +<P> +To add an event for a file, directory, or meta data structure, select +the <U>Add Note</U> button. At the bottom will be check boxes that allow +an event to be generated for each of the file's times. The "standard" +note does not have to be generated if it is not needed. + +<P> +To add an event from a different source, go to the Event Sequencer from +the Host Gallery (where the images are listed). At the bottom of +the window will be an area where the new event can be added. The +<B>Source</B> of the event will be shown where the file name of +a file event is normally shown. Examples of this type include +entries from firewall logs or reports from the help desk. + +<H3>Viewing the Sequence Events</H3> +<P> +The <U>Event Sequencer</U> button can be found in the Host Gallery. +This window shows the events that are sorted by the time. Events that +correspond to a file, directory, or meta data structure will have either +[M-Time], [A-Time], or [C-Time] in the note that shows what time this +event was generated from. Clicking on the name will show the contents of +the file or directory. + + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/srch_mode.html b/help/srch_mode.html new file mode 100644 index 0000000000..43b65791be --- /dev/null +++ b/help/srch_mode.html @@ -0,0 +1,68 @@ +<HTML> +<HEAD><TITLE>Autopsy Keyword Search Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + + +<CENTER><H2>Keyword Search</H2></CENTER> +<H3>Overview</H3> +<P> +This mode searches an image for a given string. This is most useful +when searching for deleted content. To decrease the time required +for a search, a "strings" file can serve as an index. This file +will contain only the ASCII strings in the image. + +<P> +Autopsy will also prompt you to create a file of unallocated data if one +does not exist. This obviously is useful for recovering deleted data. +If a string is found in this file, Autopsy will also report the location +in the original image. + +<H3>Entering the String</H3> + +Enter the string or regular expression into the text box. Autopsy +allows you to search for a either a specific string or using 'grep' +style regular expressions. A case insensitive search will occur +if the appropriate box is checked, otherwise it is case sensitive. +You will also have the option of searching for the string as an +ASCII or a Unicode string. Unicode is much more common in Windows +systems than Unix systems. If both types are selected, then two +searches will be done. + +<P> +If you have not generated a strings file or unallocated data file yet, +that option will exist. + +<P> +The <U>Load Unallocated Image</U> or <U>Load Allocated Image</U> button +exists to switch between the two file types if they have both been +generated. + +<P> +Autopsy also has the ability to perform pre-configured searches. They +are shown in the "Predefined Searches" section. + +<H3>Viewing the Results</H3> +After the image has been searched, a list of "hits" will appear on the +left-hand side. Each data unit that contains the string is listed with +the offset of each occurrence. If a regular expression is used, then the +exact location is not given. + +<P> +If the search was done on an unallocated data file, then an option will +exist next to each address to also view the original. Doing so could +reveal the inode that allocated it. + +<H3>Previous Searches</H3> +The search results are saved to a file so it is easy to recall the +results with out having to perform the search again. + +<H3>Regular Expressions</H3> +You can use grep regular expressions in the search +(refer to the 'grep' <A HREF="grep.html"> +help page</A> and man page for more details). To search for +a couple of different words you would use: <TT>(foo) | (bar)</TT>. + + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/temp.html b/help/temp.html new file mode 100644 index 0000000000..c3a4b95ee9 --- /dev/null +++ b/help/temp.html @@ -0,0 +1,10 @@ +<HTML> +<HEAD><TITLE>Autopsy File Analysis Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + + + + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/timezones.html b/help/timezones.html new file mode 100644 index 0000000000..6fa95b7c21 --- /dev/null +++ b/help/timezones.html @@ -0,0 +1,508 @@ +<HTML> +<HEAD><TITLE>Autopsy File Analysis Help - Time zone</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<p> + +When creating a host, you can specify a time zone. If you do not, it will default to the time zone to which your system is set. If the system being investigated came from a different time zone, then you need to figure out what it was called. Below are a list of time zones that are known by most computers. + +<p><br> +This list was copied from this site: +<tt>http://showtunepink.com/ical/TIMEZONES</tt> + +<pre> + +Africa/Addis_Ababa +Africa/Algiers +Africa/Asmera +Africa/Bangui +Africa/Blantyre +Africa/Brazzaville +Africa/Bujumbura +Africa/Cairo +Africa/Ceuta +Africa/Dar_es_Salaam +Africa/Djibouti +Africa/Douala +Africa/Gaborone +Africa/Harare +Africa/Johannesburg +Africa/Kampala +Africa/Khartoum +Africa/Kigali +Africa/Kinshasa +Africa/Lagos +Africa/Libreville +Africa/Luanda +Africa/Lubumbashi +Africa/Lusaka +Africa/Malabo +Africa/Maputo +Africa/Maseru +Africa/Mbabane +Africa/Mogadishu +Africa/Nairobi +Africa/Ndjamena +Africa/Niamey +Africa/Porto-Novo +Africa/Tripoli +Africa/Tunis +Africa/Windhoek +America/Adak +America/Anchorage +America/Anguilla +America/Antigua +America/Araguaina +America/Aruba +America/Asuncion +America/Atka +America/Barbados +America/Belem +America/Belize +America/Boa_Vista +America/Bogota +America/Boise +America/Buenos_Aires +America/Cambridge_Bay +America/Cancun +America/Caracas +America/Catamarca +America/Cayenne +America/Cayman +America/Chicago +America/Chihuahua +America/Cordoba +America/Costa_Rica +America/Cuiaba +America/Curacao +America/Dawson +America/Dawson_Creek +America/Denver +America/Detroit +America/Dominica +America/Edmonton +America/Eirunepe +America/El_Salvador +America/Ensenada +America/Fort_Wayne +America/Fortaleza +America/Glace_Bay +America/Godthab +America/Goose_Bay +America/Grand_Turk +America/Grenada +America/Guadeloupe +America/Guatemala +America/Guayaquil +America/Guyana +America/Halifax +America/Havana +America/Hermosillo +America/Indiana/Indianapolis +America/Indiana/Knox +America/Indiana/Marengo +America/Indiana/Vevay +America/Indianapolis +America/Inuvik +America/Iqaluit +America/Jamaica +America/Jujuy +America/Juneau +America/Kentucky/Louisville +America/Kentucky/Monticello +America/Knox_IN +America/La_Paz +America/Lima +America/Los_Angeles +America/Louisville +America/Maceio +America/Managua +America/Manaus +America/Martinique +America/Mazatlan +America/Mendoza +America/Menominee +America/Merida +America/Mexico_City +America/Miquelon +America/Monterrey +America/Montevideo +America/Montreal +America/Montserrat +America/Nassau +America/New_York +America/Nipigon +America/Nome +America/Noronha +America/Panama +America/Pangnirtung +America/Paramaribo +America/Phoenix +America/Port-au-Prince +America/Port_of_Spain +America/Porto_Acre +America/Porto_Velho +America/Puerto_Rico +America/Rainy_River +America/Rankin_Inlet +America/Recife +America/Regina +America/Rio_Branco +America/Rosario +America/Santiago +America/Santo_Domingo +America/Sao_Paulo +America/Scoresbysund +America/Shiprock +America/St_Johns +America/St_Kitts +America/St_Lucia +America/St_Thomas +America/St_Vincent +America/Swift_Current +America/Tegucigalpa +America/Thule +America/Thunder_Bay +America/Tijuana +America/Tortola +America/Vancouver +America/Virgin +America/Whitehorse +America/Winnipeg +America/Yakutat +America/Yellowknife +Antarctica/Casey +Antarctica/Davis +Antarctica/DumontDUrville +Antarctica/Mawson +Antarctica/McMurdo +Antarctica/Palmer +Antarctica/South_Pole +Antarctica/Syowa +Antarctica/Vostok +Arctic/Longyearbyen +Asia/Aden +Asia/Almaty +Asia/Amman +Asia/Anadyr +Asia/Aqtau +Asia/Aqtobe +Asia/Ashgabat +Asia/Ashkhabad +Asia/Baghdad +Asia/Bahrain +Asia/Baku +Asia/Bangkok +Asia/Beirut +Asia/Bishkek +Asia/Brunei +Asia/Calcutta +Asia/Chungking +Asia/Colombo +Asia/Dacca +Asia/Damascus +Asia/Dhaka +Asia/Dili +Asia/Dubai +Asia/Dushanbe +Asia/Gaza +Asia/Harbin +Asia/Hong_Kong +Asia/Hovd +Asia/Irkutsk +Asia/Istanbul +Asia/Jakarta +Asia/Jayapura +Asia/Jerusalem +Asia/Kabul +Asia/Kamchatka +Asia/Karachi +Asia/Kashgar +Asia/Katmandu +Asia/Krasnoyarsk +Asia/Kuala_Lumpur +Asia/Kuching +Asia/Kuwait +Asia/Macao +Asia/Magadan +Asia/Manila +Asia/Muscat +Asia/Nicosia +Asia/Novosibirsk +Asia/Omsk +Asia/Phnom_Penh +Asia/Pyongyang +Asia/Qatar +Asia/Rangoon +Asia/Riyadh +Asia/Riyadh87 +Asia/Riyadh88 +Asia/Riyadh89 +Asia/Saigon +Asia/Samarkand +Asia/Seoul +Asia/Shanghai +Asia/Singapore +Asia/Taipei +Asia/Tashkent +Asia/Tbilisi +Asia/Tehran +Asia/Tel_Aviv +Asia/Thimbu +Asia/Thimphu +Asia/Tokyo +Asia/Ujung_Pandang +Asia/Ulaanbaatar +Asia/Ulan_Bator +Asia/Urumqi +Asia/Vientiane +Asia/Vladivostok +Asia/Yakutsk +Asia/Yekaterinburg +Asia/Yerevan +Atlantic/Azores +Atlantic/Bermuda +Atlantic/Canary +Atlantic/Cape_Verde +Atlantic/Faeroe +Atlantic/Jan_Mayen +Atlantic/Madeira +Atlantic/South_Georgia +Atlantic/Stanley +Australia/ACT +Australia/Adelaide +Australia/Brisbane +Australia/Broken_Hill +Australia/Canberra +Australia/Darwin +Australia/Hobart +Australia/LHI +Australia/Lindeman +Australia/Lord_Howe +Australia/Melbourne +Australia/NSW +Australia/North +Australia/Perth +Australia/Queensland +Australia/South +Australia/Sydney +Australia/Tasmania +Australia/Victoria +Australia/West +Australia/Yancowinna +Brazil/Acre +Brazil/DeNoronha +Brazil/East +Brazil/West +CET +CST6CDT +Canada/Atlantic +Canada/Central +Canada/East-Saskatchewan +Canada/Eastern +Canada/Mountain +Canada/Newfoundland +Canada/Pacific +Canada/Saskatchewan +Canada/Yukon +Chile/Continental +Chile/EasterIsland +Cuba +EET +EST +EST5EDT +Egypt +Eire +Etc/GMT+1 +Etc/GMT+10 +Etc/GMT+11 +Etc/GMT+12 +Etc/GMT+2 +Etc/GMT+3 +Etc/GMT+4 +Etc/GMT+5 +Etc/GMT+6 +Etc/GMT+7 +Etc/GMT+8 +Etc/GMT+9 +Etc/GMT-1 +Etc/GMT-10 +Etc/GMT-11 +Etc/GMT-12 +Etc/GMT-13 +Etc/GMT-14 +Etc/GMT-2 +Etc/GMT-3 +Etc/GMT-4 +Etc/GMT-5 +Etc/GMT-6 +Etc/GMT-7 +Etc/GMT-8 +Etc/GMT-9 +Europe/Amsterdam +Europe/Andorra +Europe/Athens +Europe/Belfast +Europe/Belgrade +Europe/Berlin +Europe/Bratislava +Europe/Brussels +Europe/Bucharest +Europe/Budapest +Europe/Chisinau +Europe/Copenhagen +Europe/Dublin +Europe/Gibraltar +Europe/Helsinki +Europe/Istanbul +Europe/Kaliningrad +Europe/Kiev +Europe/Lisbon +Europe/Ljubljana +Europe/London +Europe/Luxembourg +Europe/Madrid +Europe/Malta +Europe/Minsk +Europe/Monaco +Europe/Moscow +Europe/Nicosia +Europe/Oslo +Europe/Paris +Europe/Prague +Europe/Riga +Europe/Rome +Europe/Samara +Europe/San_Marino +Europe/Sarajevo +Europe/Simferopol +Europe/Skopje +Europe/Sofia +Europe/Stockholm +Europe/Tallinn +Europe/Tirane +Europe/Tiraspol +Europe/Uzhgorod +Europe/Vaduz +Europe/Vatican +Europe/Vienna +Europe/Vilnius +Europe/Warsaw +Europe/Zagreb +Europe/Zaporozhye +Europe/Zurich +GB +GB-Eire +GMT +HST +Hongkong +Indian/Antananarivo +Indian/Chagos +Indian/Christmas +Indian/Cocos +Indian/Comoro +Indian/Kerguelen +Indian/Mahe +Indian/Maldives +Indian/Mauritius +Indian/Mayotte +Indian/Reunion +Iran +Israel +Jamaica +Japan +Kwajalein +Libya +MET +MST +MST7MDT +Mexico/BajaNorte +Mexico/BajaSur +Mexico/General +Mideast/Riyadh87 +Mideast/Riyadh88 +Mideast/Riyadh89 +NZ +NZ-CHAT +Navajo +PRC +PST8PDT +Pacific/Apia +Pacific/Auckland +Pacific/Chatham +Pacific/Easter +Pacific/Efate +Pacific/Enderbury +Pacific/Fakaofo +Pacific/Fiji +Pacific/Funafuti +Pacific/Galapagos +Pacific/Gambier +Pacific/Guadalcanal +Pacific/Guam +Pacific/Honolulu +Pacific/Johnston +Pacific/Kiritimati +Pacific/Kosrae +Pacific/Kwajalein +Pacific/Majuro +Pacific/Marquesas +Pacific/Midway +Pacific/Nauru +Pacific/Niue +Pacific/Norfolk +Pacific/Noumea +Pacific/Pago_Pago +Pacific/Palau +Pacific/Pitcairn +Pacific/Ponape +Pacific/Port_Moresby +Pacific/Rarotonga +Pacific/Saipan +Pacific/Samoa +Pacific/Tahiti +Pacific/Tarawa +Pacific/Tongatapu +Pacific/Truk +Pacific/Wake +Pacific/Wallis +Pacific/Yap +Poland +Portugal +ROC +ROK +Singapore +SystemV/AST4 +SystemV/AST4ADT +SystemV/CST6 +SystemV/CST6CDT +SystemV/EST5 +SystemV/EST5EDT +SystemV/HST10 +SystemV/MST7 +SystemV/MST7MDT +SystemV/PST8 +SystemV/PST8PDT +SystemV/YST9 +SystemV/YST9YDT +Turkey +US/Alaska +US/Aleutian +US/Arizona +US/Central +US/East-Indiana +US/Eastern +US/Hawaii +US/Indiana-Starke +US/Michigan +US/Mountain +US/Pacific +US/Samoa +W-SU +WET + +</pre> + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/help/tl.html b/help/tl.html new file mode 100644 index 0000000000..621165414b --- /dev/null +++ b/help/tl.html @@ -0,0 +1,183 @@ +<HTML> +<HEAD><TITLE>Autopsy Timeline Analysis Help</TITLE></HEAD> +<BODY BGCOLOR=#CCCC99> + +<CENTER><H2>Timeline Mode</H2></CENTER> +<H3>Overview</H3> +<P> +For some investigations, creating a timeline of activity can be +useful to identify places where the analysis should begin. Of +course file times can be easily modified by an attacker, so they +can not be 100% trusted. But, Autopsy can create timelines of +file activity. + +<P> +Files have at least three times associated with them. The details of +each time varies with the file system type. + +<P> +The following times exist for UNIX file systems (EXT2FS & FFS): + +<UL> + <LI><B>Modified</B>: When the file data was last + modified. This time can be modified using the utimes() + function. This time is preserved in a 'tar' archive, so it is + possible to have M-times of files prior to when they were introduced + to the system. + + <LI><B>Accessed</B>: When the file data was last + accessed. This time can be modified using the utimes() function. + + <LI><B>Changed</B>: When the file status (inode data) + was last changed. This time can not be set using the utimes() + function in UNIX (but it will be set when utimes() is used to modify + other values). +</UL> + +The EXT2FS file system also has a Deleted time, but it is not displayed +in the timeline. + +<P> +A FAT File system has the following times: +<UL> + <LI><B>Written</B>: When the file was last written to. + It is the ONLY required time in the FAT file system. + + <LI><B>Accessed</B>: When the file was last accessed. In + FAT, it is only accurate to the day (not minute). It is an optional + value, so some Operating Systems may not update it. + + <LI><B>Created</B>: When the file was created. It is + also optional, so some Operating Systems may not update it. In fact, + many Windows installations have a C-Time of 0 for directories such as + <TT>C:\\Windows</TT> and <TT>C:\\Program Files</TT>. +</UL> + +<P> +The NTFS File system has several times, four of which are +used in the timeline. These times are gathered from the +<TT>\$STANDARD_INFORMATION</TT> attribute. +<UL> + <LI><B>Written</B>: When the file was last written to. + + <LI><B>Accessed</B>: When the file was last accessed. + + <LI><B>Changed</B>: When the MFT entry was last modified. + + <LI><B>Created</B>: When the file was created. +</UL> + + +<H3>How to Create a Timeline</H3> +Creating a timeline takes two steps. The first step extracts and +saves the needed data from each file system images. This step +stores the data from each specific file system in a generic format. +Historically (from TCT), this file was called the <TT>body</TT> +file. The second step takes the <TT>body</TT> file as input and +generates an ASCII timeline of file activity between two specified +dates. The resulting timeline can be viewed in Autopsy or using +a text editor. + + +<H3>Creating the Body File</H3> +The file meta-data must be extracted from the file system images and saved +to the <TT>body</TT> file. There are three major types of files that data +can be extracted for: +<UL> + <LI><B>Allocated Files</B>: +Files that are seen when doing an 'ls' or 'dir' in a directory. In +other words, these are the files that have an allocated file name +structure. + + <LI><B>Unallocated Files</B>: +Files that have been deleted, but that TSK can still access. +Files in this category include orphan files, which are files that +no longer have a name, but whose metadata still exists. +If a deleted file name points to an allocated metadata structure, +then the name will say (realloc) next to it. + +</UL> + +<P> +To create the <TT>body</TT> file, select the images to analyze from +the list on top. Next, select which types of data that you want to +extract. By default all types are extracted. Lastly, identify the +name of the body file to create. The file will be created in the +<TT>output</TT> directory and an entry will be added to the host config +file. You will be given the option to calculate the MD5 value of +the new file. + + +<H3>Creating the Timeline</H3> +The next window allows one to create a timeline based on the newly +created <TT>body</TT> file. Or, one can select the option from +the left-hand side menu. The range of dates must be selected as +well as the name of the timeline file. The resulting timeline will +use the time zone for the host. + +<P> +If the images are from a +UNIX file system, then the password and group files can be used to +change the UID and GID to actual names. If the partition from the +root directory exists in the host, select it from the pull down +list and Autopsy will find the <TT>/etc/passwd</TT> and +<TT>/etc/group</TT> file contents. + +<P> +The timeline will be created in the <TT>output</TT> directory. +You will be given the option to calculate the MD5 hash value of +the new file. + +<H3>Viewing the Timeline</H3> +The timeline can be viewed in Autopsy. Timelines tend to be very +large though and have thousands of lines. HTML browsers can not +handle tables of this size very well and typically have trouble +processing it. Therefore, Autopsy only allows you to view the +timeline one month at a time. It will likely be easier to open a +shell and examine the timeline in a text editor or pager such as +'less' or 'more'. + +<P> +The 'summary' link will show a page that contains a monthly summary +of activity. It shows how many many events occured in that month +and links to the details. This allows one to get a high level +view of when a lot of activity last occured. + +<P> +The following columns are in the timeline (in order): +<UL> + <LI><B>Date and time</B>of the activity. If no date is given, + then the activity occured at the same time as the previous entry + with a time. + + <LI><B>Size</B>. The size of the file. + + <LI><B>Entry Type</B>. The 'm', 'a', 'c', and 'b' letters will exist to + identify which of the activity types this entry corresponds to. 'm' is + for modified times, 'a' is for access times, 'c' is for change times, and + 'b' is for created (or born) times. + + <LI><B>Mode</B. The UNIX mode is shown. + + <LI><B>UID</B>. The User Id or User name is shown. If a password + file was provided when the timeline was created, then the colunn should + only have names. + + <LI><B>GID</B>. The Group Id or Group name is shown. If a group + file was provided when the timeline was created, then the colunn should + only have names. + + <LI><B>Meta Data Address</B>. The inode or MFT entry address for the + associated file. + + <LI><B>File Name</B>. The name of the file and the destination of a + symbolic link. Deleted entries will have '(deleted)' at the end and + deleted entries that point to an allocated meta data structure will + have '(realloc)'. + + +</UL> + +<HR> +<FONT SIZE=0>Brian Carrier</FONT> +</BODY></HTML> diff --git a/lib/.perltidyrc b/lib/.perltidyrc new file mode 100755 index 0000000000..f1f2e71a01 --- /dev/null +++ b/lib/.perltidyrc @@ -0,0 +1,5 @@ +-i=4 # indent of 4 +-pt=2 # paren tightness +-sbt=2 # square paren tightness +-bt=2 # curly paren tightness +-nsfs # no space after semi in for loop diff --git a/lib/Appsort.pm b/lib/Appsort.pm new file mode 100644 index 0000000000..bdf82bfad6 --- /dev/null +++ b/lib/Appsort.pm @@ -0,0 +1,399 @@ +# +# Sort files based on their application type (content) +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2008 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Appsort; + +$Appsort::FRAME = 1; +$Appsort::MENU = 2; +$Appsort::ENTER = 3; +$Appsort::RUN = 4; +$Appsort::VIEW = 5; +$Appsort::BLANK = 6; + +sub main { + + if ($::LIVE == 1) { + Print::print_html_header("Unsupported for Live Analysis"); + print +"<center><h2>This feature is not available during a live analysis</h2></center>"; + Print::print_html_footer(); + return 0; + } + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Appsort::FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view == $Appsort::BLANK) { + return blank(); + } + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the meta data address + if ($view == $Appsort::FRAME) { + return frame(); + } + elsif ($view == $Appsort::ENTER) { + return enter(); + } + elsif ($view == $Appsort::MENU) { + return menu(); + } + elsif ($view == $Appsort::RUN) { + return run(); + } + elsif ($view == $Appsort::VIEW) { + return view(); + } + else { + Print::print_check_err("Invalid Application Sorting View"); + } +} + +sub get_sorter_dir { + if ($Args::args{'vol'} =~ /^($::REG_VNAME)$/) { + return "$::host_dir" . "$::DATADIR/sorter-$1/"; + } + Print::print_err("Invalid Sorter Directory"); +} + +sub get_sorter_graphics_dir { + if ($Args::args{'vol'} =~ /^($::REG_VNAME)$/) { + return "$::host_dir" . "$::DATADIR/sorter-graphics-$1/"; + } + Print::print_err("Invalid Sorter Graphics Directory"); +} + +# sorter frameset +sub frame { + Print::print_html_header_frameset("Sorter on $Args::args{'vol'}"); + + print "<frameset cols=\"20%,80%\">\n"; + + # Block List + print "<frame src=\"$::PROGNAME?mod=$::MOD_APPSORT&view=$Appsort::MENU&" + . "$Args::baseargs\">\n"; + + # Blank + print "<frame src=\"$::PROGNAME?mod=$::MOD_APPSORT&view=$Appsort::BLANK&" + . "$Args::baseargs\" name=\"content\">\n" + . "</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# The left-hand frame for running sorter +sub menu { + Print::print_html_header("sorter menu"); + + print "<p><a href=\"$::PROGNAME?mod=$::MOD_APPSORT&view=$Appsort::ENTER&" + . "$Args::baseargs\" " + . "target=\"content\">Sort Files by Type</a>"; + + print "<p><a href=\"$::PROGNAME?mod=$::MOD_APPSORT&view=$Appsort::VIEW&" + . "$Args::baseargs\" " + . "target=\"content\">View Sorted Files</a>"; + + Print::print_html_footer(); + return 0; +} + +# Get the data and print the form so that sorter can be run +sub enter { + Print::print_html_header("sorter - enter data to create"); + + print "<center>" + . "<h3>File Type Sortings</h3></center><br>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_APPSORT\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Appsort::RUN\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Args::args{'vol'}\">\n" + . Args::make_hidden(); + + print <<EOF1; +<p>The <b>sorter</b> tool will process an image and organize the +files based on their file type. The files are organized into categories +that are defined in configuration files. The categories will be saved +in the <tt>$::DATADIR</tt> directory. +<hr> +EOF1 + + my $sort_dir = get_sorter_dir(); + if (-d "$sort_dir") { + print "WARNING: This will overwrite any existing data in:<br>" + . " <tt>$sort_dir</tt><br>\n"; + } + + my $tab = " "; + + print <<EOF2; + +<p> +<input type=\"checkbox\" name=\"sorter_cat\" value=\"1\" CHECKED> +Sort files into categories by type + + <p>$tab + <input type=\"checkbox\" name=\"sorter_unk\" value=\"1\"> + Do not save data about <tt>unknown</tt> file types + + <p>$tab + <input type=\"checkbox\" name=\"sorter_save\" value=\"1\"> + Save a copy of files in category directory (may require lots of disk space) + + <p>$tab + <input type=\"checkbox\" name=\"sorter_img\" value=\"1\"> + Save ONLY graphic images and make thumbnails <br> + $tab (may require lots of disk space and will save to a different directory than sorting all file types) + +<p> +<input type=\"checkbox\" name=\"sorter_ext\" value=\"1\" CHECKED> +Extension and File Type Validation + +EOF2 + + if (($::NSRLDB ne "") && (-e "$::NSRLDB")) { + + # NSRL + print +"<p><input type=\"checkbox\" name=\"sorter_nsrl\" value=\"1\" CHECKED>" + . "Exclude files in the <b>NIST NSRL</b>\n"; + } + + if (($Caseman::alert_db ne "") && (-e "$Caseman::alert_db")) { + print +"<p><input type=\"checkbox\" name=\"sorter_alert\" value=\"1\" CHECKED>" + . "Alert files that are found in the <b>Alert Hash Database</b>\n"; + } + + if (($Caseman::exclude_db ne "") && (-e "$Caseman::exclude_db")) { + print +"<p><input type=\"checkbox\" name=\"sorter_exclude\" value=\"1\" CHECKED>" + . "Ignore files that are found in the <b>Exclude Hash Database</b>\n"; + } + + print "<p><input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return; +} + +# Run sorter on the image +sub run { + Print::print_html_header("sorter - create"); + + my $sort_args = ""; + my $ext = 0; + my $cat = 0; + + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + Print::log_host_inv("Running 'sorter' on ($Caseman::vol2sname{$vol}"); + + $ext = 1 + if ( (exists $Args::args{'sorter_ext'}) + && ($Args::args{'sorter_ext'} == 1)); + $cat = 1 + if ( (exists $Args::args{'sorter_cat'}) + && ($Args::args{'sorter_cat'} == 1)); + + if (($cat == 0) && ($ext == 0)) { + print "At least one action must be selected\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_APPSORT&" + . "view=$Appsort::ENTER&$Args::baseargs\">" + . "<img border=0 src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=43 height=20></a>\n"; + + return; + } + + # If both actions are wanted then no flags are needed + $sort_args .= "-e " if (($ext == 1) && ($cat == 0)); + $sort_args .= "-E " if (($ext == 0) && ($cat == 1)); + + my $sort_dir = get_sorter_dir(); + + if ($cat == 1) { + if ( (exists $Args::args{'sorter_img'}) + && ($Args::args{'sorter_img'} == 1)) + { + my $config = "$::TSKDIR/../share/tsk3/sorter/images.sort"; + + Print::print_err("images configuration file not found ($config)") + unless (-e "$config"); + + $sort_args .= "-C \'$config\' -s -U "; + + $sort_dir = get_sorter_graphics_dir(); + + } + else { + $sort_args .= "-s " + if ( (exists $Args::args{'sorter_save'}) + && ($Args::args{'sorter_save'} == 1)); + + $sort_args .= "-U " + if ( (exists $Args::args{'sorter_unk'}) + && ($Args::args{'sorter_unk'} == 1)); + } + } + + if ($::NSRLDB ne "") { + $sort_args .= "-n \'$::NSRLDB\' " + if ( (exists $Args::args{'sorter_nsrl'}) + && ($Args::args{'sorter_nsrl'} == 1)); + } + + if ($Caseman::alert_db ne "") { + $sort_args .= "-a \'$Caseman::alert_db\' " + if ( (exists $Args::args{'sorter_alert'}) + && ($Args::args{'sorter_alert'} == 1)); + } + + if ($Caseman::exclude_db ne "") { + $sort_args .= "-x \'$Caseman::exclude_db\' " + if ( (exists $Args::args{'sorter_exclude'}) + && ($Args::args{'sorter_exclude'} == 1)); + } + + unless (-d "$sort_dir") { + unless (mkdir "$sort_dir", $::MKDIR_MASK) { + Print::print_err("Error making $sort_dir"); + } + } + if (-e "$sort_dir/index.html") { + unlink("$sort_dir/index.html"); + } + + my $exec = +"-h -m '$mnt' -d '$sort_dir' -o $offset -i $imgtype -f $ftype $sort_args $img"; + + # print "Executing: <tt>sorter $exec</tt><p>\n"; + + # Execute Sorter + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + alarm(5); + + local *OUT; + Exec::exec_pipe(*OUT, "LANG=C LC_ALL=C '$::TSKDIR/sorter' $exec"); + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + + while ($_ = Exec::read_pipe_line(*OUT)) { + print "$_<br>\n"; + $hit_cnt = 0; + } + + close(OUT); + + if (-e "$sort_dir/index.html") { + print "<p>Output can be found by viewing:<br>" + . " <tt>$sort_dir/index.html</tt><p>\n"; + + # Print the index.html file from the output + print "<hr><center><h3>Results Summary</h3></center>\n"; + open INDEX, "<$sort_dir/index.html" + or die "Can't open sorter index file ($sort_dir/index.html)"; + + while (<INDEX>) { + next if ((/^<HTML><HEAD><TITLE>/i) + || (/^<BODY><center><H2>/i)); + + # Extract out the symlinks to the categories + if (/^\s*<li><a href="\.\/[\w\.]+">([\w\s]+)<\/a> \((\d+)\)\s*$/i) { + print "<LI>$1 ($2)\n"; + } + + # Skip the link on the thumbnails link + elsif (/^\s*\(<a href=[\"\.\/\w]+>thumbnails<\/A>\)\s*$/) { + print "(thumbnails)\n"; + } + else { + print "$_"; + } + } + close(INDEX); + } + + Print::print_html_footer(); + return; +} + +# View Page +sub view { + Print::print_html_header(""); + print "<center><h3>File Type Sorting</h3>\n" + . "Autopsy does not currently support viewing the sorted files.<br>\n" + . "After sorting, you can view the results by opening the following file:<p>\n"; + print "<tt>" . get_sorter_dir() . "index.html</tt>"; + + Print::print_html_footer(); + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header(""); + print "<center><h3>File Type Sorting</h3>\n" + . "In this mode, Autopsy will examine allocated and unallocated files<br> and " + . "sort them into categories and verify the extension.<p>This allows you to find a file based on" + . "its type and find \"hidden\" files.<p>\n" + . + + "WARNING: This can be a time intensive process.<br>\n"; + + Print::print_html_footer(); + return 0; +} + diff --git a/lib/Appview.pm b/lib/Appview.pm new file mode 100644 index 0000000000..3a407fa2e1 --- /dev/null +++ b/lib/Appview.pm @@ -0,0 +1,291 @@ +# +# View the application layer (HTML, picutures etc.) +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Updated 1/15 + +package Appview; + +$Appview::CELL_FRAME = 1; +$Appview::CELL_MENU = 2; +$Appview::CELL_CONT = 3; + +sub main { + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Appview::CELL_FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + # Check Basic Args + Args::check_vol('vol'); + Args::check_meta('meta'); + Args::check_dir(); + Args::check_recmode(); + + if ($view == $Appview::CELL_FRAME) { + return cell_frame(); + } + elsif ($view == $Appview::CELL_CONT) { + return cell_content(); + } + elsif ($view == $Appview::CELL_MENU) { + return cell_menu(); + } + else { + Print::print_check_err("Invalid Application Viewing View"); + } +} + +######################################################################### +# +# CELL - Sanitized Environment +# + +my $CELL_MODE_SANIT = 1; +my $CELL_MODE_NORM = 2; + +sub cell_frame { + Print::print_html_header_frameset("Autopsy Cell"); + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $fname = "$mnt$Args::args{'dir'}"; + + print "<frameset rows=\"15%,85%\">\n"; + + # if a mode was not given, then choose the Sanitized by default + $Args::args{'cell_mode'} = $CELL_MODE_SANIT + unless ((exists $Args::args{'cell_mode'}) + && ($Args::args{'cell_mode'} =~ /^\d$/)); + + my $url = + "&$Args::baseargs&meta=$Args::enc_args{'meta'}" + . "&dir=$Args::enc_args{'dir'}&" + . "cell_mode=$Args::args{'cell_mode'}&recmode=$Args::args{'recmode'}"; + + print +"<frame src=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_MENU${url}\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_CONT${url}\">\n" + . "</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# Print the menu on top. This allows one to export the file and change modes +sub cell_menu { + Args::check_cell_mode(); + + Print::print_html_header("Cell Header"); + + my $cell_mode = $Args::args{'cell_mode'}; + + my $url = + "&$Args::baseargs&meta=$Args::enc_args{'meta'}&" + . "dir=$Args::enc_args{'dir'}&recmode=$Args::enc_args{'recmode'}"; + + if ($cell_mode == $CELL_MODE_SANIT) { + + print <<EOF1; +<center> +This file is currently being viewed in a <b>sanitized environment</b><br> +HTML files have been edited to disable scripts and links. +The script contents will be shown as text.<br> +Pictures have been replaced by place holders<br> + +<table width=300 cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center> + <a href=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_FRAME$url&cell_mode=$CELL_MODE_NORM\" + target=\"_top\"> + <img src=\"pict/sanit_b_norm.jpg\" alt=\"Normal\" border=\"0\"> + </a> + </td> +EOF1 + + } + + elsif ($cell_mode == $CELL_MODE_NORM) { + print <<EOF2; +<center> +This file is currently being viewed in a <b>normal environment</b><br> +HTML files are being viewed without modification.<br> + +<table width=300 cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center> + <a href=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_FRAME&$url&cell_mode=$CELL_MODE_SANIT\" + target=\"_top\"> + <img src=\"pict/sanit_b_san.jpg\" alt=\"Sanitized\" border=\"0\"> + </a> + </td> +EOF2 + } + + # Export the file + print "<td align=center>\n" + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::EXPORT&$url\">" + . "<img src=\"pict/but_export.jpg\" alt=\"export\" border=\"0\" " + . "width=123 height=20>" + . "</a></td></tr>\n"; + + print "<tr><td colspan=\"2\" align=\"center\">" + . "Deleted File Recovery Mode</td></tr>\n" + if ($Args::enc_args{'recmode'} == $File::REC_YES); + + print "</table>"; + + Print::print_html_footer(); + return; +} + +# Display safe and common things in the browser (pictures, basic html) +sub cell_content { + Args::check_meta('meta'); + Args::check_dir(); + Args::check_cell_mode(); + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $fname = "$mnt$Args::args{'dir'}"; + + my $recflag = ""; + + $recflag = " -r " + if (Args::get_recmode() == $File::REC_YES); + + # identify what type it is + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + my $file_type = Exec::read_pipe_line(*OUT); + close(OUT); + + $file_type = "Error getting file type" + if ((!defined $file_type) || ($file_type eq "")); + + if ($file_type =~ /JPEG image data/) { + Print::log_host_inv("$vol: Viewing $fname ($meta) as JPEG"); + print "Content-type: image/jpeg$::HTTP_NL$::HTTP_NL"; + } + elsif ($file_type =~ /GIF image data/) { + Print::log_host_inv("$vol: Viewing $fname ($meta) as GIF"); + print "Content-type: image/gif$::HTTP_NL$::HTTP_NL"; + } + elsif ($file_type =~ /PNG image data/) { + Print::log_host_inv("$vol: Viewing $fname ($meta) as PNG"); + print "Content-type: image/png$::HTTP_NL$::HTTP_NL"; + } + elsif ($file_type =~ /PC bitmap data/) { + Print::log_host_inv("$vol: Viewing $fname ($meta) as BMP"); + print "Content-type: image/bmp$::HTTP_NL$::HTTP_NL"; + } + elsif ($file_type =~ /HTML document text/) { + Print::log_host_inv("$vol: Viewing $fname ($meta) as HTML"); + print "Content-type: text/html$::HTTP_NL$::HTTP_NL"; + } + else { + Print::log_host_inv("$vol: Unknown format of meta $meta "); + Print::print_check_err("Unknown File Type for Viewing: $file_type"); + } + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + + while ($_ = Exec::read_pipe_line(*OUT)) { + + # Parse out bad "stuff" + if ( ($file_type =~ /HTML document text/) + && ($Args::args{'cell_mode'} == $CELL_MODE_SANIT)) + { + $_ =~ s/\bsrc=/src=$::SANITIZE_TAG\?/ig; + $_ =~ s/\bhref=/href=$::SANITIZE_TAG\?/ig; + $_ =~ s/<script/<$::SANITIZE_TAG-script/ig; + $_ =~ s/\bbackground=/background=$::SANITIZE_TAG\?/ig; + } + print "$_"; + } + print "$::HTTP_NL$::HTTP_NL"; + close(OUT); + return 0; +} + +sub sanitize_pict { + my $url = shift(); + my $lurl = $url; + $lurl =~ tr/[A-Z]/[a-z]/; + + print "HTTP/1.0 200 OK$::HTTP_NL"; + if ( ($lurl =~ /.jpg/i) + || ($lurl =~ /.jpeg/i) + || ($lurl =~ /.gif/i) + || ($lurl =~ /.png/i) + || ($lurl =~ /.bmp/i)) + { + + open PICT, "<$::PICTDIR/$::SANITIZE_PICT" + or die "can not open $::PICTDIR/$::SANITIZE_PICT"; + + print "Content-type: image/jpeg$::HTTP_NL$::HTTP_NL"; + while (<PICT>) { + print "$_"; + } + close(PICT); + print "$::HTTP_NL$::HTTP_NL"; + } + else { + $url =~ tr/\+/ /; + $url =~ s/%([a-f0-9][a-f0-9])/chr( hex( $1 ) )/eig; + + Print::print_html_header("Denied"); + print "<h1><center>Unable to Complete Request</h1><br>\n" + . "<tt>Autopsy</tt> will not follow links from " + . "untrusted HTML pages:<br><tt>$url</tt><br>\n"; + Print::print_html_footer(); + } + + exit(0); +} + diff --git a/lib/Args.pm b/lib/Args.pm new file mode 100644 index 0000000000..705cc89a39 --- /dev/null +++ b/lib/Args.pm @@ -0,0 +1,927 @@ +# +# Functions to check and get the arguments from URL +# +# ver 2.00+ +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2003-2004 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Args; + +# Parse the argument string into the args hash +sub parse_args { + my $lcl_args = shift; + foreach my $nam_val (split(/&/, $lcl_args)) { + my ($name, $value) = split(/=/, $nam_val); + if (defined $value) { + my $dec_name = url_decode($name); + $Args::enc_args{$dec_name} = $value; + $Args::args{$dec_name} = url_decode($value); + } + } +} + +sub url_encode { + my $text = shift; + $text =~ s/([^a-z0-9_.!~*'() -])/sprintf "%%%02X", ord($1)/eig; + $text =~ tr/ /+/; + return $text; +} + +sub url_decode { + my $text = shift; + $text =~ tr/\+/ /; + $text =~ s/%([a-f0-9][a-f0-9])/chr( hex( $1 ) )/eig; + return $text; +} + +# This assumes that the checking of the types has been done and this just +# makes a string of the key values if they exist +# +# case +# host +# img + +# Must add & after +sub make_baseargs { + $Args::baseargs = ""; + + # The standard case, host, and investigator + $Args::baseargs .= "case=$Args::enc_args{'case'}&" + if ((exists $Args::enc_args{'case'}) && ($Args::enc_args{'case'} ne "")); + $Args::baseargs .= "host=$Args::enc_args{'host'}&" + if ((exists $Args::enc_args{'host'}) && ($Args::enc_args{'host'} ne "")); + $Args::baseargs .= "inv=$Args::enc_args{'inv'}&" + if ((exists $Args::enc_args{'inv'}) && ($Args::enc_args{'inv'} ne "")); + + $Args::baseargs_novol = $Args::baseargs; + + # Add the image, file system type, and mount point + $Args::baseargs .= "vol=$Args::enc_args{'vol'}&" + if ((exists $Args::enc_args{'vol'}) && ($Args::enc_args{'vol'} ne "")); + + # remove the final '&' + $Args::baseargs_novol = $1 if ($Args::baseargs_novol =~ /^(.*?)&$/); + $Args::baseargs = $1 if ($Args::baseargs =~ /^(.*?)&$/); + + return; +} + +# Does not do mnt or img +sub make_hidden { + my $str = ""; + + $str .= + "<input type=\"hidden\" name=\"host\" value=\"$Args::args{'host'}\">\n" + if ((exists $Args::args{'host'}) && ($Args::args{'host'} ne "")); + + $str .= + "<input type=\"hidden\" name=\"case\" value=\"$Args::args{'case'}\">\n" + if ((exists $Args::args{'case'}) && ($Args::args{'case'} ne "")); + + $str .= + "<input type=\"hidden\" name=\"inv\" value=\"$Args::args{'inv'}\">\n" + if ((exists $Args::args{'inv'}) && ($Args::args{'inv'} ne "")); + + return $str; +} + +############################### +# block +############################### +sub check_block { + if ((!exists $Args::args{'block'}) || ($Args::args{'block'} !~ /^\d+$/)) { + Print::print_check_err( + "Invalid block argument (positive numbers only)"); + } + return 0; +} + +sub get_block { + if ($Args::args{'block'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid Block"); +} + +############################### +# body +############################### + +sub check_body { + unless (exists $Args::args{'body'}) { + Print::print_check_err("Missing body argument"); + } + unless ($Args::args{'body'} =~ /^$::REG_VNAME$/o) { + Print::print_check_err( + "Invalid body value (only letters, " . "numbers,-,., and _)"); + } + return 0; +} + +sub get_body { + if ($Args::args{'body'} =~ /^($::REG_VNAME)$/o) { + return $1; + } + Print::print_err("Invalid Body"); +} + +################################ +# Case name +################################ + +sub check_case { + unless (exists $Args::args{'case'}) { + Print::print_check_err("Missing case argument"); + } + unless ($Args::args{'case'} =~ /^$::REG_CASE$/o) { + Print::print_check_err( + "Invalid case value (letters, num, and symbols only"); + } + return 0; +} + +sub get_case { + if ($Args::args{'case'} =~ /^($::REG_CASE)$/o) { + return $1; + } + Print::print_err("Invalid Case Name"); +} + +############################### +# cell_mode +############################### +sub check_cell_mode { + if ( (!exists $Args::args{'cell_mode'}) + || ($Args::args{'cell_mode'} !~ /^\d$/o)) + { + Print::print_check_err( + "Invalid cell_mode argument (numbers >= 0 only)"); + } + return 0; +} + +################################ +# dir +################################ +sub check_dir { + if ( (!exists $Args::args{'dir'}) + || ($Args::args{'dir'} =~ /\/\.\.\//) + || ($Args::args{'dir'} =~ /\;/)) + { + Print::print_check_err("Invalid dir argument (valid file path only)"); + } + return 0; +} + +sub get_dir { + if ($Args::args{'dir'} =~ /([^;]*)/o) { + my $d = $1; + + # Remove double slashes + $d =~ s/\/\//\//g; + return $d; + } + Print::print_err("Invalid Directory"); +} + +############################### +# dirmode +############################### +sub check_dirmode { + if ((!exists $Args::args{'dirmode'}) || ($Args::args{'dirmode'} !~ /^\d+$/)) + { + Print::print_check_err( + "Invalid dirmode argument (positive numbers only)"); + } + return 0; +} + +sub get_dirmode { + if ($Args::args{'dirmode'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid dirmode"); +} + +################################ +# do_md5 +################################ +sub check_do_md5 { + if ((!exists $Args::args{'do_md5'}) || ($Args::args{'do_md5'} !~ /^\d+$/)) { + Print::print_check_err("Missing do_md5 argument"); + } + return 0; +} + +sub get_do_md5 { + if ($Args::args{'do_md5'} =~ /^\s*(\d+)$/) { + return $1; + } + Print::print_err("Invalid MD5 Flag"); +} + +################################ +# fname +################################ + +sub check_fname { + unless (exists $Args::args{'fname'}) { + Print::print_check_err("Missing fname argument"); + } + unless ($Args::args{'fname'} =~ /^$::REG_FNAME$/o) { + Print::print_check_err( + "Invalid fname value (only letters, " . "numbers,-,., and _)"); + } + return 0; +} + +sub get_fname { + if ($Args::args{'fname'} =~ /^($::REG_FNAME)$/o) { + return "$::host_dir" . "$::DATADIR/$1"; + } + Print::print_err("Invalid File Name"); +} + +################################ +# fname_mode +################################ +sub check_fname_mode { + if (!exists $Args::args{'fname_mode'}) { + Print::print_check_err("Missing fname_mode argument"); + } + unless ($Args::args{'fname_mode'} =~ /^\d+$/) { + Print::print_check_err("invalid mode: numbers only"); + } + return 0; +} + +################################ +# fname_rel +# Return the relative fname +################################ +sub get_fname_rel { + if ($Args::args{'fname'} =~ /^($::REG_FNAME)$/o) { + return "$::DATADIR/$1"; + } + Print::print_err("Invalid Relative File Name"); +} + +############################### +# force +############################### +sub get_force { + if ($Args::args{'force'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid Force Flag"); +} + +################################ +# ftype +################################ +sub get_ftype_blah { + if (exists $Args::args{'ftype'}) { + if ($Args::args{'ftype'} =~ /^($::REG_FTYPE)$/o) { + return $1; + } + } + if ( (exists $Args::args{'img'}) + && (exists $Caseman::vol2ftype{$Args::args{'img'}})) + { + return $Caseman::vol2ftype{$Args::args{'img'}}; + } + Print::print_err("Missing ftype value"); +} + +sub check_ftype_blah { + unless ( + ( + (exists $Args::args{'img'}) + && (exists $Caseman::vol2ftype{$Args::args{'img'}}) + && ($Caseman::vol2ftype{$Args::args{'img'}} =~ /^$::REG_FTYPE$/o) + ) + || ( (exists $Args::args{'ftype'}) + && ($Args::args{'ftype'} =~ /^$::REG_FTYPE$/o)) + ) + { + Print::print_check_err("Missing or invalid ftype value"); + } + return 0; +} + +################################ +# host +# Host for the case +################################ + +sub check_host { + unless (exists $Args::args{'host'}) { + Print::print_check_err("Missing host argument"); + } + unless ($Args::args{'host'} =~ /^$::REG_HOST$/o) { + Print::print_check_err("Invalid host value"); + } + return 0; +} + +sub get_host { + if ($Args::args{'host'} =~ /^($::REG_HOST)$/o) { + return $1; + } + Print::print_err("Invalid Host"); +} + +################################ +# htype +################################ +sub check_htype { + if ((!exists $Args::args{'htype'}) || ($Args::args{'htype'} !~ /^\d+$/)) { + Print::print_check_err( + "Invalid htype argument (positive numbers only)"); + } + return 0; +} + +sub get_htype { + if ($Args::args{'htype'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid htype"); +} + +############################### +# ifind +# ifind is optional and by default is 0 if not given +############################### +sub get_ifind { + if (!exists $Args::args{'ifind'}) { + return 0; + } + elsif ($Args::args{'ifind'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid ifind flag"); +} + +############################### +# img_path is used when adding images - it is the full path to the +# non-evidence locker copy of the image +############################### + +sub check_img_path { + if (!exists $Args::args{'img_path'}) { + Print::print_check_err("Missing image (img_path) argument"); + } + elsif ($Args::args{'img_path'} =~ /^$::REG_IMG_PATH$/o) { + + # Check for its actual existence + + Print::print_check_err("Image not found at $Args::args{'img_path'}") + unless ( + (-e "$Args::args{'img_path'}") + || ( (-l "$Args::args{'img_path'}") + && (-e readlink "$::host_dir" . "$Args::args{$img}")) + ); + } + else { + Print::print_check_err("Invalid image path (only letters, " + . "numbers,-,.,_/ and start with /) [$Args::args{'img_path'}]"); + } + + return 0; +} + +sub get_img_path { + if ($Args::args{'img_path'} =~ /^($::REG_IMG_PATH)$/o) { + return "$1"; + } + Print::print_err("Invalid Image Path"); +} + +sub check_img_path_wild { + if (!exists $Args::args{'img_path'}) { + Print::print_check_err("Missing wild image (img_path) argument"); + } + elsif ($Args::args{'img_path'} !~ /^$::REG_IMG_PATH_WILD$/o) { + + # IF there is extra white space then remove it and move on + if ($Args::args{'img_path'} =~ /^\s*($::REG_IMG_PATH_WILD)\s*$/o) { + $Args::args{'img_path'} = $1; + return 0; + } + else { + Print::print_check_err("Invalid wild image (img_path) argument"); + } + } + + return 0; +} + +sub get_img_path_wild { + if ($Args::args{'img_path'} =~ /^($::REG_IMG_PATH_WILD)$/o) { + return "$1"; + } + Print::print_err("Invalid Image Path"); +} + +############################### +# meta +############################### + +sub check_meta { + my $meta = shift; + if ( (!exists $Args::args{$meta}) + || ($Args::args{$meta} !~ /^$::REG_META$/o)) + { + Print::print_check_err( + "Invalid meta address ($meta) argument (numbers >= 0 only)"); + } + return 0; +} + +sub get_meta { + my $meta = shift; + if ($Args::args{$meta} =~ /^($::REG_META)$/o) { + return $1; + } + Print::print_err("Invalid Meta Address"); +} + +################################ +# inv +# Investigator +################################ + +sub check_inv { + unless (exists $Args::args{'inv'}) { + Print::print_check_err("Missing inv argument"); + } + unless ($Args::args{'inv'} =~ /^$::REG_INVESTIG$/o) { + Print::print_check_err( + "Invalid inv value (letters, num, and symbols only"); + } + return 0; +} + +sub get_inv { + if ($Args::args{'inv'} =~ /^($::REG_INVESTIG)$/o) { + return $1; + } + Print::print_err("Invalid Investigator"); +} + +############################### +# len +############################### +sub check_len { + if ( (!exists $Args::args{'len'}) + || ($Args::args{'len'} !~ /^\d+$/) + || ($Args::args{'len'} == 0)) + { + Print::print_check_err("Invalid len argument (positive numbers only)"); + } + return 0; +} + +sub get_len { + if ((exists $Args::args{'len'}) && ($Args::args{'len'} =~ /^(\d+)$/)) { + return $1; + } + + # return the default len of 1 if it is not defined + return 1; +} + +############################### +# min +############################### +sub get_min { + if ($Args::args{'min'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid Minute"); +} + +################################ +# module +################################ +sub check_mod { + if ((!exists $Args::args{'mod'}) || ($Args::args{'mod'} !~ /^\d+$/)) { + Print::print_check_err( + "Invalid Module argument (positive numbers only)"); + } + return 0; +} + +sub get_mod { + if ($Args::args{'mod'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid Module"); +} + +################################ +# mnt +############################### + +sub check_mnt { + my $ftype = Args::get_ftype(); + if (($ftype eq "blkls") || ($ftype eq "swap") || ($ftype eq "raw")) { + $Args::args{'mnt'} = $ftype; + $Args::enc_args{'mnt'} = $ftype; + } + elsif (!exists $Args::args{'mnt'}) { + + # Look it up if it is not found + if (exists $Args::args{'img'}) { + unless (exists $Caseman::vol2mnt{$Args::args{'img'}}) { + Print::print_check_err( + "Mounting point not found: $Args::args{'img'}"); + } + my $mnt = $Caseman::vol2mnt{$Args::args{'img'}}; + $Args::args{'mnt'} = $mnt; + $Args::enc_args{'mnt'} = Args::url_encode($mnt); + } + else { + Print::print_check_err("Mounting point not found"); + } + } + if ($Args::args{'mnt'} =~ /\/\.\.\//) { + Print::print_check_err( + "Invalid mount point argument (valid file path only)"); + } + unless ($Args::args{'mnt'} =~ /^$::REG_MNT$/o) { + Print::print_check_err( + "Invalid mount point argument (valid file path only)"); + } + return 0; +} + +sub get_mnt { + if ((exists $Args::args{'mnt'}) && ($Args::args{'mnt'} =~ /($::REG_MNT)/o)) + { + return $1; + } + Print::print_err("Invalid Mounting Point"); +} + +################################ +# note +################################ +sub check_note { + if (!exists $Args::args{'note'}) { + Print::print_check_err("Missing note argument"); + } + return 0; +} + +################# +# num_img - adding disk images + +sub check_num_img { + if ((!exists $Args::args{'num_img'}) || ($Args::args{'num_img'} !~ /^\d+$/)) + { + Print::print_check_err( + "Invalid num_img argument (positive numbers only)"); + } + return 0; +} + +sub get_num_img { + if ($Args::args{'num_img'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid num_img"); +} + +############################### +# recmode +############################### +sub check_recmode { + if ((!exists $Args::args{'recmode'}) || ($Args::args{'recmode'} !~ /^\d+$/)) + { + Print::print_check_err( + "Invalid recmode argument (positive numbers only)"); + } + return 0; +} + +sub get_recmode { + if ($Args::args{'recmode'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid recmode"); +} + +################################ +# srchidx +# +# Index for previous keyword search +############################### +sub check_srchidx { + if ((!exists $Args::args{'srchidx'}) || ($Args::args{'srchidx'} !~ /^\d+$/)) + { + Print::print_check_err( + "Invalid srchidx argument (positive numbers only)"); + } + return 0; +} + +############################### +# sort +############################### +sub check_sort { + if ((!exists $Args::args{'sort'}) || ($Args::args{'sort'} !~ /^\d+$/)) { + Print::print_check_err("Invalid sort argument (positive numbers only)"); + } + return 0; +} + +sub get_sort { + if ($Args::args{'sort'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid sort flag"); +} + +################################ +# st_mon +################################ +sub check_st_mon { + if ( (exists $Args::args{'st_mon'}) + && ($Args::args{'st_mon'} =~ /^(\d\d?)$/)) + { + if (($1 < 1) || ($1 > 12)) { + print("Invalid start month\n"); + return 1; + } + } + else { + print("Invalid start month\n"); + return 1; + } +} + +sub get_st_mon { + if ($Args::args{'st_mon'} =~ /^(\d\d?)$/) { + return $1; + } + Print::print_err("Invalid Month"); +} + +################################ +# st_year +################################ +sub check_st_year { + if ( (exists $Args::args{'st_year'}) + && ($Args::args{'st_year'} =~ /^(\d\d\d\d?)$/)) + { + if (($1 < 1970) || ($1 > 2020)) { + print("Invalid start year\n"); + return 1; + } + } + else { + print("Invalid start year\n"); + return 1; + } +} + +sub get_st_year { + if ($Args::args{'st_year'} =~ /^(\d\d\d\d)$/) { + return $1; + } + Print::print_err("Invalid Year"); +} + +################################ +# str +# search string +################################ +# This should be made more flexible +sub check_str { + if (!exists $Args::args{'str'}) { + Print::print_check_err("Missing string argument"); + } + return 0; +} + +sub get_str { + if ($Args::args{'str'} =~ /^\s*(.*)$/) { + return $1; + } + Print::print_err("Invalid String"); +} + +############################### +# submod +# Used by the tab module to identify the actual module +############################### +sub check_submod { + if ((!exists $Args::args{'submod'}) || ($Args::args{'submod'} !~ /^\d+$/)) { + Print::print_check_err( + "Invalid sub-mode argument (positive numbers only)"); + } + return 0; +} + +sub get_submod { + if ($Args::args{'submod'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid sub-mode"); +} + +################################ +# tl +############################### +sub check_tl { + if ((!exists $Args::args{'tl'}) || ($Args::args{'tl'} !~ /^$::REG_VNAME$/)) + { + Print::print_check_err( + "Invalid timeline argument (positive numbers only)"); + } + return 0; +} + +sub get_tl { + if ($Args::args{'tl'} =~ /^($::REG_VNAME)$/o) { + return $1; + } + Print::print_err("Invalid Timeline"); +} + +################################ +# ts +# time skew +################################ +sub check_ts { + if ((!exists $Args::args{'ts'}) || ($Args::args{'ts'} !~ /^$::REG_SKEW$/o)) + { + Print::print_check_err("Missing time skew argument"); + } + return 0; +} + +sub get_ts { + if ($Args::args{'ts'} =~ /^\s*($::REG_SKEW)$/o) { + return $1; + } + Print::print_err("Invalid Time Skew"); +} + +################################ +# tz +# timezone +################################ +sub check_tz { + if ( (!exists $Args::args{'tz'}) + || ($Args::args{'tz'} !~ /^$::REG_ZONE_ARGS$/o)) + { + Print::print_check_err("Missing time zone argument"); + } + return 0; +} + +sub get_tz { + if ($Args::args{'tz'} =~ /^($::REG_ZONE_ARGS)$/o) { + return $1; + } + Print::print_err("Invalid Timezone"); +} + +################################ +# unitsize +################################ +sub get_unitsize { + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $blkcat_out; + + if ($ftype eq 'blkls') { + if (exists $Caseman::mod2vol{$vol}) { + my $orig = $Caseman::mod2vol{$vol}; + my $img = $Caseman::vol2path{$orig}; + my $offset = $Caseman::vol2start{$orig}; + my $imgtype = $Caseman::vol2itype{$orig}; + + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $Caseman::vol2ftype{$orig} -s -o $offset -i $imgtype $img" + ); + $blkcat_out = <OUT>; + close(OUT); + } + + # We don't have the original image, so just set the size to 512 + else { + return 512; + } + } + elsif ($ftype eq 'swap') { + return 4096; + } + elsif ($ftype eq 'raw') { + return 512; + } + elsif ($Caseman::vol2cat{$vol} eq 'disk') { + return 512; + } + else { + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkcat' -f $ftype -s -o $offset -i $imgtype $img"); + $blkcat_out = <OUT>; + close(OUT); + } + $blkcat_out = "Error getting unit size" + if ((!defined $blkcat_out) || ($blkcat_out eq "")); + + if ($blkcat_out =~ /(\d+): Size of Addressable Unit/) { + return $1; + } + else { + Print::print_err("Error identifying block size (blkcat -s output)\n" + . "$blkcat_out\n"); + } +} + +################################ +# View - subset of module +################################ +sub check_view { + if ((!exists $Args::args{'view'}) || ($Args::args{'view'} !~ /^\d+$/)) { + Print::print_check_err("Invalid View argument (positive numbers only)"); + } + return 0; +} + +sub get_view { + if ($Args::args{'view'} =~ /^(\d+)$/) { + return $1; + } + Print::print_err("Invalid View"); +} + +############################### +# We don't allow much for the volume because this is an argument to +# the TSK programs. We keep these files only in one +# directory and for easy/simple security only allow basic names +# Symbolic links are allowed if these simple names are not desired +# +# Allowed values are A-Za-z0-9_-. +# +# The argument is the name of the image +############################### + +sub check_vol { + my $vol = shift; + if ((!exists $Args::args{$vol}) || ($Args::args{$vol} !~ /^$::REG_VNAME$/)) + { + Print::print_check_err( + "Invalid volume argument (name and number only)"); + } + return 0; +} + +sub get_vol { + my $vol = shift; + if ($Args::args{$vol} =~ /^($::REG_VNAME)$/) { + return $1; + } + Print::print_err("Invalid volume ($vol)"); +} + +1; diff --git a/lib/Caseman.pm b/lib/Caseman.pm new file mode 100644 index 0000000000..a34db68087 --- /dev/null +++ b/lib/Caseman.pm @@ -0,0 +1,4161 @@ +# +# Case Management methods, including the windows and functions to read the +# config files +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Caseman; + +# If the order of these views are changed, then the order of the main +# function may have to be as well + +# Case Views +$Caseman::CASE_NEW = 1; +$Caseman::CASE_NEW_DOIT = 2; +$Caseman::CASE_OPEN = 3; +$Caseman::CASE_OPEN_LOG = 4; +$Caseman::CASE_DETAILS = 5; + +# $Caseman::CASE_DEL = 6; +my $CASE_MAX = 5; + +# Host Views +$Caseman::HOST_ADD = 7; +$Caseman::HOST_ADD_DOIT = 8; +$Caseman::HOST_OPEN = 9; +$Caseman::HOST_OPEN_LOG = 10; +$Caseman::HOST_DETAILS = 11; + +# $Caseman::HOST_DEL = 12; +my $HOST_MAX = 11; + +# Image Views +$Caseman::IMG_ADD = 13; +$Caseman::IMG_ADD_PREP = 14; +$Caseman::IMG_ADD_DOIT = 15; +$Caseman::VOL_OPEN = 16; +$Caseman::VOL_OPEN_LOG = 17; +$Caseman::VOL_DETAILS = 18; +$Caseman::IMG_DEL = 19; +$Caseman::VOL_MAKESTR = 20; +$Caseman::VOL_MAKEBLKLS = 21; +my $IMG_MAX = 21; + +# Module Variables +# %vol2par - Volume to parent volume (vol to img, str to vol) +# %vol2start - Starting sector of volume in image +# %vol2end - ending sector of volume in image +# %vol2cat - The big picture type of volume (part, disk, strings, blkls) +# %vol2ftype - The file system type (fat, dos, ntfs etc.) +# %vol2itype - The image file type (could be for a parent image) +# %vol2dtype- the disk type +# %mod2vol; # Mapping for image, given the strings or blkls +# %vol2mnt; # Mapping for mount point, given the vol name +# %vol2str; # Mapping for ASCII strings file, given the vol name +# %vol2uni; # Mapping for Unicode strings file, given the vol name +# %vol2blkls; # Mapping for blkls file, given the vol name +# %vol2path - full file path of volume +# %vol2sname - short name of volume + +sub main { + + # By default, show the case open window + $Args::args{'view'} = $Args::enc_args{'view'} = $Caseman::CASE_OPEN + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + # The only live function is for the open img + if ($::LIVE == 1) { + Args::check_inv(); + if ($view == $Caseman::VOL_OPEN) { + return vol_open(); + } + + Args::check_vol('vol'); + + # Args::check_ftype(); + # Args::check_mnt(); + + if ($view == $Caseman::VOL_OPEN_LOG) { + return vol_open_log(); + } + else { + Print::print_check_err( + "Invalid Live Analysis Case Management View"); + } + return 0; + } + + # Case functions + if ($view <= $CASE_MAX) { + if ($view == $Caseman::CASE_OPEN) { + return case_open(); + } + elsif ($view == $Caseman::CASE_NEW) { + return case_new(); + } + + Args::check_case(); + $::case_dir = "$::LOCKDIR/" . Args::get_case() . "/"; + $::case_dir =~ s/\/\//\//g; + + if ($view == $Caseman::CASE_OPEN_LOG) { + return case_open_log(); + } + elsif ($view == $Caseman::CASE_NEW_DOIT) { + return case_new_doit(); + } + elsif ($view == $Caseman::CASE_DETAILS) { + return case_details(); + } + } + + Args::check_case(); + $::case_dir = "$::LOCKDIR/" . Args::get_case() . "/"; + $::case_dir =~ s/\/\//\//g; + + # Host functions + if ($view <= $HOST_MAX) { + if ($view == $Caseman::HOST_OPEN) { + return host_open(); + } + elsif ($view == $Caseman::HOST_ADD) { + return host_add(); + } + + Args::check_host(); + $::host_dir = "$::case_dir" . Args::get_host() . "/"; + $::host_dir =~ s/\/\//\//g; + if ($view == $Caseman::HOST_ADD_DOIT) { + return host_add_doit(); + } + + Caseman::read_host_config(); + if ($view == $Caseman::HOST_OPEN_LOG) { + return host_open_log(); + } + elsif ($view == $Caseman::HOST_DETAILS) { + return host_details(); + } + } + + Args::check_host(); + $::host_dir = "$::case_dir" . Args::get_host() . "/"; + $::host_dir =~ s/\/\//\//g; + Caseman::read_host_config(); + Args::check_inv(); + + if ($view <= $IMG_MAX) { + if ($view == $Caseman::VOL_OPEN) { + return vol_open(); + } + elsif ($view == $Caseman::IMG_ADD) { + return img_add(); + } + elsif ($view == $Caseman::IMG_ADD_PREP) { + return img_add_prep(); + } + elsif ($view == $Caseman::IMG_ADD_DOIT) { + return img_add_doit(); + } + + Args::check_vol('vol'); + + if ($view == $Caseman::VOL_OPEN_LOG) { + return vol_open_log(); + } + elsif ($view == $Caseman::VOL_DETAILS) { + return vol_details(); + } + + # elsif ($view == $Caseman::IMG_DEL) { + # return img_del(); + # } + elsif ($view == $Caseman::VOL_MAKESTR) { + return vol_makestr(); + } + elsif ($view == $Caseman::VOL_MAKEBLKLS) { + return vol_makeblkls(); + } + } + + Print::print_check_err("Invalid Case Management View"); +} + +#################################################################### +# General menu Functions + +sub print_menu_tabs { + + if ($::LIVE == 1) { + print "<h2>Live Analysis Mode</h2>\n"; + } + + print "<table width=\"600\" height=\"60\" background=\"$::YEL_PIX\" " + . "border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tr>\n" + . "<td align=\"center\" width=\"200\">"; + + my $view = Args::get_view(); + + # Case Gallery Tab + if ($view == $Caseman::CASE_OPEN) { + print "<img border=0 src=\"pict/menu_t_cg_cur.jpg\" " + . "width=200 height=65 alt=\"Case Gallery (Current Mode)\">\n"; + } + elsif ($::LIVE == 1) { + print "<img border=0 src=\"pict/menu_t_cg_org.jpg\" " + . "width=200 height=65 alt=\"Case Gallery\">\n"; + } + else { + print "<a href=\"$::PROGNAME?" + . "mod=$::MOD_CASEMAN&view=$Caseman::CASE_OPEN\">" + . "<img border=0 src=\"pict/menu_t_cg_link.jpg\" " + . "width=200 height=65 alt=\"Case Gallery\"></a>\n"; + } + print "</td>\n" . "<td align=\"center\" width=\"200\">"; + + # Host Gallery Tab + # Current + if ($view == $Caseman::HOST_OPEN) { + print "<img border=0 src=\"pict/menu_t_hg_cur.jpg\" " + . "width=200 height=65 alt=\"Host Gallery (Current Mode)\">\n"; + } + + # Link + elsif (($view == $Caseman::VOL_OPEN) && ($::LIVE == 0)) { + print "<a href=\"$::PROGNAME?" + . "mod=$::MOD_CASEMAN&view=$Caseman::HOST_OPEN" + . "&case=$Args::args{'case'}\">" + . "<img border=0 src=\"pict/menu_t_hg_link.jpg\" " + . "width=200 height=65 alt=\"Host Gallery\"></a>\n"; + } + + # Non-link + else { + print "<img border=0 src=\"pict/menu_t_hg_org.jpg\" " + . "width=200 height=65 alt=\"Host Gallery (Not Available)\">\n"; + } + + print "</td>\n" . "<td align=\"center\" width=\"200\">"; + + # Host Manager Tab + # Current + if ($view == $Caseman::VOL_OPEN) { + print "<img border=0 src=\"pict/menu_t_hm_cur.jpg\" " + . "width=200 height=65 alt=\"Host Manager (Current Mode)\">\n"; + } + + # non-link + else { + print "<img border=0 src=\"pict/menu_t_hm_org.jpg\" " + . "width=200 height=65 alt=\"Host Manager (Not Available)\">\n"; + } + + print "</td>\n</tr>\n" . "</table>\n"; +} + +#################################################################### +# Case Functions + +# if no args are passed, return case config using args{'case'}, +# else use the case value passed +# +# Case config: +# In case directory with case_name.case +sub case_config_fname { + if (scalar(@_) == 1) { + my $c = shift; + return "$::LOCKDIR/" . "$c/case.aut"; + } + else { + return "$::LOCKDIR/" . "$Args::args{'case'}/case.aut"; + } +} + +# Read case config and save it to $Caseman::cvals +sub read_case_config { + return if ($::LIVE == 1); + + my $case; + + if (scalar(@_) == 1) { + $case = shift; + } + else { + $case = Args::get_case(); + } + + my $fname = case_config_fname($case); + + %Caseman::cvals = (); + + open CONFIG, "<$fname" + or die "Can't open case config file ($fname)"; + + while (<CONFIG>) { + next if ((/^\#/) || (/^\s+$/)); + s/^\s+//; + s/\s+$//; + $Caseman::cvals{$1} = Print::html_encode($2) if (/^(\S+)\s+(.*)$/); + } + close(CONFIG); + + $Caseman::cvals{'desc'} = "None Provided" + unless (exists $Caseman::cvals{'desc'}); + + $Caseman::cvals{'created'} = "unknown" + unless (exists $Caseman::cvals{'created'}); +} + +sub case_new { + Print::print_html_header("Create A New Case"); + + print <<EOF; +<br> +<br> +<center> +<img src=\"pict/menu_h_cnew.jpg\" alt=\"New Case\"> +<br><br><br> + +<table width=\"600\" background=\"$::YEL_PIX\" cellspacing=\"0\" + cellpadding=\"2\" border=0> +<form action=\"$::PROGNAME\" method=\"get\"> +<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\"> +<input type=\"hidden\" name=\"view\" value=\"$Caseman::CASE_NEW_DOIT\"> +<tr> + <td colspan=3 align=left> + 1. <b>Case Name:</b> The name of this investigation. It can contain only letters, numbers, and symbols. + </td> +</tr> +<tr> + <td> </td> + <td align=left colspan=2><input type=\"text\" name=\"case\"></td> +</tr> + +<tr><td colspan=3> </td></tr> + +<tr> + <td colspan=3 align=left> + 2. <b>Description:</b> An optional, one line description of this case. + </td> +</tr> +<tr> + <td> </td> + <td align=left colspan=2><input type=\"text\" name=\"desc\" size=32 maxlength=32></td> +</tr> + +<tr><td colspan=3> </td></tr> + +<tr> + <td colspan=3 align=left> + 3. <b>Investigator Names:</b> The optional names (with no spaces) of the investigators for this case. + </td> +</tr> +<tr> + <td> </td> + <td align=left><tt>a.</tt> <input type=\"text\" name=\"inv1\"></td> + <td align=left><tt>b.</tt> <input type=\"text\" name=\"inv2\"></td> +</tr> +<tr> + <td> </td> + <td align=left><tt>c.</tt> <input type=\"text\" name=\"inv3\"></td> + <td align=left><tt>d.</tt> <input type=\"text\" name=\"inv4\"></td> +</tr> +<tr> + <td> </td> + <td align=left><tt>e.</tt> <input type=\"text\" name=\"inv5\"></td> + <td align=left><tt>f.</tt> <input type=\"text\" name=\"inv6\"></td> +</tr> +<tr> + <td> </td> + <td align=left><tt>g.</tt> <input type=\"text\" name=\"inv7\"></td> + <td align=left><tt>h.</tt> <input type=\"text\" name=\"inv8\"></td> +</tr> +<tr> + <td> </td> + <td align=left><tt>i.</tt> <input type=\"text\" name=\"inv9\"></td> + <td align=left><tt>j.</tt> <input type=\"text\" name=\"inv10\"></td> +</tr> +</table> + +<br><br> +<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center> + <input type=\"image\" src=\"pict/menu_b_cnew.jpg\" + alt=\"Create Case\" width=\"176\" height=20 border=0> + </td> +</form> + <td align=center> + <form action=\"$::PROGNAME\" method=\"get\"> + <input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\"> + <input type=\"hidden\" name=\"view\" value=\"$Caseman::CASE_OPEN\"> + <input type=\"image\" src=\"pict/menu_b_cancel.jpg\" + alt=\"Cancel\" width=\"167\" height=20 border=0> + </form> + </td> + <td align=center><a href=\"$::HELP_URL\" + target=\"_blank\"> + <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" + width=\"167\" height=20 border=0></a> + </td> +</tr> +</table> +EOF + + Print::print_html_footer(); + return; +} + +# Create the directory and case configuration file +# Gets the input from CASE_NEW +sub case_new_doit { + Print::print_html_header("Creating Case: $Args::args{'case'}"); + my $case = $Args::args{'case'}; + + print "<h3>Creating Case: <tt>$case</tt></h3>\n"; + + # Make the directory + if (-d "$::case_dir") { + + # we can't send all of this to print_err, bc it doesn't want HTML + print "Error: $::case_dir already exists<br>" + . "Please remove the directory and its contents and try again" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::CASE_OPEN\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + Print::print_err("\n"); + } + + unless (mkdir "$::case_dir", $::MKDIR_MASK) { + Print::print_err("Error making directory $::case_dir: $!"); + } + + print "Case directory (<tt>$::case_dir</tt>) created<br>\n"; + Print::log_case_info("Case $case created"); + + my $fname = Caseman::case_config_fname(); + + open CASE_CONFIG, ">$fname" or die "Can't open case config: $fname"; + + print CASE_CONFIG "# Autopsy case config file\n" + . "# Case: $case\n\n" + . "created " + . localtime() . "\n"; + + if ((exists $Args::args{'desc'}) && ($Args::args{'desc'} ne "")) { + Print::print_err( + "Invalid Description\n" . "Use the browser's back button to fix") + if ($Args::args{'desc'} =~ /\n/); + + print CASE_CONFIG "desc $Args::args{'desc'}\n"; + } + print CASE_CONFIG "images $::IMGDIR\n"; + print CASE_CONFIG "data $::DATADIR\n"; + print CASE_CONFIG "log $::LOGDIR\n"; + print CASE_CONFIG "reports $::REPDIR\n"; + + close CASE_CONFIG; + print "Configuration file (<tt>$fname</tt>) created<br>\n"; + + my $iname = investig_fname(); + open INVES, ">>$iname" or die "Can't open investigators file: $iname"; + + my @invs; + if ( (exists $Args::args{'inv1'}) + && ($Args::args{'inv1'} ne "") + && ($Args::args{'inv1'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv2'}) + && ($Args::args{'inv2'} ne "") + && ($Args::args{'inv2'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv3'}) + && ($Args::args{'inv3'} ne "") + && ($Args::args{'inv3'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv4'}) + && ($Args::args{'inv4'} ne "") + && ($Args::args{'inv4'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv5'}) + && ($Args::args{'inv5'} ne "") + && ($Args::args{'inv5'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv6'}) + && ($Args::args{'inv6'} ne "") + && ($Args::args{'inv6'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv7'}) + && ($Args::args{'inv7'} ne "") + && ($Args::args{'inv7'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv8'}) + && ($Args::args{'inv8'} ne "") + && ($Args::args{'inv8'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv9'}) + && ($Args::args{'inv9'} ne "") + && ($Args::args{'inv9'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + if ( (exists $Args::args{'inv10'}) + && ($Args::args{'inv10'} ne "") + && ($Args::args{'inv10'} =~ /^\s*($::REG_INVESTIG)\s*$/o)) + { + print INVES "$1\n"; + push @invs, $1; + } + + close(INVES); + + Print::log_session_info("Case $case created"); + + print "<br><br>We must now create a host for this case.\n"; + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_ADD\">\n" + . "<input type=\"hidden\" name=\"case\" value=\"$case\">\n"; + + if (scalar @invs == 0) { + print "<option hiddden name=\"inv\" value=\"unknown\">\n"; + } + else { + print "<br><br>Please select your name from the list: " + . "<select name=\"inv\" size=\"1\">\n"; + + foreach $i (@invs) { + print "<option value=\"$i\">$i</option>\n"; + } + print "</select>\n"; + } + + print "<br><br>" + . "<input type=\"image\" src=\"pict/menu_b_hnew.jpg\" alt=\"Add New Host\" " + . "height=20 border=\"0\"></form>\n"; + + Print::print_html_footer(); + return; +} + +# Open a Case +# This provides a form with a list of options +sub case_open { + Print::print_html_header("Open A Case"); + + # Read the directories of the Evidence Locker into an array + # Verify that there is a config file in the directory + my @cases; + opendir CASES, $::LOCKDIR or die "Can't open $::LOCKDIR directory: $!"; + foreach my $c (readdir CASES) { + next if (($c eq '.') || ($c eq '..')); + my $cfile = Caseman::case_config_fname($c); + + push @cases, $c + if ((-d "$::LOCKDIR/$c") && (-e "$cfile")); + } + closedir CASES; + + print "<br><br><center>"; + + # Were there any cases? + if (scalar @cases == 0) { + print "No cases exist in <tt>$::LOCKDIR</tt><br><br>\n" + . "Select the New Case button below to make one<br>\n"; + } + else { + + print "Select the case to open or create a new one<br>\n"; + + print_menu_tabs(); + + print "<table width=\"600\" background=\"$::YEL_PIX\" " + . " cellspacing=\"0\" cellpadding=\"2\" border=0>\n"; + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::CASE_OPEN_LOG\">\n" + . Args::make_hidden() + . "<tr><th>Name</th>" + . "<th>Description</th>" + . "<td> </td></tr>\n"; + + my $first = 0; + foreach my $c (@cases) { + + print "<tr><td align=\"left\">" + . "<input type=\"radio\" name=\"case\" value=$c"; + if ($first == 0) { + print " CHECKED"; + $first = 1; + } + print ">" . Print::html_encode($c) . "</td>"; + + Caseman::read_case_config($c); + + print "<td>$Caseman::cvals{'desc'}</td>" + . "<td align=center>" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::CASE_DETAILS&case=$c\">" + . "details</a></td>" + . "</tr>\n"; + } + print "</table>\n"; + } + + print "<br><br>" + . "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr>\n"; + + # Print the OK button if there were cases + if (scalar @cases != 0) { + print "<td align=center>" + . "<input type=\"image\" src=\"pict/menu_b_ok.jpg\" " + . "width=167 height=20 alt=\"Ok\" border=0>" + . "</form></td>\n\n"; + } + + # Print a 'New Case' Button + print "<td align=center>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::CASE_NEW\">\n" + . "<input type=\"image\" src=\"pict/menu_b_cnew.jpg\" " + . "width=167 height=20 alt=\"New Case\" border=0>\n" + . "</form></td>" + . + + # Print a Menu Button + "<td align=center>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"image\" src=\"pict/menu_b_menu.jpg\" " + . "width=167 height=20 alt=\"Main Menu\" border=0>\n" + . "</form></td></tr></table>\n"; + + print "<table width=600 cellspacing=\"0\" cellpadding=\"2\">\n<tr>" + . "<td> </td>\n" + . "<td align=center width=200><a href=\"$::HELP_URL\" " + . " target=\"_blank\">" + . "<img src=\"pict/menu_b_help.jpg\" alt=\"Help\" " + . "width=\"167\" height=20 border=0>" + . "</a></td>" + . "<td> </td>\n" + . "</tr>\n" + . "</table>"; + + Print::print_html_footer(); + return; +} + +# Log that a given case was opened and then proceed to open a host +sub case_open_log { + Print::log_session_info("Case $Args::args{'case'} opened"); + Print::log_case_info("Case $Args::args{'case'} opened"); + $Args::args{'view'} = $Args::enc_args{'view'} = $Caseman::HOST_OPEN; + host_open(); +} + +# Display Case Details +sub case_details { + + Print::print_html_header("Details of $Args::args{'case'}"); + + read_case_config(); + + print "<br><br>" + . "<center>" + . "<img src=\"pict/menu_h_cdet.jpg\" alt=\"Case Details\">" + . "<br><br><br>\n" + . "<table width=\"600\" cellspacing=\"0\" background=\"$::YEL_PIX\" " + . "cellpadding=\"2\" border=0>\n" + . " <tr><td align=\"right\" width=300><b>Name:</b></td>" + . "<td align=\"left\" width=300><tt>$Args::args{'case'}</tt></td></tr>\n" + . + + # Description + " <tr><td align=\"right\"><b>Description:</b></td>" + . "<td align=\"left\"><tt>$Caseman::cvals{'desc'}</tt></td></tr>\n" + . " <tr><td align=\"right\"><b>Created:</b></td>" + . "<td align=\"left\"><tt>$Caseman::cvals{'created'}</tt></td></tr>\n"; + + # Display the valid investigators + my @invs = read_invest(); + my $cnt = 0; + print " <tr><td colspan=\"2\"> </td></tr>\n" + if (scalar @invs > 0); + + foreach my $i (@invs) { + if ($cnt == 0) { + print " <tr><td align=\"right\"><b>Investigators:</b></td>"; + $cnt++; + } + else { + print " <tr><td> </td>"; + } + print "<td align=\"left\"><tt>" + . Print::html_encode($i) + . "</tt></td></tr>\n"; + } + + print "</table>\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::CASE_OPEN\">" + . "<img src=\"pict/menu_b_ok.jpg\" alt=\"Ok\" " + . "width=\"167\" height=20 border=\"0\"></a>"; + + Print::print_html_footer(); + return 0; +} + +#################################################################### +# Host Functions + +# if no args are passed, return host config using args{'host'}, +# else use the host value passed +sub host_config_fname { + if (scalar(@_) == 1) { + my $h = shift; + return "$::case_dir" . "$h/host.aut"; + } + else { + return "$::host_dir" . "host.aut"; + } +} + +# Converts the original single image host config to the volume-based config +sub convert_host_config { + + return if ($::LIVE == 1); + + my $host = Args::get_host(); + + Print::log_host_info("Converting host config files"); + print STDERR "Converting host config file to new format\n"; + + # The file to convert + my $cfile = host_config_fname(); + unless (open(FILE, $cfile)) { + Print::print_check_err("Error opening $cfile"); + } + + my $tmpcfile = "$::host_dir" . "host-convert.aut"; + unless (open(FILE_TMP, ">>$tmpcfile")) { + Print::print_check_err("Error opening $tmpcfile"); + } + + my $img_cnt = 0; + my $vol_cnt = 0; + $img2vol{'qazwsxedc'} = ""; # stores the image path to partition / file name + $img2vol2{'qazwsxedc'} = + ""; # stores the image path to file name (no partitions) + + while (<FILE>) { + if ((/^\#/) || (/^\s+$/)) { + print FILE_TMP $_; + next; + } + + # remove whitespace + s/^\s+//; + s/\s+$//; + + # normal file system image entry + # + # 'image images/hda1.dd openbsd /usr + if (/^image\s+($::REG_IMG)\s+([\w\-]+)\s+([\w\-\_\.\/:\\]+)$/o) { + + my $i = $1; + my $t = $2; + my $r = $3; + + # Add trailing / to original mount point if needed + if (($r !~ /.*?\/$/) && ($r !~ /.*?\\$/)) { + $r .= '/'; + } + my $vnum = "vol" . $vol_cnt; + my $inum = "img" . $img_cnt; + $img2vol{$i} = $vnum; + $img2vol2{$i} = $inum; + + print FILE_TMP "image $inum raw $i\n"; + print FILE_TMP "part $vnum $inum 0 0 $t $r\n"; + + $img_cnt++; + $vol_cnt++; + } + + # swap + # swap images/hda3.dd + elsif (/^swap\s+($::REG_IMG)\s*$/o) { + my $i = $1; + + my $vnum = "vol" . $vol_cnt; + my $inum = "img" . $img_cnt; + $img2vol{$i} = $vnum; + $img2vol2{$i} = $inum; + + print FILE_TMP "image $inum raw $i\n"; + print FILE_TMP "part $vnum $inum 0 0 swap\n"; + $img_cnt++; + $vol_cnt++; + + } + + # raw + # raw images/hda3.dd + elsif (/^raw\s+($::REG_IMG)\s*$/o) { + my $i = $1; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "img" . $img_cnt; + + print FILE_TMP "image img" . $img_cnt . " raw $i\n"; + print FILE_TMP "part vol" . $vol_cnt . " img" . $img_cnt + . " 0 0 raw\n"; + $img_cnt++; + $vol_cnt++; + } + + # entry for a strings or blkls file + # + # strings data/hda1.str images/hda1.dd + elsif (/^strings\s+($::REG_IMG)\s+($::REG_IMG)$/o) { + my $i = $1; + my $o = $2; + + if (exists $img2vol{$o}) { + my $vname = $img2vol{$o}; + print FILE_TMP "strings vol" . $vol_cnt . " $vname $i\n"; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "vol" . $vol_cnt; + } + else { + print STDERR "Error: Volume for strings $o not found<br>\n"; + } + $vol_cnt++; + } + + # entry for a strings or blkls file + # + # unistrings data/hda1.str images/hda1.dd + elsif (/^unistrings\s+($::REG_IMG)\s+($::REG_IMG)$/o) { + my $i = $1; + my $o = $2; + + if (exists $img2vol{$o}) { + my $vname = $img2vol{$o}; + print FILE_TMP "unistrings vol" . $vol_cnt + . " $vname $i\n"; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "vol" . $vol_cnt; + } + else { + print STDERR + "Error: Volume for unicode strings $o not found<br>\n"; + } + $vol_cnt++; + } + + # blkls entry + # blkls data/image.blkls [images/image.dd] + elsif (/^blkls\s+($::REG_IMG)\s*($::REG_IMG)$/o) { + my $i = $1; + my $o = $2; + + $img2vol{$i} = "vol" . $vol_cnt; + + if (exists $img2vol{$o}) { + my $vname = $img2vol{$o}; + print FILE_TMP "blkls vol" . $vol_cnt . " $vname $i\n"; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "vol" . $vol_cnt; + } + else { + print STDERR "Error: Volume for blkls $o not found<br>\n"; + } + $vol_cnt++; + } + + # body data/body.txt + elsif (/^body\s+($::REG_IMG)$/o) { + my $i = $1; + print FILE_TMP "body vol" . $vol_cnt . " $i\n"; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "vol" . $vol_cnt; + + $vol_cnt++; + } + + # timeline data/timeline.txt + elsif (/^timeline\s+($::REG_IMG)$/o) { + my $i = $1; + print FILE_TMP "timeline vol" . $vol_cnt . " $i\n"; + $img2vol{$i} = "vol" . $vol_cnt; + $img2vol2{$i} = "vol" . $vol_cnt; + $vol_cnt++; + } + + # timezone XYZ + elsif (/^timezone\s+($::REG_ZONE_ARGS)$/o) { + print FILE_TMP "$_\n"; + } + + # timeskew XYZ + elsif (/^timeskew\s+($::REG_SKEW)$/o) { + print FILE_TMP "$_\n"; + } + + # desc XYZ + elsif (/^desc\s+(.*)$/) { + print FILE_TMP "$_\n"; + } + + # hash databases + elsif (/^alert_db\s+'(.*)'$/) { + print FILE_TMP "$_\n"; + } + elsif (/^exclude_db\s+'(.*)'$/) { + print FILE_TMP "$_\n"; + } + else { + my $msg = + "Error: invalid entry in $cfile:$." . "\n" + . "image path fs_type mnt_point\n" + . "strings path orig_img\n" + . "blkls path [orig_img]\n" + . "body path\n" + . "timeline path\n" + . "timezone TZ\n" + . "desc DESCRIPTION\n"; + Print::print_check_err($msg); + } + } + + close(FILE); + close(FILE_TMP); + unless (rename $cfile, $cfile . ".bak") { + print STDERR "Error backing up original host config file\n"; + } + unless (rename $tmpcfile, $cfile) { + print STDERR "Error renaming new host config file\n"; + } + + Notes::convert(\%img2vol); + Hash::convert(\%img2vol2); +} + +# reads host config file and sets global hash values for images and other +sub read_host_config { + + if ($::LIVE == 1) { + %Caseman::mod2vol = (); + %Caseman::vol2str = (); + %Caseman::vol2uni = (); + %Caseman::vol2blkls = (); + $Caseman::tz = ""; + $Caseman::ts = 0; + $Caseman::host_desc = ""; + $Caseman::exclude_db = ""; + $Caseman::alert_db = ""; + return; + } + + my $host = Args::get_host(); + + my $cfile = host_config_fname(); + restart: + unless (open(FILE, $cfile)) { + Print::print_check_err("Error opening $cfile"); + } + + %Caseman::vol2mnt = (); + %Caseman::vol2ftype = (); + %Caseman::vol2dtype = (); + %Caseman::vol2cat = (); + %Caseman::mod2vol = (); + %Caseman::vol2str = (); + %Caseman::vol2uni = (); + %Caseman::vol2blkls = (); + %Caseman::vol2par = (); + %Caseman::vol2start = (); + %Caseman::vol2end = (); + $Caseman::vol2path = (); + $Caseman::vol2sname = (); + + $Caseman::tz = ""; + $Caseman::ts = 0; + $Caseman::host_desc = ""; + $Caseman::exclude_db = ""; + $Caseman::alert_db = ""; + + while (<FILE>) { + next if ((/^\#/) || (/^\s+$/)); + + # remove whitespace + s/^\s+//; + s/\s+$//; + + # old file system image entry + # + # 'image images/hda1.dd openbsd /usr + if (/^image\s+($::REG_IMG)\s+([\w\-]+)\s+([\w\-\_\.\/:\\]+)$/o) { + + close(FILE); + convert_host_config(); + goto restart; + } + elsif ( + /^image\s+($::REG_INAME)\s+($::REG_IMGTYPE)\s+($::REG_IMG_CONFIG)$/o + ) + { + my $me = $1; + my $t = $2; + my $i = $3; + + unless ((-e "$::host_dir$i") + || ((-l "$::host_dir$i") && (-e readlink "$::host_dir$i"))) + { + Print::print_check_err( + "Error: image $i in ${host}.host:$. not found: " + . "$::host_dir" + . "$i \nEdit the config file and refresh your browser\n" + . "(Or your version of Perl does not support large files)" + ); + } + + if (exists $Caseman::vol2path{$me}) { + $Caseman::vol2path{$me} .= " \'$::host_dir" . "$i\'"; + } + else { + $Caseman::vol2path{$me} = "\'$::host_dir" . "$i\'"; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + + $Caseman::vol2par{$me} = ""; + $Caseman::vol2cat{$me} = "image"; + $Caseman::vol2itype{$me} = $t; + $Caseman::vol2ftype{$me} = ""; + + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + } + } + elsif ( +/^part\s+($::REG_VNAME)\s+($::REG_INAME)\s+(\d+)\s+(\d+)\s+($::REG_FTYPE)\s*([\w\-\_\.\/:\\]+)?$/o + ) + { + my $par = $2; + my $me = $1; + my $s = $3; + my $e = $4; + my $t = $5; + my $r = $6; # Not defined for swap and raw + + unless (exists $Fs::addr_unit{$t}) { + Print::print_check_err( + "Error: unknown type: $t in host config: $." + . "\nEdit the file and refresh your browser"); + } + + if (exists $Caseman::vol2itype{$par}) { + $Caseman::vol2itype{$me} = $Caseman::vol2itype{$par}; + } + else { + Print::print_check_err( +"Error: Image $par for partition $me was not found in config: $." + . "\nEdit the file and refresh your browser"); + } + + $Caseman::vol2ftype{$me} = $t; + $Caseman::vol2cat{$me} = "part"; + $Caseman::vol2start{$me} = $s; + $Caseman::vol2end{$me} = $e; + + # Add trailing / to original mount point if needed + if ((defined $r) && ($r !~ /.*?\/$/) && ($r !~ /.*?\\$/)) { + $r .= '/'; + } + $Caseman::vol2mnt{$me} = $r; + $Caseman::vol2par{$me} = $par; + $Caseman::vol2path{$me} = $Caseman::vol2path{$par}; + $Caseman::vol2sname{$me} = + $Caseman::vol2sname{$par} . "-" . $s . "-" . $e; + } + elsif (/^disk\s+($::REG_VNAME)\s+($::REG_INAME)\s+($::REG_FTYPE)?$/o) { + my $par = $2; + my $me = $1; + my $t = $3; + + unless (exists $Vs::type{$t}) { + Print::print_check_err( + "Error: unknown volume system type: $t in host config: $." + . "\nEdit the file and refresh your browser"); + } + + if (exists $Caseman::vol2itype{$par}) { + $Caseman::vol2itype{$me} = $Caseman::vol2itype{$par}; + } + else { + Print::print_check_err( +"Error: Image $par for disk $me was not found in config: $.\n" + . "Edit the file and refresh your browser"); + } + + $Caseman::vol2ftype{$me} = "raw"; + $Caseman::vol2dtype{$me} = $t; + $Caseman::vol2cat{$me} = "disk"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2mnt{$me} = ""; + $Caseman::vol2par{$me} = $par; + $Caseman::vol2path{$me} = $Caseman::vol2path{$par}; + $Caseman::vol2sname{$me} = $Caseman::vol2sname{$par} . "-disk"; + } + + # entry for a strings or blkls file + # + # strings data/hda1.str volX + elsif (/^strings\s+($::REG_VNAME)\s+($::REG_VNAME)\s+($::REG_IMG)$/o) { + my $i = $3; + my $par = $2; + my $me = $1; + + unless ((-e "$::host_dir$i") + || ((-l "$::host_dir$i") && (-e readlink "$::host_dir$i"))) + { + Print::print_check_err("Error: strings file not found: " + . "$::host_dir$i\nEdit host config in $::host_dir and refresh your browser" + ); + } + + unless (exists $Caseman::vol2cat{$par}) { + Print::print_check_err( +"Error: Volume $par for strings $me was not found in config: $." + . "\nEdit the file and refresh your browser"); + } + + $Caseman::vol2ftype{$me} = "strings"; + $Caseman::vol2cat{$me} = "mod"; + $Caseman::vol2itype{$me} = "raw"; + $Caseman::mod2vol{$me} = $par; + $Caseman::vol2str{$par} = $me; + $Caseman::vol2par{$me} = $par; + $Caseman::vol2path{$me} = "\'$::host_dir" . "$i\'"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + + } + + # entry for a strings or blkls file + # + # unistrings data/hda1.str volX + elsif (/^unistrings\s+($::REG_VNAME)\s+($::REG_VNAME)\s+($::REG_IMG)$/o) + { + my $i = $3; + my $par = $2; + my $me = $1; + + unless ((-e "$::host_dir$i") + || ((-l "$::host_dir$i") && (-e readlink "$::host_dir$i"))) + { + Print::print_check_err("Error: Unicode strings file not found: " + . "$::host_dir$i\nEdit host config in $::host_dir and refresh your browser" + ); + } + + unless (exists $Caseman::vol2cat{$par}) { + Print::print_check_err( +"Error: Volume $par for unistrings $me was not found in config: $." + . "\nEdit the file and refresh your browser"); + } + + $Caseman::vol2ftype{$me} = "strings"; + $Caseman::vol2cat{$me} = "mod"; + $Caseman::vol2itype{$me} = "raw"; + $Caseman::mod2vol{$me} = $par; + $Caseman::vol2uni{$par} = $me; + $Caseman::vol2par{$me} = $par; + $Caseman::vol2path{$me} = "\'$::host_dir" . "$i\'"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + } + + # blkls entry + # blkls themname myname + elsif ((/^blkls\s+($::REG_VNAME)\s+($::REG_VNAME)\s+($::REG_IMG)$/o) || + (/^dls\s+($::REG_VNAME)\s+($::REG_VNAME)\s+($::REG_IMG)$/o)) { + my $i = $3; + my $par = $2; + my $me = $1; + + unless ( + (-e "$::host_dir$i") + || ( (-l "$::host_dir$i") + && (-e readlink "$::host_dir$i")) + ) + { + Print::print_check_err("Error: blkls file not found: " + . "$::host_dir$i \nEdit host config in $::host_dir and refresh your browser" + ); + } + + unless (exists $Caseman::vol2cat{$par}) { + Print::print_check_err( +"Error: Volume $par for blkls $me was not found in config: $." + . "\nEdit the file and refresh your browser"); + } + + $Caseman::vol2ftype{$me} = "blkls"; + $Caseman::vol2cat{$me} = "mod"; + $Caseman::vol2itype{$me} = "raw"; + $Caseman::vol2mnt{$me} = ""; + $Caseman::vol2par{$me} = $par; + $Caseman::mod2vol{$me} = $par; + $Caseman::vol2blkls{$par} = $me; + $Caseman::vol2path{$me} = "\'$::host_dir" . "$i\'"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + + } + + # body data/body.txt + elsif (/^body\s+($::REG_VNAME)\s+($::REG_IMG)$/o) { + my $me = $1; + my $i = $2; + + unless ((-e "$::host_dir$i") + || ((-l "$::host_dir$i") && (-e readlink "$::host_dir$i"))) + { + Print::print_check_err("Error: body file not found: " + . "$::host_dir$i <br>Edit host config in $::host_dir and refresh your browser" + ); + } + + $Caseman::vol2cat{$me} = "timeline"; + $Caseman::vol2ftype{$me} = "body"; + $Caseman::vol2itype{$me} = "raw"; + $Caseman::vol2path{$me} = "\'$::host_dir" . "$i\'"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + } + + # timeline data/timeline.txt + elsif (/^timeline\s+($::REG_VNAME)\s+($::REG_IMG)$/o) { + my $me = $1; + my $i = $2; + + unless ((-e "$::host_dir$i") + || ((-l "$::host_dir$i") && (-e readlink "$::host_dir$i"))) + { + Print::print_check_err("Error: timeline file not found: " + . "$::host_dir$i \nEdit host config in $::host_dir and refresh your browser" + ); + } + + $Caseman::vol2cat{$me} = "timeline"; + $Caseman::vol2ftype{$me} = "timeline"; + $Caseman::vol2itype{$me} = "raw"; + +# We do not add the quotes to the path for timeline because it is opened only by the Perl code and it doesn't like the quotes + $Caseman::vol2path{$me} = "$::host_dir" . "$i"; + $Caseman::vol2start{$me} = 0; + $Caseman::vol2end{$me} = 0; + $Caseman::vol2sname{$me} = $i; + $Caseman::vol2sname{$me} = $1 if ($i =~ /\/($::REG_FILE)$/); + + } + + # timezone XYZ + elsif (/^timezone\s+($::REG_ZONE_ARGS)$/o) { + $Caseman::tz = "\'$1\'"; + } + + # timeskew XYZ + elsif (/^timeskew\s+($::REG_SKEW)$/o) { + $Caseman::ts = "\'$1\'"; + } + + # desc XYZ + elsif (/^desc\s+(.*)$/) { + $Caseman::host_desc = Print::html_encode($1); + } + + # hash databases + elsif (/^alert_db\s+'($::REG_HASHDB)'$/) { + $Caseman::alert_db = "$1"; + } + elsif (/^exclude_db\s+'($::REG_HASHDB)'$/) { + $Caseman::exclude_db = "$1"; + } + else { + my $msg = "Error: invalid entry in $cfile:$." . "\n" . "$_\n"; + Print::print_check_err($msg); + } + } + close(FILE); +} + +# Add a new image entry to the host config and return its id +sub add_img_host_config { + my $type = shift; + my $other = shift; + my $id = shift; + + my $read = host_config_fname(); + my $write = $read . "-" . rand(); + + unless (open(READ, "<$read")) { + Print::print_check_err("Error opening $read"); + } + + unless (open(WRITE, ">$write")) { + Print::print_check_err("Error opening $write"); + } + + my $maxcnt = 0; + + while (<READ>) { + s/^\s+//; + s/\s+$//; + if (/^\w+\s+img(\d+)\s+.*$/) { + $maxcnt = $1 if ($1 > $maxcnt); + } + print WRITE "$_\n"; + } + $maxcnt++; + if ($id eq "") { + $id = "img" . $maxcnt; + } + print WRITE "$type $id $other\n"; + + Print::log_host_info("Image added: $type $id $other"); + + close(READ); + close(WRITE); + unless (rename $write, $read) { + print STDERR "Error renaming temp host config file\n"; + } + + return $id; +} + +# Add a new volume entry to the host config and return its id +sub add_vol_host_config { + my $type = shift; + my $other = shift; + + my $read = host_config_fname(); + my $write = $read . "-" . rand(); + + unless (open(READ, "<$read")) { + Print::print_check_err("Error opening $read"); + } + + unless (open(WRITE, ">$write")) { + Print::print_check_err("Error opening $write"); + } + + # We want to find the max count ... not just the unused + # ones because we could end up reusing one and that could + # mess up the notes + my $maxcnt = 0; + + while (<READ>) { + s/^\s+//; + s/\s+$//; + if (/^\w+\s+vol(\d+)\s+.*$/) { + $maxcnt = $1 if ($1 > $maxcnt); + } + print WRITE "$_\n"; + } + $maxcnt++; + print WRITE "$type vol" . $maxcnt . " $other\n"; + Print::log_host_info("Volume added: $type vol" . $maxcnt . " $other"); + + close(READ); + close(WRITE); + unless (rename $write, $read) { + print STDERR "Error renaming temp host config file\n"; + } + + return "vol" . $maxcnt; +} + +# Delete anentry from the host config +# DOES NOT WORK RIGHT NOW +sub del_host_config_BLAH { + return; + my $type = shift; + my $other = shift; + + my $read = host_config_fname(); + my $write = $read . "-" . rand(); + + unless (open(READ, "<$read")) { + Print::print_check_err("Error opening $read"); + } + + unless (open(WRITE, ">$write")) { + Print::print_check_err("Error opening $write"); + } + + while (<READ>) { + s/^\s+//; + s/\s+$//; + print WRITE "$_\n" + unless ((/^(\w+)\s+($::REG_IMG)/o) + && ($2 eq $img) + && ($1 ne 'desc') + && ($1 ne 'timezone')); + } + + if ($type ne "") { + if (defined $ref) { + print WRITE "$type $img $ref\n"; + } + else { + print WRITE "$type $img\n"; + } + } + + close(READ); + close(WRITE); + unless (rename $write, $read) { + print STDERR "Error renaming temp host config file\n"; + } + + return; +} + +# Given the image and md5, it is saved to the MD5.txt file and any other +# references to the image are removed +# +# if $md5 is "", then nothing is written +sub update_md5 { + my $vol = shift; + my $md5 = shift; + $md5 =~ tr/[a-f]/[A-F]/; + + my $read = "$::host_dir/md5.txt"; + my $write = $read . "-" . rand(); + + unless (open(WRITE, ">$write")) { + Print::print_check_err("Error opening $write"); + } + + if (-e "$read") { + unless (open(READ, "<$read")) { + Print::print_check_err("Error opening $read"); + } + + while (<READ>) { + s/^\s+//; + s/\s+$//; + print WRITE "$_\n" + unless ((/^$::REG_MD5\s+($::REG_VNAME)/o) && ($1 eq $vol)); + } + close(READ); + } + + print WRITE "$md5 $vol\n" if ($md5 ne ""); + + close(WRITE); + + unless (rename $write, $read) { + print STDERR "Error renaming temp MD5 hash file\n"; + } + return; +} + +sub host_add { + Print::print_html_header("Add A New Host To $Args::args{'case'}"); + + print "<b>Case: </b> $Args::args{'case'}<br><br>\n"; + + print "<center>" + . "<img src=\"pict/menu_h_hnew.jpg\" alt=\"Add Host\">" + . "<br><br><br>\n"; + + print "<table width=\"600\" cellspacing=\"0\" background=\"$::YEL_PIX\" " + . "cellpadding=\"2\" border=0>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_ADD_DOIT\">\n" + . Args::make_hidden() + . "<tr><td colspan=\"2\"> </td></tr>" + . + + # Host name +"<tr><td align=\"left\" colspan=2>1. <b>Host Name:</b> The name of the computer being investigated. It can contain only letters, numbers, and symbols.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\"><input type=\"text\" name=\"host\" size=32 maxlength=32 value=\"host1\"></td></tr>\n" + . + + # Description +"<tr><td align=\"left\" colspan=2>2. <b>Description:</b> An optional one-line description or note about this computer.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\">" + . "<input type=\"text\" name=\"desc\" size=32 maxlength=32></td></tr>\n" + . + + # Empty line + "<tr><td colspan=\"2\"> </td></tr>" . + + # Timezone +"<tr><td align=\"left\" colspan=2>3. <b>Time zone:</b> An optional timezone value (i.e. EST5EDT). If not given, it defaults to the local setting. A list of time zones can be found in the help files.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\">" + . "<input type=\"text\" name=\"tz\" size=16 maxlength=64></td></tr>\n" + . + + # Timeskew +"<tr><td align=\"left\" colspan=2>4. <b>Timeskew Adjustment:</b> An optional value to describe how many seconds this computer's clock was out of sync. For example, if the computer was 10 seconds fast, then enter -10 to compensate.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\">" + . "<input type=\"text\" name=\"ts\" size=8 maxlength=16 value=\"0\">" + . "</td></tr>\n" + . + + # Spacer + "<tr><td colspan=\"2\"> </td></tr>" . + + # Alert +"<tr><td align=\"left\" colspan=2>5. <b>Path of Alert Hash Database:</b> An optional hash database of known bad files.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\">" + . "<input type=\"text\" name=\"alert_db\" size=32 maxlength=512>" + . "</td></tr>\n" + . + + # Ignore +"<tr><td align=\"left\" colspan=2>6. <b>Path of Ignore Hash Database:</b> An optional hash database of known good files.</td></tr>" + . "<tr><td align=\"left\"> </td>" + . "<td align=\"left\">" + . "<input type=\"text\" name=\"exclude_db\" size=32 maxlength=512>" + . "</td></tr>\n" + . + + # Spacer + "<tr><td colspan=\"2\"> </td></tr>" . "</table>\n"; + + if (exists $Args::args{'inv'}) { + print + "<input type=\"hidden\" name=\"inv\" value=\"$Args::args{'inv'}\">\n"; + } + + # Ok Button + print "<br><br><table width=\"600\" cellspacing=\"8\" cellpadding=\"2\">\n" + . "<tr><td align=center>" + . "<input type=\"image\" src=\"pict/menu_b_hnew.jpg\" " + . "width=167 height=20 alt=\"Add Host\" border=0>\n" + . "</form></td>\n" + . + + # Cancel Button + "<td align=center>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_OPEN\">\n" + . "<input type=\"hidden\" name=\"case\" value=\"$Args::args{'case'}\">\n" + . "<input type=\"image\" src=\"pict/menu_b_cancel.jpg\" " + . "alt=\"Cancel\" width=\"167\" height=20 border=0>\n" + . "</form></td>\n" + . + + # Help Button + "<td align=center><a href=\"$::HELP_URL\" " + . "target=\"_blank\">" + . "<img src=\"pict/menu_b_help.jpg\" alt=\"Help\" " + . "width=\"167\" height=20 border=0></a>" + . "</td></tr>\n" + . "</table>"; + + Print::print_html_footer(); + + return 0; +} + +# Make the directories and config files for a host +sub host_add_doit { + Args::check_tz() + if ((exists $Args::args{'tz'}) && ($Args::args{'tz'} ne "")); + Args::check_ts(); + Print::print_html_header( + "Adding Host $Args::args{'host'} to $Args::args{'case'}"); + + print "<h3>Adding host: <tt>$Args::args{'host'}</tt> to " + . "case <tt>$Args::args{'case'}</tt></h3>\n"; + + # Do some sanity checks before we start making the directories and such + if ( (exists $Args::args{'alert_db'}) + && ($Args::args{'alert_db'} ne "")) + { + + unless ($Args::args{'alert_db'} =~ /^$::REG_HASHDB$/o) { + print "Invalid Alert Database path\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_ADD&case=$Args::args{'case'}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + return 1; + } + + unless (-e "$Args::args{'alert_db'}") { + print "Alert Database Not Found: $Args::args{'alert_db'}" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_ADD&case=$Args::args{'case'}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + return 1; + } + } + + if ( (exists $Args::args{'exclude_db'}) + && ($Args::args{'exclude_db'} ne "")) + { + unless ($Args::args{'exclude_db'} =~ /^$::REG_HASHDB$/o) { + print "Invalid Exclude Database path\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_ADD&case=$Args::args{'case'}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + return 1; + } + + unless (-e "$Args::args{'exclude_db'}") { + print "Exclude Database Not Found: $Args::args{'exclude_db'}" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_ADD&case=$Args::args{'case'}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + return 1; + } + } + + # Make the directory + if (-d "$::host_dir") { + + print "Error: $::host_dir already exists<br>" + . "Please remove the directory and its contents and try again" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_OPEN&case=$Args::enc_args{'case'}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + Print::print_err("\n"); + } + unless (mkdir "$::host_dir", $::MKDIR_MASK) { + Print::print_err("Error making directory $::host_dir: $!"); + } + + print "Host Directory (<tt>$::host_dir</tt>) created<p>\n"; + Print::log_case_info("Host $Args::args{'host'} added to case"); + + # Images directory + unless (mkdir "$::host_dir" . "$::IMGDIR", $::MKDIR_MASK) { + rmdir "$::host_dir"; + Print::print_err("Error making $::host_dir" . "$::IMGDIR"); + } + + # Output Directory + unless (mkdir "$::host_dir" . "$::DATADIR", $::MKDIR_MASK) { + rmdir "$::host_dir" . "$::IMGDIR"; + rmdir "$::host_dir"; + Print::print_err("Error making $::host_dir" . "$::DATADIR"); + } + + # Log Directory + unless (mkdir "$::host_dir" . "$::LOGDIR", $::MKDIR_MASK) { + rmdir "$::host_dir" . "$::DATADIR"; + rmdir "$::host_dir" . "$::IMGDIR"; + rmdir "$::host_dir"; + Print::print_err("Error making $::host_dir" . "$::LOGDIR"); + } + + # Reports directory + unless (mkdir "$::host_dir" . "$::REPDIR", $::MKDIR_MASK) { + rmdir "$::host_dir" . "$::LOGDIR"; + rmdir "$::host_dir" . "$::DATADIR"; + rmdir "$::host_dir" . "$::IMGDIR"; + rmdir "$::host_dir"; + Print::print_err("Error making $::host_dir" . "$::REPDIR"); + } + + # Make a directory for mounting the image in loopback + unless (mkdir "$::host_dir" . "mnt", $::MKDIR_MASK) { + rmdir "$::host_dir" . "$::REPDIR"; + rmdir "$::host_dir" . "$::LOGDIR"; + rmdir "$::host_dir" . "$::DATADIR"; + rmdir "$::host_dir" . "$::IMGDIR"; + rmdir "$::host_dir"; + Print::print_err("Error making $::host_dir" . "mnt"); + } + + Print::log_host_info( + "Host $Args::args{'host'} added to case $Args::args{'case'}"); + + # Create config file + my $fname = Caseman::host_config_fname(); + open HOST_CONFIG, ">$fname" or die "Can't open host config: $fname"; + + print HOST_CONFIG "# Autopsy host config file\n" + . "# Case: $Args::args{'case'} Host: $Args::args{'host'}\n" + . "# Created: " + . localtime() . "\n\n"; + + if ((exists $Args::args{'desc'}) && ($Args::args{'desc'} ne "")) { + Print::print_err( + "Invalid Description\n" . "Use the browser's back button to fix") + if ($Args::args{'desc'} =~ /\n/); + + print HOST_CONFIG "desc $Args::args{'desc'}\n"; + } + + print HOST_CONFIG "timezone " . Args::get_tz() . "\n" + if ((exists $Args::args{'tz'}) && ($Args::args{'tz'} ne "")); + print HOST_CONFIG "timeskew " . Args::get_ts() . "\n"; + + if ( (exists $Args::args{'alert_db'}) + && ($Args::args{'alert_db'} ne "")) + { + + # Index it if it is not + unless (-e "$Args::args{'alert_db'}-md5.idx") { + print +"Alert Database has not been indexed - it will be as an md5sum file<br>\n"; + + print "<hr>\n"; + Hash::index_md5sum($Args::args{'alert_db'}); + print "<hr>\n"; + } + + # only print it if it was successful + print HOST_CONFIG "alert_db \'$Args::args{'alert_db'}\'\n" + if (-e "$Args::args{'alert_db'}-md5.idx"); + } + + if ( (exists $Args::args{'exclude_db'}) + && ($Args::args{'exclude_db'} ne "")) + { + + # Index it if it is not + unless (-e "$Args::args{'exclude_db'}-md5.idx") { + print +"Exclude Database has not been indexed - it will be as an md5sum file<br>\n"; + + print "<hr>\n"; + Hash::index_md5sum($Args::args{'exclude_db'}); + print "<hr>\n"; + } + + # only print it if it was successful + print HOST_CONFIG "exclude_db \'$Args::args{'exclude_db'}\'\n" + if (-e "$Args::args{'exclude_db'}-md5.idx"); + } + + close HOST_CONFIG; + + print "Configuration file (<tt>$fname</tt>) created<br><br>\n"; + + print "We must now import an image file for this host\n"; + + print "<br><br><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_OPEN_LOG&$Args::baseargs\">" + . "<img src=\"pict/menu_b_inew.jpg\" alt=\"Add Image\" " + . " height=20 border=\"0\"></a>\n"; + + Print::print_html_footer(); + return 0; +} + +# Open a host in the given case +sub host_open { + Print::print_html_header("Open Host In $Args::args{'case'}"); + + # Create an array of directories in the case, verifying that there is + # a config file + my @hosts; + opendir HOSTS, $::case_dir or die "Can't open $::case_dir directory: $!"; + foreach my $h (readdir HOSTS) { + next if (($h eq '.') || ($h eq '..')); + + my $hfile = Caseman::host_config_fname($h); + push @hosts, $h + if ((-d "$::case_dir" . "$h") && (-e "$hfile")); + } + closedir HOSTS; + + print "<b>Case:</b> $Args::args{'case'}<br><br>\n"; + + print "<center>"; + + if (scalar @hosts == 0) { + print "No hosts have been added to the case yet" + . "<br><br>Select the Add Host button below to create one.<br>\n"; + } + else { + + print "Select the host to open or create a new one<br>\n"; + + print_menu_tabs(); + + print "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\" " + . "background=\"$::YEL_PIX\" border=0>\n"; + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_OPEN_LOG\">\n" + . Args::make_hidden() + . "<tr><th>Name</th>" + . "<th>Description</th><th> </th></tr>\n"; + + my $first = 0; + foreach my $h (@hosts) { + + print "<tr><td align=\"left\">" + . "<input type=\"radio\" name=\"host\" value=$h"; + if ($first == 0) { + print " CHECKED"; + $first = 1; + } + print "> " . Print::html_encode($h) . " </td>"; + + my $fname = Caseman::host_config_fname($h); + open CONFIG, "<$fname" + or die "Can't open host config file ($fname)"; + + my $desc = "None Provided"; + while (<CONFIG>) { + s/^\s+//; + s/\s+$//; + + if (/^desc\s+(.*)$/) { + $desc = Print::html_encode($1); + last; + } + } + close CONFIG; + + print "<td align=left>$desc</td>" + . "<td align=center>" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::HOST_DETAILS&$Args::baseargs&" + . "host=$h\">details</a></td></tr>\n"; + } + print "</table>\n"; + + # Display pulldown of investigators + my @invs = read_invest(); + if (scalar @invs == 0) { + print "<input type=\"hidden\" name=\"inv\" value=\"unknown\">\n"; + } + else { + print "<br>Investigator (for reports only): "; + my $cur_inv = ""; + $cur_inv = $Args::args{'inv'} if (exists $Args::args{'inv'}); + + print "<select name=\"inv\" size=\"1\">\n"; + + if (($cur_inv eq "") && (scalar @invs != 1)) { + print "<option value=\"\" selected>Select One" . "</option>\n"; + } + foreach my $i (@invs) { + print "<option value=\"$i\""; + print " selected" if ($cur_inv eq $i); + print ">" . Print::html_encode($i) . "</option>\n"; + } + print "</select>\n"; + } + } + print "<br><br><table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr>\n"; + + # Make a table for the buttons. The table will either be 3 or 2 + # entries wide, depending on if there is an 'Ok' button or not + + unless (scalar @hosts == 0) { + print "<td align=center>" + . "<input type=\"image\" src=\"pict/menu_b_ok.jpg\" " + . "alt=\"Ok\" width=\"167\" height=20 border=0>\n" + . "</form>\n</td>\n"; + } + + # Add Host + print "<td align=center>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_ADD\">\n" + . "<input type=\"hidden\" name=\"case\" value=\"$Args::args{'case'}\">\n" + . "<input type=\"image\" src=\"pict/menu_b_hnew.jpg\" " + . "alt=\"Add Host\" width=\"176\" height=20 border=0>\n" + . "</form></td>" + . + + # Close Button + "<td align=center>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::CASE_OPEN\">\n" + . "<input type=\"image\" src=\"pict/menu_b_ccls.jpg\" " + . "alt=\"Close Case\" width=\"176\" height=20 border=0>\n" + . "</form></td></tr></table>\n"; + + print "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr><td> </td>" + . "<td align=center><a href=\"$::HELP_URL\" " + . " target=\"_blank\">" + . "<img src=\"pict/menu_b_help.jpg\" alt=\"Help\" " + . "width=\"167\" height=20 border=0>" + . "</a></td><td> </td></tr>\n" + . "</table>\n"; + + Print::print_html_footer(); + return 0; +} + +# Log that a given host was opened and then proceed to open an image +sub host_open_log { + unless ((exists $Args::args{'inv'}) && ($Args::args{'inv'} ne "")) { + my @invs = read_invest(); + if (scalar @invs == 0) { + $Args::args{'inv'} = $Args::enc_args{'inv'} = 'unknown'; + } + else { + Print::print_html_header("Missing Investigator"); + print "<br>An investigator must be selected<p>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_OPEN_LOG\">\n" + . Args::make_hidden(); + + print "Select one of the following:"; + print "<select name=\"inv\" size=\"1\">\n"; + + print "<option value=\"\" selected>Select One" . "</option>\n"; + + foreach my $i (@invs) { + print "<option value=\"$i\">$i</option>\n"; + } + print "</select><p>\n" + . "<input type=\"image\" src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=43 height=20 border=\"0\">\n" + . "</form>\n"; + + Print::print_html_footer(); + return 0; + } + } + + Args::check_inv(); + Print::log_case_info( + "Host $Args::args{'host'} opened by $Args::args{'inv'}"); + Print::log_host_info( + "Host $Args::args{'host'} opened by $Args::args{'inv'}"); + Print::log_host_inv("Host $Args::args{'host'} opened"); + + $Args::args{'view'} = $Args::enc_args{'view'} = $Caseman::VOL_OPEN; + vol_open(); +} + +# Provide details about the configuration of a host. This window is +# a link from the HOST_OPEN window +sub host_details { + Print::print_html_header( + "Details of $Args::args{'case'}:$Args::args{'host'}"); + + print "<b>Case: </b>$Args::args{'case'}<br><br>" + . "<center>" + . "<img src=\"pict/menu_h_hdet.jpg\" alt=\"Host Details\">" + . "<br><br><br>\n" + . "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\" " + . "background=\"$::YEL_PIX\" border=0>\n" + . + + # Name + "<tr><td align=\"right\" width=300><b>Name:</b></td>" + . "<td align=\"left\" width=300><tt>$Args::args{'host'}</tt></td></tr>\n" + . + + # Description + "<tr><td align=\"right\"><b>Description:</b></td>" + . "<td align=\"left\"><tt>" + . (($Caseman::host_desc ne "") ? $Caseman::host_desc : " ") + . "</tt></td></tr>\n" + . + + # Timezone + "<tr><td align=\"right\"><b>Time zone: </b></td>" + . "<td align=\"left\"><tt>$Caseman::tz</tt></td></tr>\n" + . + + # Timeskew + "<tr><td align=\"right\"><b>Timeskew:</b></td>" + . "<td align=\"left\"><tt>$Caseman::ts</tt></td></tr>\n" + . "<tr><td colspan=2> </td></tr>\n" + . + + # Actual Directory + "<tr><td align=\"right\"><b>Directory:</b></td>" + . "<td align=\"left\"><tt>" + . Print::html_encode($::host_dir) + . "</tt></td></tr>\n" + . "<tr><td colspan=2> </td></tr>\n" + . + + # Alert Database + "<tr><td align=\"right\"><b>Alert Hash Database:</b></td>" + . "<td align=\"left\"><tt>" + . (($Caseman::alert_db ne "") + ? Print::html_encode($Caseman::alert_db) + : " ") + . "</tt></td></tr>\n" + . + + # Exclude Database + "<tr><td align=\"right\"><b>Exclude Hash Database:</b></td>" + . "<td align=\"left\"><tt>" + . (($Caseman::exclude_db ne "") + ? Print::html_encode($Caseman::exclude_db) + : " ") + . "</tt></td></tr>\n" + . "</table>\n"; + + # Final Button + print "<br><br><form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_OPEN\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/menu_b_ok.jpg\" " + . "alt=\"Ok\" width=\"167\" height=20 border=\"0\">\n</form>"; + + Print::print_html_footer(); + + return; +} + +# Read the investigators file and return a sorted list +sub read_invest { + my $fname = investig_fname(); + open INVES, "<$fname" or return; + + my @investigs; + while (<INVES>) { + chomp; + s/^\s+//; + s/\s+$//; + push @investigs, $1 + if (/^($::REG_INVESTIG)$/o); + } + close(INVES); + sort { lc($a) cmp lc($b) } @investigs; +} + +# File of investigators name in list +sub investig_fname { + return "$::case_dir" . "investigators.txt"; +} + +#################################################################### +# Image Functions + +# Types of modes for fname (i.e. can we overwrite it if it exists) +my $FNAME_MODE_INIT = 0; +my $FNAME_MODE_OVER = 1; + +my $MD5_NOTHING = 1; +my $MD5_CALC = 2; +my $MD5_ADD = 3; + +my $IMG_ADD_SYM = 1; +my $IMG_ADD_COPY = 2; +my $IMG_ADD_MOVE = 3; + +# Open an image that has been configured +sub vol_open { + Print::print_html_header( + "Open Image In $Args::args{'case'}:$Args::args{'host'}"); + + print "<b>Case:</b> $Args::args{'case'}<br>\n"; + print "<b>Host:</b> $Args::args{'host'}<br>\n"; + print "<center>\n"; + + # the images have been loaded from reading the host config file in + # autopsy_main + if (scalar(keys %Caseman::vol2ftype) == 0) { + print "No images have been added to this host yet<br><br>\n" + . "Select the Add Image File button below to add one\n"; + goto EGRESS; + } + + if ($::LIVE == 1) { + print "Select a volume to analyze.<br>\n"; + } + else { + print "Select a volume to analyze or add a new image file.<br>\n"; + } + + print_menu_tabs(); + + print "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\" " + . "background=\"$::YEL_PIX\" border=0>\n"; + + # We want to sort, so rearrange the hash + my %mnt2vol; + my %par2disk; + + # Cycle through each image we read from the host config + foreach my $i (keys %Caseman::vol2cat) { + if ($Caseman::vol2cat{$i} eq "disk") { + $mnt2vol{"1disk--AUTOPSY--$i"} = $i; + } + elsif ($Caseman::vol2cat{$i} eq "part") { + if ( ($Caseman::vol2ftype{$i} eq "raw") + || ($Caseman::vol2ftype{$i} eq "swap")) + { + $mnt2vol{"2$Caseman::vol2ftype{$i}--AUTOPSY--$i"} = $i; + } + else { + $mnt2vol{"2$Caseman::vol2mnt{$i}--AUTOPSY--$i"} = $i; + } + } + } + + # sort via parent volume, then starting location, + # and then mount point (which includes the name) + my @mnt = sort { + ($Caseman::vol2par{$mnt2vol{$a}} cmp $Caseman::vol2par{$mnt2vol{$b}}) + or ($Caseman::vol2start{$mnt2vol{$a}} <=> + $Caseman::vol2start{$mnt2vol{$b}}) + or (lc($a) cmp lc($b)) + } keys %mnt2vol; + + # It is possible to have only the blkls image and not the original + # We need to search for those now because they will not be in the + # list that we just made (which are arranged via mount point) + my @orphan_blkls; + + # cycle through each image and check its type and original + foreach my $k (keys %Caseman::vol2ftype) { + if ( ($Caseman::vol2ftype{$k} eq "blkls") + && (!exists $Caseman::mod2vol{$k})) + { + push @orphan_blkls, $k; + } + } + + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_OPEN_LOG\">\n" + . Args::make_hidden() + + . "<tr><th> </th>" + . "<th align=left>mount</th>" + . "<th align=left>name</th>" + . # vol name + "<th align=left>fs type</th></tr>\n"; + + my $prev_par = ""; + + for (my $i = 0; $i <= $#mnt; $i++) { + my $vol = $mnt2vol{$mnt[$i]}; + + if ($Caseman::vol2par{$vol} ne $prev_par) { + print "<tr><td colspan=5><hr></td></tr>\n" if ($i != 0); + $prev_par = $Caseman::vol2par{$vol}; + } + + # Mount Point + # If we have the dummy string at the end of the duplicate + # entry, then take it off and print the original + $mnt[$i] = $1 if ($mnt[$i] =~ /^\d(.*?)--AUTOPSY--$::REG_VNAME$/o); + print "<tr>" . "<td><input type=\"radio\" name=\"vol\" value=$vol"; + print " CHECKED" if ($i == 0); + print "></td>" + . "<td><tt>" + . Print::html_encode($mnt[$i]) + . "</tt></td>"; + + # image name and ftype + print +"<td><tt>$Caseman::vol2sname{$vol}</tt></td><td>$Caseman::vol2ftype{$vol}</td>"; + if ($::LIVE == 0) { + print "<td align=center><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_DETAILS&$Args::baseargs&" + . "vol=$vol\">details</a></td>" + . "</tr>\n"; + } + else { + print "<td> </td></tr>\n"; + } + } + + # If we are done with the regular images and have some orphan + # blkls images, print them + my @sort = sort @orphan_blkls; + for (my $i = 0; $i <= $#sort; $i++) { + print +"<tr><td> </td><td> </td><td>(<input type=\"radio\" name=\"vol\" " + . "value=$sort[$i]"; + print " CHECKED" if ($#mnt == 0); + print "> unalloc)</td><td><tt>" + . Print::html_encode($Caseman::vol2sname{$sort[$i]}) + . "</tt></td><td>" + . Print::html_encode($Caseman::vol2ftype{$sort[$i]}) + . "</td></tr>\n"; + } + + # Begin Button + print "</table>\n"; + + EGRESS: + + print "<br><br>" + . "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n"; + + # Ok Button + if (scalar(keys %Caseman::vol2ftype) == 0) { + print "<tr><td width=200> </td>\n"; + } + else { + print "<tr><td align=center width=200>" + . "<input type=\"image\" src=\"pict/menu_b_analyze.jpg\" " + . "alt=\"Analyze\" width=\"167\" height=20 border=0>\n" + . "</form></td>\n"; + } + + # Image Add Button + if ($::LIVE == 0) { + print "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::IMG_ADD\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/menu_b_ifnew.jpg\" " + . "alt=\"Add Image\" width=167 height=20 border=0></form></td>\n" + . + + # Cancel Button + "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::HOST_OPEN\">\n" + . "<input type=\"hidden\" name=\"case\" value=\"$Args::args{'case'}\">\n" + . "<input type=\"image\" src=\"pict/menu_b_hcls.jpg\" " + . "width=167 height=20 alt=\"Close Host\" border=0>\n" + . "</form></td></tr>"; + } + else { + print "<td width=200> </td><td width=200> </td></tr>\n"; + } + + # Help Button + print +"<td width=200> </td><td align=center width=200><a href=\"$::HELP_URL\" " + . " target=\"_blank\">" + . "<img src=\"pict/menu_b_help.jpg\" alt=\"Help\" " + . "width=\"167\" height=20 border=0>" + . "</a></td><td width=200> </td></tr>\n" + . "</table>\n"; + + # Other features that can be done on a host + + if ($::LIVE == 0) { + print "<hr><p>" + . "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr>\n"; + + # Timeline of file activity + print "<td align=\"center\" width=200>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&" + . "mod=$::MOD_TL&view=$Timeline::FRAME\">" + . "<img border=0 " + . "src=\"pict/menu_b_tl.jpg\" " + . "width=\"167\" height=20 " + . "alt=\"File Activity Timelines\"></a></td>\n"; + + # verify the integrity of the images + print "<td align=\"center\" width=200>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&" + . "mod=$::MOD_HASH&view=$Hash::IMG_LIST_FR\">" + . "<img border=0 " + . "src=\"pict/menu_b_int.jpg\" " + . "width=\"167\" height=20 " + . "alt=\"Image Integrity\"></a></td>\n" + . + + # Hashdatabases + "<td align=\"center\" width=200>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&" + . "mod=$::MOD_HASH&view=$Hash::DB_MANAGER\">" + . "<img border=0 " + . "src=\"pict/menu_b_hashdb.jpg\" " + . "width=\"167\" height=20 " + . "alt=\"Hash Databases\"></a></td>\n" + . "</tr></table>\n"; + + # Notes + if ($::USE_NOTES == 1) { + print "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr>\n" + . "<td align=\"center\" width=300>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_NORM\">" + . "<img border=0 " + . "src=\"pict/menu_b_note.jpg\" " + . "width=\"167\" height=20 " + . "alt=\"View Notes\"></a></td>\n" + . + + "<td width=300 align=\"center\">" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_SEQ\">" + . "<img border=0 " + . "src=\"pict/menu_b_seq.jpg\" " + . "width=\"167\" height=20 " + . "alt=\"Event Sequencer\"></a></td>\n" + . + + "</tr>\n" . "</table>\n"; + } + + # If LIVE + } + else { + print "<a href=\"./about\"><br>\n" + . "<img src=\"pict/logo.jpg\" border=0 alt=\"Logo\"></a><br>\n"; + + } + + Print::print_html_footer(); + + return 0; +} + +# Log in the host log that a given image was opened by what user +# then open the main window +sub vol_open_log { + + # These will be stopped in the func during LIVE + Print::log_host_info( + "Image $Args::args{'vol'} opened by $Args::args{'inv'}"); + Print::log_host_inv("$Args::args{'vol'}: volume opened"); + + $Args::args{'mod'} = $Args::enc_args{'mod'} = $::MOD_FRAME; + $Args::args{'view'} = $Args::enc_args{'view'} = $Frame::IMG_FRAME; + Frame::main(); +} + +# Menu to add a new image to the host +# +# The list of new images is determined by looking in the images directory +# and seeing which is not yet configured +# +sub img_add { + Print::print_html_header( + "Add Image To $Args::args{'case'}:$Args::args{'host'}"); + + print "<b>Case:</b> $Args::args{'case'}<br>\n" + . "<b>Host:</b> $Args::args{'host'}<br>\n"; + + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::IMG_ADD_PREP\">\n" + . Args::make_hidden(); + + print <<EOF1; +<center> +<img src=\"pict/menu_h_inew.jpg\" alt=\"Add Image\"> +<br><br><br> + +<table width=\"600\" cellpadding=\"2\" cellspacing=\"0\" background=\"$::YEL_PIX\" border=0> +<tr> + <td colspan=4> </td> +</tr> + +<tr> + <td align=left colspan=4> + 1. <b>Location</b><br>Enter the full path (starting with <tt>/</tt>) to the image file.<br> + If the image is split (either raw or EnCase), then enter '*' for the extension. + </td> +</tr> +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"text\" name=\"img_path\" size=36 maxlength=256> + </td> +</tr> +<tr><td colspan=4> </td><tr> +<tr> + <td align=left colspan=4>2. <b>Type</b><br>Please select if this image file is for a disk or a single partition.</td> +</tr> +<tr> + <td> </td> + <td align=left> + <input type=\"radio\" name=\"imgtype\" value="disk" CHECKED> + Disk + </td> + <td align=left> + <input type=\"radio\" name=\"imgtype\" value="volume"> + Partition + </td> + <td align=left> + </td> +</tr> + +<tr><td colspan=4> </td><tr> +<tr> + <td align=left colspan=4>3. <b>Import Method</b><br>To analyze the image file, it must be located in the evidence locker. It can be imported from its current location using a symbolic link, by copying it, or by moving it. Note that if a system failure occurs during the move, then the image could become corrupt.</td> +</tr> +<tr> + <td> </td> + <td align=left> + <input type=\"radio\" name=\"sort\" value=$IMG_ADD_SYM CHECKED> + Symlink + </td> + <td align=left> + <input type=\"radio\" name=\"sort\" value=$IMG_ADD_COPY> + Copy + </td> + <td align=left> + <input type=\"radio\" name=\"sort\" value=$IMG_ADD_MOVE> + Move + </td> +</tr> + + +<tr> + <td colspan=4> </td> +</tr> + +</table> + +<br> +<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center colspan=2> + <input type=\"image\" src=\"pict/menu_b_next.jpg\" alt=\"Next Step\" width=\"167\" height=20 border=0> + </td> +</tr> + +</form> + +EOF1 + + print "<tr><td colspan=2> </td></tr>\n" + . "<td align=center>\n" + . " <form action=\"$::PROGNAME\" method=\"get\">\n" + . " <input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . " <input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_OPEN\">\n" + . + + Args::make_hidden() + . " <input type=\"image\" src=\"pict/menu_b_cancel.jpg\" " + . "alt=\"Cancel\" width=\"167\" height=20 border=0></form>\n" + . " </td>\n" + . + + # HELP + " <td align=center>\n" + . " <a href=\"$::HELP_URL\" target=\"_blank\">\n" + . " <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" " + . "width=\"167\" height=20 border=0></a>\n" + . " </td>\n" + . "</tr>\n" + . "</table>\n"; + + Print::print_html_footer(); + + return 0; +} + +# List the images from the glob - called from img_add_prep if spl_conf is not set +sub img_add_split_conf { + my $img_path = Args::get_img_path_wild(); + my $img_type = $Args::args{'imgtype'}; + + print "<center><br><br><b>Split Image Confirmation</b><br><br>\n"; + + my @spl_img = glob($img_path); + if (scalar(@spl_img) == 0) { + print "No images were found at this location ($img_path)<br>\n" + . "Use the back button and fix the path<br>\n"; + return; + } + + print <<EOF1; +The following images will be added to the case.<br> +If this is not the correct order, then you should change the naming convention.<br> +Press the Next button at the bottom of the page if this is correct.<br><br> + +<table width=\"600\" cellpadding=\"2\" cellspacing=\"0\" background=\"$::YEL_PIX\" border=0> +<tr> + <td colspan=2> </td> +</tr> +EOF1 + + my $a = 0; + foreach $i (@spl_img) { + + # We need to do this when we analyze the image, so do it here too to show + # what will be analyzed + $i = $1 if ($i =~ /^($::REG_IMG_PATH)$/); + print +"<tr><td align=\"center\">$a</td><td align=\"left\"><tt>$i</tt></td></tr>\n"; + $a++; + } + + my $vs = ""; + $vs = "&vstype=$Args::args{'vstype'}" + if (exists $Args::args{'vstype'}); + + # Print the Ok Button + print "</table><br><br>\n" + . "<table width=\"600\" cellpadding=\"2\" cellspacing=\"0\" border=0>" + . "<tr><td width=\"300\" align=\"center\"><a href=\"$::PROGNAME?${Args::baseargs_novol}&" + . "mod=$::MOD_CASEMAN&view=$Caseman::IMG_ADD_PREP&spl_conf=1&sort=$Args::args{'sort'}&" + . "img_path=$img_path&imgtype=$Args::args{'imgtype'}$vs\">" + . "<img src=\"pict/menu_b_next.jpg\" alt=\"Next\" " + . "width=\"167\" height=20 border=0></a></td>\n" + . "<td width=\"300\" align=\"center\"><a href=\"$::PROGNAME?${Args::baseargs_novol}&" + . "mod=$::MOD_CASEMAN&view=$Caseman::IMG_ADD\">" + . "<img src=\"pict/menu_b_cancel.jpg\" alt=\"cancel\" width=\"167\" height=\"20\" border=\"0\">" + . "</a></td></tr></table>\n"; + + return 0; +} + +# Run the autodetect stuff and get confirmation from the user +sub img_add_prep { + Args::check_img_path_wild(); + Args::check_sort(); + unless ((exists $Args::args{'imgtype'}) + && ($Args::args{'imgtype'} =~ /^\w+$/)) + { + Print::print_check_err("Invalid image type"); + } + + Print::print_html_header("Collecting details on new image file"); + + my $img_path = Args::get_img_path_wild(); + + my $img_type = $Args::args{'imgtype'}; + my $spl_conf = 0; + $spl_conf = 1 + if ((exists $Args::args{'spl_conf'}) && ($Args::args{'spl_conf'} == 1)); + + # If we have a wildcard then it is a split image, so we verify it first and + # then make a string of the images so we can test it. + if ($img_path =~ /[\*\?]/) { + if ($spl_conf == 0) { + return img_add_split_conf(); + } + else { + $img_tmp = ""; + foreach my $i (glob($img_path)) { + if ($i =~ /^($::REG_IMG_PATH)$/) { + $img_tmp .= "\"$1\" "; + } + } + $img_path = $img_tmp; + } + } + else { + unless ((-f $img_path) + || (-d $img_path) + || (-l $img_path) + || (-b $img_path) + || (-c $img_path)) + { + Print::print_err("Image file not found ($img_path)"); + } + $img_path = "\"$img_path\""; + } + + # Get the image type + local *OUT; + Exec::exec_pipe(*OUT, "'$::TSKDIR/img_stat' -t $img_path"); + my $itype = Exec::read_pipe_line(*OUT); + if (defined $itype) { + chomp $itype; + $itype = $1 if ($itype =~ /^(\w+)$/); + } + else { + print +"The image format type could not be determined for this image file<br>\n"; + return; + } + close(OUT); + + # The plan here is to collect the needed info and then we print it + + my $conflict = 0; + my $cnt = 0; + $start[0] = ""; + $end[0] = ""; + $type[0] = ""; + $desc[0] = ""; + $active[0] = ""; + + my $vstype = ""; + + my $vstype_flag = ""; + my $mmls_out = ""; # Will contain output of mmls (if disk image) + if ($img_type eq "disk") { + my $out; + + if ( (exists $Args::args{'vstype'}) + && ($Args::args{'vstype'} =~ /^(\w+)$/)) + { + $vstype = $Args::args{'vstype'}; + $vstype_flag = "-t $vstype"; + } + + # Get the type + else { + + Exec::exec_pipe(*OUT, "'$::TSKDIR/mmstat' -i $itype $img_path"); + + $vstype = Exec::read_pipe_line(*OUT); + close(OUT); + + chomp $vstype if (defined $vstype); + + if ( (!defined $vstype) + || ($vstype =~ /^Error determining/) + || ($vstype eq "") + || (!exists $Vs::type{$vstype}) + || ($vstype !~ /^\w+$/)) + { + print +"<table><tr><td colspan=2><font color=\"$::DEL_COLOR[0]\">Warning:</font> Autopsy could not determine the volume system type for the disk image (i.e. the type of partition table).<br>\n" + . "Please select the type from the list below or reclassify the image as a volume image instead of as a disk image.</td></tr>\n" + . "<tr><td colspan=2> </td></tr>\n" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::IMG_ADD_PREP\">\n" + . "<input type=\"hidden\" name=\"spl_conf\" value=\"1\">\n" + . "<input type=\"hidden\" name=\"img_path\" value=\"$Args::args{'img_path'}\">\n" + . "<input type=\"hidden\" name=\"sort\" value=\"$Args::enc_args{'sort'}\">\n" + . Args::make_hidden() + . "<tr><td>Disk Image <input type=\"radio\" name=\"imgtype\" value=\"disk\" CHECKED></td>\n" + . "<td>Volume Image<input type=\"radio\" name=\"imgtype\" value=\"volume\"></td></tr>\n" + . "<tr><td>Volume System Type (disk image only): <select name=\"vstype\">\n"; + + foreach my $vs (sort keys %Vs::type) { + print "<option value=\"$vs\""; + print " selected" if ($vs eq 'dos'); + print ">${vs}</option>\n"; + } + + print "</select></td>" + . "<td> </td></tr>" + . "<tr><td colspan=2> </td></tr>" + . "</table><br><br>\n" + . "<input type=\"image\" src=\"pict/menu_b_ok.jpg\" alt=\"Ok\" width=\"176\" height=20 border=0>" + . "</form>\n"; + return; + } + $vstype = $1 if ($vstype =~ /^(\w+)$/); + $vstype_flag = "-t $vstype"; + } + + # Run 'mmls' on the image + Exec::exec_pipe(*OUT, + "'$::TSKDIR/mmls' -a -i $itype -aM $vstype_flag -r $img_path"); + + # cycle through results and add each to table with file system type + my $part_type = ""; + + while ($_ = Exec::read_pipe_line(*OUT)) { + $mmls_out .= "$_"; # Save the line + last if (/^Error determining partition/); + + if (/^\d+:\s+[\d:]+\s+(\d+)\s+(\d+)\s+\d+\s+(\S.*)$/) { + $start[$cnt] = $1; + $end[$cnt] = $2; + $desc[$cnt] = $3; + $active[$cnt] = 1; + } + elsif ((/^DOS Partition/) + || (/^BSD Disk/) + || (/^Sun VTOC/) + || (/^MAC Partition/) + || (/^GUID Partition/)) + { + $part_type = $_; + + #print "<tr><td colspan=7> </td></tr>\n"; + #print "<tr><td colspan=7>$_</td></tr>\n"; + next; + } + elsif (/^Sector:/) { + + #print "<tr><td colspan=7>$_</td></tr>\n"; + next; + } + else { + next; + } + + # Skip the BSD partition for the full disk + next + if ( ($part_type =~ /^BSD Disk/) + && ($start[$cnt] == 0) + && ($desc[$cnt] =~ /^Unused/)); + + # Skip if this is an extended DOS partition + next + if ( ($part_type =~ /^DOS Partition/) + && ($desc[$cnt] =~ /Extended \(/)); + + # Get rid of the leading 0s + $start[$cnt] = $1 + if ($start[$cnt] =~ /^0+([1-9]\d*)$/); + $end[$cnt] = $1 + if ($end[$cnt] =~ /^0+([1-9]\d*)$/); + + # Do we already have this partition? + my $i; + for ($i = 0; $i < $cnt; $i++) { + next if ($active[$i] == 0); + + if ($start[$i] == $start[$cnt]) { + $conflict = 1; + + if ($end[$i] == $end[$cnt]) { + last; + } + + #The previous was the BSD partition - skip it */ + if ( ($desc[$i] =~ /^FreeBSD \(0xA5\)/) + || ($desc[$i] =~ /^OpenBSD \(0xA6\)/) + || ($desc[$i] =~ /^NetBSD \(0xA9\)/)) + { + $active[$i] = 0; + + # if the current one is the BSD partition for + # the full partition/disk then skip it + if ($desc[$cnt] =~ /^Unused /) { + $active[$cnt] = 0; + } + } + } + + # Do we start inside of another? + if (($start[$i] > $start[$cnt]) && ($end[$i] < $start[$cnt])) { + $conflict = 1; + } + + # Do we end inside of another? + elsif (($start[$i] < $end[$cnt]) && ($end[$i] > $end[$cnt])) { + $conflict = 1; + } + } + if (($end[$i] == $end[$cnt]) && ($i != $cnt)) { + next; + } + + local *OUT2; + my $out2; + + # Run 'fstat -t' on the image + Exec::exec_pipe(*OUT2, + "'$::TSKDIR/fsstat' -o $start[$cnt] -i $itype -t $img_path"); + + $type[$cnt] = Exec::read_pipe_line(*OUT2); + close(OUT2); + + if ( (!exists $type[$cnt]) + || (!defined $type[$cnt]) + || ($type[$cnt] =~ /^Cannot determine/) + || ($type[$cnt] eq "")) + { + $type[$cnt] = "Unknown"; + } + chomp $type[$cnt]; + + $cnt++; + } + close(OUT); + + if ($conflict == 1) { + print +"<tr><td colspan=2><font color=\"$::DEL_COLOR[0]\">Warning:</font> Conflicts in the partitions were detected.<br>The full <tt>mmls</tt> output is given at the bottom of the page</td></tr>\n" + . "<tr><td colspan=2> </td></tr>\n"; + } + } + + # If a volume, then run fsstat on it + elsif ($img_type eq "volume") { + + # Run 'fstat -t' on the image + Exec::exec_pipe(*OUT, "'$::TSKDIR/fsstat' -t -i $itype $img_path"); + + $type[0] = Exec::read_pipe_line(*OUT); + close(OUT); + + if ( (!defined $type[0]) + || ($type[0] =~ /^Cannot determine/) + || ($type[0] eq "")) + { + $type[0] = "Unknown"; + print +"<font color=\"$::DEL_COLOR[0]\">Warning:</font> The file system type of the volume image file could not be determined.<br>\n" + . "If this is a disk image file, return to the previous page and change the type.<br><br>\n"; + } + chomp $type[0]; + $start[0] = 0; + $end[0] = 0; + $active[0] = 1; + $desc[0] = $type[0]; + $cnt++; + close(OUT); + } + else { + Print::print_err("Unknown image type: $img_type"); + } + + my $sname = $img_path; + $sname = "$::IMGDIR/" . "$1" if ($sname =~ /\/($::REG_FILE)\"$/); + +# Now that we have the information about the partitions and disks, print the fields + print <<EOF1; + +<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\"> +<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\"> +<input type=\"hidden\" name=\"view\" value=\"$Caseman::IMG_ADD_DOIT\"> +<input type=\"hidden\" name=\"img_path\" value=\"$Args::args{'img_path'}\"> +<input type=\"hidden\" name=\"num_img\" value=\"$cnt\"> +<input type=\"hidden\" name=\"sort\" value=\"$Args::enc_args{'sort'}\"> + + +<center> +<h3>Image File Details</h3> +<table width=\"600\" cellpadding=\"2\" cellspacing=\"0\" background=\"$::YEL_PIX\" border=0> +<tr> + <td align=left colspan=4> + <b>Local Name: </b> $sname + </td> +</tr> + +EOF1 + + # We do not currently offer integrity options for non-raw files + if (($itype eq "raw") || ($itype eq "split")) { + + print <<EOF1b; +<tr> + <td align=left colspan=4> + <b>Data Integrity: </b> An MD5 hash can be used to verify the + integrity of the image. (With split images, this hash is for the full image file) + </td> +</tr> + +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"radio\" name=\"do_md5\" value=\"$MD5_NOTHING\" CHECKED> + <u>Ignore</u> the hash value for this image. + </td> +</tr> + +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"radio\" name=\"do_md5\" value=\"$MD5_CALC\"> + <u>Calculate</u> the hash value for this image. + </td> +</tr> + +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"radio\" name=\"do_md5\" value=\"$MD5_ADD\"> + <u>Add</u> the following MD5 hash value for this image: + </td> +</tr> + +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"text\" name=\"md5\" size=36 maxlength=32> + </td> +</tr> + +<tr> + <td> </td> + <td align=left colspan=3> + <input type=\"checkbox\" name=\"ver_md5\" value=\"1\"> + Verify hash after importing? + </td> +</tr> +EOF1b + } + else { + print + "<input type=\"hidden\" name=\"do_md5\" value=\"$MD5_NOTHING\">\n"; + } + + print <<EOF1c; +</table> + +<h3>File System Details</h3> +<table width=\"600\" cellpadding=\"2\" cellspacing=\"0\" background=\"$::YEL_PIX\" border=0> + +<tr> + <td colspan=2 align=left>Analysis of the image file shows the following partitions:</td> +</tr> +<tr> + <td colspan=2> </td> +</tr> + +EOF1c + + print Args::make_hidden(); + + print "<input type=\"hidden\" name=\"vstype\" value=\"$vstype\">\n" + if ($vstype ne ""); + + my $idx = 1; + my $ms_cnt = 0; + my @ms_name = ("C:", "D:", "E:", "F:", "G:", "H:", "I:", "J:"); + for (my $i = 0; $i < $cnt; $i++) { + next if ($active[$i] == 0); + print +"<tr><td colspan=2><u>Partition $idx</u> (Type: $desc[$i])</td><tr>\n"; + + if ($cnt > 1) { + print "<tr><td colspan=2> Add to case? " + . "<input type=\"checkbox\" name=\"yes-${idx}\" value=1 CHECKED></td></tr>\n"; + } + else { + print "<input type=\"hidden\" name=\"yes-${idx}\" value=1>\n"; + } + + unless (($start[$i] == 0) && ($end[$i] == 0)) { + print "<tr><td colspan=2> Sector Range: " + . "$start[$i] to $end[$i]" + . "</td></tr>\n"; + } + + print + "<input type=\"hidden\" name=\"start-${idx}\" value=\"$start[$i]\">" + . "<input type=\"hidden\" name=\"end-${idx}\" value=\"$end[$i]\">\n" + . "<tr><td> Mount Point: <input type=\"text\" name=\"mnt-${idx}\" size=\"6\""; + if (($type[$i] =~ /^ntfs/) || ($type[$i] =~ /^fat/)) { + print " value=\"$ms_name[$ms_cnt]\"" + if ($ms_cnt < 8); + $ms_cnt++; + } + elsif (($type[$i] =~ /^raw/) + || ($type[$i] =~ /^swap/)) + { + print " value=\"N/A\""; + } + else { + print " value=\"/$idx/\""; + } + print "></td>\n" + . "<td>File System Type: <select name=\"ftype-${idx}\">\n"; + + foreach my $fs (@Fs::types) { + print "<option value=\"$fs\""; + print " selected" if ($fs eq $type[$i]); + print ">${fs}</option>\n"; + } + + # The following do not have 'metas' but should be in the list + print "<option value=\"\">======</option>\n"; + if ($type[$i] eq "Unknown") { + print "<option value=\"raw\" selected>raw</option>\n"; + } + else { + print "<option value=\"raw\">raw</option>\n"; + } + + print "<option value=\"swap\">swap</option>\n" + . "</select></td></tr>\n" + . "<tr><td colspan=2> </td></tr>\n"; + + $idx++; + } + + print "</table>\n"; + + print <<EOF2; +<br><br> +<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center> + <input type=\"image\" src=\"pict/menu_b_add.jpg\" + alt=\"Add\" width=\"176\" height=20 border=0> + </td> +</form> + <td align=center> + <form action=\"$::PROGNAME\" method=\"get\"> +EOF2 + print Args::make_hidden(); + print <<EOF3; + <input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\"> + <input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_OPEN\"> + <input type=\"image\" src=\"pict/menu_b_cancel.jpg\" + alt=\"Cancel\" width=\"167\" height=20 border=0> + </form> + </td> + <td align=center><a href=\"$::HELP_URL\" + target=\"_blank\"> + <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" + width=\"167\" height=20 border=0></a> + </td> +</tr> +</table> +EOF3 + + if ($img_type eq "disk") { + print +"</center><p>For your reference, the <tt>mmls</tt> output was the following:<br><pre>$mmls_out</pre>\n"; + } + + Print::print_html_footer(); + + return 0; +} + +# Add the image to the configuration by adding it to the host config file +# and the md5.txt file if that data was provided +sub img_add_doit { + + Args::check_num_img(); + Args::check_img_path_wild(); + Args::check_sort(); + Args::check_do_md5(); + + my $num_img = Args::get_num_img(); + my $img_path = Args::get_img_path_wild(); + my $import_type = Args::get_sort(); + + Print::print_html_header("Add a new image to an Autopsy Case"); + + my $err = 0; + my $add_num = 0; + $start[0] = 0; + $end[0] = 0; + $ftype[0] = ""; + $mnt[0] = ""; + + # We need a string with all images in it for the hashes and file system testing + my $img_path_full; + if ($img_path =~ /[\*\?]/) { + $img_path_full = ""; + foreach my $i (glob($img_path)) { + if ($i =~ /^($::REG_IMG_PATH)$/) { + $img_path_full .= "\"$1\" "; + } + } + } + else { + $img_path_full = "\"$img_path\""; + } + + # Get the image type + local *OUT; + Exec::exec_pipe(*OUT, "'$::TSKDIR/img_stat' -t $img_path_full"); + my $itype = Exec::read_pipe_line(*OUT); + if (defined $itype) { + chomp $itype; + $itype = $1 if ($itype =~ /^(\w+)$/); + } + else { + print +"The image format type could not be determined for this image file<br>\n"; + return; + } + close(OUT); + + # Check the hash of the image if that is the plan + my $do_md5 = Args::get_do_md5(); + my $act_md5 = ""; + unless ($do_md5 == $MD5_NOTHING) { + + # Do we need to calculate an MD5? + if ( + ($do_md5 == $MD5_CALC) + || ( ($do_md5 == $MD5_ADD) + && (exists $Args::args{'ver_md5'}) + && ($Args::args{'ver_md5'} == 1)) + ) + { + + print "<p>Calculating MD5 (this could take a while)<br>\n"; + $act_md5 = Hash::calc_md5_split($img_path_full); + unless ($act_md5 =~ /^$::REG_MD5$/o) { + print "Error calculating MD5: $act_md5<br>\n"; + return 1; + } + print "Current MD5: <tt>$act_md5</tt><br>\n"; + } + + # And md5 value was given so we can add it to the md5.txt file + if (($do_md5 == $MD5_ADD) && (exists $Args::args{'md5'})) { + + my $md5 = $Args::args{'md5'}; + unless ($md5 =~ /^$::REG_MD5$/o) { + if ($md5 eq "") { + print "MD5 value missing<br>\n"; + } + else { + print "Invalid MD5 value (32 numbers or letters a-f)<br>\n"; + } + print "<p><a href=\"$::PROGNAME?" + . "mod=$::MOD_CASEMAN&view=$Caseman::IMG_ADD&" + . "$Args::baseargs\">" + . "<img src=\"pict/menu_b_back.jpg\" border=\"0\" " + . "width=\"167\" height=20 alt=\"Back\"></a>\n"; + return 1; + } + $md5 =~ tr/[a-f]/[A-F]/; + + # They also want us to validate the MD5 + if ( (exists $Args::args{'ver_md5'}) + && ($Args::args{'ver_md5'} == 1)) + { + + if ($act_md5 eq $md5) { + print "Integrity Check Passed<br>\n"; + Print::log_host_info("Integrity check passed on new image"); + } + else { + print "<font color=\"$::DEL_COLOR[0]\">" + . "Integrity Check Failed<br></font><br>\n" + . "Provided: <tt>$md5</tt><br>\n" + . "Image not added to case<br>\n"; + + Print::log_host_info("Integrity check failed on new image"); + return 1; + } + } + + # set the act_md5 value to what was given and verified + $act_md5 = $md5; + } + + # We will add the MD5 to the config file after we get its ID + } + + # Proces the image arguments to make sure they are all there and test the + # file system type + print "Testing partitions<br>\n"; + for (my $i = 0; $i <= $num_img; $i++) { + + next + unless ((exists $Args::args{"yes-" . $i}) + && ($Args::args{"yes-" . $i} == 1)); + + if ( (exists $Args::args{"start-" . $i}) + && ($Args::args{"start-" . $i} =~ /^(\d+)$/)) + { + $start[$add_num] = $1; + } + else { + print "Missing starting address for partition $i<br>\n"; + $err = 1; + last; + } + + if ( (exists $Args::args{"end-" . $i}) + && ($Args::args{"end-" . $i} =~ /^(\d+)$/)) + { + $end[$add_num] = $1; + } + else { + print "Missing ending address for partition $i<br>\n"; + $err = 1; + last; + } + + if ( (exists $Args::args{"mnt-" . $i}) + && ($Args::args{"mnt-" . $i} =~ /^($::REG_MNT)$/)) + { + $mnt[$add_num] = $1; + } + else { + print "Missing mount point for partition $i<br>\n"; + $err = 1; + last; + } + + if ( (exists $Args::args{"ftype-" . $i}) + && ($Args::args{"ftype-" . $i} =~ /^($::REG_FTYPE)$/)) + { + $ftype[$add_num] = $1; + } + else { + print "Missing file system type for partition $i<br>\n"; + $err = 1; + last; + } + + # Test the File System + if (($ftype[$add_num] ne 'swap') && ($ftype[$add_num] ne 'raw')) { + + local *OUT; + my $out; + + # Run 'fsstat' and see if there is any output - else there was + # an error and the data went to STDERR + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fsstat' -o $start[$add_num] -i $itype -f $ftype[$add_num] $img_path_full" + ); + unless (read(OUT, $out, 1)) { + print +"<p>Partition $i is not a <tt>$ftype[$add_num]</tt> file system<br>\n"; + $err = 1; + last; + } + close(OUT); + } + $add_num++; + } + + # Go back if we got an error + if ($err == 1) { + print "Use the browser's back button to fix the data<br>\n"; + return 1; + } + + ################################################## + # Copy the images and add them to the config file + + if ($import_type == $IMG_ADD_SYM) { + Print::print_err("ERROR: /bin/ln missing") + unless (-x '/bin/ln'); + + print "Linking image(s) into evidence locker<br>\n"; + } + elsif ($import_type == $IMG_ADD_COPY) { + Print::print_err("ERROR: /bin/cp missing") + unless (-x '/bin/cp'); + + print +"Copying image(s) into evidence locker (this could take a little while)<br>\n"; + } + elsif ($import_type == $IMG_ADD_MOVE) { + Print::print_err("ERROR: /bin/mv missing") + unless (-x '/bin/mv'); + + print "Moving image(s) into evidence locker<br>\n"; + } + else { + Print::print_err("Invalid Import Type: $import_type\n"); + } + + my $imgid = ""; + foreach my $i (glob($img_path)) { + + # remove the tainting + $i = $1 if ($i =~ /^($::REG_IMG_PATH)$/); + + # Deterine the local (target) name + my $img = ""; + if ($i =~ /\/($::REG_FILE)$/) { + $img = "$::IMGDIR/$1"; + } + else { + Print::print_err("Error Parsing Image Path ($i)\n"); + } + + # Get the full path of the destination + my $img_dst = "$::host_dir" . "$img"; + if ((-e "$img_dst") || (-l "$img_dst")) { + Print::print_err( +"An image by the same name already exists in the Host directory ($img)\n" + . "Use the browser's back button to fix the name or delete the existing file." + ); + } + + my $orig_size = (stat("$i"))[7]; + + # Copy, Move, or link it + if ($import_type == $IMG_ADD_SYM) { + + Print::log_host_info( +"Sym Linking image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/ln -s '$i' '$img_dst'"); + } + elsif ($import_type == $IMG_ADD_COPY) { + Print::log_host_info( +"Copying image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/cp '$i' '$img_dst'"); + } + elsif ($import_type == $IMG_ADD_MOVE) { + Print::log_host_info( +"Moving image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/mv '$i' '$img_dst'"); + } + + my $new_size = (stat("$img_dst"))[7]; + + if ($new_size != $orig_size) { + Print::print_err( +"Original image size ($orig_size) is not the same as the destination size ($new_size)" + ); + } + + # Add the disk and partition images to the config file + $imgid = Caseman::add_img_host_config("image", "$itype $img", $imgid); + } + print "Image file added with ID <tt>$imgid</tt><br>\n"; + + # AFM files have raw files that we also need to copy + # This approach is not the best, since it may copy more than + # is needed + if ($itype eq "afm") { + my $afm_base_path = ""; + + if ($img_path =~ /^(.*?)\.afm/i) { + $afm_base_path = $1; + $afm_base_path .= ".[0-9][0-9][0-9]"; + } + else { + Print::print_err( + "Error parsing out base name of AFM file $img_path"); + } + + print "BASE: $afm_base_path<br>\n"; + + my $copied = 0; + + foreach my $i (glob($afm_base_path)) { + $copied++; + + # remove the tainting + $i = $1 if ($i =~ /^($::REG_IMG_PATH)$/); + + # Deterine the local (target) name + my $img = ""; + if ($i =~ /\/($::REG_FILE)$/) { + $img = "$::IMGDIR/$1"; + } + else { + Print::print_err("Error Parsing Image Path ($i)\n"); + } + + # Get the full path of the destination + my $img_dst = "$::host_dir" . "$img"; + if ((-e "$img_dst") || (-l "$img_dst")) { + Print::print_err( +"An image by the same name already exists in the Host directory ($img) (AFM import)\n" + . "Use the browser's back button to fix the name or delete the existing file." + ); + } + + my $orig_size = (stat("$i"))[7]; + + # Copy, Move, or link it + if ($import_type == $IMG_ADD_SYM) { + + Print::log_host_info( +"Sym Linking image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/ln -s '$i' '$img_dst'"); + } + elsif ($import_type == $IMG_ADD_COPY) { + Print::log_host_info( +"Copying image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/cp '$i' '$img_dst'"); + } + elsif ($import_type == $IMG_ADD_MOVE) { + Print::log_host_info( +"Moving image $img_path into $Args::args{'case'}:$Args::args{'host'}" + ); + + Exec::exec_sys("/bin/mv '$i' '$img_dst'"); + } + + my $new_size = (stat("$img_dst"))[7]; + + if ($new_size != $orig_size) { + Print::print_err( +"Original image size ($orig_size) is not the same as the destination size ($new_size) after AFM import" + ); + } + } + if ($copied == 0) { + Print::print_err( +"No AFM raw files were found with the same base name and a numeric extension" + ); + } + else { + print "$copied AFM raw files imported<br>\n"; + } + } + + Caseman::update_md5("$imgid", "$act_md5") + unless (($do_md5 == $MD5_NOTHING) || ($imgid eq "")); + + # Add a disk entry if the image is of a disk + unless (($add_num == 1) && ($end[0] == 0) && ($start[0] == 0)) { + unless ((exists $Args::args{'vstype'}) + && ($Args::args{'vstype'} =~ /^(\w+)$/)) + { + Print::print_err("Missing Volume System Type"); + } + my $vstype = $Args::args{'vstype'}; + + my $diskid = Caseman::add_vol_host_config("disk", "$imgid $vstype"); + print "<p>Disk image (type $vstype) added with ID <tt>$diskid</tt>\n"; + } + + # Add the file system / partition entries + for (my $i = 0; $i < $add_num; $i++) { + my $volid = + Caseman::add_vol_host_config("part", + "$imgid $start[$i] $end[$i] $ftype[$i] $mnt[$i]"); + print +"<p>Volume image ($start[$i] to $end[$i] - $ftype[$i] - $mnt[$i]) added with ID <tt>$volid</tt>\n"; + } + + print <<EOF; +<p> +<center> +<table width=600> +<tr> + <td width=300 align=center> + <a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::VOL_OPEN&${Args::baseargs_novol}\"> + <img src=\"pict/menu_b_ok.jpg\" alt=\"Ok\" width=\"167\" height=20 border=\"0\"> + </a> + </td> + <td width=300 align=center> + <a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::IMG_ADD&${Args::baseargs_novol}\"> + <img src=\"pict/menu_b_inew.jpg\" alt=\"Ok\" width=\"167\" height=20 border=\"0\"> + </a> + </td> +</tr> +</table> +</center> + +EOF + Print::print_html_footer(); + + return 0; +} + +# Display details of image based on config values +# provides links to remove the config of the image and to get the file +# system details + +sub vol_details { + Print::print_html_header("Details of $Args::args{'vol'}"); + + Args::get_unitsize(); + + my $vol = Args::get_vol('vol'); + + my $mnt = $Caseman::vol2mnt{$vol}; + my $ftype = $Caseman::vol2ftype{$vol}; + + print "<center>" + . "<img src=\"pict/menu_h_idet.jpg\" alt=\"Image Details\">" + . "<br><br><br>\n" + . "<table width=\"600\" cellspacing=\"0\" cellpadding=\"2\" " + . "background=\"$::YEL_PIX\" border=0>\n" + . " <tr><td colspan=\"2\"> </td></tr>\n" + . + + # Name + " <tr><td align=\"right\" width=\"300\"><b>Name:</b></td>" + . "<td align=\"left\"><tt>$Caseman::vol2sname{$vol}</tt></td></tr>\n" + . "<tr><td align=\"right\" width=\"300\"><b>Volume Id:</b></td>" + . "<td align=\"left\"><tt>$vol</tt></td></tr>\n" + . "<tr><td align=\"right\" width=\"300\"><b>Parent Volume Id:</b></td>" + . "<td align=\"left\"><tt>$Caseman::vol2par{$vol}</tt></td></tr>\n" + . "<tr><td align=\"right\" width=\"300\"><b>Image File Format:</b></td>" + . "<td align=\"left\"><tt>$Caseman::vol2itype{$vol}</tt></td></tr>\n" + + # Mount + . " <tr><td align=\"right\"><b>Mounting Point:</b></td>" + . "<td align=\"left\"><tt>$mnt</tt></td></tr>\n" + . + + # Type + " <tr><td align=\"right\"><b>File System Type:</b></td>" + . "<td align=\"left\"><tt>$ftype</tt></td></tr>\n"; + + # Host Directory + print " <tr><td colspan=\"2\"> </td></tr>\n" + + # Strings File + . " <tr><td colspan=2 align=\"center\"><b>External Files</b></td></tr>\n" + . " <tr><td align=\"right\"><b>ASCII Strings:</b></td>" + . "<td align=\"left\"><tt>" + . ( + (exists $Caseman::vol2str{$vol}) + ? $Caseman::vol2sname{$Caseman::vol2str{$vol}} + : " " + ) + . "</tt></td></tr>\n" + . + + # Unicode Strings File + " <tr><td align=\"right\"><b>Unicode Strings:</b></td>" + . "<td align=\"left\"><tt>" + . ( + (exists $Caseman::vol2uni{$vol}) + ? $Caseman::vol2sname{$Caseman::vol2uni{$vol}} + : " " + ) + . "</tt></td></tr>\n"; + + if (($ftype ne "raw") && ($ftype ne "swap")) { + + # blkls file + print +" <tr><td align=\"right\"><b>Unallocated $Fs::addr_unit{$ftype}s:</b></td>" + . "<td align=\"left\"><tt>" + . ( + (exists $Caseman::vol2blkls{$vol}) + ? $Caseman::vol2sname{$Caseman::vol2blkls{$vol}} + : " " + ) + . "</tt></td></tr>\n"; + + # Strings of blkls + print + " <tr><td align=\"right\"><b>ASCII Strings of Unallocated:</b></td>" + . "<td align=\"left\"><tt>" + . ( + ( + (exists $Caseman::vol2blkls{$vol}) + && (exists $Caseman::vol2str{$Caseman::vol2blkls{$vol}}) + ) + ? $Caseman::vol2sname{$Caseman::vol2str{$Caseman::vol2blkls{$vol}}} + : " " + ) + . "</tt></td></tr>\n"; + + # Unicodde Strings of blkls + print +" <tr><td align=\"right\"><b>Unicode Strings of Unallocated:</b></td>" + . "<td align=\"left\"><tt>" + . ( + ( + (exists $Caseman::vol2blkls{$vol}) + && (exists $Caseman::vol2uni{$Caseman::vol2blkls{$vol}}) + ) + ? $Caseman::vol2sname{$Caseman::vol2uni{$Caseman::vol2blkls{$vol}}} + : " " + ) + . "</tt></td></tr>\n"; + } + + print " <tr><td colspan=\"2\"> </td></tr>\n" + . "</table>\n<a name=\"extract\"\n"; + + # Section for Strings file and 'blkls' file + + if ( + (!(exists $Caseman::vol2str{$vol})) + || (!(exists $Caseman::vol2uni{$vol})) + || (!(exists $Caseman::vol2blkls{$vol})) + || ( + (exists $Caseman::vol2blkls{$vol}) + && ( (!(exists $Caseman::vol2str{$Caseman::vol2blkls{$vol}})) + || (!(exists $Caseman::vol2uni{$Caseman::vol2blkls{$vol}}))) + ) + ) + { + print "<hr><table width=600>\n<tr>"; + } + + # Strings File + if ( (!(exists $Caseman::vol2str{$vol})) + || (!(exists $Caseman::vol2uni{$vol}))) + { + + print +"<td align=\"center\" width=280><h3>Extract Strings of<br>Entire Volume</h3>" + . "Extracting the ASCII and Unicode strings from a file system will " + . "make keyword searching faster.<br><br>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "Generate MD5? " + . "<input type=\"checkbox\" name=\"md5\" value=\"1\" CHECKED><br><br>" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_MAKESTR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Args::args{'vol'}\">\n" + . Args::make_hidden(); + + if (!(exists $Caseman::vol2str{$vol})) { + print +"ASCII: <input type=\"checkbox\" name=\"str\" value=\"1\" CHECKED> \n"; + } + if (!(exists $Caseman::vol2uni{$vol})) { + print +" Unicode: <input type=\"checkbox\" name=\"uni\" value=\"1\" CHECKED>\n"; + } + + print "<br><br><input type=\"image\" src=\"pict/srch_b_str.jpg\" " + . "alt=\"Extract Strings\" border=\"0\">\n</form></td>\n" + . "<td width=40> </td>\n"; + } + + if (($ftype eq 'blkls') || ($ftype eq 'swap') || ($ftype eq 'raw')) { + + # Place holder for types that have no notion of unallocated + } + + # Unallocated Space File + elsif (!(exists $Caseman::vol2blkls{$vol})) { + + print +"<td align=\"center\" width=280><h3>Extract Unallocated $Fs::addr_unit{$ftype}s</h3>" + . "Extracting the unallocated data in a file system allows " + . "more focused keyword searches and data recovery.<br><br>\n" + . "(Note: This Does Not Include Slack Space)<br>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n"; + + print "Generate MD5? " + . "<input type=\"checkbox\" name=\"md5\" value=\"1\" CHECKED><br><br>" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_MAKEBLKLS\">\n" + . + + "<input type=\"hidden\" name=\"vol\" value=\"$Args::args{'vol'}\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/srch_b_un.jpg\" " + . "alt=\"Extract Unallocated Data\" border=\"0\">\n<br></form>\n"; + } + + # strings of 'blkls' + elsif ((!(exists $Caseman::vol2str{$Caseman::vol2blkls{$vol}})) + || (!(exists $Caseman::vol2uni{$Caseman::vol2blkls{$vol}}))) + { + + print +"<td align=\"center\" width=280><h3>Extract Strings of<br>Unallocated $Fs::addr_unit{$ftype}s</h3>" + . "Extracting the ASCII strings from the unallocated data will make " + . "keyword searching faster.<br><br>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "Generate MD5? " + . "<input type=\"checkbox\" name=\"md5\" value=\"1\" CHECKED><br><br>" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_MAKESTR\">\n" + . + +"<input type=\"hidden\" name=\"vol\" value=\"$Caseman::vol2blkls{$vol}\">\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_INIT\">\n" + . Args::make_hidden(); + + if (!(exists $Caseman::vol2str{$Caseman::vol2blkls{$vol}})) { + print +"ASCII: <input type=\"checkbox\" name=\"str\" value=\"1\" CHECKED> \n"; + } + if (!(exists $Caseman::vol2uni{$Caseman::vol2blkls{$vol}})) { + print +" Unicode: <input type=\"checkbox\" name=\"uni\" value=\"1\" CHECKED>\n"; + } + print "<br><br><input type=\"image\" src=\"pict/srch_b_str.jpg\" " + . "alt=\"Extract Strings\" border=\"0\">\n</form></td>\n"; + } + if ( + (!(exists $Caseman::vol2str{$vol})) + || (!(exists $Caseman::vol2uni{$vol})) + || (!(exists $Caseman::vol2blkls{$vol})) + || ( + (exists $Caseman::vol2blkls{$vol}) + && ( (!(exists $Caseman::vol2str{$Caseman::vol2blkls{$vol}})) + || (!(exists $Caseman::vol2uni{$Caseman::vol2blkls{$vol}}))) + ) + ) + { + print "</tr></table><hr>\n"; + } + + print "<p>" + . "<table width=\"400\" cellspacing=\"0\" cellpadding=\"2\">\n" + . + + # Ok + "<tr><td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_OPEN\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/menu_b_close.jpg\" " + . "alt=\"Close\" width=\"167\" height=20 border=0></form></td>\n"; + + print "<td align=center width=200>"; + if (($ftype ne "raw") && ($ftype ne "swap")) { + + # File System Details + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_blank\">\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$::MOD_FS\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"image\" src=\"pict/menu_b_fs.jpg\" " + . "width=167 height=20 " + . "alt=\"File System\" border=0></form></td>\n"; + } + else { + print " </td>\n"; + } + +# Remove Image +# THis was removed 12/03 because it causes problems because the image still +# exists and config entries and ... it becomes a mess +# print +# "<td align=center width=200>". +# "<form action=\"$::PROGNAME\" method=\"get\">\n". +# "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n". +# "<input type=\"hidden\" name=\"view\" value=\"$Caseman::IMG_DEL\">\n". +# Args::make_hidden(). +# "<input type=\"hidden\" name=\"vol\" value=\"$Args::args{'vol'}\">\n". +# "<input type=\"hidden\" name=\"mnt\" value=\"$Args::args{'mnt'}\">\n". +# "<input type=\"image\" src=\"pict/menu_b_rem.jpg\" ". +# "width=167 height=20 alt=\"Remove\" border=0></form>". +# "</td>\n". +# "</tr></table>\n"; + + Print::print_html_footer(); + return 0; +} + +# remove the config files +sub img_del { + Args::check_vol('vol'); + + # Args::check_ftype(); + Print::print_html_header( + "Removing Configuration Settings for $Args::args{'vol'}"); + + Caseman::del_host_config("", $Args::args{'vol'}, ""); + Caseman::update_md5($Args::args{'vol'}, ""); + + print "Settings for <tt>$Args::args{'vol'}</tt> removed from " + . "<tt>$Args::args{'case'}:$Args::args{'host'}</tt>.\n" + . "<p>NOTE: The actual file still exists in the host directory.\n"; + + print "<p><a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_OPEN&${Args::baseargs_novol}\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\"></a>\n"; + + Print::print_html_footer(); + + return 0; +} + +# Make a strings -t d file for the image to decrease the search time +# Can make both ASCII and Unicode strings files +sub vol_makestr { + Print::print_html_header("Extracting Strings"); + + my $ascii = 0; + my $uni = 0; + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + if ((exists $Args::args{'str'}) && ($Args::args{'str'} == 1)) { + if (exists $Caseman::vol2str{$vol}) { + Print::print_err( +"Image already has an ASCII strings file: $Caseman::vol2sname{$vol}" + ); + } + $ascii = 1; + } + + if ((exists $Args::args{'uni'}) && ($Args::args{'uni'} == 1)) { + if (exists $Caseman::vol2uni{$vol}) { + Print::print_err( +"Image already has a Unicode strings file: $Caseman::vol2sname{$vol}" + ); + } + + $uni = 1; + } + if (($uni == 0) && ($ascii == 0)) { + goto str_egress; + } + + my $base_name = $Caseman::vol2sname{$vol}; + + if ($ascii == 1) { + my $fname_rel = "$::DATADIR/${base_name}-$ftype.asc"; + my $fname = "$::host_dir" . "$fname_rel"; + + if (-e "$fname") { + my $i = 1; + $i++ while (-e "$::host_dir" + . "$::DATADIR/" + . "${base_name}-$ftype-$i.asc"); + + $fname_rel = "$::DATADIR/${base_name}-$ftype-$i.asc"; + $fname = "$::host_dir" . "$fname_rel"; + } + + print +"Extracting ASCII strings from <tt>$Caseman::vol2sname{$vol}</tt><br>\n"; + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Saving ASCII strings to $fname_rel"); + + local *OUT; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + + if ($ftype eq "blkls") { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/srch_strings' -a -t d $img > '$fname'"); + } + elsif ((($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d > '$fname'"); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d > '$fname'" + ); + } + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + + print $_ while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + + print "<br>\n" if ($hit_cnt != 0); + + # Verify that it worked + unless (open(STR, "$fname")) { + print( "Error opening $fname<br>\n" + . "Either an error occurred while generating the file or " + . "no ASCII strings exist<br>"); + goto str_uni; + } + + # append to config + my $strvol = + Caseman::add_vol_host_config("strings", "$vol $fname_rel"); + print "Host configuration file updated<br>"; + + $Caseman::vol2ftype{$strvol} = "strings"; + $Caseman::mod2vol{$strvol} = $vol; + $Caseman::vol2str{$vol} = $strvol; + $Caseman::vol2cat{$strvol} = "mod"; + $Caseman::vol2itype{$strvol} = "raw"; + + $Caseman::vol2par{$strvol} = $vol; + $Caseman::vol2path{$strvol} = "$::host_dir" . "$fname_rel"; + $Caseman::vol2start{$strvol} = 0; + $Caseman::vol2end{$strvol} = 0; + $Caseman::vol2sname{$strvol} = $fname_rel; + + # Calculate MD5 + if ((exists $Args::args{'md5'}) && ($Args::args{'md5'} == 1)) { + print "Calculating MD5 Value<br><br>\n"; + my $m = Hash::int_create_wrap($strvol); + print "MD5 Value: <tt>$m</tt><br><br>\n"; + } + } + + str_uni: + + if ($uni == 1) { + + my $fname_rel = "$::DATADIR/${base_name}-$ftype.uni"; + my $fname = "$::host_dir" . "$fname_rel"; + + if (-e "$fname") { + my $i = 1; + $i++ while (-e "$::host_dir" + . "$::DATADIR/" + . "${base_name}-$ftype-$i.uni"); + + $fname_rel = "$::DATADIR/${base_name}-$ftype-$i.uni"; + $fname = "$::host_dir" . "$fname_rel"; + } + + print "<hr>\n" if ($ascii == 1); + + print +"Extracting Unicode strings from <tt>$Caseman::vol2sname{$vol}</tt><br>\n"; + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Saving Unicode strings to $fname_rel"); + + local *OUT; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + if ($ftype eq "blkls") { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/srch_strings' -a -t d -e l $img > '$fname'"); + } + elsif ((($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d -e l > '$fname'"); + } + + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d -e l > '$fname'" + ); + } + + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + + print $_ while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + + print "<br>\n" if ($hit_cnt != 0); + + # Verify that it worked + unless (open(STR, "$fname")) { + print "Error opening $fname<br>\n" + . "Either an error occurred while generating the file or " + . "no Unicode strings exist"; + goto str_egress; + } + + # append to config + my $strvol = + Caseman::add_vol_host_config("unistrings", "$vol $fname_rel"); + print "Host configuration file updated<br>"; + + $Caseman::vol2ftype{$strvol} = "strings"; + $Caseman::mod2vol{$strvol} = $vol; + $Caseman::vol2uni{$vol} = $strvol; + $Caseman::vol2cat{$strvol} = "mod"; + $Caseman::vol2itype{$strvol} = "raw"; + + $Caseman::vol2par{$strvol} = $vol; + $Caseman::vol2path{$strvol} = "$::host_dir" . "$fname_rel"; + $Caseman::vol2start{$strvol} = 0; + $Caseman::vol2end{$strvol} = 0; + $Caseman::vol2sname{$strvol} = $fname_rel; + + # Calculate MD5 + if ((exists $Args::args{'md5'}) && ($Args::args{'md5'} == 1)) { + print "Calculating MD5 Value<br><br>\n"; + $m = Hash::int_create_wrap($strvol); + print "MD5 Value: <tt>$m</tt><br><br>\n"; + } + } + + str_egress: + + my $dest_vol = $vol; + + # We need to return with a real image to VOL_DETAILS so check the mod + $dest_vol = $Caseman::mod2vol{$vol} + if (exists $Caseman::mod2vol{$vol}); + + print "<hr><a href=\"$::PROGNAME?$Args::baseargs_novol&mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_DETAILS&vol=$dest_vol\" target=_top>Image Details</a><p>\n"; + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_KWSRCH&$Args::baseargs\"" + . " target=\"_top\">Keyword Search</a>\n"; + + Print::print_html_footer(); + + return 0; +} + +sub vol_makeblkls { + Print::print_html_header("Extracting Unallocated Space"); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $base_name = $Caseman::vol2sname{$vol}; + $base_name = $1 if ($base_name =~ /^(.*?)\.dd$/); + my $fname_rel = "$::DATADIR/${base_name}-$ftype.unalloc"; + my $fname = "$::host_dir" . "$fname_rel"; + + if (-e "$::host_dir" . "$fname_rel") { + my $i = 1; + $i++ while (-e "$::host_dir" + . "$::DATADIR/" + . "${base_name}-$ftype-$i.unalloc"); + + $fname_rel = "$::DATADIR/${base_name}-$ftype-$i.unalloc"; + $fname = "$::host_dir" . "$fname_rel"; + } + + Print::log_host_inv( + "$Args::args{'vol'}: Saving unallocated data to $fname_rel"); + + print +"Extracting unallocated data from <tt>$Caseman::vol2sname{$vol}</tt><br>\n"; + + local *OUT; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -f $ftype -o $offset -i $imgtype $img > '$fname'"); + + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + + print "$_" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + + print "<br>\n" + if ($hit_cnt != 0); + + # append to config + my $blklsvol = Caseman::add_vol_host_config("blkls", "$vol $fname_rel"); + print "Host configuration file updated<br>"; + + $Caseman::vol2ftype{$blklsvol} = "blkls"; + $Caseman::mod2vol{$blklsvol} = $vol; + $Caseman::vol2blkls{$vol} = $blklsrvol; + $Caseman::vol2cat{$blklsvol} = "mod"; + $Caseman::vol2itype{$blklsvol} = "raw"; + + $Caseman::vol2par{$blklsvol} = $vol; + $Caseman::vol2path{$blklsvol} = "$::host_dir" . "$fname_rel"; + $Caseman::vol2start{$blklsvol} = 0; + $Caseman::vol2end{$blklsvol} = 0; + $Caseman::vol2sname{$blklsvol} = $fname_rel; + + # Calculate MD5 + if ((exists $Args::args{'md5'}) && ($Args::args{'md5'} == 1)) { + print "Calculating MD5 Value<br>\n"; + my $m = Hash::int_create_wrap($blklsvol); + print "MD5 Value: <tt>$m</tt><br><br>\n"; + } + + print "<a href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_DETAILS\" target=_top>Image Details</a><p>\n"; + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_KWSRCH&$Args::baseargs_novol&" + . "vol=$fname_rel\" target=\"_top\">Keyword Search</a>\n"; + + Print::print_html_footer(); + return 0; +} + +1; diff --git a/lib/Data.pm b/lib/Data.pm new file mode 100644 index 0000000000..f8e2ef43fe --- /dev/null +++ b/lib/Data.pm @@ -0,0 +1,927 @@ +# +# Data / Content layer functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Data; + +$Data::FRAME = 1; +$Data::ENTER = 2; +$Data::CONT = 3; +$Data::CONT_MENU = 4; +$Data::CONT_MENU_FR = 5; +$Data::REPORT = 6; +$Data::LIST = 7; +$Data::EXPORT = 8; +$Data::BLANK = 9; + +# Display types that use the sort variable +$Data::SORT_ASC = 0; +$Data::SORT_HEX = 1; +$Data::SORT_STR = 2; + +# Types of block numbers +$Data::ADDR_DD = 0; +$Data::ADDR_BLKLS = 1; + +sub main { + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Data::FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the data unit address + if ($view == $Data::FRAME) { + return frame(); + } + elsif ($view == $Data::ENTER) { + return enter(); + } + elsif ($view == $Data::LIST) { + return list(); + } + elsif ($view == $Data::BLANK) { + return blank(); + } + + # These windows do need the data unit address + Args::check_block(); + if ($view == $Data::CONT) { + return content(); + } + elsif ($view == $Data::CONT_MENU) { + return content_menu(); + } + elsif ($view == $Data::CONT_MENU_FR) { + return content_menu_frame(); + } + elsif ($view == $Data::REPORT) { + return report(); + } + + elsif ($view == $Data::EXPORT) { + return export(); + } + else { + Print::print_check_err("Invalid Data View"); + } + +} + +# Generate the 2 frames for block browsing +sub frame { + Print::print_html_header_frameset("Data Browse on $Args::args{'vol'}"); + + print "<frameset cols=\"20%,80%\">\n"; + + # Data Contents + if (exists $Args::args{'block'}) { + my $len = Args::get_len(); + + print "<frame src=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::ENTER&" + . "$Args::baseargs&block=$Args::enc_args{'block'}\">\n" + . "<frame src=\"$::PROGNAME?" + . "mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "block=$Args::enc_args{'block'}&$Args::baseargs&len=$len\" " + . "name=\"content\">\n</frameset>\n"; + } + else { + print "<frame src=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::ENTER&" + . "$Args::baseargs\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::BLANK&" + . "$Args::baseargs\" name=\"content\">\n</frameset>\n"; + } + + Print::print_html_footer_frameset(); + return 0; +} + +# Frame to enter the data into +sub enter { + Print::print_html_header(""); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $bs = Args::get_unitsize(); + + print "<form action=\"$::PROGNAME\" method=\"get\" " + . "target=\"content\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_DATA\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Data::CONT_MENU_FR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . Args::make_hidden() + . + + # Address + "<b>$Fs::addr_unit{$ftype} Number:</b><br> " + . "<input type=\"text\" name=\"block\" size=12 maxlength=12"; + print " value=\"$Args::enc_args{'block'}\"" + if (exists $Args::args{'block'}); + print ">\n"; + + # Number of units + print "<p><b>Number of $Fs::addr_unit{$ftype}" . "s:</b>" + . "<br> " + . "<input type=\"text\" name=\"len\" value=\"1\" size=6 maxlength=6>\n"; + + print "<p><b>$Fs::addr_unit{$ftype} Size:</b>" . " $bs\n"; + + # blkls images do not get to select this + # if (($ftype ne 'blkls') && ($ftype ne 'swap') && ($ftype ne 'raw')) { + if ($Fs::is_fs{$ftype} == 1) { + print "<p><b>Address Type:</b><br> " + . "<select name=\"btype\" size=1>\n" + . "<option value=\"$Data::ADDR_DD\" selected>Regular (dd)</option>\n" + . "<option value=\"$Data::ADDR_BLKLS\">Unallocated (blkls)</option>\n" + . "</select>\n"; + } + else { + print + "<input type=\"hidden\" name=\"btype\" value=\"$Data::ADDR_DD\">\n"; + } + + # Lazarus + print "<p><b>Lazarus Addr:</b> " + . "<input type=\"checkbox\" name=\"btype2\">\n" + . "<p><input type=\"image\" src=\"pict/but_view.jpg\" " + . "width=45 height=22 alt=\"View\" border=\"0\">\n" + . "</form>\n"; + + print "<hr><p>" + . "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::LIST&$Args::baseargs\" target=\"content\">" + . "<img src=\"pict/but_alloc_list.jpg\" border=\"0\" " + . "width=113 height=20 alt=\"Allocation List\"></a><br>\n" + if ($Fs::is_fs{$ftype} == 1); + + # unless (($ftype eq 'blkls') || ($ftype eq 'swap') || ($ftype eq 'raw')); + + # If there is a blkls image, then provide a button for it + if (($ftype ne 'blkls') && (exists $Caseman::vol2blkls{$vol})) { + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$::MOD_DATA\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Caseman::vol2blkls{$vol}\">\n" + . Args::make_hidden() + . "<p><input type=\"image\" src=\"pict/srch_b_lun.jpg\" " + . "alt=\"Load Unallocated Image\" border=\"0\">\n<br></form>\n"; + } + + # If we are using a blkls image, then give a button for the original + elsif (($ftype eq 'blkls') && (exists $Caseman::mod2vol{$vol})) { + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$::MOD_DATA\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Caseman::mod2vol{$vol}\">\n" + . Args::make_hidden() + . "<p><input type=\"image\" src=\"pict/srch_b_lorig.jpg\" " + . "alt=\"Load Original Image\" border=\"0\">\n<br></form>\n"; + } + + Print::print_html_footer(); + return 0; +} + +# generate frame for block content +sub content_menu_frame { + Print::print_html_header_frameset(""); + + my $sort = $Data::SORT_ASC; + $sort = $1 + if ((exists $Args::args{'sort'}) && ($Args::args{'sort'} =~ /^(\d+)$/)); + + my $len = Args::get_len(); + if ($len == 0) { + Print::print_err("Invalid length: 0"); + } + + my $blk; + + my $ifind = Args::get_ifind(); + + # off is 1 if a lazarus block number as they are off by one + my $off = 0; + $off = -1 if (exists $Args::args{'btype2'}); + + # Do we need to convert from blkls value to dd value ? + if ( (exists $Args::args{'btype'}) + && ($Args::args{'btype'} == $Data::ADDR_BLKLS)) + { + + my $vol = Args::get_vol('vol'); + my $b = Args::get_block() + $off; + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkcalc' -f $ftype -u $b -o $offset -i $imgtype $img"); + $blk = Exec::read_pipe_line(*OUT); + close(OUT); + + $blk = "Error getting block" + if ((!defined $blk) || ($blk eq "")); + + if ($blk !~ /^\d+$/) { + print "$blk\n"; + return 1; + } + } + else { + $blk = Args::get_block() + $off; + } + + print "<frameset rows=\"25%,75%\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU&$Args::baseargs" + . "&block=$blk&sort=$sort&len=$len&ifind=$ifind\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT&$Args::baseargs" + . "&block=$blk&sort=$sort&len=$len\" name=\"cont2\">\n" + . "</frameset>"; + + Print::print_html_footer_frameset(); + return 0; +} + +sub print_ifind { + my $block = Args::get_block(); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Finding $Fs::meta_str{$ftype} for data unit $block" + ); + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ifind' -f $ftype -d $block -o $offset -i $imgtype $img"); + my $meta = Exec::read_pipe_line(*OUT); + close(OUT); + + $meta = "Error getting meta address" + if ((!defined $meta) || ($meta eq "")); + + if ($meta =~ /^($::REG_META)$/o) { + $meta = $1; + my $tmpr = $Caseman::vol2mnt{$vol}; + print "<b>Pointed to by $Fs::meta_str{$ftype}:</b> " + . "<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs&" + . "meta=$meta\" target=\"_top\">$meta</a><br>\n"; + + print "<b>Pointed to by file:</b>\n"; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ffind' -f $ftype -a -o $offset -i $imgtype $img $meta"); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + + # Make it red if it is deleted + if (/^(\*)\s+\/*(.*)$/) { + Print::print_output("<tt><font color=\"$::DEL_COLOR[0]\">" + . Print::html_encode(${tmpr} . ${2}) + . "</font></tt> (deleted)<br>\n"); + } + + # If it starts with a '/' then it must be a file + elsif (/^\/(.*)$/) { + Print::print_output("<tt>" + . Print::html_encode(${tmpr} . ${1}) + . "</tt><br>\n"); + } + + # this must be an error + else { + Print::print_output(Print::html_encode($_) . "<br>\n"); + } + } + close(OUT); + } + else { + print "$meta\n"; + } +} + +# Generate index for block content +sub content_menu { + Print::print_html_header(""); + + my $block = Args::get_block(); + my $prev = $block - 1; + my $next = $block + 1; + + my $sort = Args::get_sort(); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $ifind = Args::get_ifind(); + + my $len = Args::get_len(); + my $bs = Args::get_unitsize(); + + if ($len == 0) { + Print::print_err("Invalid length: 0"); + } + + print "<center>"; + my $url = + "$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "$Args::baseargs&sort=$sort&len=$len" + . "&ifind=$ifind"; + + # Next and Previous pointers + print "<table cellspacing=\"0\" cellpadding=\"2\">\n" . "<tr>\n"; + + # Previous + if ($prev < $Fs::first_addr{$ftype}) { + print "<td align=\"right\"> </td>\n"; + } + else { + print "<td align=\"right\">" + . "<a href=\"$url&block=$prev\" target=\"_parent\">\n" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a></td>\n"; + } + + # Next + print "<td align=\"left\"><a href=\"$url&block=$next\"" + . " target=\"_parent\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a></td>\n</tr>\n"; + + print "<tr><td align=\"right\"><a href=\"$::PROGNAME?" + . "mod=$::MOD_DATA&view=$Data::EXPORT&$Args::baseargs&" + . "block=$block&len=$len\">" + . "<img src=\"pict/but_export.jpg\" border=\"0\" alt=\"Export\" " + . "width=123 height=20></a></td>\n"; + + if ($::USE_NOTES == 1) { + print "<td align=\"left\">" + . "<a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::ENTER_DATA&$Args::baseargs&block=$block&len=$len\" " + . "target=\"_blank\">" + . "<img src=\"pict/but_addnote.jpg\" border=\"0\" " + . "width=\"89\" height=20 alt=\"Add Note\"></a></td>\n"; + } + else { + print "<td align=\"left\"> </td>\n"; + } + + print "</tr></table>\n"; + + # Display formats + print "<table cellspacing=\"0\" cellpadding=\"2\">\n" . "<tr><td>ASCII ("; + if ($sort == $Data::SORT_ASC) { + print "display - "; + } + else { + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "$Args::baseargs&" + . "sort=$Data::SORT_ASC&block=$block&len=$len\" target=\"_parent\">" + . "display</a> - \n"; + } + + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::REPORT&" + . "$Args::baseargs&sort=$Data::SORT_ASC" + . "&block=$block&len=$len\" target=\"_blank\">report</a>)</td>\n" + . "<td>*</td>\n"; + + print "<td>Hex ("; + if ($sort == $Data::SORT_HEX) { + print "display - "; + } + else { + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "$Args::baseargs&" + . "sort=$Data::SORT_HEX&block=$block&len=$len\" target=\"_parent\">" + . "display</a> - \n"; + } + + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::REPORT&" + . "$Args::baseargs&sort=$Data::SORT_HEX" + . "&block=$block&len=$len\" target=\"_blank\">report</a>)</td>\n" + . "<td>*</td>\n"; + + print "<td>ASCII Strings ("; + if ($sort == $Data::SORT_STR) { + print "display - "; + } + else { + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "$Args::baseargs&" + . "sort=$Data::SORT_STR&block=$block&len=$len\" target=\"_parent\">" + . "display</a> - \n"; + } + + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::REPORT&" + . "$Args::baseargs&sort=$Data::SORT_STR" + . "&block=$block&len=$len\" target=\"_blank\">report</a>)</td>\n" + . "</tr></table>\n"; + + # Special case for 'blkls' b.c. we need to specify original data unit size + local *OUT; + if ($ftype eq 'blkls') { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype -u $bs -o $offset -i $imgtype $img $block | '$::FILE_EXE' -z -b -" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype -o $offset -i $imgtype $img $block | '$::FILE_EXE' -z -b -" + ); + } + my $file_type = Exec::read_pipe_line(*OUT); + close(OUT); + + $file_type = "Error getting file type" + if ((!defined $file_type) || ($file_type eq "")); + + print "<b>File Type:</b> $file_type<br></center>\n"; + + if ($len == 1) { + print "<b>$Fs::addr_unit{$ftype}:</b> $block<br>\n"; + } + else { + my $end = $block + $len - 1; + print "<b>$Fs::addr_unit{$ftype}" . "s:</b> $block-$end<br>\n"; + } + if ($Fs::is_fs{$ftype} == 1) { + + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkstat' -f $ftype -o $offset -i $imgtype $img $block" + ); + + my $cnt = 0; + while ($_ = Exec::read_pipe_line(*OUT)) { + + if ($_ =~ /((Not )?Allocated)/) { + print "<font color=\"$::DEL_COLOR[0]\">" if (defined $2); + print "<b>Status:</b> $1<br>"; + print "</font>" if (defined $2); + } + elsif ($_ =~ /Group: (\d+)/) { + print "<b>Group:</b> $1<br>\n"; + } + $cnt++; + } + close(OUT); + if ($cnt == 0) { + print "Invalid $Fs::addr_unit{$ftype} address<br>\n"; + return; + } + + # Make ifind an option + $url = + "$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU&" + . "$Args::baseargs&sort=$sort&len=$len&block=$block"; + if ($ifind == 0) { + print "<a href=\"$url&ifind=1\">Find Meta Data Address</a><br>\n"; + } + else { + print "<a href=\"$url&ifind=0\">Hide Meta Data Address</a><br>\n"; + print_ifind(); + } + } + + # Option to view original if it exists + if ( ($ftype eq 'blkls') + && (exists $Caseman::mod2vol{$vol})) + { + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&" + . "view=$Data::CONT_MENU_FR&${Args::baseargs_novol}" + . "&vol=$Caseman::mod2vol{$vol}&" + . "block=$block&sort=$sort&len=$len&btype=$Data::ADDR_BLKLS\" " + . "target=\"_parent\">View Original</a><br>\n"; + } + + Print::print_html_footer(); + return 0; +} + +#Display actual block content +sub content { + Args::check_sort(); + + Print::print_text_header(); + + my $sort = Args::get_sort(); + my $block = Args::get_block(); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $len = Args::get_len(); + my $bs = Args::get_unitsize(); + + my $range = ""; + if ($len == 0) { + print "Invalid length: 0\n"; + exit(1); + } + elsif ($len == 1) { + $range = "$Fs::addr_unit{$ftype} $block"; + } + else { + my $end = $block + $len - 1; + $range = "$Fs::addr_unit{$ftype}" . "s $block-$end"; + } + my $str = "Contents of $range in $Caseman::vol2sname{$vol}\n\n\n"; + my $log_str = "contents of $range"; + + my $usize_str = ""; + $usize_str = " -u $bs " + if ($ftype eq 'blkls'); + + local *OUT; + if ($sort == $Data::SORT_HEX) { + print "Hex " . $str; + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Displaying Hex $log_str"); + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -h -o $offset -i $imgtype $img $block $len" + ); + } + elsif ($sort == $Data::SORT_ASC) { + print "ASCII " . $str; + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Displaying ASCII $log_str"); + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -a -o $offset -i $imgtype $img $block $len" + ); + } + elsif ($sort == $Data::SORT_STR) { + print "ASCII String " . $str; + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Displaying string $log_str"); + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -o $offset -i $imgtype $img $block $len | '$::TSKDIR/srch_strings' -a" + ); + } + print $_ while ($_ = Exec::read_pipe_data(*OUT, 512)); + close(OUT); + + Print::print_text_footer(); + + return 0; +} + +sub report { + Args::check_sort(); + + my $sort = Args::get_sort(); + my $vol = Args::get_vol('vol'); + my $block = Args::get_block(); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $len = Args::get_len(); + my $type; + + if ($len == 0) { + print("Invalid length: 0"); + exit(1); + } + my $bs = Args::get_unitsize(); + + my $usize_str = ""; + $usize_str = " -u $bs " if ($ftype eq 'blkls'); + + Print::print_text_header("$vol" . "-" + . "$Fs::addr_unit{$ftype}" + . "$Args::args{'block'}" + . ".txt"); + + if ($sort == $Data::SORT_ASC) { + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Generating ASCII report on data unit $block" + ); + $type = "ascii"; + } + elsif ($sort == $Data::SORT_STR) { + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Generating ASCII strings report on data unit $block" + ); + $type = "string"; + } + elsif ($sort == $Data::SORT_HEX) { + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Generating hex report on data unit $block" + ); + $type = "hex"; + } + else { + print "\n\n"; + print "invalid sort value"; + return 1; + } + + print " Autopsy $type $Fs::addr_unit{$ftype} Report\n\n" + . "-" x 70 . "\n" + . " GENERAL INFORMATION\n\n"; + + if ($len == 1) { + print "$Fs::addr_unit{$ftype}: $Args::args{'block'}\n"; + } + else { + my $end = $block + $len - 1; + print "$Fs::addr_unit{$ftype}" . "s: $Args::args{'block'}-$end\n"; + } + print "$Fs::addr_unit{$ftype} Size: $bs\n"; + + # if (($ftype ne 'blkls') && ($ftype ne 'raw') && ($ftype ne 'swap')) { + if ($Fs::is_fs{$ftype} == 1) { + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ifind' -f $ftype -d $block -o $offset -i $imgtype $img" + ); + my $meta = Exec::read_pipe_line(*OUT); + close(OUT); + + $meta = "Error getting meta address" + if ((!defined $meta) || ($meta eq "")); + + if ($meta =~ /^($::REG_META)$/o) { + my $tmpi = $1; + print "\nPointed to by $Fs::meta_str{$ftype}: $tmpi\n"; + + my $tmpr = $Caseman::vol2mnt{$vol}; + print "Pointed to by files:\n"; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ffind' -f $ftype -a -o $offset -i $imgtype $img $tmpi" + ); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + if (/^(\*)\s+\/*(.*)$/) { + Print::print_output( + " $tmpr$2 (deleted)\n"); + } + elsif (/^\/(.*)$/) { + Print::print_output( + " $tmpr$1\n"); + } + else { + Print::print_output(" $_\n"); + } + } + close(OUT); + } + else { + print "Not allocated to any meta data structures\n"; + } + } # not blkls + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -o $offset -i $imgtype $img $block $len | '$::MD5_EXE'" + ); + my $md5 = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5 = "Error getting md5" + if ((!defined $md5) || ($md5 eq "")); + + chop $md5; + print "MD5 of raw $Fs::addr_unit{$ftype}: $md5\n"; + + if ($sort == $Data::SORT_HEX) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -h -o $offset -i $imgtype $img $block $len | '$::MD5_EXE'" + ); + } + elsif ($sort == $Data::SORT_ASC) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -a -o $offset -i $imgtype $img $block $len | '$::MD5_EXE'" + ); + } + elsif ($sort == $Data::SORT_STR) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -o $offset -i $imgtype $img $block $len | '$::TSKDIR/srch_strings' -a | '$::MD5_EXE'" + ); + } + + $md5 = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5 = "Error getting md5" + if ((!defined $md5) || ($md5 eq "")); + + chop $md5; + print "MD5 of $type output: $md5\n"; + + print "\nImage: $Caseman::vol2path{$vol}\n"; + if (($Caseman::vol2start{$vol} == 0) && ($Caseman::vol2end{$vol} == 0)) { + print "Offset: Full image\n"; + } + elsif ($Caseman::vol2end{$vol} == 0) { + print "Offset: $Caseman::vol2start{$vol} to end\n"; + } + else { + print "Offset: $Caseman::vol2start{$vol} to $Caseman::vol2end{$vol}\n"; + } + print "File System Type: $ftype\n"; + + my $date = localtime(); + + print "\nDate Generated: $date\n" + . "Investigator: $Args::args{'inv'}\n" + . "-" x 70 . "\n" + . " CONTENT\n\n"; + + if ($sort == $Data::SORT_HEX) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -h -o $offset -i $imgtype $img $block $len" + ); + } + elsif ($sort == $Data::SORT_ASC) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -a -o $offset -i $imgtype $img $block $len" + ); + } + elsif ($sort == $Data::SORT_STR) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype $usize_str -o $offset -i $imgtype $img $block $len | '$::TSKDIR/srch_strings' -a" + ); + } + Print::print_output($_) + while ($_ = Exec::read_pipe_data(*OUT, 512)); + close(OUT); + + print "\n" + . "-" x 70 . "\n" + . " VERSION INFORMATION\n\n" + . "Autopsy Version: $::VER\n"; + print "The Sleuth Kit Version: " . ::get_tskver() . "\n"; + + Print::print_text_footer(); + + return 0; +} + +# +# Display the block allocation list +# +sub list { + Print::print_html_header("Block Allocation List"); + + my $BLKLS_GAP = 500; + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $min = 0; + $min = Args::get_min() if (exists $Args::args{'min'}); + my $max = $min + $BLKLS_GAP - 1; + + # set fmin to the minimum for the file system + my $fmin = $min; + $fmin = $Fs::first_addr{$ftype} if ($min < $Fs::first_addr{$ftype}); + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Block Allocation List for $min to $max"); + print "<center><H2>$Fs::addr_unit{$ftype}: $min - $max</H2>"; + + my $tmp; + + if ($min - $BLKLS_GAP >= 0) { + $tmp = $min - $BLKLS_GAP; + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::LIST&" + . "$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a> "; + } + $tmp = $min + $BLKLS_GAP; + print " <a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::LIST&" + . "$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a><br>"; + print "</center>\n"; + + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -el -f $ftype -o $offset -i $imgtype $img $fmin-$max" + ); + while ($_ = Exec::read_pipe_line(*OUT)) { + if (/^(\d+)\|([af])/) { + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&" + . "view=$Data::CONT_MENU_FR&$Args::baseargs&block=$1\">" + . "$1:</a> "; + if ($2 eq "a") { + print "allocated<br>\n"; + } + else { + print "<font color=\"$::DEL_COLOR[0]\">free</font><br>\n"; + } + } + } + close(OUT); + + print "<center>\n"; + if ($min - $BLKLS_GAP >= 0) { + $tmp = $min - $BLKLS_GAP; + print "<a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::LIST&" + . "$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a> "; + } + $tmp = $min + $BLKLS_GAP; + print " <a href=\"$::PROGNAME?mod=$::MOD_DATA&view=$Data::LIST&" + . "$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a><br>"; + print "</center>\n"; + + Print::print_html_footer(); + return 0; +} + +sub export { + my $block = Args::get_block(); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $len = Args::get_len(); + my $bs = Args::get_unitsize(); + + Print::print_oct_header( + "$vol" . "-" . "$Fs::addr_unit{$ftype}" . "$block" . ".raw"); + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Saving contents of data unit $block (unit size: $bs number: $len)" + ); + + local *OUT; + if ($ftype eq 'blkls') { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype -u $bs -o $offset -i $imgtype $img $block $len" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkcat' -f $ftype -o $offset -i $imgtype $img $block $len" + ); + } + print "$_" while ($_ = Exec::read_pipe_data(*OUT, 512)); + close(OUT); + + Print::print_oct_footer(); + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header("Data Unit Blank Page"); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + + print "<center><h3>Data Unit Mode</h3><br>\n" + . "Here you can view the contents of any $Fs::addr_unit{$ftype} in the file system.<br>\n" + . "Enter the address in the field on the left.\n"; + Print::print_html_footer(); + return 0; +} diff --git a/lib/Exec.pm b/lib/Exec.pm new file mode 100644 index 0000000000..e138712756 --- /dev/null +++ b/lib/Exec.pm @@ -0,0 +1,91 @@ +# +# Functions that wrap the execution of tools so that they are logged +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Exec; + +# exec_pipe(HANDLE, CMD); +sub exec_pipe { + my $handle = shift(@_); + my $cmd = shift(@_); + + die "Can't open pipe for exec_pipe" + unless defined(my $pid = open($handle, '-|')); + + if ($pid) { + return $handle; + } + else { + $| = 1; + Print::log_host_inv_exec("$cmd"); + exec("$cmd") or die "Can't exec program: $!"; + } +} + +sub read_pipe_line { + my $handle = shift(@_); + my $out; + +# for (my $i = 0; ($len = read ($handle, $$buf, $size)) && (!defined $len); $i++) { + + for (my $i = 0; $i < 100; $i++) { + $out = <$handle>; + return $out if (defined $out); + } + return $out; +} + +sub read_pipe_data { + my $handle = shift(@_); + my $size = shift(@_); + my $out; + my $len; + + for ( + my $i = 0; + ($len = read($handle, $out, $size)) && (!defined $len) && ($i < 100); + $i++ + ) + { + } + + return $out; +} + +sub exec_sys { + my $cmd = shift(@_); + Print::log_host_inv_exec("$cmd"); + system($cmd); + return; +} + +1; diff --git a/lib/File.pm b/lib/File.pm new file mode 100644 index 0000000000..59696d013c --- /dev/null +++ b/lib/File.pm @@ -0,0 +1,2310 @@ +# +# File name layer functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Updated 1/15 + +package File; + +# If the order of these views are changed, then the checks in main +# must be as well +$File::BLANK = 0; +$File::FRAME = 1; +$File::DIR_LIST = 2; +$File::FILE_LIST_DIR = 3; +$File::FILE_LIST_FILE = 4; +$File::FILE_LIST_DEL = 5; +$File::FILE_LIST = 6; +$File::CONT = 7; +$File::CONT_FR = 8; +$File::CONT_MENU = 9; +$File::REPORT = 10; +$File::EXPORT = 11; +$File::MD5LIST = 12; +$File::CONT_IMG = 13; + +$File::REC_NO = 0; +$File::REC_YES = 1; + +sub main { + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $File::FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view == $File::BLANK) { + blank(); + return 0; + } + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the meta data address + if ($view < $File::FILE_LIST) { + + if ($view == $File::FRAME) { + return frame(); + } + + Args::check_dir(); + if ($view == $File::DIR_LIST) { + return dir_list(); + } + elsif ($view == $File::FILE_LIST_DIR) { + return file_list_dir(); + } + elsif ($view == $File::FILE_LIST_DEL) { + return file_list_del(); + } + elsif ($view == $File::FILE_LIST_FILE) { + return file_list_file(); + } + } + + # These windows need the meta data address + Args::check_dir(); + Args::check_meta('meta'); + + if ($view < $File::REPORT) { + if ($view == $File::FILE_LIST) { + return file_list(); + } + elsif ($view == $File::CONT) { + return content(); + } + elsif ($view == $File::CONT_FR) { + return content_fr(); + } + elsif ($view == $File::CONT_MENU) { + return content_menu(); + } + } + else { + if ($view == $File::REPORT) { + return report(); + } + elsif ($view == $File::EXPORT) { + return export(); + } + elsif ($view == $File::MD5LIST) { + return md5list(); + } + elsif ($view == $File::CONT_IMG) { + return content_img(); + } + } + + Print::print_check_err("Invalid File View"); +} + +# Sorting and display types +my $FIL_SORT_ASC = 0; +my $FIL_SORT_STR = 1; +my $FIL_SORT_HEX = 2; + +# Methods of sorting the file listings +my $SORT_DTYPE = 0; # type according to dentry +my $SORT_ITYPE = 1; # type according to meta +my $SORT_NAME = 2; +my $SORT_MOD = 3; +my $SORT_ACC = 4; +my $SORT_CHG = 5; +my $SORT_CRT = 6; +my $SORT_SIZE = 7; +my $SORT_GID = 8; +my $SORT_UID = 9; +my $SORT_META = 10; +my $SORT_DEL = 11; + +my $DIRMODE_SHOW = 1; +my $DIRMODE_NOSHOW = 2; + +# +# Make the three frames and fill them in +# +sub frame { + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + + # If we were not given the meta, then look up the root + unless (exists $Args::args{'meta'}) { + $Args::args{'meta'} = $Args::enc_args{'meta'} = $Fs::root_meta{$ftype}; + } + + unless (exists $Args::args{'dir'}) { + $Args::enc_args{'dir'} = $Args::args{'dir'} = "/"; + } + + Args::check_meta('meta'); + Args::check_dir(); + + my $meta = Args::get_meta('meta'); + my $dir = Args::get_dir(); + + Print::print_html_header_frameset("$mnt$dir on $Args::args{'vol'}"); + + my $sort = $SORT_NAME; + $sort = $Args::args{'sort'} if (exists $Args::args{'sort'}); + + my $dirmode = $DIRMODE_NOSHOW; + $dirmode = $Args::args{'dirmode'} if (exists $Args::args{'dirmode'}); + + print "<frameset cols=\"175,*\">\n"; + + # Directory Listing on Left + my $url = + "$::PROGNAME?$Args::baseargs&dir=$dir&" . "sort=$sort&dirmode=$dirmode"; + + print "<frame src=\"$url&mod=$::MOD_FILE&view=$File::DIR_LIST\">\n"; + + # File frameset on right + print "<frameset rows=\"50%,50%\">\n"; + + # File Listings on top + print + "<frame src=\"$url&mod=$::MOD_FILE&view=$File::FILE_LIST&meta=$meta\" " + . "name=\"list\">\n"; + + # File Contents + print "<frame src=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::BLANK&" + . "$Args::baseargs\" name=\"content\">\n" + . "</frameset>\n" + . "</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# +# Print the directory names for the lhs frame and other +# Search forms +# + +sub dir_list { + Args::check_sort(); + Args::check_dirmode(); + + Print::print_html_header(""); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $sort = Args::get_sort(); + my $dirmode = Args::get_dirmode(); + my $mnt = $Caseman::vol2mnt{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $lcldir = ""; + my $prev_plus = ""; # previous number of '+' directory spacers + my $prev_fname = ""; + my $prev_meta = ""; + + # Field to enter a directory into: + print "<p><form action=\"$::PROGNAME\" method=\"get\" target=\"list\">\n" + . "<center><b>Directory Seek</b></center><br>" + . "Enter the name of a directory that you want to view.<br>" + . "<tt>$mnt</tt>" + . "<input type=\"text\" name=\"dir\" size=24 maxlength=100>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FILE\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$File::FILE_LIST_DIR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"sort\" value=\"$Args::args{'sort'}\">\n" + . "<input type=\"hidden\" name=\"dirmode\" value=\"$Args::args{'dirmode'}\">\n" + . Args::make_hidden() + . + + # View Button + "<br><input type=\"image\" src=\"pict/but_view.jpg\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></form>\n"; + + # Field to enter a name into: + print + "<hr><p><form action=\"$::PROGNAME\" method=\"get\" target=\"list\">\n" + . "<center><b>File Name Search</b></center><br>" + . "Enter a Perl regular expression for the file names you want to find.<br><br>\n" + . "<input type=\"text\" name=\"dir\" size=24 maxlength=100>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FILE\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$File::FILE_LIST_FILE\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Args::args{'vol'}\">\n" + . "<input type=\"hidden\" name=\"sort\" value=\"$Args::args{'sort'}\">\n" + . "<input type=\"hidden\" name=\"dirmode\" value=\"$Args::args{'dirmode'}\">\n" + . Args::make_hidden() + . "<br>\n" + . + + # Search Button + "<input type=\"image\" src=\"pict/but_search.jpg\" " + . "width=61 height=22 alt=\"Search\" border=\"0\"></form>\n"; + + print "<p><hr><p>\n"; + + my $base_url = "$::PROGNAME?$Args::baseargs&sort=$sort"; + + # All deleted files button + print "<a href=\"$base_url&mod=$::MOD_FILE&view=$File::FILE_LIST_DEL&" + . "dir=&dirmode=$dirmode\" target=\"list\">" + . "<img border=\"0\" src=\"pict/file_b_alldel.jpg\" width=\"127\" " + . "alt=\"Show All Deleted Files\">" + . "</a><p>\n"; + + # The dirmode arg shows if we should expand the whole directory listing + # or not + if ($dirmode == $DIRMODE_NOSHOW) { + print "<a href=\"$base_url&mod=$::MOD_FILE&view=$File::FRAME&" + . "dirmode=$DIRMODE_SHOW\" target=\"_parent\">" + . "<img src=\"pict/file_b_expand.jpg\" alt=\"Expand All Directories\" " + . "border=\"0\"></a><p><hr>\n"; + + return; + } + else { + print "<a href=\"$base_url&mod=$::MOD_FILE&view=$File::FRAME&" + . "dirmode=$DIRMODE_NOSHOW\" target=\"_parent\">" + . "<img src=\"pict/file_b_hide.jpg\" alt=\"Hide All Directories\" " + . "border=\"0\"></a><p><hr>\n"; + } + + $base_url .= "&dirmode=$dirmode"; + + Print::log_host_inv("$Args::args{'vol'}: List of all directories"); + + # We need to maintain state to create dir and this is done by + # counting the + marks. + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/fls' -f $ftype -ruD -o $offset -i $imgtype $img"); + + # Print root + my $url = + "$base_url&mod=$::MOD_FILE&view=$File::FILE_LIST&" + . "meta=$Fs::root_meta{$ftype}&dir="; + print "<p><a href=\"$url\" target=\"list\">$mnt</a><br>\n"; + + while ($_ = Exec::read_pipe_line(*OUT)) { + if ( +/^(\*)?(\+*)\s*[\-d]\/[\-d]\s*(\d+)\-?\d*\-?\d*\s*(\(realloc\))?:\t(.+)$/ + ) + { + + my $del = $1; + my $plus = $2; + my $meta = $3; + my $re = $4; + my $fname = $5; + + # Adjust the dir value using the '++' values to determine + # how "deep" we are + unless ($prev_plus eq $plus) { + + # are we in 1 more + if ($plus eq $prev_plus . '+') { + $lcldir .= ($prev_fname . "/"); + } + + # we are back (at least one) + elsif (defined $plus) { + my @dirs = split('/', $lcldir); + my $idx = -1; + $lcldir = ""; + + while (($idx = index($plus, '+', $idx + 1)) != -1) { + $lcldir .= ($dirs[$idx] . "/"); + } + } + } + + $prev_plus = $plus; + $prev_fname = $fname; + $prev_meta = $meta; + + $url = + "$base_url&mod=$::MOD_FILE&view=$File::FILE_LIST&" + . "meta=$meta&dir=" + . Args::url_encode($lcldir . $fname . "/"); + + print "<font color=\"$::DEL_COLOR[0]\">" if defined $del; + print "+$plus<a href=\"$url\" target=\"list\"><tt>/" + . Print::html_encode($fname) + . "</tt></a><br>\n"; + print "</font>" if defined $del; + } + } + close(OUT); + Print::print_html_footer(); + return 0; + +}; # end of FIL_DIR + +# Print the files and directories for the upper rhs frame +# These can be sorted in any format +# +# We need to find a way to cache this data +# +sub file_list { + Args::check_sort(); + Args::check_dirmode(); + + my $vol = Args::get_vol('vol'); + my $sort = Args::get_sort(); + my $ftype = $Caseman::vol2ftype{$vol}; + my $meta = Args::get_meta('meta'); + my $mnt = $Caseman::vol2mnt{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + + my $sp = " "; + + Print::print_html_header("Entries in $fname"); + + my (@itype, @dtype, @name, @mod, @acc, @chg, @crt, @size, @gid, @uid, + @meta); + my (@dir, @entry, @del, @realloc, @meta_int); + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Directory listing of $fname ($meta)"); + + local *OUT; + + # execute command + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' -f $ftype -la $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + + # Make the big table, small table, and start the current directory + + my $iurl = +"$::PROGNAME?$Args::baseargs&dirmode=$Args::enc_args{'dirmode'}&sort=$sort"; + + # base number of columns in table + my $cols = 15; + $cols += 2 if ($Fs::has_ctime{$ftype}); + $cols += 2 if ($Fs::has_crtime{$ftype}); + $cols += 2 if ($Fs::has_mtime{$ftype}); + + print <<EOF1; +<!-- Big Table --> +<table cellspacing=\"0\" cellpadding=\"2\" border=0> + +<!-- Small Table --> +<tr> + <td colspan=$cols> + <table border=0 align=\"left\" cellspacing=\"0\" cellpadding=\"2\" width=500> + <tr> + <td colspan=2><b>Current Directory:</b> <tt> + + <a href=\"${iurl}&mod=$::MOD_FILE&view=$File::FILE_LIST&meta=$Fs::root_meta{$ftype}&dir=\">$mnt</a> + +EOF1 + + # Each file in the path will get its own link + $iurl .= "&mod=$::MOD_FILE&view=$File::FILE_LIST_DIR"; + my $path = ""; + my @dir_split = split('/', $Args::args{'dir'}); + while (scalar @dir_split > 1) { + my $d = shift @dir_split; + + next if ($d eq ''); + + $path .= "$d/"; + print " <a href=\"${iurl}&dir=$path\">/${d}/</a> \n"; + } + print " /$dir_split[0]/ \n" + if (scalar @dir_split == 1); + + print " </tt></td>\n" . " </tr>\n"; + + # Add Note Button + $iurl = +"&$Args::baseargs&dir=$Args::enc_args{'dir'}&meta=$Args::enc_args{'meta'}"; + if ($::USE_NOTES == 1) { + + print <<EOF2; + <tr> + <td width=\"100\" align=left> + <a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::ENTER_FILE$iurl\" target=\"_blank\"> + <img border=\"0\" src=\"pict/but_addnote.jpg\" width=\"89\" height=20 alt=\"Add Note About Directory\"> + </a> + </td> +EOF2 + + } + + # Generate MD5 List Button + print <<EOF3; + + <td width=\"206\" align=left> + <a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::MD5LIST$iurl\" target=\"_blank\"> + <img border=\"0\" src=\"pict/file_b_md5list.jpg\" width=\"206\" alt=\"Generate list of MD5 values\"> + </a> + </td> + </tr> + <!-- END of Little Table --> + </table> + </td> +</tr> +<tr> + <td colspan=$cols><hr></td> +</tr> + +EOF3 + + # Make the Table and Headers + my $url = + "$::PROGNAME?mod=$::MOD_FILE&view=$File::FRAME&" + . "$Args::baseargs&meta=$Args::enc_args{'meta'}" + . "&dir=$Args::enc_args{'dir'}&dirmode=$Args::enc_args{'dirmode'}"; + + print "<tr valign=\"MIDDLE\" " . "background=\"$::YEL_PIX\">\n"; + + # Print the Headers - If the sorting mode is set to it, then don't + # make it a link and print a different button + if ($sort == $SORT_DEL) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_del_cur.jpg\" " + . "width=\"49\" height=20 " + . "alt=\"Deleted Files\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_DEL"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_del_link.jpg\" " + . "width=\"28\" height=20 " + . "alt=\"Deleted Files\">" + . "</a></td>\n"; + } + + # type only gets one column for two 'types' + print " <td background=\"$::YEL_PIX\">$sp</td>\n" + . " <th align=\"center\" background=\"$::YEL_PIX\">" + . " Type <br>"; + + if ($sort == $SORT_DTYPE) { + print "dir"; + } + else { + $iurl = $url . "&sort=$SORT_DTYPE"; + print "<a href=\"$iurl\" target=\"_parent\">dir</a>"; + } + + print " / "; + + if ($sort == $SORT_ITYPE) { + print "in</th>\n"; + } + else { + $iurl = $url . "&sort=$SORT_ITYPE"; + print "<a href=\"$iurl\" target=\"_parent\">in</a></th>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + if ($sort == $SORT_NAME) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_nam_cur.jpg\" " + . "width=\"76\" height=20 " + . "alt=\"File Name\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_NAME"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_nam_link.jpg\" " + . "width=\"50\" height=20 " + . "alt=\"File Name\">" + . "</a></td>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + # Modified / Written + if ($Fs::has_mtime{$ftype}) { + if ($sort == $SORT_MOD) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_wr_cur.jpg\" " + . "width=\"89\" height=20 " + . "alt=\"Modified/Written Time\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_MOD"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_wr_link.jpg\" " + . "width=\"60\" height=20 " + . "alt=\"Modified/Written Time\">" + . "</a></td>\n"; + } + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + } + + # Accessed + if ($sort == $SORT_ACC) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_acc_cur.jpg\" " + . "width=\"90\" height=20 " + . "alt=\"Access Time\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_ACC"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_acc_link.jpg\" " + . "width=\"66\" height=20 " + . "alt=\"Access Time\">" + . "</a></td>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + # Change + if ($Fs::has_ctime{$ftype}) { + if ($sort == $SORT_CHG) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_chg_cur.jpg\" " + . "width=\"90\" height=20 " + . "alt=\"Change Time\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_CHG"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_chg_link.jpg\" " + . "width=\"62\" height=20 " + . "alt=\"Change Time\">" + . "</a></td>\n"; + } + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + } + + # Create + if ($Fs::has_crtime{$ftype}) { + if ($sort == $SORT_CRT) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_cre_cur.jpg\" " + . "width=\"84\" height=20 " + . "alt=\"Create Time\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_CRT"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_cre_link.jpg\" " + . "width=\"59\" height=20 " + . "alt=\"Create Time\">" + . "</a></td>\n"; + } + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + } + + # Size + if ($sort == $SORT_SIZE) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_siz_cur.jpg\" " + . "width=\"53\" height=20 " + . "alt=\"Size\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_SIZE"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_siz_link.jpg\" " + . "width=\"31\" height=20 " + . "alt=\"Size\">" + . "</a></td>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + # UID + if ($sort == $SORT_UID) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_uid_cur.jpg\" " + . "width=\"49\" height=20 " + . "alt=\"UID\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_UID"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_uid_link.jpg\" " + . "width=\"27\" height=20 " + . "alt=\"UID\">" + . "</a></td>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + # GID + if ($sort == $SORT_GID) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_gid_cur.jpg\" " + . "width=\"49\" height=20 " + . "alt=\"GID\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_GID"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_gid_link.jpg\" " + . "width=\"28\" height=20 " + . "alt=\"GID\">" + . "</a></td>\n"; + } + + print " <td background=\"$::YEL_PIX\">$sp</td>\n"; + + # meta + if ($sort == $SORT_META) { + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_meta_cur.jpg\" " + . "width=\"62\" height=20 " + . "alt=\"Meta\">" + . "</td>\n"; + } + else { + $iurl = $url . "&sort=$SORT_META"; + print " <td align=\"left\" background=\"$::YEL_PIX\">" + . "<a href=\"$iurl\" target=\"_parent\">" + . "<img border=\"0\" " + . "src=\"pict/file_h_meta_link.jpg\" " + . "width=\"41\" height=20 " + . "alt=\"Meta\">" + . "</a></td>\n"; + } + print "</tr>\n"; + + my $cnt = 0; + my %seen; + + # sort fls into arrays + while ($_ = Exec::read_pipe_line(*OUT)) { + if ( +/^($::REG_MTYPE)\/($::REG_MTYPE)\s*(\*?)\s*($::REG_META)(\(realloc\))?:\t(.+?)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t(\d+)\t(\d+)\t(\d+)$/o + ) + { + + my $lcldir = $Args::args{'dir'}; + $dtype[$cnt] = $1; + $itype[$cnt] = $2; + $del[$cnt] = $3; + $meta[$cnt] = $4; + $realloc[$cnt] = ""; + $realloc[$cnt] = $5 if (defined $5); + $name[$cnt] = $6; + $mod[$cnt] = $7; + $acc[$cnt] = $8; + $chg[$cnt] = $9; + $crt[$cnt] = $10; + $size[$cnt] = $11; + $gid[$cnt] = $12; + $uid[$cnt] = $13; + + if ($meta[$cnt] =~ /^(\d+)(-\d+(-\d+)?)?$/) { + $meta_int[$cnt] = $1; + } + else { + $meta_int[$cnt] = $meta[$cnt]; + } + + # See if we have already seen this file yet + if (exists $seen{"$name[$cnt]-$meta[$cnt]"}) { + my $prev_cnt = $seen{"$name[$cnt]-$meta[$cnt]"}; + + # If we saw it while it was deleted, & it + # is now undel, then update it + if ( ($del[$cnt] eq "") + && ($del[$prev_cnt] eq '*')) + { + $del[$prev_cnt] = $del[$cnt]; + } + next; + + # Add it to the seen list + } + else { + $seen{"$name[$cnt]-$meta[$cnt]"} = $cnt; + } + + # We must adjust the dir for directories + if ($itype[$cnt] eq 'd') { + + # special cases for .. and . + if ($name[$cnt] eq '..') { + my @dirs = split('/', $lcldir); + my $i; + $lcldir = ""; + for ($i = 0; $i < $#dirs; $i++) { + $lcldir .= ($dirs[$i] . '/'); + } + } + elsif ($name[$cnt] ne '.') { + $lcldir .= ($name[$cnt] . '/'); + } + $name[$cnt] .= '/'; + } + else { + $lcldir .= $name[$cnt]; + } + + # format the date so that the time and time zone are on the + # same line + $mod[$cnt] = "$1 $2" + if ($mod[$cnt] =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + $acc[$cnt] = "$1 $2" + if ($acc[$cnt] =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + $chg[$cnt] = "$1 $2" + if ($chg[$cnt] =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + $crt[$cnt] = "$1 $2" + if ($crt[$cnt] =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + $dir[$cnt] = Args::url_encode($lcldir); + $entry[$cnt] = $cnt; + $cnt++; + + } + + # We missed it for some reason + else { + print +"<tr><td colspan=10>Error Parsing File (Invalid Characters?):<br>$_</td></tr>\n"; + } + } + close(OUT); + + if ($cnt == 0) { + print "</table>\n<center>No Contents</center>\n"; + return 0; + } + + # Sort the above array based on the sort argument + my @sorted; # an array of indices + + if ($sort == $SORT_DTYPE) { + @sorted = + sort { $dtype[$a] cmp $dtype[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_ITYPE) { + @sorted = + sort { $itype[$a] cmp $itype[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_NAME) { + @sorted = sort { lc($name[$a]) cmp lc($name[$b]) } @entry; + } + elsif ($sort == $SORT_MOD) { + @sorted = + sort { $mod[$a] cmp $mod[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_ACC) { + @sorted = + sort { $acc[$a] cmp $acc[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_CHG) { + @sorted = + sort { $chg[$a] cmp $chg[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_CRT) { + @sorted = + sort { $crt[$a] cmp $crt[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_SIZE) { + @sorted = + sort { $size[$a] <=> $size[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_UID) { + @sorted = + sort { $uid[$a] <=> $uid[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_GID) { + @sorted = + sort { $gid[$a] <=> $gid[$b] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + elsif ($sort == $SORT_META) { + @sorted = sort { + $meta_int[$a] <=> $meta_int[$b] + or lc($name[$a]) cmp lc($name[$b]) + } @entry; + } + elsif ($sort == $SORT_DEL) { + @sorted = + sort { $del[$b] cmp $del[$a] or lc($name[$a]) cmp lc($name[$b]) } + @entry; + } + + # print them based on sorting + my $row = 0; + foreach my $i (@sorted) { + my $url; + my $target; + my $color; + my $lcolor; + if ($del[$i] eq '*') { + $color = + "<font color=\"" . $::DEL_COLOR[$realloc[$i] ne ""] . "\">"; + $lcolor = $color; + } + else { + $color = "<font color=\"$::NORM_COLOR\">"; + $lcolor = "<font color=\"$::LINK_COLOR\">"; + } + + # directories have different targets and view values + if ($itype[$i] eq 'd') { + $target = "list"; + $url = + "$::PROGNAME?mod=$::MOD_FILE&view=$File::FILE_LIST&" + . "$Args::baseargs&meta=$meta_int[$i]" + . "&sort=$sort&dir=$dir[$i]&dirmode=$Args::enc_args{'dirmode'}"; + } + else { + $target = "content"; + $url = + "$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR&" + . "$Args::baseargs&meta=$meta[$i]" + . "&sort=$sort&dir=$dir[$i]&dirmode=$Args::enc_args{'dirmode'}"; + if ($del[$i] eq '*') { + $url .= "&recmode=$File::REC_YES"; + } + else { + $url .= "&recmode=$File::REC_NO"; + } + } + + if (($row % 2) == 0) { + print +"<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR\">\n <td align=\"center\">"; + } + else { + print +"<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR_TABLE\">\n <td align=\"center\">"; + } + + print "<img src=\"pict/file_b_check.jpg\" border=\"0\">\n" + if ($del[$i] eq '*'); + + print "</td>\n" + . " <td>$sp</td>\n" + . " <td align=\"center\">${color}$dtype[$i] / $itype[$i]</td>\n" + . " <td>$sp</td>\n"; + + # for valid files and directories make a link + # Special rule for $OrphanFiles directory and HFS directories, which have a size of 0 + if ( + ($meta_int[$i] >= $Fs::first_meta{$ftype}) + && (($size[$i] > 0) || (($name[$i] =~ /^\$Orphan/) && ($itype[$i] eq 'd')) || (($ftype =~ /hfs/) && ($itype[$i] eq 'd'))) + && ( ($itype[$i] eq 'r') + || ($itype[$i] eq 'd') + || ($itype[$i] eq 'v')) + ) + { + print " <td><a href=\"$url\" target=\"$target\">$lcolor"; + } + else { + print " <td>$color"; + } + print "<tt>" + . Print::html_encode($name[$i]) + . "</tt></td>\n" + . " <td>$sp</td>\n"; + print " <td>${color}$mod[$i]</td>\n" . " <td>$sp</td>\n" + if ($Fs::has_mtime{$ftype}); + print " <td>${color}$acc[$i]</td>\n" . " <td>$sp</td>\n"; + print " <td>${color}$chg[$i]</td>\n" . " <td>$sp</td>\n" + if ($Fs::has_ctime{$ftype}); + print " <td>${color}$crt[$i]</td>\n" . " <td>$sp</td>\n" + if ($Fs::has_crtime{$ftype}); + print " <td>${color}$size[$i]</td>\n" + . " <td>$sp</td>\n" + . " <td>${color}$uid[$i]</td>\n" + . " <td>$sp</td>\n" + . " <td>${color}$gid[$i]</td>\n" + . " <td>$sp</td>\n"; + + # for a valid meta, make a link to meta browsing mode + if ($meta_int[$i] >= $Fs::first_meta{$ftype}) { + my $iurl = +"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs&meta=$meta[$i]"; + print "<td><a href=\"$iurl\" target=\"_top\">$lcolor"; + } + else { + print "<td>$color"; + } + print "$meta[$i]</a> $realloc[$i]</td>\n</tr>\n"; + + $row++; + } + + print "</table>\n"; + Print::print_html_footer(); + return 0; + +}; #end of FIL_LIST + +# This takes a directory name as an argument and converts it to +# the meta value and calls FIL_LIST +# +# The meta value can be anything when this is run, it will be +# overwritten +sub file_list_dir { + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $dir = Args::get_dir(); + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + Print::log_host_inv( + "$Args::args{'vol'}: Finding meta data address for $dir"); + + # Use 'ifind -n' to get the meta data address for the given name + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ifind' -f $ftype -n '$dir' -o $offset -i $imgtype $img"); + my $meta; + + while ($_ = Exec::read_pipe_line(*OUT)) { + $meta = $1 + if (/^($::REG_META)$/); + } + close(OUT); + + Print::print_check_err("Error finding meta data address for $dir") + unless (defined $meta); + + Print::print_check_err("Error finding meta data address for $dir: $meta") + unless ($meta =~ /^$::REG_META$/); + + # Verify it is a directory with istat + Exec::exec_pipe(*OUT, + "'$::TSKDIR/istat' -f $ftype -o $offset -i $imgtype $img $meta"); + + while ($_ = Exec::read_pipe_line(*OUT)) { + + # This is a directory + if ( (/mode:\s+d/) + || (/File Attributes: Directory/) + || (/^Flags:.*?Directory/)) + { + close(OUT); + + # Set the meta variables + $Args::enc_args{'meta'} = $Args::args{'meta'} = $meta; + + $Args::args{'dir'} .= "/" + unless ($Args::args{'dir'} =~ /.*?\/$/); + $Args::enc_args{'dir'} .= "/" + unless ($Args::enc_args{'dir'} =~ /.*?\/$/); + + # List the directory contents + file_list(); + + return 0; + } + } + close(OUT); + + # This is not a directory, so just give a link + Print::print_html_header(""); + + my $meta_int = $meta; + $meta_int = $1 if ($meta_int =~ /(\d+)-\d+(-\d+)?/); + + my $recmode = $File::REC_NO; + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ils' -f $ftype -e -o $offset -i $imgtype $img $meta_int"); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + next unless ($_ =~ /^$meta/); + if ($_ =~ /^$meta\|f/) { + $recmode = $File::REC_YES; + } + elsif ($_ =~ /^$meta\|a/) { + $recmode = $File::REC_NO; + } + else { + Print::print_err("Error parsing ils output: $_"); + } + } + close(OUT); + + print <<EOF; + +<tt>$dir</tt> ( +<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs&meta=$meta&recmode=$recmode\" target=\"_top\"> +meta $meta</a>) is not a directory. + +<p> +<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR&$Args::baseargs&meta=$meta&dir=$dir&recmode=$recmode\" target=\"content\"> + <img src=\"pict/but_viewcont.jpg\" height=20 width=123 alt=\"view contents\" border=\"0\"> +</a> + +EOF + + Print::print_html_footer(); + return 1; + +} + +# List the files that meet a certain pattern +sub file_list_file { + Args::check_sort(); + Args::check_dirmode(); + Args::check_dir(); + + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $ftype = $Caseman::vol2ftype{$vol}; + my $meta = $Fs::root_meta{$ftype}; + my $sort = Args::get_sort(); + my $dirmode = Args::get_dirmode(); + my $dir = Args::get_dir(); + + Print::print_html_header( + "Filtered files on $Caseman::vol2sname{$vol} $mnt"); + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + my $sp = " "; + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Listing all files with $dir"); + + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' -f $ftype -lpr $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + + print "<b>All files with \'<tt>$dir</tt>\' in the name</b><p>\n" + . "<a href=\"$::PROGNAME?$Args::baseargs&dirmode=$Args::enc_args{'dirmode'}" + . "&sort=$sort&mod=$::MOD_FILE&view=$File::FILE_LIST" + . "&meta=$Fs::root_meta{$ftype}&dir=\">" + . "<img border=\"0\" src=\"pict/file_b_allfiles.jpg\" width=\"112\" " + . "alt=\"Show All Files\"></a>\n" . "<hr>" + . "<table cellspacing=\"0\" cellpadding=\"2\" border=0>\n" + . "<tr valign=\"MIDDLE\" align=\"left\" " + . "background=\"$::YEL_PIX\">\n"; + + # deleted + print "<td align=\"left\">" + . "<img border=\"0\" src=\"pict/file_h_del_link.jpg\" " + . "width=\"28\" height=20 alt=\"Deleted Files\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Type + print "<th align=\"center\"> Type  <br>" + . "dir / in</th>" + . "<td>$sp</td>\n"; + + # Name + print " <td><img border=\"0\" " + . "src=\"pict/file_h_nam_link.jpg\" " + . "width=\"50\" height=20 " + . "alt=\"File Name\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Mod / Written + if ($Fs::has_mtime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_wr_link.jpg\" " + . "width=\"60\" " + . "alt=\"Written Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Access + print " <td><img border=\"0\" " + . "src=\"pict/file_h_acc_link.jpg\" " + . "width=\"66\" height=20 " + . "alt=\"Access Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Change + if ($Fs::has_ctime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_chg_link.jpg\" " + . "width=\"62\" " + . "alt=\"Change Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Create + if ($Fs::has_crtime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_cre_link.jpg\" " + . "width=\"59\" " + . "alt=\"Create Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Size + print " <td><img border=\"0\" " + . "src=\"pict/file_h_siz_link.jpg\" " + . "width=\"31\" height=20 " + . "alt=\"Size\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # UID + print " <td><img border=\"0\" " + . "src=\"pict/file_h_uid_link.jpg\" " + . "width=\"27\" height=20 " + . "alt=\"UID\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # GID + print " <td><img border=\"0\" " + . "src=\"pict/file_h_gid_link.jpg\" " + . "width=\"28\" height=20 " + . "alt=\"GID\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Meta + print " <td><img border=\"0\" " + . "src=\"pict/file_h_meta_link.jpg\" " + . "width=\"41\" height=20 " + . "alt=\"Meta\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + my $row = 0; + while ($_ = Exec::read_pipe_line(*OUT)) { + if ( +/^($::REG_MTYPE)\/($::REG_MTYPE)\s*(\*?)\s*($::REG_META)(\(realloc\))?:\t(.+?)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t(\d+)\t(\d+)\t(\d+)$/o + ) + { + + # We have to remove the / from the beginning of the file name so + # save all values so they aren't lost + my $dt = $1; + my $it = $2; + my $d = $3; + my $i = $4; + my $r = 0; + $r = 1 if (defined $5); + my $n = $6; + my $m = $7; + my $a = $8; + my $c = $9; + my $cr = $10; + my $s = $11; + my $g = $12; + my $u = $13; + + if ($n =~ /^\/(.*)/) { + $n = $1; + } + + my $p = ""; + my $f = $n; + + if ($n =~ /^(.+?)\/([^\/]+)$/) { + $p = $1; + $f = $2; + } + + next unless ($f =~ /$dir/i); + + my $enc_n = Args::url_encode($n); + my $iurl = +"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs&meta=$i"; + my $i_int = $i; + $i_int = $1 if ($i =~ /(\d+)-\d+-\d+/); + + if (($row % 2) == 0) { + print "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR\">\n"; + } + else { + print "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR_TABLE\">\n"; + } + + print "<td align=\"left\">\n"; + + my $color; + my $lcolor; + if ($d eq '*') { + $color = "<font color=\"" . $::DEL_COLOR[$r] . "\">"; + $lcolor = $color; + + print "<img src=\"pict/file_b_check.jpg\" border=\"0\">\n"; + + } + else { + $color = "<font color=\"$::NORM_COLOR\">"; + $lcolor = "<font color=\"$::LINK_COLOR\">"; + print " "; + } + + print "</td><td>$sp</td>"; + + print "<td align=\"center\">$color" + . "$dt / $it</td>" + . "<td>$sp</td>\n"; + + if ($it eq 'd') { + my $url = + "$::PROGNAME?mod=$::MOD_FILE&" + . "view=$File::FILE_LIST&$Args::baseargs&meta=$i" + . "&sort=$sort&dir=$enc_n&dirmode=$dirmode"; + + print "<td>"; + if ($i_int >= $Fs::first_meta{$ftype}) { + print "<a href=\"$url\" target=\"_self\">$lcolor"; + } + else { + print "$color"; + } + print "<tt>" + . Print::html_encode($mnt . $n) + . "</tt></td>" + . "<td>$sp</td>\n"; + } + else { + my $url = + "$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR&" + . "$Args::baseargs&meta=$i&sort=$sort&dir=$enc_n"; + + if ($d eq '*') { + $url .= "&recmode=$File::REC_YES"; + } + else { + $url .= "&recmode=$File::REC_NO"; + } + + print "<td>"; + if (($i_int >= $Fs::first_meta{$ftype}) && ($it eq 'r')) { + print "<a href=\"$url\" target=\"content\">$lcolor"; + } + else { + print "$color"; + } + print "<tt>$mnt$n</tt></td>" . "<td>$sp</td>\n"; + } + + $m = "$1 $2" + if ($m =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $a = "$1 $2" + if ($a =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $c = "$1 $2" + if ($c =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $cr = "$1 $2" + if ($cr =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + print "<td>$color$m</td>" . "<td>$sp</td>\n" + if ($Fs::has_mtime{$ftype}); + + print "<td>$color$a</td>" . "<td>$sp</td>\n"; + print "<td>$color$c</td>" . "<td>$sp</td>\n" + if ($Fs::has_ctime{$ftype}); + print "<td>$color$cr</td>" . "<td>$sp</td>\n" + if ($Fs::has_crtime{$ftype}); + + print "<td>$color$s</td>" + . "<td>$sp</td>\n" + . "<td>$color$g</td>" + . "<td>$sp</td>\n" + . "<td>$color$u</td>" + . "<td>$sp</td>\n"; + + print "<td>"; + if ($i_int >= $Fs::first_meta{$ftype}) { + print "<a href=\"$iurl\" target=\"_top\">"; + print "$lcolor$i</a>"; + } + else { + print "$color$i"; + } + print " (realloc)" if $r; + print "</td></tr>\n"; + } + else { + print "Error Parsing File (invalid characters?)<br>: $_\n<br>"; + } + + $row++; + } + close(OUT); + print "</table>\n"; + + print "<center>No files found with that pattern</center>\n" + if ($row == 0); + + Print::print_html_footer(); + return 0; +} + +# display deleted files only +# +# Sorting should be added to this +sub file_list_del { + Args::check_sort(); + Args::check_dirmode(); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $mnt = $Caseman::vol2mnt{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $meta = $Fs::root_meta{$ftype}; + my $sort = Args::get_sort(); + my $dirmode = Args::get_dirmode(); + + Print::print_html_header("Deleted files on $Caseman::vol2sname{$vol} $mnt"); + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + my $sp = " "; + + Print::log_host_inv("$Caseman::vol2sname{$vol}: Listing all deleted files"); + + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' -f $ftype -ldr $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + + print "<b>All Deleted Files</b><p><hr>" + . "<table cellspacing=\"0\" cellpadding=\"2\" border=0>\n" + . "<tr valign=\"MIDDLE\" align=\"left\" " + . "background=\"$::YEL_PIX\">\n"; + + # Type + print "<th align=\"center\"> Type  <br>" + . "dir / in</th>" + . "<td>$sp</td>\n"; + + # Name + print " <td><img border=\"0\" " + . "src=\"pict/file_h_nam_link.jpg\" " + . "width=\"50\" height=20 " + . "alt=\"File Name\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Mod / Written + if ($Fs::has_mtime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_wr_link.jpg\" " + . "width=\"60\" " + . "alt=\"Written Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Access + print " <td><img border=\"0\" " + . "src=\"pict/file_h_acc_link.jpg\" " + . "width=\"66\" height=20 " + . "alt=\"Access Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Change + if ($Fs::has_ctime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_chg_link.jpg\" " + . "width=\"62\" " + . "alt=\"Change Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Create + if ($Fs::has_crtime{$ftype}) { + print " <td><img border=\"0\" " + . "src=\"pict/file_h_cre_link.jpg\" " + . "width=\"59\" " + . "alt=\"Create Time\">" + . "</td>\n" + . "<td>$sp</td>\n"; + } + + # Size + print " <td><img border=\"0\" " + . "src=\"pict/file_h_siz_link.jpg\" " + . "width=\"31\" height=20 " + . "alt=\"Size\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # UID + print " <td><img border=\"0\" " + . "src=\"pict/file_h_uid_link.jpg\" " + . "width=\"27\" height=20 " + . "alt=\"UID\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # GID + print " <td><img border=\"0\" " + . "src=\"pict/file_h_gid_link.jpg\" " + . "width=\"28\" height=20 " + . "alt=\"GID\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + # Meta + print " <td><img border=\"0\" " + . "src=\"pict/file_h_meta_link.jpg\" " + . "width=\"41\" height=20 " + . "alt=\"Meta\">" + . "</td>\n" + . "<td>$sp</td>\n"; + + my $row = 0; + while ($_ = Exec::read_pipe_line(*OUT)) { + + if ( +/^($::REG_MTYPE)\/($::REG_MTYPE)\s*(\*?)\s*($::REG_META)(\(realloc\))?:\t(.+?)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t($::REG_DATE)\t(\d+)\t(\d+)\t(\d+)$/o + ) + { + + # We have to remove the / from the beginning of the file name so + # save all values so they aren't lost + my $dt = $1; + my $it = $2; + my $d = $3; + my $i = $4; + my $r = 0; + $r = 1 if (defined $5); + my $n = $6; + my $m = $7; + my $a = $8; + my $c = $9; + my $cr = $10; + my $s = $11; + my $g = $12; + my $u = $13; + + if ($n =~ /^\/(.*)/) { + $n = $1; + } + my $enc_n = Args::url_encode($n); + my $iurl = +"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs&meta=$i"; + my $i_int = $i; + $i_int = $1 if ($i =~ /(\d+)-\d+-\d+/); + + if (($row % 2) == 0) { + print "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR\">\n"; + } + else { + print "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR_TABLE\">\n"; + } + + print "<td align=\"center\"><font color=\"$::DEL_COLOR[$r]\">" + . "$dt / $it</td>" + . "<td>$sp</td>\n"; + + if ($it eq 'd') { + my $url = + "$::PROGNAME?mod=$::MOD_FILE&" + . "view=$File::FILE_LIST&$Args::baseargs&meta=$i" + . "&sort=$sort&dir=$enc_n&dirmode=$dirmode"; + + print "<td>"; + if ($i_int >= $Fs::first_meta{$ftype}) { + print "<a href=\"$url\" target=\"_self\">"; + } + print "<font color=\"$::DEL_COLOR[$r]\"><tt>" + . Print::html_encode($mnt . $n) + . "</tt></td>" + . "<td>$sp</td>\n"; + } + else { + my $url = + "$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR&" + . "$Args::baseargs&meta=$i&sort=$sort&dir=$enc_n" + . "&recmode=$File::REC_YES"; + + print "<td>"; + if (($i_int >= $Fs::first_meta{$ftype}) && ($it eq 'r')) { + print "<a href=\"$url\" target=\"content\">"; + } + print "<font color=\"$::DEL_COLOR[$r]\"><tt>" + . Print::html_encode($mnt . $n) + . "</tt></td>" + . "<td>$sp</td>\n"; + } + + $m = "$1 $2" + if ($m =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $a = "$1 $2" + if ($a =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $c = "$1 $2" + if ($c =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + $cr = "$1 $2" + if ($cr =~ /($::REG_DAY\s+$::REG_TIME)\s+($::REG_ZONE2)/o); + + print "<td><font color=\"$::DEL_COLOR[$r]\">$m</td>" + . "<td>$sp</td>\n" + if ($Fs::has_mtime{$ftype}); + + print "<td><font color=\"$::DEL_COLOR[$r]\">$a</td>" + . "<td>$sp</td>\n"; + print "<td><font color=\"$::DEL_COLOR[$r]\">$c</td>" + . "<td>$sp</td>\n" + if ($Fs::has_ctime{$ftype}); + print "<td><font color=\"$::DEL_COLOR[$r]\">$cr</td>" + . "<td>$sp</td>\n" + if ($Fs::has_crtime{$ftype}); + + print "<td><font color=\"$::DEL_COLOR[$r]\">$s</td>" + . "<td>$sp</td>\n" + . "<td><font color=\"$::DEL_COLOR[$r]\">$g</td>" + . "<td>$sp</td>\n" + . "<td><font color=\"$::DEL_COLOR[$r]\">$u</td>" + . "<td>$sp</td>\n"; + + print "<td>"; + if ($i_int >= $Fs::first_meta{$ftype}) { + print "<a href=\"$iurl\" target=\"_top\">"; + } + print "<font color=\"$::DEL_COLOR[$r]\">$i</a>"; + print " (realloc)" if $r; + print "</td></tr>\n"; + } + else { + print "Error Parsing File (invalid characters?)<br>: $_\n<br>"; + } + + $row++; + } + close(OUT); + print "</table>\n"; + + print "<center>None</center>\n" + if ($row == 0); + + Print::print_html_footer(); + return 0; +} + +# Content Frame +# This creates two frames for the lower rhs frame +# +sub content_fr { + Print::print_html_header_frameset(""); + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + print "<frameset rows=\"65,*\">\n"; + + my $recmode = $File::REC_NO; + + if (exists $Args::enc_args{'recmode'}) { + $recmode = $Args::enc_args{'recmode'}; + } + else { + + # We need to get the allocation status of this structure + my $meta_int = $meta; + $meta_int = $1 if ($meta_int =~ /(\d+)-\d+(-\d+)?/); + + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ils' -f $ftype -e -o $offset -i $imgtype $img $meta_int" + ); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + next unless ($_ =~ /^$meta/); + if ($_ =~ /^$meta\|f/) { + $recmode = $File::REC_YES; + } + elsif ($_ =~ /^$meta\|a/) { + $recmode = $File::REC_NO; + } + else { + Print::print_check_err("Error parsing ils output: $_"); + } + } + } + close(OUT); + + # Get the file type so we can show the thumb nails automatically + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + + my $apptype = Exec::read_pipe_line(*OUT); + close(OUT); + + $apptype = "Error getting file type" + if ((!defined $apptype) || ($apptype eq "")); + + # The menu for the different viewing options + print "<frame src=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_MENU&" + . "$Args::baseargs&dir=$Args::enc_args{'dir'}" + . "&meta=$Args::enc_args{'meta'}&sort=$FIL_SORT_ASC&recmode=$recmode\">\n"; + + # Print the image thumbnail + if (($apptype =~ /image data/) || ($apptype =~ /PC bitmap data/)) { + print "<frame src=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_IMG" + . "&$Args::baseargs&dir=$Args::enc_args{'dir'}" + . "&meta=$Args::enc_args{'meta'}" + . "&sort=$FIL_SORT_ASC&recmode=$recmode\" name=\"cont2\">\n</frameset>"; + } + else { + + # Where the actual content will be displayed + print "<frame src=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT" + . "&$Args::baseargs&dir=$Args::enc_args{'dir'}" + . "&meta=$Args::enc_args{'meta'}" + . "&sort=$FIL_SORT_ASC&recmode=$recmode\" name=\"cont2\">\n</frameset>"; + } + + Print::print_html_footer_frameset(); + return 0; +} + +# This is the index for the lower rhs frame +# Choose the content display type here +sub content_menu { + Args::check_sort(); + Args::check_recmode(); + + Print::print_html_header(""); + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $recmode = Args::get_recmode(); + + # Get the file type + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + + my $apptype = Exec::read_pipe_line(*OUT); + close(OUT); + + $apptype = "Error getting file type" + if ((!defined $apptype) || ($apptype eq "")); + + # We already have the path in the content window below, so save space + # print "<center><tt>$mnt$Args::args{'dir'}</tt>\n"; + print "<center>\n"; + + my $url = + "&$Args::baseargs&dir=$Args::enc_args{'dir'}" + . "&meta=$Args::enc_args{'meta'}&recmode=$recmode"; + + # Print the options for output display + print "<table cellspacing=\"0\" cellpadding=\"2\">\n<tr>\n" + . "<td>ASCII (<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT&" + . "sort=$FIL_SORT_ASC$url\" target=\"cont2\">display</a> - " + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::REPORT&" + . "sort=$FIL_SORT_ASC$url\" target=\"_blank\">report</a>)</td>\n" + . "<td>*</td>\n" + . "<td>Hex (" + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT&" + . "sort=$FIL_SORT_HEX$url\" target=\"cont2\">display</a> - " + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::REPORT&" + . "sort=$FIL_SORT_HEX$url\" target=\"_blank\">report</a>)</td>\n" + . "<td>*</td>\n" + . "<td>ASCII Strings (" + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT&" + . "sort=$FIL_SORT_STR$url\" target=\"cont2\">display</a> - " + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::REPORT&" + . "sort=$FIL_SORT_STR$url\" target=\"_blank\">report</a>)</td>\n" + . "<td>*</td>\n" + . "<td><a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::EXPORT&$url\">" + . "Export</a></td>\n"; + + # if the file is either image or HTML, then let them view it + if ( ($apptype =~ /image data/) + || ($apptype =~ /PC bitmap data/)) + { + print "<td>*</td>\n<td><a href=\"$::PROGNAME?" + . "mod=$::MOD_FILE&view=$File::CONT_IMG$url\"" + . "target=\"cont2\">View</a></td>\n"; + } + elsif ($apptype =~ /HTML document text/) { + print "<td>*</td>\n<td><a href=\"$::PROGNAME?" + . "mod=$::MOD_APPVIEW&view=$Appview::CELL_FRAME$url\"" + . "target=\"_blank\">View</a></td>\n"; + } + + print "<td>*</td>\n" + . "<td><a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::ENTER_FILE$url\" target=\"_blank\">" + . "Add Note</a></td>\n" + if ($::USE_NOTES == 1); + + print "</tr></table>\n"; + + print "File Type: $apptype\n"; + print + "<br><font color=\"$::DEL_COLOR[0]\">Deleted File Recovery Mode</font>\n" + if ($recmode == $File::REC_YES); + print "</center>\n"; + + Print::print_html_footer(); + return 0; +} + +# +# Display the actual content here +# +# NOTE: This has a media type of raw text +# +sub content { + Args::check_sort(); + Args::check_recmode(); + + Print::print_text_header(); + + my $sort = Args::get_sort(); + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $recflag = ""; + $recflag = " -r " if (Args::get_recmode() == $File::REC_YES); + + my $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + + local *OUT; + if ($sort == $FIL_SORT_ASC) { + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Viewing $fname ($meta) as ASCII"); + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + + print "Contents Of File: $fname\n\n\n"; + Print::print_output($_) while ($_ = Exec::read_pipe_data(*OUT, 1024)); + close(OUT); + } + elsif ($sort == $FIL_SORT_HEX) { + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Viewing $fname ($meta) as Hex"); + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + + print "Hex Contents Of File: $fname\n\n\n"; + my $offset = 0; + while ($_ = Exec::read_pipe_data(*OUT, 1024)) { + Print::print_hexdump($_, $offset * 1024); + $offset++; + } + close(OUT); + } + elsif ($sort == $FIL_SORT_STR) { + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Viewing $fname ($meta) as strings"); + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::TSKDIR/srch_strings' -a" + ); + + print "ASCII String Contents Of File: $fname\n\n\n\n"; + Print::print_output($_) while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + } + + Print::print_text_footer(); + + return 0; +} + +sub content_img { + + Print::print_html_header("image content"); + + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + my $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + + my $url = + "&$Args::baseargs&meta=$Args::enc_args{'meta'}" + . "&dir=$Args::enc_args{'dir'}&" + . "cell_mode=2&recmode=$Args::enc_args{'recmode'}"; + + print "<tt>$fname</tt><br><br>\n" + . "<table><tr>\n" + . "<td width=250 align=\"center\">" + . "<b>Thumbnail:</b><br>" + . "<img src=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_CONT${url}\" width=\"200\"></td>\n" + . "<td valign=top>" + . "<a href=\"$::PROGNAME?mod=$::MOD_APPVIEW&view=$Appview::CELL_CONT${url}\" " + . "target=_blank>View Full Size Image</a><br>\n</td>\n" + . "</tr></table>\n"; + + Print::print_html_footer(); + + return 0; +} + +# Export the contents of a file +sub export { + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + + my $recflag = ""; + + $recflag = " -r " + if ( (exists $Args::enc_args{'recmode'}) + && ($Args::enc_args{'recmode'} == $File::REC_YES)); + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Saving contents of $fname ($meta)"); + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + + # We can't trust the mnt and dir values (since there + # could be bad ASCII values, so only allow basic chars into name + $fname =~ tr/a-zA-Z0-9\_\-\@\,/\./c; + $fname = $1 if ($fname =~ /^\.(.*)$/); + + Print::print_oct_header("$vol-${fname}"); + + print "$_" while ($_ = Exec::read_pipe_data(*OUT, 1024)); + + Print::print_oct_footer(); + + return 0; +} + +# Display a report for a file +# This is intended to have its own window +# +sub report { + Args::check_sort(); + + my $sort = Args::get_sort(); + my $vol = Args::get_vol('vol'); + my $meta = Args::get_meta('meta'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $type; + my $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + my $recflag = ""; + + $recflag = " -r " + if ( (exists $Args::enc_args{'recmode'}) + && ($Args::enc_args{'recmode'} == $File::REC_YES)); + + # We can't trust the mnt and dir values (since there + # could be bad ASCII values, so only allow basic chars into name + $fname =~ tr/a-zA-Z0-9\_\-\@\,/\./c; + $fname = $1 if ($fname =~ /^\.+(.*)$/); + $fname = $1 if ($fname =~ /^(.*?)\.+$/); + + Print::print_text_header("filename=$Args::args{'vol'}-${fname}.txt"); + + $fname = "$mnt$Args::args{'dir'}"; + if ($sort == $FIL_SORT_ASC) { + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Generating ASCII report for $fname ($meta)" + ); + $type = "ASCII"; + } + elsif ($sort == $FIL_SORT_HEX) { + Print::log_host_inv( + "$Args::args{'vol'}: Generating Hex report for $fname ($meta)"); + $type = "Hex"; + } + elsif ($sort == $FIL_SORT_STR) { + Print::log_host_inv( +"$Args::args{'vol'}: Generating ASCII strings report for $fname ($meta)" + ); + $type = "string"; + } + else { + print "\n\ninvalid sort value"; + return 1; + } + + # NOTE: There is a space in the beginning of the separator lines in + # order to make clear@stamper.itconsult.co.uk time stamping happy + # I think it confuses the lines that begin at the lhs with PGP + # headers and will remove the second line. + # + print " Autopsy $type Report\n\n" + . "-" x 70 . "\n" + . " GENERAL INFORMATION\n\n" + . "File: $fname\n"; + + # Calculate the MD5 value + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::MD5_EXE'" + ); + my $md5 = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5 = "Error getting MD5 Value" + if ((!defined $md5) || ($md5 eq "")); + + chomp $md5; + if ($recflag eq "") { + print "MD5 of file: $md5\n"; + } + else { + print "MD5 of recovered file: $md5\n"; + } + + if ($::SHA1_EXE ne "") { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::SHA1_EXE'" + ); + my $sha1 = Exec::read_pipe_line(*OUT); + close(OUT); + + $sha1 = "Error getting SHA-1 Value" + if ((!defined $sha1) || ($sha1 eq "")); + + chomp $sha1; + if ($recflag eq "") { + print "SHA-1 of file: $sha1\n"; + } + else { + print "SHA-1 of recovered file: $sha1\n"; + } + } + + if ($sort == $FIL_SORT_STR) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::TSKDIR/srch_strings' -a | '$::MD5_EXE'" + ); + $md5 = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5 = "Error getting MD5 Value" + if ((!defined $md5) || ($md5 eq "")); + + chomp $md5; + print "MD5 of ASCII strings: $md5\n"; + + if ($::SHA1_EXE ne "") { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::TSKDIR/srch_strings' -a | '$::SHA1_EXE'" + ); + $sha1 = Exec::read_pipe_line(*OUT); + close(OUT); + + $sha1 = "Error getting SHA-1 Value" + if ((!defined $sha1) || ($sha1 eq "")); + + chomp $sha1; + print "SHA-1 of ASCII strings: $sha1\n"; + } + } + + print "\nImage: $Caseman::vol2path{$vol}\n"; + if (($Caseman::vol2start{$vol} == 0) && ($Caseman::vol2end{$vol} == 0)) { + print "Offset: Full image\n"; + } + elsif ($Caseman::vol2end{$vol} == 0) { + print "Offset: $Caseman::vol2start{$vol} to end\n"; + } + else { + print "Offset: $Caseman::vol2start{$vol} to $Caseman::vol2end{$vol}\n"; + } + print "File System Type: $ftype\n"; + + my $date = localtime(); + print "\nDate Generated: $date\n" + . "Investigator: $Args::args{'inv'}\n\n" + . "-" x 70 . "\n" + . " META DATA INFORMATION\n\n"; + + # Get the meta details + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + print $_ while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + + # File Type + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + my $apptype = Exec::read_pipe_line(*OUT); + close(OUT); + + $apptype = "Error getting file type" + if ((!defined $apptype) || ($apptype eq "")); + + print "\nFile Type: $apptype"; + + print "\n" . "-" x 70 . "\n"; + if ($sort == $FIL_SORT_ASC) { + print " CONTENT (Non-ASCII data may not be shown)\n\n"; + } + else { + print " CONTENT\n\n"; + } + + if ($sort == $FIL_SORT_ASC) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + Print::print_output($_) while ($_ = Exec::read_pipe_data(*OUT, 1024)); + close(OUT); + } + elsif ($sort == $FIL_SORT_HEX) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta" + ); + my $offset = 0; + while ($_ = Exec::read_pipe_data(*OUT, 1024)) { + Print::print_hexdump($_, $offset * 1024); + $offset++; + } + close(OUT); + } + elsif ($sort == $FIL_SORT_STR) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype $recflag -o $offset -i $imgtype $img $meta | '$::TSKDIR/srch_strings' -a" + ); + Print::print_output($_) while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + } + + print "\n" + . "-" x 70 . "\n" + . " VERSION INFORMATION\n\n" + . "Autopsy Version: $::VER\n"; + print "The Sleuth Kit Version: " . ::get_tskver() . "\n"; + + Print::print_text_footer(); + return 0; +} + +# Generate the MD5 value for every file in a given directory and save +# them to a text file +sub md5list { + my $vol = Args::get_vol('vol'); + my $meta = Args::get_meta('meta'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $fname = "$mnt$Args::args{'dir'}"; + $fname = 'root' if ($fname eq '/'); + $fname =~ s/\/\//\//g; + + # We can't trust the mnt and dir values (since there + # could be bad ASCII values, so only allow basic chars into name + $fname =~ tr/a-zA-Z0-9\_\-\@\,/\./c; + + # remove .'s at beginning and end + $fname = $1 if ($fname =~ /^\.+(.*)$/); + $fname = $1 if ($fname =~ /^(.*?)\.+$/); + + Print::print_text_header("filename=$fname.md5"); + + $fname = "$mnt$Args::args{'dir'}"; + $fname =~ s/\/\//\//g; + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/fls' -f $ftype -Fu -o $offset -i $imgtype $img $meta"); + + print "MD5 Values for files in $fname ($Caseman::vol2sname{$vol})\n\n"; + + while ($_ = Exec::read_pipe_line(*OUT)) { + + # area for allocated files + if ( (/r\/[\w\-]\s+([\d\-]+):\s+(.*)$/) + || (/-\/r\s+([\d\-]+):\s+(.*)$/)) + { + my $in = $1; + my $name = $2; + + local *OUT_MD5; + Exec::exec_pipe(*OUT_MD5, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $in | '$::MD5_EXE'" + ); + my $md5out = Exec::read_pipe_line(*OUT_MD5); + + $md5out = "Error calculating MD5" + if ((!defined $md5out) || ($md5out eq "")); + + chomp $md5out; + print "$md5out\t" . Print::html_encode($name) . "\n"; + close(OUT_MD5); + } + elsif (/[\w\-]\/[\w\-]\s+([\d\-]+):\s+(.*)$/) { + + # ignore, non-file types such as sockets or symlinks that do not have + # MD5 values that make sense + } + + # Hmmmm + else { + print "Error parsing file (invalid characters?): $_\n"; + } + } + close(OUT); + + Print::print_text_footer(); + + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header(""); + print "<br><center><h3>File Browsing Mode</h3><br>\n" + . "<p>In this mode, you can view file and directory contents.</p>\n" + . "<p>File contents will be shown in this window.<br>\n" + . "More file details can be found using the Metadata link at the end of the list (on the right).<br>\n" + . "You can also sort the files using the column headers</p>\n"; + Print::print_html_footer(); + return 0; +} + diff --git a/lib/Filesystem.pm b/lib/Filesystem.pm new file mode 100644 index 0000000000..935a22b11b --- /dev/null +++ b/lib/Filesystem.pm @@ -0,0 +1,170 @@ +# +# File system layer functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Updated 1/13 + +package Filesystem; + +$Filesystem::STATS = 0; + +sub main { + + # By default, show the main window + $Args::args{'view'} = $Args::enc_args{'view'} = $Filesystem::STATS + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the meta data address + if ($view == $Filesystem::STATS) { + return stats(); + } + else { + Print::print_check_err("Invalid File System View"); + } +} + +sub stats_disk { + Print::print_html_header("Disk Status"); + + my $vol = Args::get_vol('vol'); + my $img = $Caseman::vol2path{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $dtype = $Caseman::vol2dtype{$vol}; + + # Run 'mmls' on the image + Exec::exec_pipe(*OUT, + "'$::TSKDIR/mmls' -o $offset -i $imgtype -t $dtype -r $img"); + + # cycle through results and add each to table with file system type + print "<center><h3>Disk Image Details</h3></center>\n"; + print "<b>PARTITION INFORMATION</b><p>\n"; + + while ($_ = Exec::read_pipe_line(*OUT)) { + print "<tt>$_</tt><br>\n"; + } + return 0; + +} + +############ FILE SYSTEM ################## +sub stats { + + my $vol = Args::get_vol('vol'); + + return stats_disk() if ($Caseman::vol2cat{$vol} eq "disk"); + + Print::print_html_header("File System Status"); + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Displaying file system details"); + print "<center><h3>General File System Details</h3></center><p>\n"; + + my $fat = 0; + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/fsstat' -f $ftype -o $offset -i $imgtype $img"); + while ($_ = Exec::read_pipe_line(*OUT)) { + + if (/\-\-\-\-\-\-\-\-\-\-/) { + + # Ignore these and print them ahead of the headers + } + + # need the space to prevent NTFS STD_INFORMATION from triggering it + elsif (/ INFORMATION/) { + print "<hr><b>$_</b><p>\n"; + } + elsif (($ftype =~ /fat/) && ($_ =~ /FAT CONTENTS/)) { + print "<hr><b>$_</b><p>\n"; + + # Set the flag if we reach the FAT + $fat = 1; + } + + # Special case for FAT + # We will be giving hyperlinks in the FAT table dump + elsif ($fat == 1) { + + # Ignore the divider + if (/\-\-\-\-\-\-\-\-\-\-/) { + print "$_<br>"; + next; + } + + if (/^((\d+)\-\d+\s+\((\d+)\)) \-\> ([\w]+)$/) { + my $full = $1; + my $blk = $2; + my $len = $3; + my $next = $4; + + # Print the tag so that other FAT entries can link to it + print "<a name=\"$blk\">\n"; + + print +"<a href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_FRAME&submod=$::MOD_DATA&" + . "block=$blk&len=$len\" target=\"_top\">$full</a> -> "; + + if ($next eq 'EOF') { + print "EOF<br>\n"; + } + else { + print "<a href=\"#$next\">$next</a><br>\n"; + } + } + else { + $fat = 0; + print "$_<br>"; + } + } + else { + print "$_<br>"; + } + } + close(OUT); + + Print::print_html_footer(); + return 0; +} + +1; diff --git a/lib/Frame.pm b/lib/Frame.pm new file mode 100644 index 0000000000..20e107f457 --- /dev/null +++ b/lib/Frame.pm @@ -0,0 +1,336 @@ +# +# Functions to create the tabs and frame of the main browsing mode +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Frame; + +$Frame::IMG_FRAME = 0; +$Frame::IMG_TABS = 1; +$Frame::IMG_BLANK = 2; + +sub main { + Args::check_vol('vol'); + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Frame::IMG_FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view == $Frame::IMG_FRAME) { + vol_browse_frame(); + } + elsif ($view == $Frame::IMG_TABS) { + vol_browse_tabs(); + } + elsif ($view == $Frame::IMG_BLANK) { + vol_browse_blank(); + } + else { + Print::print_check_err("Invalid Frame View"); + } + + return 0; +} + +# create the frame for the tabs on top and the generic message on the bottom +sub vol_browse_frame { + Print::print_html_header_frameset( + "$Args::args{'case'}:$Args::args{'host'}:$Args::args{'vol'}"); + + my $submod = $::MOD_FRAME; + $submod = Args::get_submod() if (exists $Args::args{'submod'}); + + # Print the rest of the frames + my $str = ""; + my $view = ""; + + if ($submod == $::MOD_FILE) { + $str .= "&meta=$Args::args{'meta'}" if (exists $Args::args{'meta'}); + $str .= "&dir=$Args::args{'dir'}" if (exists $Args::args{'dir'}); + $str .= "&sort=$Args::args{'sort'}" if (exists $Args::args{'sort'}); + $str .= "&dmode=$Args::args{'dmode'}" if (exists $Args::args{'dmode'}); + } + elsif ($submod == $::MOD_DATA) { + $str .= "&block=$Args::args{'block'}" if (exists $Args::args{'block'}); + $str .= "&len=$Args::args{'len'}" if (exists $Args::args{'len'}); + } + elsif ($submod == $::MOD_META) { + $str .= "&meta=$Args::args{'meta'}" if (exists $Args::args{'meta'}); + } + elsif ($submod == $::MOD_FRAME) { + $view = "&view=$Frame::IMG_BLANK"; + } + + print <<EOF; + +<frameset rows=\"40,*\"> + <frame src=\"$::PROGNAME?mod=$::MOD_FRAME&view=$Frame::IMG_TABS&$Args::baseargs&submod=$submod\"> + + <frame src=\"$::PROGNAME?mod=$submod$view&$Args::baseargs$str\"> +</frameset> + +<NOFRAMES> + <center> + Autopsy requires a browser that supports frames. + </center> +</NOFRAMES> + +EOF + + Print::print_html_footer_frameset(); + return 0; +} + +# Display a message when the image is opened (below the tabs) +sub vol_browse_blank { + Print::print_html_header("Main Message"); + + print <<EOF; + +<center> + <br><br><br><br><br><br><br> + To start analyzing this volume, choose an analysis mode from the tabs above. +</center> + +EOF + Print::print_html_footer(); + return 0; +} + +sub vol_browse_tabs { + Args::check_submod(); + Print::print_html_header_tabs("Mode Tabs"); + + my $submod = Args::get_submod(); + my $vol = Args::get_vol('vol'); + + my $special = 0; + $special = 1 + unless (($Caseman::vol2cat{$vol} eq "part") + && ($Fs::is_fs{$Caseman::vol2ftype{$vol}} == 1)); + + # if ( ($Caseman::vol2ftype{$vol} eq "strings") + # || ($Caseman::vol2ftype{$vol} eq "blkls") + # || ($Caseman::vol2ftype{$vol} eq "swap") + # || ($Caseman::vol2ftype{$vol} eq "raw")); + + print "<center><table width=\"800\" border=\"0\" cellspacing=\"0\" " + . "cellpadding=\"0\"><tr>\n"; + + # Files + print "<td align=\"center\" width=116>"; + if ($special == 0) { + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_FILE&$Args::baseargs\"" + . "target=\"_top\">"; + + # Current + if ($submod == $::MOD_FILE) { + print "<img border=0 " + . "src=\"pict/main_t_fil_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"File Analysis (Current Mode)\"></a>"; + } + + # Link + else { + print "<img border=0 " + . "src=\"pict/main_t_fil_link.jpg\" " + . "width=116 height=38 " + . "alt=\"File Analysis\"></a>"; + } + } + + # non-link + else { + print "<img border=0 " + . "src=\"pict/main_t_fil_org.jpg\" " + . "width=116 height=38 " + . "alt=\"File Analysis (not available)\">"; + } + + # Search + print "</td>\n" . "<td align=\"center\" width=116>"; + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_KWSRCH&$Args::baseargs\"" + . " target=\"_top\">"; + + if ($submod == $::MOD_KWSRCH) { + print "<img border=0 " + . "src=\"pict/main_t_srch_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"Keyword Search Mode (Current Mode)\"></a>"; + } + else { + print "<img border=0 " + . "src=\"pict/main_t_srch_link.jpg\" " + . "width=116 height=38 " + . "alt=\"Keyword Search Mode\"></a>"; + } + + # File Type + print "</td>\n" . "<td align=\"center\" width=116>"; + + if (($special == 0) && ($::LIVE == 0)) { + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_APPSORT&$Args::baseargs\"" + . " target=\"_top\">"; + + # Current + if ($submod == $::MOD_APPSORT) { + print "<img border=0 " + . "src=\"pict/main_t_ftype_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"File Type (Current Mode)\"></a>"; + } + else { + print "<img border=0 " + . "src=\"pict/main_t_ftype_link.jpg\" " + . "width=116 height=38 " + . "alt=\"File Type\"></a>"; + } + } + else { + print "<img border=0 " + . "src=\"pict/main_t_ftype_org.jpg\" " + . "width=116 height=38 " + . "alt=\"File Type (not available)\">"; + } + + # Image Details + print "</td>\n" . "<td align=\"center\" width=116>"; + + if (($special == 0) || ($Caseman::vol2cat{$vol} eq "disk")) { + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_FS&$Args::baseargs\"" + . " target=\"_top\">"; + + if ($submod == $::MOD_FS) { + print "<img border=0 " + . "src=\"pict/main_t_img_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"Image Details Mode (Current Mode)\"></a>"; + } + else { + print "<img border=0 " + . "src=\"pict/main_t_img_link.jpg\" " + . "width=116 height=38 " + . "alt=\"Image Details Mode\"></a>"; + } + } + else { + print "<img border=0 " + . "src=\"pict/main_t_img_org.jpg\" " + . "width=116 height=38 " + . "alt=\"Image Details Mode (not available)\">"; + } + + # Meta Data + print "</td>\n" . "<td align=\"center\" width=116>"; + + if ($special == 0) { + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_META&$Args::baseargs\"" + . " target=\"_top\">"; + + if ($submod == $::MOD_META) { + print "<img border=0 " + . "src=\"pict/main_t_met_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"Meta Data Mode (Current Mode)\"></a>"; + } + else { + print "<img border=0 " + . "src=\"pict/main_t_met_link.jpg\" " + . "width=116 height=38 " + . "alt=\"Meta Data Mode\"></a>"; + } + } + else { + print "<img border=0 " + . "src=\"pict/main_t_met_org.jpg\" " + . "width=116 height=38 " + . "alt=\"Meta Data Mode (not available)\">"; + } + + # Data Units + print "</td>\n" . "<td align=\"center\" width=116>"; + + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_DATA&$Args::baseargs\"" + . " target=\"_top\">"; + + # Current + if ($submod == $::MOD_DATA) { + print "<img border=0 " + . "src=\"pict/main_t_dat_cur.jpg\" " + . "width=116 height=38 " + . "alt=\"Data Units Mode (Current Mode)\"></a>"; + } + + # Link + else { + print "<img border=0 " + . "src=\"pict/main_t_dat_link.jpg\" " + . "width=116 height=38 " + . "alt=\"Data Units Mode\"></a>"; + } + + # Help - set to current mode + print "</td>\n" + . "<td align=\"center\" width=52>" + . "<a href=\"$::HELP_URL\"" + . " target=\"_blank\">" + . "<img border=0 " + . "src=\"pict/tab_help.jpg\" " + . "width=52 " + . "alt=\"Help\">" + . "</a></td>\n"; + + # Close + print "<td align=\"center\" width=52>" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_OPEN&$Args::baseargs_novol\" target=\"_top\">" + . "<img border=0 src=\"pict/tab_close.jpg\" width=52 " + . "alt=\"Close Image\"></a></td>\n"; + + print "</tr></table>\n"; + + Print::print_html_footer_tabs(); + return 0; +} diff --git a/lib/Fs.pm b/lib/Fs.pm new file mode 100644 index 0000000000..cc188012b7 --- /dev/null +++ b/lib/Fs.pm @@ -0,0 +1,171 @@ +# +package Fs; + +$Fs::types[0] = "ext"; +$Fs::types[1] = "fat"; +$Fs::types[2] = "ntfs"; +$Fs::types[3] = "ufs"; +$Fs::types[4] = "iso9660"; +$Fs::types[5] = "-----"; +$Fs::types[6] = "fat12"; +$Fs::types[7] = "fat16"; +$Fs::types[8] = "fat32"; +$Fs::types[9] = "bsdi"; +$Fs::types[10] = "freebsd"; +$Fs::types[11] = "openbsd"; +$Fs::types[12] = "solaris"; +$Fs::types[13] = "hfs"; + +# These need to be updated as The Sleuth Kit supports more file systems +# +# addr_unit contains the addressable unit per filesystem type +# first_meta contains the first usable meta address on a system +# root_meta is the meta address for the root directory (diff than +# first on ntfs) + +$Fs::addr_unit{'disk'} = 'Sector'; +$Fs::first_addr{'disk'} = 0; +$Fs::is_fs{'disk'} = 0; + +$Fs::addr_unit{'blkls'} = 'Unit'; +$Fs::first_addr{'blkls'} = 0; +$Fs::is_fs{'blkls'} = 0; + +# raw +$Fs::addr_unit{'raw'} = 'Unit'; +$Fs::first_addr{'raw'} = 0; +$Fs::is_fs{'raw'} = 0; + +# Swap +$Fs::addr_unit{'swap'} = 'Unit'; +$Fs::first_addr{'swap'} = 0; +$Fs::is_fs{'swap'} = 0; + +# BSDI +$Fs::first_meta{'bsdi'} = $Fs::root_meta{'bsdi'} = 2; +$Fs::first_addr{'bsdi'} = 0; +$Fs::addr_unit{'bsdi'} = 'Fragment'; +$Fs::has_ctime{'bsdi'} = 1; +$Fs::has_crtime{'bsdi'} = 0; +$Fs::has_mtime{'bsdi'} = 1; +$Fs::meta_str{'bsdi'} = "Inode"; +$Fs::is_fs{'bsdi'} = 1; + +# FreeBSD +$Fs::first_meta{'freebsd'} = $Fs::root_meta{'freebsd'} = 2; +$Fs::first_addr{'freebsd'} = 0; +$Fs::addr_unit{'freebsd'} = 'Fragment'; +$Fs::has_ctime{'freebsd'} = 1; +$Fs::has_crtime{'freebsd'} = 0; +$Fs::has_mtime{'freebsd'} = 1; +$Fs::meta_str{'freebsd'} = "Inode"; +$Fs::is_fs{'freebsd'} = 1; + +# OpenBSD +$Fs::first_meta{'openbsd'} = $Fs::root_meta{'openbsd'} = 2; +$Fs::first_addr{'openbsd'} = 0; +$Fs::addr_unit{'openbsd'} = 'Fragment'; +$Fs::has_ctime{'openbsd'} = 1; +$Fs::has_crtime{'openbsd'} = 0; +$Fs::has_mtime{'openbsd'} = 1; +$Fs::meta_str{'openbsd'} = "Inode"; +$Fs::is_fs{'openbsd'} = 1; + +# Solaris +$Fs::first_meta{'solaris'} = $Fs::root_meta{'solaris'} = 2; +$Fs::first_addr{'solaris'} = 0; +$Fs::addr_unit{'solaris'} = 'Fragment'; +$Fs::has_ctime{'solaris'} = 1; +$Fs::has_crtime{'solaris'} = 0; +$Fs::has_mtime{'solaris'} = 1; +$Fs::meta_str{'solaris'} = "Inode"; +$Fs::is_fs{'solaris'} = 1; + +# UFS +$Fs::first_meta{'ufs'} = $Fs::root_meta{'ufs'} = 2; +$Fs::first_addr{'ufs'} = 0; +$Fs::addr_unit{'ufs'} = 'Fragment'; +$Fs::has_ctime{'ufs'} = 1; +$Fs::has_crtime{'ufs'} = 0; +$Fs::has_mtime{'ufs'} = 1; +$Fs::meta_str{'ufs'} = "Inode"; +$Fs::is_fs{'ufs'} = 1; + +# Linux +$Fs::first_meta{'linux-ext2'} = $Fs::root_meta{'linux-ext2'} = 2; +$Fs::first_addr{'linux-ext2'} = 0; +$Fs::addr_unit{'linux-ext2'} = 'Fragment'; +$Fs::has_ctime{'linux-ext2'} = 1; +$Fs::has_crtime{'linux-ext2'} = 0; +$Fs::has_mtime{'linux-ext2'} = 1; +$Fs::meta_str{'linux-ext2'} = "Inode"; +$Fs::is_fs{'linux-ext2'} = 1; + +$Fs::first_meta{'linux-ext3'} = $Fs::root_meta{'linux-ext3'} = 2; +$Fs::first_addr{'linux-ext3'} = 0; +$Fs::addr_unit{'linux-ext3'} = 'Fragment'; +$Fs::has_ctime{'linux-ext3'} = 1; +$Fs::has_crtime{'linux-ext3'} = 0; +$Fs::has_mtime{'linux-ext3'} = 1; +$Fs::meta_str{'linux-ext3'} = "Inode"; +$Fs::is_fs{'linux-ext3'} = 1; + +$Fs::first_meta{'ext'} = $Fs::root_meta{'ext'} = 2; +$Fs::first_addr{'ext'} = 0; +$Fs::addr_unit{'ext'} = 'Fragment'; +$Fs::has_ctime{'ext'} = 1; +$Fs::has_crtime{'ext'} = 0; +$Fs::has_mtime{'ext'} = 1; +$Fs::meta_str{'ext'} = "Inode"; +$Fs::is_fs{'ext'} = 1; + +# FAT +$Fs::first_meta{'fat'} = $Fs::first_meta{'fat12'} = $Fs::first_meta{'fat16'} = + $Fs::first_meta{'fat32'} = 1; +$Fs::root_meta{'fat'} = $Fs::root_meta{'fat12'} = $Fs::root_meta{'fat16'} = + $Fs::root_meta{'fat32'} = 2; +$Fs::first_addr{'fat'} = $Fs::first_addr{'fat12'} = $Fs::first_addr{'fat16'} = + $Fs::first_addr{'fat32'} = 0; +$Fs::addr_unit{'fat'} = $Fs::addr_unit{'fat12'} = $Fs::addr_unit{'fat16'} = + $Fs::addr_unit{'fat32'} = 'Sector'; +$Fs::has_ctime{'fat'} = $Fs::has_ctime{'fat12'} = $Fs::has_ctime{'fat16'} = + $Fs::has_ctime{'fat32'} = 0; +$Fs::has_crtime{'fat'} = $Fs::has_crtime{'fat12'} = $Fs::has_crtime{'fat16'} = + $Fs::has_crtime{'fat32'} = 1; +$Fs::has_mtime{'fat'} = $Fs::has_mtime{'fat12'} = $Fs::has_mtime{'fat16'} = + $Fs::has_mtime{'fat32'} = 1; +$Fs::meta_str{'fat'} = $Fs::meta_str{'fat12'} = $Fs::meta_str{'fat16'} = + $Fs::meta_str{'fat32'} = "Dir Entry"; +$Fs::is_fs{'fat'} = $Fs::is_fs{'fat12'} = $Fs::is_fs{'fat16'} = + $Fs::is_fs{'fat32'} = 1; + +# NTFS +$Fs::first_meta{'ntfs'} = 0; +$Fs::root_meta{'ntfs'} = 5; +$Fs::first_addr{'ntfs'} = 0; +$Fs::addr_unit{'ntfs'} = 'Cluster'; +$Fs::has_ctime{'ntfs'} = 1; +$Fs::has_crtime{'ntfs'} = 1; +$Fs::has_mtime{'ntfs'} = 1; +$Fs::meta_str{'ntfs'} = "MFT Entry"; +$Fs::is_fs{'ntfs'} = 1; + +# ISO9660 +$Fs::first_meta{'iso9660'} = $Fs::root_meta{'iso9660'} = 0; +$Fs::first_addr{'iso9660'} = 0; +$Fs::addr_unit{'iso9660'} = 'Block'; +$Fs::has_ctime{'iso9660'} = 0; +$Fs::has_crtime{'iso9660'} = 1; +$Fs::has_mtime{'iso9660'} = 0; +$Fs::meta_str{'iso9660'} = "Directory Entry"; +$Fs::is_fs{'iso9660'} = 1; + +# HFS +$Fs::first_meta{'hfs'} = $Fs::root_meta{'hfs'} = 2; +$Fs::first_addr{'hfs'} = 0; +$Fs::addr_unit{'hfs'} = 'Block'; +$Fs::has_ctime{'hfs'} = 1; +$Fs::has_crtime{'hfs'} = 1; +$Fs::has_mtime{'hfs'} = 1; +$Fs::meta_str{'hfs'} = "Record"; +$Fs::is_fs{'hfs'} = 1; diff --git a/lib/Hash.pm b/lib/Hash.pm new file mode 100644 index 0000000000..640e38548e --- /dev/null +++ b/lib/Hash.pm @@ -0,0 +1,947 @@ +# +# Hash database and calculation functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2008 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Hash; + +$Hash::DB_MANAGER = 1; +$Hash::DB_LOOKUP = 2; +$Hash::DB_INDEX = 3; +$Hash::IMG_VERIFY = 4; +$Hash::IMG_CALC = 5; +$Hash::IMG_LIST_FR = 6; +$Hash::IMG_LIST = 7; +$Hash::BLANK = 8; + +sub main { + + return if ($::LIVE == 1); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view == $Hash::BLANK) { + blank(); + return 0; + } + elsif ($view == $Hash::DB_MANAGER) { + return db_manager(); + } + elsif ($view == $Hash::DB_LOOKUP) { + return db_lookup(); + } + elsif ($view == $Hash::DB_INDEX) { + return db_index(); + } + elsif ($view == $Hash::IMG_LIST_FR) { + return img_list_fr(); + } + elsif ($view == $Hash::IMG_LIST) { + return img_list(); + } + + Args::check_vol('vol'); + if ($view == $Hash::IMG_CALC) { + return img_calc(); + } + elsif ($view == $Hash::IMG_VERIFY) { + return img_verify(); + } + else { + Print::print_check_err("Invalid Hash View"); + } + +} + +sub index_md5sum { + my $db = shift; + local *OUT; + Exec::exec_pipe(*OUT, "'$::TSKDIR/hfind' -i md5sum '$db'"); + while ($_ = Exec::read_pipe_line(*OUT)) { + print "$_<br>\n"; + } + close(OUT); +} + +sub index_nsrl { + local *OUT; + Exec::exec_pipe(*OUT, "'$::TSKDIR/hfind' -i nsrl-md5 '$::NSRLDB'"); + while ($_ = Exec::read_pipe_line(*OUT)) { + print "$_<br>\n"; + } + close(OUT); +} + +# Manager/status Window from HOST Manager +sub db_manager { + Print::print_html_header("Hash Database Manager"); + + print <<EOF; + +Hash databases allow Autopsy to quickly identify known files. This includes +files that are known to be good and those that are known to be bad. The +'hfind' tool is used to lookup entries in the databases and it needs an +index file for each database. This window allows one to re-index the +database after it has been updated. + +<p> +To edit the location of the databases, you must manually edit the +<tt>host.aut</tt> file in the host directory. + +<hr> +<center> +<img src=\"pict/hashdb_h_alert.jpg\" alt=\"Alert Database\" border=\"0\"> +</center> +<p><b>Overview</b><br> +These files are known to be <U>bad</U> and are the ones that you want to +know about if they are in the image you are analyzing. For example, +this database would include hashes of known attacker tools, rootkits, +or photographs. + +EOF + print "<p><b>Details</b><br>\n"; + if ($Caseman::alert_db eq "") { + print "Location: <tt>Not Configured</tt><br>\n"; + } + elsif (-e "$Caseman::alert_db") { + print "Location: <tt>$Caseman::alert_db</tt><br>\n"; + if (-e "$Caseman::alert_db" . "-md5.idx") { + print "Status: MD5 Index File Exists<br>\n"; + } + else { + print "Status: Database has not been MD5 indexed<br>\n"; + } + + # Index Button + print "<p><a href=\"$::PROGNAME?mod=$::MOD_HASH&" + . "view=$Hash::DB_INDEX&hash_alert=1&$Args::baseargs\">" + . "<img src=\"pict/but_indexdb.jpg\" alt=\"Index DB\" " + . "width=116 height=20 border=\"0\">" + . "</a>\n"; + + # Lookup Button + if (-e "$Caseman::alert_db" . "-md5.idx") { + print "<p><b>Lookup</b><br>" + . "<form action=\"$::PROGNAME\" method=\"get\">" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::DB_LOOKUP\">\n" + . "<input type=\"hidden\" name=\"hash_alert\" value=\"1\">\n" + . Args::make_hidden() + . "<table cellspacing=\"10\" cellpadding=\"2\">\n<tr>\n" + . "<td align=\"left\">Enter MD5 Value: " + . "<input type=\"text\" name=\"md5\" size=40 maxlength=32></td>\n" + . "<td align=\"left\">" + . "<input type=\"image\" src=\"pict/but_lookup.jpg\" alt=\"Ok\" " + . "width=116 height=20 border=\"0\">\n" + . "</td></tr>\n</table>\n" + . "</form>"; + } + } + else { + print "Location: <tt>$Caseman::alert_db</tt><br>\n" + . "ERROR: Database not found<br>\n"; + } + + print <<EOF2; +<hr> +<center> +<img src=\"pict/hashdb_h_ig.jpg\" alt=\"Ignore Database\" border=\"0\"> +</center> +<p><b>Overview</b><br> +These files are known to be <U>good</U> and are the ones that you +can ignore if they are found in the image you are analyzing. For +example, this database would include hashes of known system binaries +and other documents that you do not want to waste time on when running +'sorter' or files that you want to confirm were not modified by an +attacker. + +EOF2 + + print "<p><b>Details</b><br>\n"; + if ($Caseman::exclude_db eq "") { + print "Location: <tt>Not Configured</tt><br>\n"; + } + elsif (-e "$Caseman::exclude_db") { + print "Location: <tt>$Caseman::exclude_db</tt><br>\n"; + if (-e "$Caseman::exclude_db" . "-md5.idx") { + print "Status: MD5 Index File Exists<br>\n"; + } + else { + print "Status: Database has not been MD5 indexed<br>\n"; + } + + # Index Button + print "<p><a href=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::DB_INDEX&" + . "hash_exclude=1&$Args::baseargs\">" + . "<img src=\"pict/but_indexdb.jpg\" alt=\"Index DB\" " + . "width=116 height=20 border=\"0\">" + . "</a>\n"; + + # Lookup Button + if (-e "$Caseman::exclude_db" . "-md5.idx") { + print "<p><b>Lookup</b><br>" + . "<form action=\"$::PROGNAME\" method=\"get\">" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::DB_LOOKUP\">\n" + . "<input type=\"hidden\" name=\"hash_exclude\" value=\"1\">\n" + . Args::make_hidden() + . "<table cellspacing=\"10\" cellpadding=\"2\">\n<tr>\n" + . "<td align=\"left\">Enter MD5 Value: " + . "<input type=\"text\" name=\"md5\" size=40 maxlength=32></td>\n" + . "<td align=\"left\">" + . "<input type=\"image\" src=\"pict/but_lookup.jpg\" alt=\"Ok\" " + . "width=116 height=20 border=\"0\">\n" + . "</td></tr>\n</table>\n" + . "</form>"; + } + } + else { + print "Location: <tt>$Caseman::exclude_db</tt><br>\n" + . "ERROR: Database not found<br>\n"; + } + + print <<EOF3; +<hr> +<center> +<img src=\"pict/hashdb_h_nsrl.jpg\" alt=\"NSRL Database\" border=\"0\"> +</center> +<p><b>Overview</b><br> +These files are known to be <U>good</U> and <U>bad</U>. It is currently +difficult to distinguish between known good and known bad, but the NSRL +is used in Autopsy to ignore all known files. + +EOF3 + + print "<p><b>Details</b><br>\n"; + if ($::NSRLDB eq "") { + print "Location: <tt>Not Configured</tt><br>\n"; + } + elsif (-e "$::NSRLDB") { + print "Location: <tt>$::NSRLDB</tt><br>\n"; + if (-e "$::NSRLDB" . "-md5.idx") { + print "Status: MD5 Index File Exists<br>\n"; + } + else { + print "Status: Database has not been MD5 indexed<br>\n"; + } + + # Index Button + print "<p><a href=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::DB_INDEX&" + . "hash_nsrl=1&$Args::baseargs\">" + . "<img src=\"pict/but_indexdb.jpg\" alt=\"Index DB\" " + . "width=116 height=20 border=\"0\">" + . "</a>\n"; + + # Lookup Button + if (-e "$::NSRLDB" . "-md5.idx") { + print "<p><b>Lookup</b><br>" + . "<form action=\"$::PROGNAME\" method=\"get\">" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::DB_LOOKUP\">\n" + . "<input type=\"hidden\" name=\"hash_nsrl\" value=\"1\">\n" + . Args::make_hidden() + . "<table cellspacing=\"10\" cellpadding=\"2\">\n<tr>\n" + . "<td align=\"left\">Enter MD5 Value: " + . "<input type=\"text\" name=\"md5\" size=40 maxlength=32></td>\n" + . "<td align=\"left\">" + . "<input type=\"image\" src=\"pict/but_lookup.jpg\" " + . "alt=\"Lookup\" width=116 height=20 border=0>\n" + . "</td></tr>\n</table>\n" + . "</form>"; + } + } + else { + print "Location: <tt>$::NSRLDB</tt><br>\n" + . "ERROR: Database not found<br>\n"; + } + + print <<EOF4; + +<hr><center> +<table width=600 cellspacing=\"0\" cellpadding=\"2\"> +<tr> + <td align=center> + <a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::VOL_OPEN&$Args::baseargs\"> + <img src=\"pict/menu_b_close.jpg\" alt=\"Close\" width=\"167\" height=20 border=\"0\"> + </a> + </td> + <td align=center> + <a href=\"$::HELP_URL\" target=\"_blank\"> + <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" + width=\"167\" height=20 border=0> + </a> + </td> +</tr> +</table> +EOF4 + + Print::print_html_footer(); + return 0; +} + +sub db_index { + Print::print_html_header("Hash Database Indexing"); + + if ( (exists $Args::args{'hash_exclude'}) + && ($Args::args{'hash_exclude'} == 1) + && ($Caseman::exclude_db ne "")) + { + Print::log_host_info("Exclude Database Re-Indexed"); + print "<hr><b>Exclude Database Indexing</b><p>\n"; + index_md5sum($Caseman::exclude_db); + } + + if ( (exists $Args::args{'hash_alert'}) + && ($Args::args{'hash_alert'} == 1) + && ($Caseman::alert_db ne "")) + { + Print::log_host_info("Alert Database Re-Indexed"); + print "<hr><b>Alert Database Indexing</b><p>\n"; + index_md5sum($Caseman::alert_db); + } + + if ( (exists $Args::args{'hash_nsrl'}) + && ($Args::args{'hash_nsrl'} == 1) + && ($::NSRLDB ne "")) + { + Print::log_host_info("NSRL Database Re-Indexed"); + print "<hr><b>NSRL Database Indexing</b><p>\n"; + index_nsrl(); + } + + print "<p>Indexing Complete<br>\n" + . "<hr><p>\n<a href=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::DB_MANAGER&" + . "$Args::baseargs\">\n" + . "<img src=\"pict/menu_b_hashdb.jpg\" width=\"167\" " + . "height=20 alt=\"Hash Databases\" border=\"0\"></a>\n"; + + Print::print_html_footer(); + return 0; +} + +# Lookup hashes in database +sub db_lookup { + Print::print_html_header("Hash Database Lookup"); + + unless ((exists $Args::args{'md5'}) + && ($Args::args{'md5'} =~ /^$::REG_MD5$/o)) + { + Print::print_err("Invalid MD5 Argument"); + } + + if ( (exists $Args::args{'hash_nsrl'}) + && ($Args::args{'hash_nsrl'} == 1) + && ($::NSRLDB ne "")) + { + print "<hr><b>NSRL Lookup</b><p>\n"; + + if (-e "$::NSRLDB") { + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/hfind' '$::NSRLDB' $Args::args{'md5'}"); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + Print::log_host_inv("NSRL Lookup ($Args::args{'md5'})"); + } + else { + print "NSRL Database Missing<br>\n"; + Print::log_host_inv( + "NSRL Lookup ($Args::args{'md5'}) - Database Missing"); + } + } + + if ( (exists $Args::args{'hash_exclude'}) + && ($Args::args{'hash_exclude'} == 1) + && ($Caseman::exclude_db ne "")) + { + print "<hr><b>Exclude Database Lookup</b><p>\n"; + + if (-e "$Caseman::exclude_db") { + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/hfind' '$Caseman::exclude_db' $Args::args{'md5'}"); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + Print::log_host_inv("Exclude Database Lookup ($Args::args{'md5'})"); + } + else { + print "Exclude Database Missing<br>\n"; + Print::log_host_inv( +"Exclude Database Lookup ($Args::args{'md5'}) - Database Missing" + ); + } + } + + if ( (exists $Args::args{'hash_alert'}) + && ($Args::args{'hash_alert'} == 1) + && ($Caseman::alert_db ne "")) + { + print "<hr><b>Alert Database Lookup</b><p>\n"; + + if (-e "$Caseman::alert_db") { + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/hfind' '$Caseman::alert_db' $Args::args{'md5'}"); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + Print::log_host_inv("Alert Database Lookup ($Args::args{'md5'})"); + } + else { + print "Alert Database Missing<br>\n"; + Print::log_host_inv( + "Alert Database Lookup ($Args::args{'md5'}) - Database Missing" + ); + } + } + + print "<hr><p>\n" + . "If any of the hash databases need to be re-indexed, use the " + . "<U>Hash Database Manager</U><p>" + . "<a href=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::DB_MANAGER&" + . "$Args::baseargs\" target=\"_top\">\n" + . "<img src=\"pict/menu_b_hashdb.jpg\" width=\"167\" " + . "height=20 alt=\"Hash Databases\" border=\"0\"></a>\n"; + + Print::print_html_footer(); + return 0; +} + +############ INTEGRITY CHECKS ################## + +# Special view for printing integrity check menu +# We show any file that we have a reference for + +# pass the md5 hash (from md5.txt) and then the sorted array +sub int_menu_print { + my %md5s = %{$_[0]}; + my @sort = @{$_[1]}; + + for (my $i = 0; $i <= $#sort; $i++) { + + print +"<tr><td align=\"right\"><tt><b>$Caseman::vol2sname{$sort[$i]}</b></tt></td>\n"; + + # It already exists, so make verify button + if (exists $md5s{$sort[$i]}) { + print "<td><tt>$md5s{$sort[$i]}</tt></td><td>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"cont\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$sort[$i]\">\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::IMG_VERIFY\">\n" + . "<input type=\"image\" src=\"pict/int_b_valid.jpg\" " + . "alt=\"Validate\" border=\"0\">\n" + . "</form></td></tr>\n"; + } + + # we currenly only support integrity for raw and split image formats + elsif (($Caseman::vol2itype{$sort[$i]} ne "raw") + && ($Caseman::vol2itype{$sort[$i]} ne "split")) + { + print +"<td colspan=2>Integrity checks for image type $Caseman::vol2itype{$sort[$i]} not yet supported</td></tr>\n"; + } + + # Generate New button + else { + print "<td> </td><td>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"cont\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$sort[$i]\">\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::IMG_CALC\">\n" + . "<input type=\"image\" src=\"pict/int_b_calc.jpg\" " + . "alt=\"Calculate\" border=\"0\">\n" + . "</form></td></tr>\n"; + } + } + + return; +} + +# Create a frame with two rows, one with the list of images to check +# and then the bottom actually does it. +sub img_list_fr { + Print::print_html_header_frameset( + "$Args::args{'case'}:$Args::args{'host'} Integrity Check"); + + print "<frameset rows=\"80%,20%\">\n"; + + # Block List + print "<frame src=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::IMG_LIST&" + . "$Args::baseargs\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_HASH&view=$Hash::BLANK&" + . "$Args::baseargs\" name=\"cont\">\n" + . "</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# Reads the MD5 file to fill in the MENU list for the integrity +# check mode +sub img_list { + Print::print_html_header("Image Integrity Menu"); + + my %md5s; + my @blkls; + my @str; + my @img; + my @body; + my @tl; + + # Read the known values if the file exists + if (open(FILE, "$::host_dir" . "/md5.txt")) { + + # Read the md5 values into a hash + while (<FILE>) { + s/^\s+//; + s/\s+$//; + + if (/($::REG_MD5)\s+(.*)/o) { + $md5s{"$2"} = $1; + $md5s{"$2"} =~ tr/[a-f]/[A-F]/; + } + else { + print "Error reading line $. of md5.txt: $_<br>\n"; + return 1; + } + } + close(FILE); + } + + # sort the images into the different types + foreach my $k (keys %Caseman::vol2cat) { + if ($Caseman::vol2cat{$k} eq "image") { + push @img, $k; + } + elsif ($Caseman::vol2ftype{$k} eq "blkls") { + push @blkls, $k; + } + elsif ($Caseman::vol2ftype{$k} eq "strings") { + push @str, $k; + } + elsif ($Caseman::vol2ftype{$k} eq "body") { + push @body, $k; + } + elsif ($Caseman::vol2ftype{$k} eq "timeline") { + push @tl, $k; + } + } + + print "<center><table cellspacing=\"10\" cellpadding=\"2\">"; + + # image files + if (scalar @img > 0) { + print "<tr><th colspan=3>" + . "<img src=\"pict/int_h_img.jpg\" alt=\"Image Files\">" + . "</th></tr>\n"; + my @sort = sort { $a cmp $b } @img; + int_menu_print(\%md5s, \@sort); + } + + # Unallocated (blkls) images + if (scalar @blkls > 0) { + print "<tr><th colspan=3> </th></tr>\n" + . "<tr><th colspan=3>" + . "<img src=\"pict/int_h_unalloc.jpg\" alt=\"Unallocated Data Files\">" + . "</th></tr>\n"; + my @sort = sort { $a cmp $b } @blkls; + int_menu_print(\%md5s, \@sort); + } + + # Strings files (of blkls or fs images) + if (scalar @str > 0) { + print "<tr><th colspan=3> </th></tr>\n" + . "<tr><th colspan=3>" + . "<img src=\"pict/int_h_str.jpg\" alt=\"Strings of Images\">" + . "</th></tr>\n"; + my @sort = sort { $a cmp $b } @str; + int_menu_print(\%md5s, \@sort); + + } + + # timeline body files + if (scalar @body > 0) { + print "<tr><th colspan=3> </th></tr>\n" + . "<tr><th colspan=3>" + . "<img src=\"pict/int_h_data.jpg\" alt=\"Timeline Data Files\">" + . "</th></tr>\n"; + my @sort = sort { $a cmp $b } @body; + int_menu_print(\%md5s, \@sort); + } + + # timeline files + if (scalar @tl > 0) { + print "<tr><th colspan=3> </th></tr>\n" + . "<tr><th colspan=3>" + . "<img src=\"pict/int_h_tl.jpg\" alt=\"Timelines\">" + . "</th></tr>\n"; + my @sort = sort { $a cmp $b } @tl; + int_menu_print(\%md5s, \@sort); + } + + print <<EOF; +</table> +<p> +<table cellspacing=20 width=600 cellpadding=2> +<tr> + <td><a href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_CASEMAN&view=$Caseman::VOL_OPEN\" target=\"_top\"> + <img src=\"pict/menu_b_close.jpg\" alt=\"close\" + width=\"167\" height=20 border=\"0\"> + </a> + </td> + <td><a href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_HASH&view=$Hash::IMG_LIST_FR\" target=\"_top\"> + <img src=\"pict/menu_b_ref.jpg\" alt=\"Refresh\" + width=\"167\" height=20 border=\"0\"> + </a> + </td> + <td align=center> + <a href=\"$::HELP_URL\" target=\"_blank\"> + <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" + width=\"167\" height=20 border=0> + </a> + </td> +</tr> +</table> + +EOF + Print::print_html_footer(); + return 0; +} + +# Pass the relative path (images/xyz) of the file. The MD5 is +# returned (or NULL) (in all caps) +sub lookup_md5 { + my $vol = shift; + my $md5 = ""; + + my $md5_file = "$::host_dir/md5.txt"; + + if (-e "$md5_file") { + unless (open(FILE, $md5_file)) { + print "Error opening $md5_file<br>\n"; + return ""; + } + + while (<FILE>) { + s/^\s+//; + s/\s+$//; + + if (/($::REG_MD5)\s+(.*)/o) { + my $m = $1; + if ($2 =~ /$vol$/) { + $md5 = $m; + $md5 =~ tr/[a-f]/[A-F]/; + last; + } + } + else { + print "Error reading line $. of $md5_file: $_<br>\n"; + return ""; + } + } + close(FILE); + } + + return $md5; +} + +sub img_verify { + + Print::print_html_header("Image Integrity Check"); + + my $vol = Args::get_vol('vol'); + + my $md5 = lookup_md5($vol); + + if ($md5 eq "") { + print +"The MD5 value of <tt>$Caseman::vol2sname{$vol}</tt> was not found<br>" + . "It can be calculated by pressing the button below." + . "<br><br>\n<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::IMG_CALC\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/int_b_calc.jpg\" " + . "alt=\"Calculate\" border=\"0\">\n</form>"; + return 1; + } + + Print::log_host_inv("$Caseman::vol2sname{$vol}: Checking image integrity"); + + print "Original MD5: <tt>$md5</tt><br>\n"; + + # We have the original value, now get the new one + my $img = $Caseman::vol2path{$vol}; + + my $cur; + if ($Caseman::vol2itype{$vol} eq "split") { + $cur = calc_md5_split($img); + } + else { + $cur = calc_md5($img); + } + + if ($cur =~ /^$::REG_MD5$/o) { + print "Current MD5: <tt>$cur</tt><br><br>\n"; + + if ($cur eq $md5) { + print "Pass<br>\n"; + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Image integrity check PASSED"); + } + else { + print "<font color=\"$::DEL_COLOR[0]\">Fail: Restore from backup" + . "<br>\n"; + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: Image integrity check FAILED"); + } + Print::print_html_footer(); + return 0; + } + else { + print "$cur<br>\n"; + Print::print_html_footer(); + return 1; + } +} + +# Calculate the MD5 value of a file (given the full path) +# return the value in upper case +# This one supports only single files - not split volumes +sub calc_md5 { + my $img = shift; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + local *OUT; + Exec::exec_pipe(*OUT, "'$::MD5_EXE' $img"); + + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + print "<br>\n" + if ($hit_cnt > 0); + + my $out = Exec::read_pipe_line(*OUT); + close(OUT); + + $out = "Error calculating MD5" + if ((!defined $out) || ($out eq "")); + + if ($out =~ /^($::REG_MD5)\s+/) { + my $m = $1; + $m =~ tr/[a-f]/[A-F]/; + return $m; + } + else { + return $out; + } +} + +# Same as the version above, but this one can do split images +# it fails though if the file is not a multiple of 512 +sub calc_md5_split { + my $img = shift; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + local *OUT; + + # We use the blkls method so that we can handle split images + Exec::exec_pipe(*OUT, "'$::TSKDIR/blkls' -f raw -e $img | '$::MD5_EXE'"); + + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + print "<br>\n" + if ($hit_cnt > 0); + + my $out = Exec::read_pipe_line(*OUT); + close(OUT); + + $out = "Error calculating MD5" + if ((!defined $out) || ($out eq "")); + + if ($out =~ /^($::REG_MD5)\s+/) { + my $m = $1; + $m =~ tr/[a-f]/[A-F]/; + return $m; + } + else { + return $out; + } +} + +# Pass it the full path and the short name +# and it adds it to md5.txt and returns the MD5 +sub int_create_wrap { + my $vol = shift; + my $img = $Caseman::vol2path{$vol}; + + my $m; + if ( (exists $Caseman::vol2itype{$vol}) + && ($Caseman::vol2itype{$vol} eq "split")) + { + $m = calc_md5_split($img); + } + else { + $m = calc_md5($img); + } + Caseman::update_md5($vol, $m) if ($m =~ /^$::REG_MD5$/o); + return $m; +} + +sub img_calc { + Print::print_html_header("Image Integrity Creation"); + my $vol = Args::get_vol('vol'); + print "Calculating MD5 value for <tt>$Caseman::vol2sname{$vol}</tt><br>\n"; + Print::log_host_inv("$Caseman::vol2sname{$vol}: Calculating MD5 value"); + + my $m = int_create_wrap($vol); + + print "MD5: <tt>$m</tt><br>\n"; + print "<br>Value saved to host file<br><br>\n"; + + Print::print_html_footer(); + return 0; +} + +# Conver the 'image' format to the 'volume' format +# Make one central file +sub convert { + my %img2vol = %{shift()}; + + Print::log_host_info("Converting format of MD5 hash files"); + + # Get out of here if there are no hash files + return 0 + unless ((-e "$::host_dir" . "$::IMGDIR" . "/md5.txt") + || (-e "$::host_dir" . "$::DATADIR" . "/md5.txt")); + + # We are going ot make a single file + my $md5_file_new = "$::host_dir" . "/md5.txt"; + open MD5_NEW, ">$md5_file_new" + or die "Can't open writing file: $md5_file_new"; + + # Read the md5s for the image directory + my $md5_file = "$::host_dir" . "$::IMGDIR" . "/md5.txt"; + if (open(FILE, $md5_file)) { + + # Read the md5 values into a hash + while (<FILE>) { + s/^\s+//; + s/\s+$//; + + if (/($::REG_MD5)\s+(.*)/o) { + my $md5 = $1; + my $img = $2; + + unless (exists $img2vol{$img}) { + print STDERR +"Error finding image during hash file conversion: $img. Skipping\n"; + next; + } + my $vol = $img2vol{$img}; + + print MD5_NEW "$md5 $vol\n"; + } + else { + print MD5_NEW "$_"; + } + } + close(FILE); + rename $md5_file, $md5_file . ".bak"; + } + + # Now do the data directory + $md5_file = "$::host_dir" . "$::DATADIR" . "/md5.txt"; + if (open(FILE, $md5_file)) { + + # Read the md5 values into a hash + while (<FILE>) { + s/^\s+//; + s/\s+$//; + + if (/($::REG_MD5)\s+(.*)/o) { + my $md5 = $1; + my $img = $2; + + unless (exists $img2vol{$img}) { + print STDERR +"Error finding image during hash file conversion: $img. Skipping\n"; + next; + } + my $vol = $img2vol{$img}; + + print MD5_NEW "$md5 $vol\n"; + } + else { + print MD5_NEW "$_"; + } + } + close(FILE); + rename $md5_file, $md5_file . ".bak"; + } + + close(MD5_NEW); + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header(""); + print "<!-- This Page Intentionally Left Blank -->\n"; + Print::print_html_footer(); + return 0; +} diff --git a/lib/Kwsrch.pm b/lib/Kwsrch.pm new file mode 100644 index 0000000000..a643bfa7bf --- /dev/null +++ b/lib/Kwsrch.pm @@ -0,0 +1,954 @@ +# +# Keyword search mode +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Kwsrch; + +require 'search.pl'; + +$Kwsrch::ENTER = 1; +$Kwsrch::RESULTS_FR = 2; +$Kwsrch::RUN = 3; +$Kwsrch::LOAD = 4; +$Kwsrch::BLANK = 5; + +my $IMG_DETAILS = 0x80; + +sub main { + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Kwsrch::ENTER + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view == $Kwsrch::BLANK) { + blank(); + return 0; + } + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the meta data address + if ($view == $Kwsrch::ENTER) { + return enter(); + } + elsif ($view == $Kwsrch::RESULTS_FR) { + return results_fr(); + } + elsif ($view == $Kwsrch::RUN) { + return run(); + } + elsif ($view == $Kwsrch::LOAD) { + return load(); + } + else { + Print::print_check_err("Invalid Keyword Search View"); + } +} + +my $CASE_INSENS = 1; +my $CASE_SENS = 0; + +my $REG_EXP = 1; +my $STRING = 0; + +# Form to enter search data +sub enter { + my $vol = Args::get_vol('vol'); + + Print::print_html_header("Search on $Caseman::vol2sname{$vol}"); + my $ftype = $Caseman::vol2ftype{$vol}; + + if ($ftype eq 'blkls') { + print "<center><h3>Keyword Search of Unallocated Space</h3>\n"; + } + elsif ($ftype eq 'swap') { + print "<center><h3>Keyword Search of swap partition</h3>\n"; + } + elsif ($ftype eq 'raw') { + print "<center><h3>Keyword Search of raw data</h3>\n"; + } + elsif ($Caseman::vol2cat{$vol} eq "disk") { + print "<center><h3>Keyword Search of disk</h3>\n"; + } + else { + print +"<center><h3>Keyword Search of Allocated and Unallocated Space</h3>\n"; + } + + # @@@ Fix this - caused by writing all results to a file + if ($::LIVE == 1) { + Print::print_err( +"Keyword searching is temporarily not available during live analysis mode" + ); + } + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "Enter the keyword string or expression to search for:<br> <input type=\"text\" name=\"str\"><br><br>\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_KWSRCH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Kwsrch::RESULTS_FR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n"; + + print "<table width=400><tr>\n" + . "<td width=200 align=center><input type=\"checkbox\" name=\"ascii\" value=\"1\" CHECKED>" + . "ASCII \n</td>" + . "<td width=200 align=center><input type=\"checkbox\" name=\"unicode\" value=\"1\" CHECKED>" + . "Unicode</td></tr>\n" + . "<tr><td align=center><input type=\"checkbox\" name=\"srch_case\" value=\"$CASE_INSENS\">" + . "Case Insensitive</td>\n" + . "<td align=center><input type=\"checkbox\" name=\"regexp\" value=\"$REG_EXP\">\n" + . "<tt>grep</tt> Regular Expression</td></tr></table>\n" + . "<input type=\"image\" src=\"pict/but_search.jpg\" " + . "alt=\"Search\" border=\"0\">\n</form>\n"; + + if ($::LIVE == 0) { + print "<table width=600><tr>\n"; + + # If we are a non-blkls image and one exists - make a button to load it + if (($ftype ne 'blkls') && (exists $Caseman::vol2blkls{$vol})) { + print "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$::MOD_KWSRCH\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Caseman::vol2blkls{$vol}\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/srch_b_lun.jpg\" " + . "alt=\"Load Unallocated Image\" border=\"0\">\n<br></form></td>\n"; + } + + # If we are a blkls and the original exists - make a button to load it + elsif (($ftype eq 'blkls') + && (exists $Caseman::mod2vol{$vol})) + { + print "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$::MOD_KWSRCH\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$Caseman::mod2vol{$vol}\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/srch_b_lorig.jpg\" " + . "alt=\"Load Original Image\" border=\"0\">\n<br></form></td>\n"; + } + + # Strings Button + if ( (!(exists $Caseman::vol2str{$vol})) + || (!(exists $Caseman::vol2uni{$vol}))) + { + + my $dest_vol = $vol; + $dest_vol = $Caseman::mod2vol{$vol} + if exists($Caseman::mod2vol{$vol}); + + print "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_DETAILS\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$dest_vol\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/srch_b_str.jpg\" " + . "alt=\"Extract Strings\" border=\"0\">\n<br></form></td>\n"; + } + + # Unallocated Space Button + if ( ($Fs::is_fs{$ftype}) + && (!(exists $Caseman::vol2blkls{$vol}))) + { + print "<td align=center width=200>" + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_CASEMAN\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Caseman::VOL_DETAILS\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/srch_b_un.jpg\" " + . "alt=\"Extract Unallocated Space\" border=\"0\">\n<br></form></td>\n"; + } + + print "</tr></table>\n"; + } + + print "<a href=\"help/grep.html\" target=\"_blank\">" + . "Regular Expression Cheat Sheet</a>\n<br><br>\n"; + + print "<p><font color=\"red\">NOTE:</font> The keyword search runs " + . "<tt>grep</tt> on the image.<br>\n" + . "A list of what will and " + . "what will not be found is available " + . "<a href=\"help/grep_lim.html\" target=\"_blank\">here</a>.<br>\n"; + + # Section for previous searches + if ($::LIVE == 0) { + my $srch_name = get_srch_fname(0); + if (-e $srch_name) { + print "<hr><h3>Previous Searches</h3>\n" . "<table width=600>\n"; + my $row_idx = 0; + + # Cycle through the files + for (my $srch_idx = 0;; $srch_idx++) { + + $srch_name = get_srch_fname($srch_idx); + + last unless (-e $srch_name); + + # Open the file to get the string and count + unless (open(SRCH, "$srch_name")) { + print "Error opening search file: $srch_name\n"; + return 1; + } + my $prev_str = ""; + my $prev_cnt = 0; + + while (<SRCH>) { + unless (/^(\d+)\|(.*?)?\|(.*)$/) { + print + "Error pasing header of search file: $srch_name\n"; + return 1; + } + $prev_cnt = $1; + $prev_str = $3; + if (length($prev_str) > 32) { + $prev_str = substr($prev_str, 0, 32); + $prev_str .= "..."; + } + + last; + } + close(SRCH); + + print "<tr>\n" if ($row_idx == 0); + + print " <td align=center width=150>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_KWSRCH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Kwsrch::RESULTS_FR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"srchidx\" value=\"$srch_idx\">\n" + . Args::make_hidden(); + + print "<input type=\"SUBMIT\" value=\"".Print::html_encode($prev_str)." ($prev_cnt)\">" + . "<br></form>\n"; + + if ($row_idx == 3) { + print "</tr>\n"; + $row_idx = 0; + } + else { + $row_idx++; + } + } + print "</table>\n"; + } + } + + # Predefined expressions from search.pl + print "<hr><h3>Predefined Searches</h3>\n"; + print "<table width=600>\n"; + my $row_idx = 0; + my $r; + foreach $r (keys %Kwsrch::auto_srch) { + + $Kwsrch::auto_srch_reg{$r} = 0 + unless (defined $Kwsrch::auto_srch_reg{$r}); + $Kwsrch::auto_srch_csense{$r} = 1 + unless (defined $Kwsrch::auto_srch_csense{$r}); + + print "<tr>\n" if ($row_idx == 0); + + # @@@ Make a unicode option in predefined + + print " <td align=center width=150>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_KWSRCH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Kwsrch::RESULTS_FR\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"str\" value=\"$Kwsrch::auto_srch{$r}\">\n" + . "<input type=\"hidden\" name=\"ascii\" value=\"1\">\n" + . Args::make_hidden(); + + if ($Kwsrch::auto_srch_reg{$r} == 1) { + print + "<input type=\"hidden\" name=\"regexp\" value=\"$REG_EXP\">\n"; + } + if ($Kwsrch::auto_srch_csense{$r} == 0) { + print +"<input type=\"hidden\" name=\"srch_case\" value=\"$CASE_INSENS\">\n"; + } + print "<input type=\"SUBMIT\" value=\"$r\"><br></form>\n" . " </td>\n"; + + if ($row_idx == 3) { + print "</tr>\n"; + $row_idx = 0; + } + else { + $row_idx++; + } + } + print "</table>\n"; + + Print::print_html_footer(); + return 0; +} + +# MAIN WITH RESULTS +# Page that makes frame with the results on left and data units on right +sub results_fr { + my $vol = Args::get_vol('vol'); + + # A string was given for a new search + if (exists $Args::args{'str'}) { + Args::check_str(); + + Print::print_html_header_frameset( + "Search on $Caseman::vol2sname{$vol} for $Args::args{'str'}"); + + print "<frameset cols=\"35%,65%\">\n"; + + my $srch_case = ""; + $srch_case = "&srch_case=$Args::args{'srch_case'}" + if (exists $Args::args{'srch_case'}); + + my $regexp = ""; + $regexp = "®exp=$Args::args{'regexp'}" + if (exists $Args::args{'regexp'}); + + my $ascii = ""; + $ascii = "&ascii=$Args::args{'ascii'}" + if (exists $Args::args{'ascii'}); + + my $unicode = ""; + $unicode = "&unicode=$Args::args{'unicode'}" + if (exists $Args::args{'unicode'}); + + # Block List + print "<frame src=\"$::PROGNAME?" + . "mod=$::MOD_KWSRCH&view=$Kwsrch::RUN&" + . "$Args::baseargs$srch_case$regexp&str=$Args::enc_args{'str'}$ascii$unicode\">\n"; + } + elsif (exists $Args::args{'srchidx'}) { + Args::check_srchidx(); + + Print::print_html_header_frameset( +"Search on $Caseman::vol2sname{$vol} for Index $Args::args{'srchidx'}" + ); + + print "<frameset cols=\"35%,65%\">\n"; + + # Block List + print "<frame src=\"$::PROGNAME?" + . "mod=$::MOD_KWSRCH&view=$Kwsrch::LOAD&" + . "$Args::baseargs&srchidx=$Args::enc_args{'srchidx'}\">\n"; + } + + # Block Contents + print "<frame src=\"$::PROGNAME?mod=$::MOD_KWSRCH&view=$Kwsrch::BLANK&" + . "$Args::baseargs\" name=\"content\">\n" + . "</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# Find an empty file to save the keyword searches to +sub find_srch_file { + my $vol = Args::get_vol('vol'); + + my $out_name = "$::host_dir" . "$::DATADIR/$Caseman::vol2sname{$vol}"; + my $i; + for ($i = 0; -e "${out_name}-${i}.srch"; $i++) { } + + return "${out_name}-${i}.srch"; +} + +# Pass the index +# return the full path of the file returned +sub get_srch_fname { + my $idx = shift; + my $vol = Args::get_vol('vol'); + return "$::host_dir" + . "$::DATADIR" + . "/$Caseman::vol2sname{$vol}-${idx}.srch"; +} + +sub load { + Args::check_srchidx(); + + Print::print_html_header(""); + + if ($::LIVE == 1) { + print "Searches cannot be loaded during live analysis<br>\n"; + return 1; + } + + my $srch_name = get_srch_fname($Args::args{'srchidx'}); + + print "<b><a href=\"$::PROGNAME?mod=$::MOD_KWSRCH&view=$Kwsrch::ENTER&" + . "$Args::baseargs\" " + . "target=\"_parent\">New Search</a></b>\n<p>"; + + print_srch_results($srch_name); + + Print::print_html_footer(); + return 0; +} + +# performs actual search, saves hits to file, and calls method to print +sub run { + Args::check_str(); + + Print::print_html_header(""); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $orig_str = Args::get_str(); + my $grep_str = $orig_str; # we will escape some values in the grep ver + + # Check for a search string + if ($orig_str eq "") { + print "You must enter a string value to search<br>\n"; + print "<b><a href=\"$::PROGNAME?mod=$::MOD_KWSRCH&view=$Kwsrch::ENTER&" + . "$Args::baseargs\" target=\"_parent\">New Search</a></b>\n<p>"; + return 1; + } + + my $log = ""; # Log entry string + + my $ascii = 0; + my $unicode = 0; + + if ((exists $Args::args{'ascii'}) && ($Args::args{'ascii'} == 1)) { + $ascii = 1; + $log .= "ASCII, "; + } + if ((exists $Args::args{'unicode'}) && ($Args::args{'unicode'} == 1)) { + $unicode = 1; + $log .= "Unicode, "; + } + + if (($ascii == 0) && ($unicode == 0)) { + print "You must choose either ASCII or Unicode to search<br>\n"; + print "<b><a href=\"$::PROGNAME?mod=$::MOD_KWSRCH&view=$Kwsrch::ENTER&" + . "$Args::baseargs\" target=\"_parent\">New Search</a></b>\n<p>"; + return 1; + } + + my $grep_flag = ""; # Flags to pass to grep + + # Check if search is case insensitive + my $case = 0; + if ( (exists $Args::args{'srch_case'}) + && ($Args::args{'srch_case'} == $CASE_INSENS)) + { + $grep_flag = "-i"; + $case = 1; + $log .= "Case Insensitive "; + } + + # Check if search is a regular expression + my $regexp = 0; + if ((exists $Args::args{'regexp'}) && ($Args::args{'regexp'} == $REG_EXP)) { + $grep_flag .= " -E"; + $regexp = 1; + $log .= "Regular Expression "; + } + + # if not a reg-exp, we need to escape some special values that + # 'grep' will misinterpret + else { + $grep_str =~ s/\\/\\\\/g; # \ + $grep_str =~ s/\./\\\./g; # . + $grep_str =~ s/\[/\\\[/g; # [ + $grep_str =~ s/\^/\\\^/g; # ^ + $grep_str =~ s/\$/\\\$/g; # $ + $grep_str =~ s/\*/\\\*/g; # * + # We need to add ' to end begin and end of the search as well + if ($grep_str =~ /\'/) { + $grep_str =~ s/\'/\\\'/g; # ' + $grep_str = "'$grep_str'"; + } + $grep_str =~ s/^\-/\\\-/; # starting with - (mistakes for an arg) + } + + Print::log_host_inv( + "$Caseman::vol2sname{$vol}: ${log}search for $grep_str"); + + # Get the addressable unit of image + my $bs = Args::get_unitsize(); + + # $norm_str is normalized to find the "hit" in the output + my $norm_str = $orig_str; + + # make this lowercase if we are doing case insens + $norm_str =~ tr/[A-Z]/[a-z]/ if ($case == 1); + + my $norm_str_len = length($norm_str); + + # array to pass to printing method + my @results; + + my $name_uni = ""; + my $name_asc = ""; + + # round 0 is for ASCII and 1 is for Unicode + for (my $i = 0; $i < 2; $i++) { + + next if (($i == 0) && ($ascii == 0)); + next if (($i == 1) && ($unicode == 0)); + + @results = (); + + local *OUT; + + my $hit_cnt = 0; + $SIG{ALRM} = sub { + if (($hit_cnt++ % 5) == 0) { + print "+"; + } + else { + print "-"; + } + alarm(5); + }; + + alarm(5); + + if ($i == 0) { + print "<b>Searching for ASCII</b>: "; + } + else { + print "<b>Searching for Unicode</b>: "; + } + + # if the string is less than 4 chars, then it will not be in the + # strings file so it will be searched for the slow way + if (length($orig_str) < 4) { + my $ltmp = length($orig_str); + + if ($i == 0) { + if ( (($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d -$ltmp | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d -$ltmp | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + } + + else { + if ( (($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d -e l -$ltmp | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d -e l -$ltmp | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + } + } + + # Use the strings file if it exists + elsif (($i == 0) && (defined $Caseman::vol2str{$vol})) { + my $str_vol = $Caseman::vol2path{$Caseman::vol2str{$vol}}; + Exec::exec_pipe(*OUT, + "'$::GREP_EXE' $grep_flag '$grep_str' $str_vol"); + } + elsif (($i == 1) && (defined $Caseman::vol2uni{$vol})) { + my $str_vol = $Caseman::vol2path{$Caseman::vol2uni{$vol}}; + Exec::exec_pipe(*OUT, + "'$::GREP_EXE' $grep_flag '$grep_str' $str_vol"); + } + + # Run strings on the image first and then grep that + else { + if ($i == 0) { + if ( (($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + } + else { + if ( (($ftype eq "raw") || ($ftype eq "swap")) + && ($Caseman::vol2end{$vol} != 0)) + { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/blkls' -e -f $ftype -i $imgtype $img " + . $Caseman::vol2start{$vol} . "-" + . $Caseman::vol2end{$vol} + . " | '$::TSKDIR/srch_strings' -a -t d -e l | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/blkls' -e -f $ftype -o $offset -i $imgtype $img | '$::TSKDIR/srch_strings' -a -t d -e l | '$::GREP_EXE' $grep_flag '$grep_str'" + ); + } + } + } + + alarm(0); + $SIG{ALRM} = 'DEFAULT'; + + # Cycle through the results and put them in an array + while ($_ = Exec::read_pipe_line(*OUT)) { + + # Parse out the byte offset and hit string + if (/^\s*(\d+)\s+(.+)$/) { + my $off = $1; + my $hit_str_orig = $2; + my $idx = 0; + + # Make a copy that we can modify & play with + my $hit_str = $hit_str_orig; + $hit_str =~ tr/[A-Z]/[a-z]/ if ($case == 1); + + # How long was the string that we hit? + my $hit_str_len = length($hit_str); + + # I'm not sure how to find a grep re in the hit yet, so + # for now we do not get the exact offset + if ($regexp) { + my $b = int($off / $bs); + my $o = int($off % $bs); + + # $hit =~ s/\n//g; + push @results, "${b}|${o}|"; + next; + } + + # There could be more than one keyword in the string + # so cycle through all of them + my $psize = scalar(@results); + while (($idx = index($hit_str, $norm_str, $idx)) > -1) { + + # The summary of the hit starts 5 chars before it + my $sum_min = $idx - 5; + $sum_min = 0 if ($sum_min < 0); + + # Goto 5 after, if there is still space + my $sum_max = $idx + $norm_str_len + 5; + $sum_max = $hit_str_len if ($sum_max > $hit_str_len); + + my $sum_hit = + substr($hit_str_orig, $sum_min, $sum_max - $sum_min); + + # remove new lines + $sum_hit =~ s/\n/ /g; + + # The actual offset for Unicode is 2 bytes per char + my $tmpidx = $idx; + $tmpidx *= 2 + if ($i == 1); + + my $b = int(($off + $tmpidx) / $bs); + my $o = int(($off + $tmpidx) % $bs); + + push @results, "${b}|${o}|$sum_hit"; + + # advance index to find next hit + $idx++; + } + + # If we did not find a term, then just print what + # was found-this occurs bc index does not find it + # sometimes. + if ($psize == scalar(@results)) { + + my $b = int($off / $bs); + my $o = int($off % $bs); + + # $hit =~ s/\n//g; + push @results, "${b}|${o}|"; + next; + } + } + + # A negative offset is common on FreeBSD with large images + elsif (/^\s*(\-\d+):?\s*(.+)$/) { + print "ERROR: Negative byte offset ($1) Your version of " + . "strings likely does not support large files: $2<br>\n"; + } + else { + print "Error parsing grep result: $_<br>\n"; + } + } + close(OUT); + + print " <b>Done</b><br>"; + my $cnt = scalar(@results); + + my $srch_name = ""; + if ($::LIVE == 0) { + print "<b>Saving</b>: "; + + # Find a file to save the results to + $srch_name = find_srch_file(); + unless (open(IDX, ">$srch_name")) { + print "Error opening $srch_name\n"; + return (1); + } + + # Print the header + if ($i == 0) { + print IDX "$cnt|${grep_flag}|${orig_str}|ascii\n"; + $name_asc = $srch_name; + } + else { + print IDX "$cnt|${grep_flag}|${orig_str}|unicode\n"; + $name_uni = $srch_name; + } + + for (my $a = 0; $a < $cnt; $a++) { + print IDX "$results[$a]\n"; + } + close(IDX); + print " <b>Done</b><br>\n"; + } + if ($i == 0) { + print "$cnt hits"; + print "- <a href=\"#ascii\">link to results</a>" if ($cnt > 0); + print "<br>\n"; + } + else { + print "$cnt hits"; + print "- <a href=\"#unicode\">link to results</a>" if ($cnt > 0); + print "<br>\n"; + } + print "<hr>\n"; + } + + print "<b><a href=\"$::PROGNAME?mod=$::MOD_KWSRCH&view=$Kwsrch::ENTER&" + . "$Args::baseargs\" " + . "target=\"_parent\">New Search</a></b>\n<p>"; + + if ($::LIVE == 0) { + if ($ascii == 1) { + print_srch_results($name_asc); + } + + if ($unicode == 1) { + print_srch_results($name_uni); + } + } + + Print::print_html_footer(); + return 0; +} + +# Args are search string, grep flags, and array of hits +sub print_srch_results { + + if (scalar(@_) != 1) { + print "Missing Args for print_srch_results()\n"; + return 1; + } + + my $srch_name = shift; + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + + my $addr_str = $Fs::addr_unit{$ftype}; + + unless (open(SRCH, "$srch_name")) { + print "Error opening search file: $srch_name\n"; + return 1; + } + + my @results; + my $grep_str = ""; + my $grep_flag = ""; + my $cnt = 0; + my $type = 0; # ASCII iis 0 and Unicode is 1 + + my $prev = -1; + + while (<SRCH>) { + + # The first line is a header + if ($. == 1) { + if (/^(\d+)\|(.*?)?\|(.*)$/) { + $cnt = $1; + $grep_flag = $2; + $grep_str = $3; + $type = 0; + } + else { + print "Error pasing header of search file: $srch_name\n"; + close(SRCH); + return 1; + } + + if ($grep_str =~ /^(.*?)\|unicode$/) { + $grep_str = $1; + $type = 1; + } + elsif ($grep_str =~ /^(.*?)\|ascii$/) { + $grep_str = $1; + } + + my $grep_str_html = Print::html_encode($grep_str); + print "<hr>\n"; + if ($type == 0) { + print "<a name=\"ascii\">\n"; + } + else { + print "<a name=\"unicode\">\n"; + } + + if ($cnt == 0) { + print "<b><tt>$grep_str_html</tt> was not found</b><br>\n"; + } + elsif ($cnt == 1) { + print +"<b>1 occurrence of <tt>$grep_str_html</tt> was found</b><br>\n"; + } + else { + print +"<b>$cnt occurrences of <tt>$grep_str_html</tt> were found</b><br>\n"; + } + + print "Search Options:<br>\n"; + if ($type == 0) { + print " ASCII<br>\n"; + } + else { + print " Unicode<br>\n"; + } + + if ($grep_flag =~ /\-i/) { + print " Case Insensitive<br>\n"; + } + else { + print " Case Sensitive<br>\n"; + } + if ($grep_flag =~ /\-E/) { + print " Regular Expression<br>\n"; + } + + print "<hr>\n"; + + if ($cnt > 1000) { + print "There were more than <U>1000</U> hits.<br>\n"; + print "Please revise the search to a managable amount.\n"; + print + "<p>The $cnt hits can be found in: <tt>$srch_name</tt><br>\n"; + close(SRCH); + return 0; + } + + next; + } + + unless (/^(\d+)\|(\d+)\|(.*)?$/) { + print "Error parsing results: $_\n"; + close(SRCH); + return 1; + } + + my $blk = $1; + my $off = $2; + my $str = $3; + + if ($blk != $prev) { + my $url = +"$::PROGNAME?mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&$Args::baseargs&block=$blk"; + + print "<br>\n$addr_str $blk (<a href=\"$url&sort=$Data::SORT_HEX\" " + . "target=content>Hex</a> - " + . "<a href=\"$url&sort=$Data::SORT_ASC\" target=content>" + . "Ascii</a>"; + + print +" - <a href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_DATA&view=$Data::CONT_MENU_FR&" + . "mnt=$Args::enc_args{'mnt'}&vol=$Caseman::mod2vol{$vol}&" + . "btype=$Data::ADDR_BLKLS&block=$blk\" target=content>Original</a>" + if ( ($ftype eq 'blkls') + && (exists $Caseman::mod2vol{$vol})); + + print ")<br>"; + $prev = $blk; + } + + my $occ = $. - 1; + if ($str ne "") { + $str = Print::html_encode($str); + print "$occ: $off (<tt>$str</tt>)<br>\n"; + } + else { + print "$occ: $off<br>\n"; + } + } + + close(SRCH); + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header(""); + print "<!-- This Page Intentionally Left Blank -->\n"; + Print::print_html_footer(); + return 0; +} + +1; diff --git a/lib/Main.pm b/lib/Main.pm new file mode 100644 index 0000000000..88c39f67a7 --- /dev/null +++ b/lib/Main.pm @@ -0,0 +1,357 @@ +# +# Main.pm +# Autopsy Forensic Browser +# +# This file requires The Sleuth Kit +# www.sleuthkit.org +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +use lib './'; +use strict; + +use Appsort; +use Appview; +use Args; +use Caseman; +use Data; +use Exec; +use File; +use Filesystem; +use Frame; +use Fs; +use Hash; +use Kwsrch; +use Meta; +use Notes; +use Print; +use Timeline; +use Vs; + +require 'conf.pl'; +require 'define.pl'; + +# Get rid of insecure settings +$ENV{PATH} = ""; +delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; + +# Formats for regular expressions +# Year.Mon.Day Hr:Min:Sec (TZ) +$::REG_DAY = '\d\d\d\d\-\d\d\-\d\d'; +$::REG_TIME = '\d\d:\d\d:\d\d'; +$::REG_ZONE_ARGS = '[\w\+\-\/\_]+'; +$::REG_ZONE2 = '\([\w\+\- ]*\)'; +$::REG_DATE = "$::REG_DAY" . '\s+' . "$::REG_TIME" . '\s+' . "$::REG_ZONE2"; +$::REG_FTYPE = '[\w\-]+'; +$::REG_SKEW = '[\+\-]?\d+'; +$::REG_MTYPE = '[\?bcdflprsvw-]'; # Type according to meta data + +$::REG_FILE = '[\w\-\_\.]+'; +$::REG_CASE = $::REG_FILE; +$::REG_HOST = '[\w\-\_\.]+'; +$::REG_INVESTIG = '[\w]+'; + +$::REG_IMG = "$::REG_FILE" . '/' . "$::REG_FILE"; +$::REG_IMG_PATH = '/[\w\-\_\.\/]+'; +$::REG_IMG_PATH_WILD = '/[\w\-\_\.\/]+\*?'; +$::REG_IMG_CONFIG = '[\w\-\_\.\/ ]+'; +$::REG_FNAME = $::REG_FILE; +$::REG_MNT = '[\w\-\_\.\/\:\\\\]+'; +$::REG_SEQ_FILE = '[\w\s\-\_\.\/\:\\\\]+'; +$::REG_HASHDB = '[\w\-\_\.\,\/]+'; +$::REG_IMGTYPE = '[\w\,]+'; +$::REG_INAME = '[\w]+'; +$::REG_VNAME = '[\w]+'; + +$::REG_META = '[\d-]+'; +$::REG_MD5 = '[0-9a-fA-F]{32,32}'; + +$::HELP_URL = "help/index.html"; + +# host_dir and case_dir will end with a '/' +$::host_dir = ""; +$::case_dir = ""; + +################## NEW STUFF ########################## +# MODULES + +# If the values of these are changed, or if new modules are added, +# Then the below pseudo-binary sort algorithm must be changed as well +$::MOD_CASEMAN = 0; +$::MOD_FRAME = 1; +$::MOD_FILE = 2; +$::MOD_META = 3; +$::MOD_KWSRCH = 4; +$::MOD_DATA = 5; +$::MOD_TL = 6; +$::MOD_FS = 7; +$::MOD_APPSORT = 8; +$::MOD_NOTES = 9; +$::MOD_HASH = 10; +$::MOD_APPVIEW = 11; + +# Main Menu +# +# Display the title page +sub welcome { + Print::print_html_header_javascript("Autopsy Forensic Browser"); + + print "<center>\n"; + + # This problem has not been seen with the 1 second delay + if ((0) && ($] >= 5.008)) { + print +"<p><font color=\"red\">Warning: You are using Perl v5.8.</font><br>\n" + . " Some buffer problems have been reported with Autopsy and Perl 5.8 " + . "where output is not shown.<br>\n" + . "Perl 5.6 should be used if available.\n" + . "If data is missing, reload the page<br><hr>\n"; + } + + print <<EOF; +<table cellspacing=0 cellpadding=2 width=600 height=350 border=0> + +<tr> + <td colspan=\"3\" align=\"center\" valign=\"MIDDLE\"> + <b>Autopsy Forensic Browser $::VER</b> + </td> +</tr> +<tr> + <td colspan=\"3\"> </td> +</tr> +<tr> + <td colspan=\"3\" align=\"center\" valign=\"MIDDLE\"> + <a href=\"./about\"> + <img src=\"pict/logo.jpg\" border=0 alt="Logo"> + </a> + </td> +</tr> +<tr> + <td colspan=\"3\"> </td> +</tr> +<tr> + <td colspan=\"3\" align=\"center\" valign=\"MIDDLE\"> + <a href="http://www.sleuthkit.org/autopsy/"> + <tt>http://www.sleuthkit.org/autopsy/</tt> + </a> + </td> +</tr> +<tr><td colspan=3> </td></tr> +<tr> + <td align=center width=200 valign=\"MIDDLE\"> + <a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::CASE_OPEN\"> + <img src=\"pict/menu_b_copen.jpg\" alt=\"Open Case\" width=176 height=20 border=0> + </a> + </td> + <td align=center width=200 valign=\"MIDDLE\"> + <a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::CASE_NEW\"> + <img src=\"pict/menu_b_cnew.jpg\" alt=\"New Case\" width=176 height=20 border=0> + </a> + </td> + <td align=center width=200 valign=\"MIDDLE\"> + <a href=\"$::HELP_URL\" target=\"_blank\"> + <img src=\"pict/menu_b_help.jpg\" alt=\"Help\" width=167 height=20 border=0> + </a> + </td> +</tr> +</table> + +EOF + + Print::print_html_footer_javascript(); + return 0; +} + +sub get_tskver { + local *OUT; + Exec::exec_pipe(*OUT, "'$::TSKDIR/fls' -V"); + + my $ver = Exec::read_pipe_line(*OUT); + $ver = $1 if ($ver =~ /^The Sleuth Kit ver (.*)$/); + close(OUT); + + return $ver; +} + +# This function is called by the code in the 'autopy' file. +# This will check for the basic module arguments and then host +# and case accordingly. The main function of each of the modules +# is called from here. Each of the modules will have to take care +# of the detailed argument checking. + +sub main { + + # Parse arguments + my $lcl_args = shift; + Args::parse_args($lcl_args); + + # When autopsy is first run, no mod or arguments are given. + unless (exists $Args::args{'mod'}) { + + # if we are not in live analysis mode, display the usual screen + if ($::LIVE == 0) { + return welcome(); + } + else { + + # If we are in live analysis mode, open up the window to select + # and image and supply basic host and case values. + $Args::args{'mod'} = $Args::enc_args{'mod'} = $::MOD_CASEMAN; + $Args::args{'view'} = $Args::enc_args{'view'} = $Caseman::VOL_OPEN; + $Args::args{'case'} = $Args::enc_args{'case'} = "live"; + $Args::args{'host'} = $Args::enc_args{'host'} = "local"; + $Args::args{'inv'} = $Args::enc_args{'inv'} = "unknown"; + } + } + + Args::check_mod(); + my $module = Args::get_mod(); + + Args::make_baseargs(); + + # For live analysis, we need to change the regular expression + # for images because it can be a full path (to /dev/xxxxxxx) + $::REG_IMG = '/[\w\-\_\.\/]+' + if ($::LIVE == 1); + + # The Case Management module is handled seperately because + # it may not have the host and case values + if ($module == $::MOD_CASEMAN) { + return Caseman::main(); + } + + # Check the minimum arguments + Args::check_case(); + Args::check_host(); + + # Set the case and host variables + if ($::LIVE == 0) { + $::case_dir = "$::LOCKDIR/" . Args::get_case() . "/"; + $::case_dir =~ s/\/\//\//g; + $::host_dir = "$::case_dir" . Args::get_host() . "/"; + $::host_dir =~ s/\/\//\//g; + } + else { + $::host_dir = ""; + $::case_dir = ""; + } + Caseman::read_host_config(); + + # This is a partial binary sort method to reduce the number of checks + + # 0 < mod < 6 + if ($module < $::MOD_TL) { + + # 0 < mod < 4 + if ($module < $::MOD_KWSRCH) { + + # mod == 1 + if ($module == $::MOD_FRAME) { + return Frame::main(); + } + + # mod == 2 + elsif ($module == $::MOD_FILE) { + return File::main(); + } + + # mod == 3 + elsif ($module == $::MOD_META) { + return Meta::main(); + } + } + + # 4 <= mod < 6 + else { + + # mod == 4 + if ($module == $::MOD_KWSRCH) { + return Kwsrch::main(); + } + + # mod == 5 + elsif ($module == $::MOD_DATA) { + return Data::main(); + } + } + } + + # 6 <= mod + else { + + # 6 <= mod < 9 + if ($module < $::MOD_NOTES) { + + # mod == 6 + if ($module == $::MOD_TL) { + return Timeline::main(); + } + + # mod == 7 + elsif ($module == $::MOD_FS) { + return Filesystem::main(); + } + + # mod == 8 + elsif ($module == $::MOD_APPSORT) { + return Appsort::main(); + } + } + + # 9 <= mod + else { + + # mod == 9 + if ($module == $::MOD_NOTES) { + return Notes::main(); + } + + # mod == 10 + elsif ($module == $::MOD_HASH) { + return Hash::main(); + } + + # mod == 11 + elsif ($module == $::MOD_APPVIEW) { + return Appview::main(); + } + + # New modules can be added here + + } + } + Print::print_check_err("Invalid Module"); +} + +1; diff --git a/lib/Meta.pm b/lib/Meta.pm new file mode 100644 index 0000000000..a0728c06b9 --- /dev/null +++ b/lib/Meta.pm @@ -0,0 +1,789 @@ +# +# Metadata mode +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Updated 1/13 + +package Meta; + +$Meta::FRAME = 0; +$Meta::ENTER = 1; +$Meta::STATS = 2; +$Meta::EXPORT = 3; +$Meta::FFIND = 4; +$Meta::LIST = 5; +$Meta::REPORT = 6; +$Meta::BLANK = 7; + +sub main { + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Meta::FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + # Check Basic Args + Args::check_vol('vol'); + + # These windows don't need the meta data address + if ($view == $Meta::FRAME) { + return frame(); + } + elsif ($view == $Meta::ENTER) { + return enter(); + } + elsif ($view == $Meta::LIST) { + return list(); + } + elsif ($view == $Meta::BLANK) { + return blank(); + } + + # These windows do need the meta data address + Args::check_meta('meta'); + if ($view == $Meta::STATS) { + return stats(); + } + elsif ($view == $Meta::FFIND) { + return findfile(); + } + + Args::check_recmode(); + if ($view == $Meta::EXPORT) { + return export(); + } + elsif ($view == $Meta::REPORT) { + return report(); + } + else { + Print::print_check_err("Invalid Meta View"); + } + +} + +# Print the two frames +sub frame { + + my $vol = Args::get_vol('vol'); + + Print::print_html_header_frameset( + "Meta Data Browse on $Caseman::vol2sname{$vol}"); + print "<frameset cols=\"20%,80%\">\n"; + + # Print the frame where an addres can be entered and a frame for the + # contents + if (exists $Args::enc_args{'meta'}) { + print +"<frame src=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::ENTER&$Args::baseargs" + . "&meta=$Args::enc_args{'meta'}\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::STATS&" + . "meta=$Args::enc_args{'meta'}&$Args::baseargs\" " + . "name=\"content\">\n</frameset>\n"; + } + else { + print +"<frame src=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::ENTER&$Args::baseargs\">\n" + . "<frame src=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::BLANK&$Args::baseargs\" " + . "name=\"content\">\n</frameset>\n"; + } + + Print::print_html_footer_frameset(); + return 0; +} + +# Generate the frame to enter the data into +sub enter { + Print::print_html_header(""); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + + # Address + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"content\">\n" + . "<b>$Fs::meta_str{$ftype} Number:</b><br>   " + . "<input type=\"text\" name=\"meta\" size=12 maxlength=12"; + + print " value=\"$Args::enc_args{'meta'}\"" if exists($Args::args{'meta'}); + + print ">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_META\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Meta::STATS\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . Args::make_hidden() + . + + # View Button + "<p><input type=\"image\" src=\"pict/but_view.jpg\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></form>\n"; + + # Allocation List + print "<hr><p>" + . "<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::LIST&$Args::baseargs\" target=\"content\">" + . "<img src=\"pict/but_alloc_list.jpg\" border=\"0\" " + . "width=113 height=20 alt=\"Allocation List\">" + . "</a>\n"; + + Print::print_html_footer(); + return 0; +} + +# Display the contents of meta +sub stats { + Print::print_html_header(""); + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Displaying details of $Fs::meta_str{$ftype} $meta" + ); + + my $meta_int = $meta; + $meta_int = $1 if ($meta =~ /^(\d+)-\d+(-\d)?/); + + my $prev = $meta_int - 1; + my $next = $meta_int + 1; + + # We need to get the allocation status of this structure + my $recmode = $File::REC_NO; + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ils' -f $ftype -e -o $offset -i $imgtype $img $meta_int"); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + next unless ($_ =~ /^$meta_int/); + if ($_ =~ /^$meta_int\|f/) { + $recmode = $File::REC_YES; + } + elsif ($_ =~ /^$meta_int\|a/) { + $recmode = $File::REC_NO; + } + else { + Print::print_err("Error parsing ils output: $_"); + } + } + close(OUT); + + print "<center>\n"; + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::STATS&$Args::baseargs&meta=$prev\">" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a>\n" + unless ($prev < $Fs::first_meta{$ftype}); + + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::STATS&$Args::baseargs&meta=$next\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a>\n<br>"; + + # Report + print "<table cellspacing=\"0\" cellpadding=\"2\">\n<tr>" + . "<td><a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::REPORT" + . "&$Args::baseargs&meta=$meta&recmode=$recmode\"" + . " target=\"_blank\">" + . "<img src=\"pict/but_report.jpg\" alt=\"report\" " + . "width=88 height=20 border=\"0\">" + . "</a></td>\n"; + + # View (File Mode) + print "<td><a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR" + . "&$Args::baseargs&meta=$meta&recmode=$recmode" + . "&dir=$vol-meta-$meta\" target=\"_blank\">" + . "<img src=\"pict/but_viewcont.jpg\" alt=\"view contents\" " + . "width=123 height=20 border=\"0\">" + . "</a></td>\n"; + + # Export + print "<td><a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::EXPORT" + . "&$Args::baseargs&meta=$meta&recmode=$recmode\">" + . "<img src=\"pict/but_export.jpg\" alt=\"export\" " + . "width=123 height=20 border=\"0\">" + . "</a></td>"; + + # Notes + print "<td><a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::ENTER_FILE" + . "&$Args::baseargs&meta=$meta&\" " + . "target=\"_blank\">" + . "<img src=\"pict/but_addnote.jpg\" alt=\"Add Note\" " + . "width=\"89\" height=20 border=\"0\">" + . "</a></td>" + if ($::USE_NOTES == 1); + + print "</tr></table>\n</center>\n"; + + my $tmpr = $Caseman::vol2mnt{$vol}; + + if ($ftype =~ /fat/) { + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::FFIND&$Args::baseargs&" + . "meta=$meta\" target=\"_blank\">Search for File Name</a><br><br>"; + } + else { + + print "<b>Pointed to by file:</b><br>\n"; + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ffind' -f $ftype -a -o $offset -i $imgtype $img $meta"); + my $cnt = 0; + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + if (/^(\*)\s+\/*(.*)$/) { + Print::print_output("<tt><font color=\"$::DEL_COLOR[0]\">" + . Print::html_encode($tmpr . $2) + . "</font></tt> (deleted)<br><br>\n"); + } + elsif (/^\/(.*)$/) { + Print::print_output("<tt>" + . Print::html_encode($tmpr . $1) + . "</tt><br><br>\n"); + } + else { + Print::print_output(Print::html_encode($_) . "<br><br>\n"); + } + $cnt++; + } + close(OUT); + if ($cnt == 0) { + print "<br>Invalid $Fs::meta_str{$ftype} value<br><br>\n"; + return; + } + } + + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + my $file_type = Exec::read_pipe_line(*OUT); + close(OUT); + + $file_type = "Error getting file type" + if ((!defined $file_type) || ($file_type eq "")); + + if ($recmode == $File::REC_YES) { + print "<b>File Type (Recovered):</b><br>$file_type<br>\n"; + } + else { + print "<b>File Type:</b><br>$file_type<br><br>\n"; + } + + # MD5 Value + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::MD5_EXE'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::MD5_EXE'" + ); + } + + my $md5out = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5out = "Error getting MD5" + if ((!defined $md5out) || ($md5out eq "")); + + chomp $md5out; + if ($recmode == $File::REC_YES) { + print "<b>MD5 of recovered content:</b><br><tt>$md5out</tt><br><br>\n"; + } + else { + print "<b>MD5 of content:</b><br><tt>$md5out</tt><br><br>\n"; + } + + # Hash Database Lookups + if ( + ( + ($::NSRLDB ne "") + || ($Caseman::alert_db ne "") + || ($Caseman::exclude_db ne "") + ) + && ($md5out =~ /^$::REG_MD5$/o) + ) + { + + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_blank\">\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"md5\" value=\"$md5out\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_HASH\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Hash::DB_LOOKUP\">\n" + . "<table cellpadding=\"2\" cellspacing=\"8\"><tr>\n"; + + if ($::NSRLDB ne "") { + print "<td align=\"left\">" + . "<input type=\"checkbox\" name=\"hash_nsrl\" value=\"1\" CHECKED>" + . "NSRL</td>\n"; + } + if ($Caseman::alert_db ne "") { + print "<td align=\"left\">" + . "<input type=\"checkbox\" name=\"hash_alert\" value=\"1\" CHECKED>" + . "Alert Database</td>\n"; + } + if ($Caseman::exclude_db ne "") { + print "<td align=\"left\">" + . "<input type=\"checkbox\" name=\"hash_exclude\" value=\"1\" CHECKED>" + . "Exclude Database</td>\n"; + } + print "<td align=\"left\">" + . "<input type=\"image\" src=\"pict/but_lookup.jpg\" " + . "width=116 height=20 alt=\"Ok\" border=\"0\">" + . "</td></tr></table>\n</form>\n"; + } + + # SHA-1 Value + if ($::SHA1_EXE ne "") { + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::SHA1_EXE'" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::SHA1_EXE'" + ); + } + + my $sha1out = Exec::read_pipe_line(*OUT); + close(OUT); + + $sha1out = "Error getting SHA-1" + if ((!defined $sha1out) || ($sha1out eq "")); + + chomp $sha1out; + if ($recmode == $File::REC_YES) { + print +"<b>SHA-1 of recovered content:</b><br><tt>$sha1out</tt><br><br>\n"; + } + else { + print "<b>SHA-1 of content:</b><br><tt>$sha1out</tt><br><br>\n"; + } + } + + # istat output + print "<b>Details:</b><br><br>\n"; + my $mode = 0; # set to 1 when showing blocks + my $force = 0; # set to 1 if size of meta is 0 + + my @output; + if (exists($Args::args{'force'})) { + my $f = Args::get_force(); + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -B $f -o $offset -i $imgtype $img $meta" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + } + while ($_ = Exec::read_pipe_line(*OUT)) { + if ($mode == 1) { + if (/^Indirect Blocks/) { + print "$_<br>\n"; + next; + } + elsif (/^Recover/) { + print "$_<br>\n"; + next; + } + elsif (/^Type: (\S+) \((\d+\-\d+)\) (.*)$/) { + print "$1 (" + . "<a href=\"$::PROGNAME?mod=$::MOD_FILE&view=$File::CONT_FR&$Args::baseargs" + . "&meta=$meta_int-$2&dir=$vol-meta-$meta_int-$2\" " + . "target=\"_blank\">$2</a>) $3<br>\n"; + next; + } + + my $blk; + foreach $blk (split(/ /, $_)) { + if ($blk =~ /^\d+$/) { + print +"<a href=\"$::PROGNAME?mod=$::MOD_FRAME&submod=$::MOD_DATA&" + . "$Args::baseargs&block=$blk\" target=\"_top\">$blk</a> "; + } + else { + print "$blk "; + } + } + print "<br>\n"; + } + else { + if (/^Not Allocated$/) { + print "<font color=\"$::DEL_COLOR[0]\">$_</font><br>\n"; + } + else { + print "$_<br>\n"; + } + $mode = 1 if (/^Direct Blocks|^Sectors/); + $mode = 1 if (/^Attributes:/); # HFS gets messed up without ":" + $mode = 1 if (/^Data Fork Blocks:/); + + if ((/^size: (\d+)/) && ($1 == 0)) { + $force = 1; + } + } + } + close(OUT); + + # display a text box to force X number of blocks to be displayed + if ($force == 1) { + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . Args::make_hidden() + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"meta\" value=\"$meta\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_META\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Meta::STATS\">\n"; + + print +"Enter number of $Fs::addr_unit{$ftype}s to display: <input type=\"text\" " + . "value=5 name=\"force\" size=\"3\">\n"; + + print "<input type=\"image\" src=\"pict/but_force.jpg\" " + . "width=53 height=20 alt=\"Force\" border=\"0\"> (because the size is 0)\n</form>\n"; + } + + Print::print_html_footer(); + return 0; +} + +sub findfile { + + Print::print_html_header("Find File"); + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $tmpr = $Caseman::vol2mnt{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + print "<b>Pointed to by file:</b><br>\n"; + + local *OUT; + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ffind' -f $ftype -a -o $offset -i $imgtype $img $meta"); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + if (/(\*)\s+\/*(.*)/) { + Print::print_output("<tt><font color=\"$::DEL_COLOR[0]\">" + . Print::html_encode($tmpr . $2) + . "</font></tt> (deleted)<br>\n"); + } + elsif (/^\/(.*)$/) { + Print::print_output( + "<tt>" . Print::html_encode($tmpr . $1) . "</tt><br>\n"); + } + else { + Print::print_output(Print::html_encode($_) . "<br>\n"); + } + } + close(OUT); + + Print::print_html_footer(); + return 0; +} + +sub export { + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $recmode = Args::get_recmode(); + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Saving contents of $Fs::meta_str{$ftype} $meta" + ); + + Print::print_oct_header("$vol" . "-meta" . "$meta" . ".raw"); + + local *OUT; + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta"); + } + else { + Exec::exec_pipe(*OUT, + "'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta"); + } + + print "$_" while ($_ = Exec::read_pipe_data(*OUT, 512)); + close(OUT); + + Print::print_oct_footer(); +} + +sub report { + + my $meta = Args::get_meta('meta'); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + my $recmode = Args::get_recmode(); + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: Generating report for $Fs::meta_str{$ftype} $meta" + ); + + Print::print_text_header("filename=$vol-meta$meta.txt"); + + print " Autopsy $Fs::meta_str{$ftype} Report\n\n" + . "-" x 70 . "\n" + . " GENERAL INFORMATION\n\n" + . "$Fs::meta_str{$ftype}: $Args::args{'meta'}\n"; + + print "Pointed to by file(s):\n"; + my $tmpr = $Caseman::vol2mnt{$vol}; + local *OUT; + + Exec::exec_pipe(*OUT, + "'$::TSKDIR/ffind' -f $ftype -a -o $offset -i $imgtype $img $meta"); + while ($_ = Exec::read_pipe_line(*OUT)) { + chop; + if (/^(\*)\s+\/*(.*)$/) { + Print::print_output( + " ${tmpr}${2} (deleted)\n"); + } + elsif (/^\/(.*)$/) { + Print::print_output(" ${tmpr}${1}\n"); + } + else { + Print::print_output(" $_\n"); + } + } + close(OUT); + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta | '$::MD5_EXE'" + ); + my $md5 = Exec::read_pipe_line(*OUT); + close(OUT); + + $md5 = "Error getting MD5 Value" + if ((!defined $md5) || ($md5 eq "")); + + chop $md5; + print "MD5 of istat output: $md5\n"; + + if ($::SHA1_EXE ne "") { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta | '$::SHA1_EXE'" + ); + my $sha1 = Exec::read_pipe_line(*OUT); + close(OUT); + + $sha1 = "Error getting SHA-1 Value" + if ((!defined $sha1) || ($sha1 eq "")); + + chop $sha1; + print "SHA-1 of istat output: $sha1\n"; + } + + print "\nImage: $Caseman::vol2path{$vol}\n"; + if (($Caseman::vol2start{$vol} == 0) && ($Caseman::vol2end{$vol} == 0)) { + print "Offset: Full image\n"; + } + elsif ($Caseman::vol2end{$vol} == 0) { + print "Offset: $Caseman::vol2start{$vol} to end\n"; + } + else { + print "Offset: $Caseman::vol2start{$vol} to $Caseman::vol2end{$vol}\n"; + } + print "File System Type: $ftype\n"; + + my $date = localtime(); + print "\nDate Generated: $date\n" + . "Investigator: $Args::args{'inv'}\n\n" + . "-" x 70 . "\n" + . " META DATA INFORMATION\n\n"; + + Exec::exec_pipe(*OUT, +"'$::TSKDIR/istat' -f $ftype $tz -s $Caseman::ts -o $offset -i $imgtype $img $meta" + ); + while ($_ = Exec::read_pipe_line(*OUT)) { + print $_; + } + close(OUT); + + if ($recmode == $File::REC_YES) { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -r -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + else { + Exec::exec_pipe(*OUT, +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $meta | '$::FILE_EXE' -z -b -" + ); + } + + my $file_type = Exec::read_pipe_line(*OUT); + close(OUT); + + $file_type = "Error getting file type" + if ((!defined $file_type) || ($file_type eq "")); + + print "\nFile Type: $file_type"; + + print "\n" + . "-" x 70 . "\n" + . " VERSION INFORMATION\n\n" + . "Autopsy Version: $::VER\n"; + print "The Sleuth Kit Version: " . ::get_tskver() . "\n"; + + Print::print_text_footer(); + + return 0; +} + +# Display the meta Allocation Table +sub list { + my $ILS_GAP = 500; + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $min = 0; + + $min = Args::get_min() if (exists $Args::args{'min'}); + my $max = $min + $ILS_GAP - 1; + + # Because we can not use metas 0 and 1 for most FS, set fmin to the + # minimum for this fs + my $fmin = $min; + $fmin = $Fs::first_meta{$ftype} if ($min < $Fs::first_meta{$ftype}); + + Print::print_html_header( + "$Fs::meta_str{$ftype} Allocation List $fmin -> $max"); + + Print::log_host_inv( +"$Caseman::vol2sname{$vol}: $Fs::meta_str{$ftype} Allocation List for $min to $max" + ); + + print "<center><H2>$Fs::meta_str{$ftype}: $fmin - $max</H2>"; + + # Display next and previous links + my $tmp; + if ($min > $Fs::first_meta{$ftype}) { + $tmp = $min - $ILS_GAP; + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::LIST&$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a> "; + } + $tmp = $min + $ILS_GAP; + print +" <a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::LIST&$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a><br>"; + print "</center>\n"; + + # The list + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ils' -e -s $Caseman::ts -f $ftype -o $offset -i $imgtype $img $fmin-$max" + ); + while ($_ = Exec::read_pipe_line(*OUT)) { + if (/^($::REG_META)\|([af])\|\d+\|\d+\|\d+\|\d+\|\d+\|/o) { + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::STATS&$Args::baseargs&meta=$1\">" + . "$1:</a> "; + if ($2 eq "a") { + print "allocated<br>\n"; + } + else { + print "<font color=\"$::DEL_COLOR[0]\">free</font><br>\n"; + } + } + } + close(OUT); + + # Display next and previous links + print "<center>\n"; + if ($min > $Fs::first_meta{$ftype}) { + $tmp = $min - $ILS_GAP; + print +"<a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::LIST&$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_prev.jpg\" alt=\"previous\" " + . "width=\"89\" height=20 border=\"0\"></a> "; + } + $tmp = $min + $ILS_GAP; + print +" <a href=\"$::PROGNAME?mod=$::MOD_META&view=$Meta::LIST&$Args::baseargs&min=$tmp\">" + . "<img src=\"pict/but_next.jpg\" alt=\"next\" " + . "width=\"89\" height=20 border=\"0\"></a><br>"; + print "</center>\n"; + + Print::print_html_footer(); + return 0; + +} + +# Blank Page +sub blank { + Print::print_html_header("Metadata Blank Page"); + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + + print "<center><h3>Metadata Mode</h3><br>\n" + . "Here you can view the details about any $Fs::meta_str{$ftype} in the file system.<br>\n" + . "These are the data structures that store the file details.<br>\n" + . "Enter the address in the field on the left.\n"; + Print::print_html_footer(); + return 0; +} + diff --git a/lib/Notes.pm b/lib/Notes.pm new file mode 100644 index 0000000000..5f36f1ad3e --- /dev/null +++ b/lib/Notes.pm @@ -0,0 +1,1110 @@ +# +# Notes and sequencer functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Notes; + +use POSIX; + +$Notes::ENTER_FILE = 1; +$Notes::ENTER_DATA = 2; +$Notes::WRITE_FILE = 3; +$Notes::WRITE_DATA = 4; +$Notes::WRITE_SEQ_MAN = 5; +$Notes::READ_NORM = 6; +$Notes::READ_SEQ = 7; + +sub main { + + # There is no default for Notes + Args::check_view(); + + Print::print_check_error("Notes option is not enabled") + if ($::USE_NOTES == 0); + + my $view = Args::get_view(); + + if ($view == $Notes::ENTER_FILE) { + return enter_file(); + } + elsif ($view == $Notes::ENTER_DATA) { + return enter_data(); + } + elsif ($view == $Notes::WRITE_FILE) { + return write_file(); + } + elsif ($view == $Notes::WRITE_DATA) { + return write_data(); + } + elsif ($view == $Notes::WRITE_SEQ_MAN) { + return write_seq_man(); + } + elsif ($view == $Notes::READ_NORM) { + return read_norm(); + } + elsif ($view == $Notes::READ_SEQ) { + return read_seq(); + } + else { + Print::print_check_err("Invalid Notes View"); + } +} + +sub investig_notes_fname { + return "$::host_dir" . "$::LOGDIR/$Args::args{'inv'}.notes"; +} + +sub investig_seq_notes_fname { + return "$::host_dir" . "$::LOGDIR/$Args::args{'inv'}.seq.notes"; +} + +# window where user can enter a normal and sequencer note for a file +# or meta data structure. +sub enter_file { + Args::check_vol('vol'); + Args::check_meta('meta'); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $mnt = $Caseman::vol2mnt{$vol}; + my $meta = Args::get_meta('meta'); + + # A file will have a 'dir' argument and a meta structure will not + if (exists $Args::args{'dir'}) { + my $fname = "$mnt$Args::args{'dir'}"; + Print::print_html_header("Notes for file $fname"); + print "<center><b>Enter a note for <tt>$fname</tt> ($meta):</b>" + . "<br><br>\n"; + } + else { + Print::print_html_header("Notes for $Fs::meta_str{$ftype} $meta"); + print "<center><b>Enter a note for $Fs::meta_str{$ftype} $meta:</b>" + . "<br><br>\n"; + } + print +"A note works like a bookmark and allows you to later find this data more easily.<br><br>\n"; + + # Setup the form + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<textarea rows=10 cols=50 wrap=\"virtual\" name=\"note\">" + . "</textarea><br>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_NOTES\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Notes::WRITE_FILE\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"meta\" value=\"$meta\">\n" + . Args::make_hidden(); + + print "<input type=\"hidden\" name=\"dir\" value=\"$Args::args{'dir'}\">\n" + if (exists $Args::args{'dir'}); + + # Option to add a normal note + print "<input type=\"checkbox\" name=\"norm_note\" value=\"1\" CHECKED>\n" + . " Add a Standard Note<br>\n"; + + # Sequencer notes - which requires the MAC times for the files + if ("$Caseman::tz" ne "") { + $ENV{TZ} = $Caseman::tz; + POSIX: tzset(); + } + + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $meta_int = $meta; + $meta_int = $1 if ($meta_int =~ /^(\d+)-\d+(-\d+)?$/); + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ils' -s $Caseman::ts -f $ftype -e -o $offset -i $imgtype $img $meta_int" + ); + + # Get the fourth line + my $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + close(OUT); + unless ((defined $tmp) + && ($tmp =~ /^$::REG_META\|\w\|\d+\|\d+\|(\d+)\|(\d+)\|(\d+)\|/o)) + { + Print::print_err("Error parsing 'ils' output"); + } + + my $mtime = $1; + my $atime = $2; + my $ctime = $3; + + $mtime = localtime($mtime); + $atime = localtime($atime); + $ctime = localtime($ctime); + + # Print the Times + print "<br><hr><b>Add a Sequencer Event:</b><br><br>\n" + . "A sequencer event will be sorted based on the time so that event reconstruction will be easier<br><br>\n" + . "<input type=\"checkbox\" name=\"mtime\" value=\"1\">" + . " M-Time (<tt>$mtime</tt>)<br>\n" + . "<input type=\"checkbox\" name=\"atime\" value=\"1\">" + . " A-Time (<tt>$atime</tt>)<br>\n" + . "<input type=\"checkbox\" name=\"ctime\" value=\"1\">" + . " C-Time (<tt>$ctime</tt>)<br><hr><br>\n"; + + # The OK Button + print "<br><input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return 0; +} + +# data unit comment +sub enter_data { + Args::check_vol('vol'); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $block = Args::get_block(); + my $len = Args::get_len(); + + Print::print_html_header("Notes for $Fs::addr_unit{$ftype} $block"); + + print + "<center><b>Enter a note for $Fs::addr_unit{$ftype} $block</b><br><br>\n" + . "A note works like a bookmark and allows you to later find this data more easily.<br><br>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<textarea rows=10 cols=50 wrap=\"virtual\" name=\"note\">" + . "</textarea><br>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_NOTES\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Notes::WRITE_DATA\">\n" + . "<input type=\"hidden\" name=\"vol\" value=\"$vol\">\n" + . "<input type=\"hidden\" name=\"block\" value=\"$block\">\n" + . "<input type=\"hidden\" name=\"len\" value=\"$len\">\n" + . "<input type=\"hidden\" name=\"norm_note\" value=\"1\">\n" + . Args::make_hidden() + . "<br><input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return 0; + +} + +# Write the note to the note file +sub write_data { + Args::check_vol('vol'); + Args::check_block(); + Args::check_len(); + Args::check_note(); + + Print::print_html_header("Write a note"); + + my $vol = Args::get_vol('vol'); + my $ftype = $Caseman::vol2ftype{$vol}; + my $img_sh = $Caseman::vol2sname{$vol}; + my $block = Args::get_block(); + my $len = Args::get_len(); + + Print::log_host_inv( + "$img_sh: Creating note for $Fs::addr_unit{$ftype} $block"); + + my $notes_file = investig_notes_fname(); + open NOTES, ">>$notes_file" or die "Can't open log: $notes_file"; + print "Note added to $notes_file:<p>\n\n"; + + # Date + my $tmp = localtime(); + print NOTES "$tmp\n"; + print "$tmp<br>\n"; + + print NOTES "Volume: $vol $Fs::addr_unit{$ftype}: $block Len: $len\n"; + print "Volume: $vol $Fs::addr_unit{$ftype}: $block Len: $len<br>\n"; + + # The actual notes and a line at the bottom + print NOTES "\n$Args::args{'note'}\n\n" . "-" x 70 . "\n"; + print "<p>".Print::html_encode($Args::args{'note'})."<p>"; + close(NOTES); + + print "<hr>\n" + . "You can view the notes from the Host Manager View<p>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_NORM\">" + . "<img border=0 src=\"pict/menu_b_note.jpg\" " + . "width=\"167\" height=20 alt=\"View Notes\"></a>\n"; + + Print::print_html_footer(); + + return 0; +} + +sub write_file { + Args::check_vol('vol'); + Args::check_meta('meta'); + Args::check_note(); + + # Get rid of carriage returns that Netscape adds + $Args::args{'note'} =~ tr/\r//d; + + my $vol = Args::get_vol('vol'); + my $mnt = $Caseman::vol2mnt{$vol}; + + my $ftype = $Caseman::vol2ftype{$vol}; + my $img_sh = $Caseman::vol2sname{$vol}; + my $meta = Args::get_meta('meta'); + + my $img = $Caseman::vol2path{$vol}; + my $offset = $Caseman::vol2start{$vol}; + my $imgtype = $Caseman::vol2itype{$vol}; + + my $fname = ""; + my $type = ""; + + if (exists $Args::args{'dir'}) { + $Args::args{'dir'} .= "/" + if ($Args::args{'dir'} eq ""); + $fname = "$mnt$Args::args{'dir'}"; + + if (($Args::args{'dir'} =~ /\/$/) || ($Args::args{'dir'} eq "")) { + Print::log_host_inv( + "$img_sh: Creating note for directory $fname ($meta)"); + $type = "dir"; + } + else { + Print::log_host_inv( + "$img_sh: Creating note for file $fname ($meta)"); + $type = "file"; + } + } + + else { + Print::log_host_inv( + "$img_sh: Creating note for $Fs::meta_str{$ftype} $meta"); + $type = "$Fs::meta_str{$ftype}"; + } + + Print::print_html_header("Writing a note / event"); + + # Get the times for the meta + # Set the timezone to the host zone + if ("$Caseman::tz" ne "") { + $ENV{TZ} = "$Caseman::tz"; + POSIX::tzset(); + } + + my $meta_int = $meta; + $meta_int = $1 if ($meta_int =~ /^(\d+)-\d+(-\d+)?$/); + local *OUT; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ils' -s $Caseman::ts -f $ftype -e -o $offset -i $imgtype $img $meta_int" + ); + + # Skip to the fourth line + my $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + $tmp = Exec::read_pipe_line(*OUT); + unless ((defined $tmp) + && ($tmp =~ /^$::REG_META\|\w\|\d+\|\d+\|(\d+)\|(\d+)\|(\d+)\|/o)) + { + Print::print_err("Error parsing 'ils' output"); + } + my $mtime = $1; + my $atime = $2; + my $ctime = $3; + close(OUT); + + # Create a "normal" note + if ((exists $Args::args{'norm_note'}) && ($Args::args{'norm_note'} == 1)) { + + my $notes_file = investig_notes_fname(); + open NOTES, ">>$notes_file" or die "Can't open log: $notes_file"; + print "Note added to $notes_file:<p>\n\n"; + + # Date + my $tmp = localtime(); + print NOTES "$tmp\n"; + print "$tmp\n"; + + # We have a file name + if ($fname ne "") { + if ($type eq 'dir') { + print NOTES "Directory: $fname\n"; + print "Directory: $fname<br>\n"; + } + else { + print NOTES "File: $fname\n"; + print "File: $fname<br>\n"; + } + } + if ($meta ne "") { + print NOTES "Volume: $vol Meta: $meta\n"; + print "Volume: $vol Meta: $meta<br>\n"; + } + print NOTES "M-time: " . localtime($mtime) . "\n"; + print "M-time: " . localtime($mtime) . "<br>\n"; + print NOTES "A-time: " . localtime($atime) . "\n"; + print "A-time: " . localtime($atime) . "<br>\n"; + print NOTES "C-time: " . localtime($ctime) . "\n"; + print "C-time: " . localtime($ctime) . "<br>\n"; + + # The actual notes and a line at the bottom + print NOTES "\n$Args::args{'note'}\n\n" . "-" x 70 . "\n"; + print "<p>".Print::html_encode($Args::args{'note'})."<p>"; + + close(NOTES); + } + + # Create a sequencer event - if there are any + unless (((exists $Args::args{'mtime'}) && ($Args::args{'mtime'} == 1)) + || ((exists $Args::args{'atime'}) && ($Args::args{'atime'} == 1)) + || ((exists $Args::args{'ctime'}) && ($Args::args{'ctime'} == 1))) + { + + print "<hr>\n" + . "You can view the notes from the Host Manager View<p>" + . "<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_NORM\">" + . "<img border=0 src=\"pict/menu_b_note.jpg\" " + . "width=\"167\" height=20 alt=\"View Notes\"></a>\n"; + + Print::print_html_footer(); + + return 0; + } + + # Get rid of the carriage returns + $Args::args{'note'} =~ s/\n/<br>/gs; + + my $notes_file = investig_seq_notes_fname(); + open NOTES, ">>$notes_file" or die "Can't open log: $notes_file"; + + if ((exists $Args::args{'mtime'}) && ($Args::args{'mtime'} == 1)) { + + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + localtime($mtime); + $year += 1900; + $mon += 1; + $mday = "0$mday" if ($mday < 10); + $hour = "0$hour" if ($hour < 10); + $min = "0$min" if ($min < 10); + $sec = "0$sec" if ($sec < 10); + + print NOTES "'$year','$mon','$mday','$hour','$min','$sec'," + . "'$Args::args{'host'}','$vol','$fname','$meta',''," + . "'$type','[M-Time]$Args::args{'note'}'\n"; + + Print::log_host_inv( + "$img_sh: M-Time note added for meta $Args::args{'meta'}"); + print "M-Time sequence event added<br>\n"; + } + + if ((exists $Args::args{'atime'}) && ($Args::args{'atime'} == 1)) { + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + localtime($atime); + $year += 1900; + $mon += 1; + $mday = "0$mday" if ($mday < 10); + $hour = "0$hour" if ($hour < 10); + $min = "0$min" if ($min < 10); + $sec = "0$sec" if ($sec < 10); + + print NOTES "'$year','$mon','$mday','$hour','$min','$sec'," + . "'$Args::args{'host'}','$vol','$fname','$meta',''," + . "'$type','[A-Time]$Args::args{'note'}'\n"; + + Print::log_host_inv( + "$img_sh: A-Time note added for meta $Args::args{'meta'}"); + print "A-Time sequence event added<br>\n"; + } + + if ((exists $Args::args{'ctime'}) && ($Args::args{'ctime'} == 1)) { + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + localtime($ctime); + $year += 1900; + $mon += 1; + $mday = "0$mday" if ($mday < 10); + $hour = "0$hour" if ($hour < 10); + $min = "0$min" if ($min < 10); + $sec = "0$sec" if ($sec < 10); + + print NOTES "'$year','$mon','$mday','$hour','$min','$sec'," + . "'$Args::args{'host'}','$vol','$fname','$meta',''," + . "'$type','[C-Time]$Args::args{'note'}'\n"; + + Print::log_host_inv( + "$img_sh: C-Time note added for meta $Args::args{'meta'}"); + print "C-Time sequence event added<br>\n"; + } + + close(NOTES); + + print "<p><hr>\n" + . "You can view the notes and events from the Host Manager View<p>"; + + if ((exists $Args::args{'norm_note'}) && ($Args::args{'norm_note'} == 1)) { + print +"<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_NORM\">" + . "<img border=0 src=\"pict/menu_b_note.jpg\" " + . "width=\"167\" height=20 alt=\"View Notes\"></a>\n"; + } + + print +"<a href=\"$::PROGNAME?${Args::baseargs_novol}&mod=$::MOD_NOTES&view=$Notes::READ_SEQ\">" + . "<img border=0 src=\"pict/menu_b_seq.jpg\" width=\"167\" height=\"20\" " + . " alt=\"Event Sequencer\"></a>\n"; + + Print::print_html_footer(); + + return 0; +} + +# Display the contents of the "normal" notes file +sub read_norm { + Print::print_html_header("Contents of Notes File"); + + my $notes_file = investig_notes_fname(); + + Print::log_host_inv("Viewing contents of notes file ($notes_file)"); + if ((!(-e "$notes_file")) || (-z "$notes_file")) { + print "No notes have been entered yet.<br>\n" + . "They can be entered using the <i>Add Note</i> link within each analysis mode.<br>\n"; + return; + } + + open NOTES, "<$notes_file" or die "Can't open log: $notes_file"; + + my $file = ""; + my $dir = ""; + + print "<table width=100%>\n" + . "<tr bgcolor=$::BACK_COLOR><td align=left>\n"; + + my $row = 0; + + # This will need to change whenever the log format changes + while (<NOTES>) { + + # we need to extract mnt from here + $file = $1 if (/^File: (.*)$/); + $dir = $1 if (/^Directory: (.*)$/); + + # Reset the $file if we are at the end of the current note + if (/^\-+$/) { + $file = ""; + $dir = ""; + if (($row++ % 2) == 0) { + print +"</td></tr>\n<tr bgcolor=$::BACK_COLOR_TABLE><td align=left>\n"; + } + else { + print "</td></tr>\n<tr bgcolor=$::BACK_COLOR><td align=left>\n"; + } + } + else { + print Print::html_encode($_); + } + + if (/^Volume: ($::REG_VNAME) Meta: ([0-9\-]+)/o) { + $vol = $1; + $meta = $2; + next unless (exists $Caseman::vol2cat{$vol}); + + # file note + if ($file ne "") { + + # extract the prepended mnt value + my $mnt = $Caseman::vol2mnt{$vol}; + my $fname = ""; + $fname = $1 if ($file =~ /^$mnt\/?(.*)$/); + print "<a href=\"$::PROGNAME?$Args::baseargs_novol" + . "&mod=$::MOD_FILE&view=$File::CONT_FR" + . "&vol=$vol&meta=$meta&dir=$fname\" target=\"_blank\">" + . "<img src=\"pict/but_view.jpg\" alt=\"view\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></a><br>\n"; + } + + # directory note + elsif ($dir ne "") { + + # extract the prepended mnt value + my $mnt = $Caseman::vol2mnt{$vol}; + my $fname = ""; + $fname = $1 if ($dir =~ /^$mnt\/?(.*)$/); + print "<a href=\"$::PROGNAME?$Args::baseargs_novol" + . "&mod=$::MOD_FRAME&submod=$::MOD_FILE&vol=$vol&" + . "&meta=$meta&dir=$fname\" target=\"_blank\">" + . "<img src=\"pict/but_view.jpg\" alt=\"view\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></a><br>\n"; + + } + + # meta note + else { + print "<a href=\"$::PROGNAME?$Args::baseargs_novol" + . "&mod=$::MOD_FRAME&submod=$::MOD_META&vol=$vol" + . "&meta=$meta\" target=\"_blank\">" + . "<img src=\"pict/but_view.jpg\" alt=\"view\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></a><br>\n"; + + } + } + + # block note + elsif (/^Volume: ($::REG_VNAME) \w+: ([0-9]+) Len: (\d+)/o) { + $vol = $1; + $blk = $2; + $len = $3; + next unless (exists $Caseman::vol2cat{$vol}); + + print "<a href=\"$::PROGNAME?$Args::baseargs_novol" + . "&mod=$::MOD_FRAME&submod=$::MOD_DATA&vol=$vol" + . "&block=$blk&len=$len\" target=\"_blank\">" + . "<img src=\"pict/but_view.jpg\" alt=\"view\" " + . "width=45 height=22 alt=\"View\" border=\"0\"></a><br>\n"; + + } + } + + print "</tr></table>\n"; + + # Ok and refresh buttons + print "<p><center><table width=600>\n" + . "<tr><td width=300 align=center>\n" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&view=$Caseman::VOL_OPEN&$Args::baseargs\">" + . "<img border=0 src=\"pict/menu_b_close.jpg\" width=167 height=20 alt=\"close\"></a>\n" + . "</td><td width=300 align=center>\n" + . "<a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::READ_NORM&$Args::baseargs\">" + . "<img border=0 src=\"pict/menu_b_ref.jpg\" width=167 height=20 alt=\"refresh\"></a>\n" + . "</td></tr></table>\n"; + + close(NOTES); + + Print::print_html_footer(); + + return 0; +} + +######################################################################### +# Sequencer Code + +# Write a sequence event that was manually entered +sub write_seq_man { + + Args::check_note(); + + Print::print_html_header("Writing Sequencer Event"); + + # Get rid of carriage returns that Netscape adds + $Args::args{'note'} =~ tr/\r//d; + $Args::args{'note'} =~ s/\n/<br>/gs; + + if ($Args::args{'note'} eq "") { + print( "A comment must be given for the event<br>\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::READ_SEQ&$Args::baseargs\">" + . "<img border=0 src=\"pict/menu_b_ok.jpg\" " + . "width=167 height=20></a>"); + Print::print_err("\n"); + } + + # Check the args and add them to the final string that will be written + my $str = ""; + unless ((exists $Args::args{'year'}) + && ($Args::args{'year'} =~ /^(\d\d\d\d)$/)) + { + Print::print_err("Invalid year"); + } + $str .= "'$1',"; + + unless ((exists $Args::args{'mon'}) && ($Args::args{'mon'} =~ /^(\d\d?)$/)) + { + Print::print_err("Invalid month"); + } + $str .= "'$1',"; + + unless ((exists $Args::args{'day'}) && ($Args::args{'day'} =~ /^(\d\d?)$/)) + { + Print::print_err("Invalid day"); + } + $str .= "'$1',"; + + unless ((exists $Args::args{'hour'}) + && ($Args::args{'hour'} =~ /^(\d\d?)$/)) + { + Print::print_err("Invalid hour"); + } + $str .= "'$1',"; + + unless ((exists $Args::args{'min'}) && ($Args::args{'min'} =~ /^(\d\d?)$/)) + { + Print::print_err("Invalid min"); + } + $str .= "'$1',"; + + unless ((exists $Args::args{'sec'}) && ($Args::args{'sec'} =~ /^(\d\d?)$/)) + { + Print::print_err("Invalid sec"); + } + $str .= "'$1',"; + + # There are no image, meta, file name, or data unit for this type + $str .= "'$Args::args{'host'}','','','','',"; + + unless ((exists $Args::args{'src'}) && ($Args::args{'src'} =~ /^(\w+)$/)) { + Print::print_err("Invalid src"); + } + $str .= "'$1','$Args::args{'note'}'\n"; + + # Write the string to the notes file + my $notes_file = investig_seq_notes_fname(); + open NOTES, ">>$notes_file" or die "Can't open log: $notes_file"; + print NOTES $str; + close(NOTES); + + # Send a message to the user + print "Event Added to Sequencer file:<br><br>\n" + . "$::d2m[$Args::args{'mon'}] $Args::args{'day'}, $Args::args{'year'} " + . "$Args::args{'hour'}:$Args::args{'min'}:$Args::args{'sec'}<br><br>\n" + . Print::html_encode($Args::args{'note'})."<br>\n" + . "<p><a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::READ_SEQ&$Args::baseargs&" + . "year=$Args::enc_args{'year'}&mon=$Args::enc_args{'mon'}&day=$Args::enc_args{'day'}&" + . "hour=$Args::enc_args{'hour'}&min=$Args::enc_args{'min'}&sec=$Args::enc_args{'sec'}\">" + . "<img border=0 src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=43 height=20></a>\n"; + + Print::print_html_footer(); + return 0; +} + +# View the sequencer file +sub read_seq { + + Print::print_html_header("Event Sequencer"); + + print "<center>\n" . "<h3>Event Sequencer</h3>\n"; + + my $cnt = 0; + my @entry; + my ( + @year, @mon, @day, @hour, @min, @sec, @host, + @vol, @fname, @meta, @data, @type, @note + ); + + # Read the sequencer file into arrays that will be sorted + my $notes_file = investig_seq_notes_fname(); + if (-e $notes_file) { + + open NOTES, "$notes_file" or die "Can't open log: $notes_file"; + while (<NOTES>) { + + unless ( +/^'?(\d+)'?,'?(\d+)'?,'?(\d+)'?,'?(\d+)'?,'?(\d+)'?,'?(\d+)'?,'?($::REG_HOST)'?,'?($::REG_VNAME)?'?,'?(.*?)'?,'?($::REG_META)?'?,'?(\d+)?'?,'?([\w\s]+)'?,'?(.*?)'?$/ + ) + { + Print::print_err("Error parsing sequence event entry: $_"); + } + + $year[$cnt] = $1; + $mon[$cnt] = $2; + $day[$cnt] = $3; + $hour[$cnt] = $4; + $min[$cnt] = $5; + $sec[$cnt] = $6; + $host[$cnt] = $7; + $vol[$cnt] = $8; + $fname[$cnt] = ""; + $fname[$cnt] = $9 if (defined $9); + $meta[$cnt] = ""; + $meta[$cnt] = $10 if (defined $10); + $data[$cnt] = ""; + $data[$cnt] = $11 if (defined $11); + $type[$cnt] = $12; + $note[$cnt] = $13; + + $entry[$cnt] = $cnt; + $cnt++; + } + + close(NOTES); + + # Sort the values by date, source, and then note + my @sorted = sort { + $year[$a] <=> $year[$b] + or $mon[$a] <=> $mon[$b] + or $day[$a] <=> $day[$b] + or $hour[$a] <=> $hour[$b] + or $min[$a] <=> $min[$b] + or $sec[$a] <=> $sec[$b] + or lc($type[$a]) cmp lc($type[$b]) + or lc($note[$a]) cmp lc($note[$b]) + } @entry; + + # Table and header + print "<table width=800 border=1>\n" + . "<tr background=\"$::YEL_PIX\">\n" + . "<th>Date & Time</th>\n" + . "<th>Source</th>\n" + . "<th>Event & Note</th></tr>\n"; + + # Cycle through the sorted events + my $row = 0; + foreach my $i (@sorted) { + + # Alternate row colors + if (($row % 2) == 0) { + print "<tr bgcolor=\"$::BACK_COLOR\">\n"; + } + else { + print "<tr bgcolor=\"$::BACK_COLOR_TABLE\">\n"; + } + + # Date & Time + print "<td align=left valign=top>\n" + . "$::d2m[$mon[$i]] $day[$i], $year[$i]" + . " $hour[$i]:$min[$i]:$sec[$i]</td>" + . "<td align=left valign=top>\n"; + + # If there is as name, then we will show it + # @@@ Why does an error message come up from here: + # Use of uninitialized value in string ne at + if ($fname[$i] ne "") { + + if ( (exists $vol[$i]) + && (defined $vol[$i]) + && ($vol[$i] ne "") + && (exists $Caseman::vol2mnt{$vol[$i]}) + && (exists $meta[$i])) + { + + # extract the prepended mnt value + my $mnt = $Caseman::vol2mnt{$vol[$i]}; + my $fname = ""; + $fname = $1 if ($fname[$i] =~ /^$mnt\/?(.*)$/); + + # Check if it is a directory + if ($type[$i] eq 'dir') { + print "<a href=\"$::PROGNAME?mod=$::MOD_FRAME&" + . "submod=$::MOD_FILE&vol=$vol[$i]&$Args::baseargs&meta=$meta[$i]&dir=$fname\" " + . "target=\"_blank\">\n" + . "<tt>$fname[$i]</tt></a>\n"; + } + else { + print "<a href=\"$::PROGNAME?mod=$::MOD_FILE&" + . "view=$File::CONT_FR&vol=$vol[$i]&$Args::baseargs&meta=$meta[$i]&dir=$fname\" " + . "target=\"_blank\">\n" + . "<tt>$fname[$i]</tt></a>\n"; + } + } + else { + print "<tt>$fname[$i]</tt>\n"; + } + } + + # Display the meta value if there was no name + elsif (($vol[$i] ne "") && (defined $meta[$i]) && ($meta[$i] ne "")) + { + my $ftype = $Caseman::vol2ftype{$vol[$i]}; + + # Include a link if we can + if (exists $Caseman::vol2mnt{$vol[$i]}) { + print "<a href=\"$::PROGNAME?mod=$::MOD_FRAME&" + . "submod=$::MOD_META&vol=$vol[$i]" + . "&$Args::baseargs&meta=$meta[$i]\" target=\"_blank\">\n" + . "$Fs::meta_str{$ftype}: $meta[$i]</a>\n"; + } + else { + print "$Fs::meta_str{$ftype}: $meta[$i]\n"; + } + } + + # Otherwise, just give the source type + else { + print "$type[$i]\n"; + } + print "</td>\n"; + + # Print the actual note + $note[$i] = Print::html_encode($note[$i]); + $note[$i] = " " if ($note[$i] eq ""); + print "<td align=left>$note[$i]</td></tr>\n"; + + $row++; + } + + print "</table>\n"; + + } + + # End of if file exists + else { + print "No events currently exist<br>\n"; + } + + # Ok and refresh buttons + print "<p><table width=600>\n" + . "<tr><td width=300 align=center>\n" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_OPEN&$Args::baseargs\">" + . "<img border=0 src=\"pict/menu_b_close.jpg\" width=167 height=20 alt=\"close\"></a>\n" + . "</td><td width=300 align=center>\n" + . "<a href=\"$::PROGNAME?mod=$::MOD_NOTES&" + . "view=$Notes::READ_SEQ&$Args::baseargs\">" + . "<img border=0 src=\"pict/menu_b_ref.jpg\" width=167 height=20 alt=\"refresh\"></a>\n" + . "</td></tr></table>\n"; + + # Manually add a new event + print "<hr>\n" + . "<b>Add a New Event</b><br><br>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<textarea rows=10 cols=50 wrap=\"virtual\" name=\"note\">" + . "</textarea><br>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_NOTES\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Notes::WRITE_SEQ_MAN\">\n" + . Args::make_hidden(); + + # Month + print "<table><tr><td align=\"left\">\n"; + print "<p>Date: " . "<select name=\"mon\" size=\"1\">\n"; + + my $prev = 1; + $prev = $Args::args{'mon'} + if ((exists $Args::args{'mon'}) && ($Args::args{'mon'} =~ /^\d+$/)); + + for my $i (1 .. 12) { + if ($i == $prev) { + print "<option value=$i selected>$::d2m[$i]</option>\n"; + } + else { + print "<option value=\"$i\">$::d2m[$i]</option>\n"; + } + } + + print "</select>\n"; + + # Day + print " <select name=\"day\" size=\"1\">\n"; + + $prev = 1; + $prev = $Args::args{'day'} + if ((exists $Args::args{'day'}) && ($Args::args{'day'} =~ /^\d+$/)); + + for my $i (1 .. 31) { + my $dstr = $i; + $dstr = "0$i" if ($i < 10); + + if ($prev eq $dstr) { + print "<option value=\"$dstr\" selected>$dstr</option>\n"; + } + else { + print "<option value=\"$dstr\">$dstr</option>\n"; + } + } + print "</select>\n"; + + # Year + $prev = 1900 + (localtime())[5]; + $prev = $Args::args{'year'} + if ((exists $Args::args{'year'}) && ($Args::args{'year'} =~ /^\d+$/)); + + print " <input type=\"text\" value=\"$prev\" " + . "name=\"year\" size=\"6\">\n"; + + # Hour + print " <select name=\"hour\" size=\"1\">\n"; + $prev = 0; + $prev = $Args::args{'hour'} + if ((exists $Args::args{'hour'}) && ($Args::args{'hour'} =~ /^\d+$/)); + + for my $i (0 .. 23) { + my $hstr = $i; + $hstr = "0$i" if ($i < 10); + + if ($prev eq $hstr) { + print "<option value=\"$hstr\" selected>$hstr</option>\n"; + } + else { + print "<option value=\"$hstr\">$hstr</option>\n"; + } + } + print "</select>\n"; + + # Min + print ":<select name=\"min\" size=\"1\">\n"; + $prev = 0; + $prev = $Args::args{'min'} + if ((exists $Args::args{'min'}) && ($Args::args{'min'} =~ /^\d+$/)); + + for my $i (0 .. 59) { + my $mstr = $i; + $mstr = "0$i" if ($i < 10); + if ($prev eq $mstr) { + print "<option value=\"$mstr\" selected>$mstr</option>\n"; + } + else { + print "<option value=\"$mstr\">$mstr</option>\n"; + } + } + print "</select>\n"; + + # Sec + print ":<select name=\"sec\" size=\"1\">\n"; + $prev = 0; + $prev = $Args::args{'sec'} + if ((exists $Args::args{'sec'}) && ($Args::args{'sec'} =~ /^\d+$/)); + + for my $i (0 .. 59) { + my $sstr = $i; + $sstr = "0$i" if ($i < 10); + + if ($prev eq $sstr) { + print "<option value=\"$sstr\" selected>$sstr</option>\n"; + } + else { + print "<option value=\"$sstr\">$sstr</option>\n"; + } + } + print "</select></td></tr>\n" . "<tr><td> </td></tr>\n"; + + # Type + print "<tr><td align=\"left\">Event Source: <select name=\"src\" size=1>\n" + . "<option value=\"firewall\">firewall</option>\n" + . "<option value=\"ids\">ids</option>\n" + . "<option value=\"isp\">isp</option>\n" + . "<option value=\"log\">log</option>\n" + . "<option value=\"other\" selected>other</option>\n" + . "<option value=\"person\">person</option>\n" + . "</select></td></tr>\n" + . "<tr><td> </td></tr>\n"; + + print +"<tr><td align=\"center\"><input type=\"image\" src=\"pict/menu_b_add.jpg\" " + . "width=167 height=20 alt=\"Add\" border=\"0\">\n</form></td></tr></table>\n"; + + Print::print_html_footer(); + return 0; +} + +# Conver the 'image' format to the 'volume' format +sub convert { + my %img2vol = %{shift()}; + + my @invs = Caseman::read_invest(); + if (scalar @invs == 0) { + push @invs, "unknown"; + } + + foreach $i (@invs) { + my $notes_file = "$::host_dir" . "$::LOGDIR/$i.notes"; + + if ((!(-e "$notes_file")) || (-z "$notes_file")) { + next; + } + Print::log_host_info( + "Converting format of notes file for $i ($notes_file)"); + + open NOTES, "<$notes_file" or die "Can't open log: $notes_file"; + + my $notes_file_new = $notes_file . ".new"; + open NOTES_NEW, ">$notes_file_new" + or die "Can't open writing log: $notes_file_new"; + + while (<NOTES>) { + + if (/Image: ($::REG_IMG)\s+(.*)$/) { + my $img = $1; + my $addr = $2; + + unless (exists $img2vol{$img}) { + print STDERR +"Error finding image during notes conversion: $img. Not converting\n"; + next; + } + my $vol = $img2vol{$img}; + + # Convert old description to last versions + $addr =~ s/Inode:/Meta:/; + print NOTES_NEW "Volume: $vol $addr\n"; + } + else { + print NOTES_NEW $_; + } + } + + close(NOTES); + close(NOTES_NEW); + rename $notes_file, $notes_file . ".bak"; + rename $notes_file_new, $notes_file; + } + + # NOw do sequence notes + foreach $i (@invs) { + my $notes_file = "$::host_dir" . "$::LOGDIR/$i.seq.notes"; + if ((!(-e "$notes_file")) || (-z "$notes_file")) { + next; + } + + open NOTES, "$notes_file" or die "Can't open log: $notes_file"; + + $notes_file_new = $notes_file . ".new"; + open NOTES_NEW, ">$notes_file_new" + or die "Can't open log for updating: $notes_file_new"; + + while (<NOTES>) { + + # No image in entry + if (/^'\d+','\d+','\d+','\d+','\d+','\d+','$::REG_HOST','','/) { + print NOTES_NEW $_; + } + elsif ( +/^('\d+','\d+','\d+','\d+','\d+','\d+','$::REG_HOST',')($::REG_IMG)(','.*)$/ + ) + { + my $pre = $1; + my $img = $2; + my $post = $3; + unless (exists $img2vol{$img}) { + print STDERR +"Error finding image during notes conversion: $img. Not converting\n"; + next; + } + my $vol = $img2vol{$img}; + print NOTES_NEW $pre . $vol . $post . "\n"; + } + else { + print NOTES_NEW "$_"; + return; + } + } + + close(NOTES); + close(NOTES_NEW); + rename $notes_file, $notes_file . ".bak"; + rename $notes_file_new, $notes_file; + } + + return 0; +} diff --git a/lib/Print.pm b/lib/Print.pm new file mode 100644 index 0000000000..417caa70f4 --- /dev/null +++ b/lib/Print.pm @@ -0,0 +1,390 @@ +package Print; + +# +# Utilities to print information +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Escape HTML entities +# Converts \n to <br>\n +sub html_encode { + my $text = shift; + $text =~ s/&/&/gs; + $text =~ s/</</gs; + $text =~ s/>/>/gs; + $text =~ s/\"/"/gs; + $text =~ s/\n/<br>\n/gs; + + # @@@ LEADING SPACES and TABS + # while ($text =~ s/^( )*\t/"$1 "/eig) {} + # while ($text =~ s/^( )* /"$1 "/eig) {} + return $text; +} + +# remove control chars from printout +# this does not escape HTML entities, so you can pass this HTML code +sub print_output { + my $out = shift; + print "$out"; + + while (my $out = shift) { + foreach $_ (split(//, $out)) { + if ( ($_ eq "\n") + || ($_ eq "\r") + || ($_ eq "\f") + || ($_ eq "\t")) + { + print "$_"; + } + elsif ((ord($_) < 0x20) && (ord($_) >= 0x00)) { + print "^" . ord($_); + } + else { + print "$_"; + } + } + } +} + +# Added to provide output in hexdump format +# function gets called on a per-icat basis, +# The offset value is the byte offset that this data +# starts at, since the File.pm code calls it in 1024 +# byte chunks) +sub print_hexdump { + my $out = shift; # data to output + my $offset = shift; # starting byte offset in file + my $buf = ""; + + foreach $i (split(//, $out)) { + my $idx = $offset % 16; + + if ($idx == 0) { + printf("%08X: ", $offset); + } + + printf("%02X", ord($i)); + if (($idx % 2) == 1) { + printf(" "); + } + + $buf[$idx] = $i; + + if ($idx == 15) { + print " "; + for (my $j = 0; $j < 16; $j++) { + if ($buf[$j] =~ m/[ -~]/) { + print $buf[$j]; + } + else { + print "."; + } + $buf[$j] = 0; + } + print "\n"; + } + $offset++; + } + + # print out last line if < 16 bytes long + my $l = $offset % 16; + + if ($l) { + my $t = (16 - $l) * 2 + (16 - $l) / 2; + for (my $j = 0; $j < $t; $j++) { + print " "; + } + print " "; + for (my $j = 0; $j < $l; $j++) { + if ($buf[$j] =~ m/[ -~]/) { + print $buf[$j]; + } + else { + print "."; + } + } + print "\n"; + } +} + +############################################ +# +# HTTP/HTML Headers and Footers + +# The page that makes the frameset does not have a body statement +# This routine is used to make the minimum required header statements +sub print_html_header_frameset { + my $text = shift; + print "Content-Type: text/html; charset=utf-8$::HTTP_NL$::HTTP_NL"; + + my $time = localtime(); + + print <<EOF; +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<!-- Autopsy ver. $::VER Forensic Browser --> +<!-- Page created at: $time --> +<head> + <title>$text</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <link rel="stylesheet" href="global.css"> +</head> + +EOF +} + +sub print_html_footer_frameset { + print "\n</html>\n" . "$::HTTP_NL$::HTTP_NL"; +} + +# Create the header information with the body tag +sub print_html_header { + print_html_header_frameset(shift); + print "<body bgcolor=\"$::BACK_COLOR\">\n\n"; + print "<link rel=\"SHORTCUT ICON\" href=\"pict/favicon.ico\">\n"; +} + +sub print_html_footer { + print "\n</body>\n</html>\n" . "$::HTTP_NL$::HTTP_NL"; +} + +# Print the header with the margins set to 0 so that the tab buttons +# are flush with the edges of the frame +sub print_html_header_tabs { + print_html_header_frameset(shift); + print "<body marginheight=0 marginwidth=0 topmargin=0 " + . "leftmargin=0 rightmargin=0 botmargin=0 bgcolor=\"$::BACK_COLOR\">\n\n"; + print "<link rel=\"SHORTCUT ICON\" href=\"pict/favicon.ico\">\n"; + $is_body = 1; +} + +sub print_html_footer_tabs { + print "\n</body>\n</html>\n" . "$::HTTP_NL$::HTTP_NL"; +} + +# Header for front page to warn about java script +sub print_html_header_javascript { + my $text = shift; + print "Content-Type: text/html; charset=utf-8$::HTTP_NL$::HTTP_NL"; + + my $time = localtime(); + + # The write line has to stay on one line + print <<EOF; +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<!-- Autopsy ver. $::VER Forensic Browser --> +<!-- Page created at: $time --> +<head> + <title>$text</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <link rel="stylesheet" href="global.css"> + <script language=\"JavaScript\"> + <!-- hide script from old browsers + document.write(\'<center><font color=\"red\"><p>WARNING: Your browser currently has Java Script enabled.</font><p>You do not need Java Script to use Autopsy and it is recommended that it be turned off for security reasons.<hr></center>\'); + //--> + </script> +</head> + +<body bgcolor=\"$::BACK_COLOR\"> +<link rel=\"SHORTCUT ICON\" href=\"pict/favicon.ico\"> + +EOF +} + +sub print_html_footer_javascript { + print "\n</body>\n</html>\n" . "$::HTTP_NL$::HTTP_NL"; +} + +# For raw text outputs (Pass the name of a file if it is being saved) +sub print_text_header { + print "Content-Type: text/plain; charset=utf-8$::HTTP_NL"; + if (scalar @_ > 0) { + my $fname = shift(); + print "Content-Disposition: inline; " . "filename=$fname;$::HTTP_NL"; + } + print "$::HTTP_NL"; +} + +sub print_text_footer { + print "$::HTTP_NL$::HTTP_NL"; +} + +# For forced save outputs +sub print_oct_header { + print "Content-Type: application/octet-stream$::HTTP_NL"; + if (scalar @_ > 0) { + my $fname = shift(); + print "Content-Disposition: inline; " . "filename=$fname;$::HTTP_NL"; + } + print "$::HTTP_NL"; +} + +sub print_oct_footer { +} + +# Error message that is used when an HTTP/HTML header is needed +# This escapes the characters that chould be HTML entities. +# it will also replace \n with <br> and other things that html_encode() +# can do. Do not send arbitrary HTML to this function. +sub print_check_err { + print_html_header(""); + print html_encode(shift()) . "<br>\n"; + print_html_footer(); + sleep(1); + exit 1; +} + +# Error message when header already exists +# This escapes the characters that chould be HTML entities. +# it will also replace \n with <br> and other things that html_encode() +# can do. Do not send arbitrary HTML to this function. +sub print_err { + print html_encode(shift()) . "<br>\n"; + sleep(1); + print_html_footer(); + exit 1; +} + +################################################################## +# +# Logging +# +# + +sub investig_log_fname { + return "" unless (defined $::host_dir && $::host_dir ne ""); + return "" unless (exists $Args::args{'inv'} && $Args::args{'inv'} ne ""); + + return "$::host_dir" . "$::LOGDIR/$Args::args{'inv'}.log"; +} + +sub investig_exec_log_fname { + return "" unless (defined $::host_dir && $::host_dir ne ""); + return "" unless (exists $Args::args{'inv'} && $Args::args{'inv'} ne ""); + + return "$::host_dir" . "$::LOGDIR/$Args::args{'inv'}.exec.log"; +} + +sub host_log_fname { + return "" unless (defined $::host_dir && $::host_dir ne ""); + + return "$::host_dir" . "$::LOGDIR/host.log"; +} + +sub case_log_fname { + return "" unless (defined $::case_dir && $::case_dir ne ""); + + return "$::case_dir" . "case.log"; +} + +# Log data to the investigators specific log file +sub log_host_inv { + return unless ($::USE_LOG == 1); + + my $str = shift; + chomp $str; + + my $date = localtime; + my $fname = investig_log_fname(); + return if ($fname eq ""); + + open HOSTLOG, ">>$fname" or die "Can't open log: $fname"; + print HOSTLOG "$date: $str\n"; + close(HOSTLOG); + + return; +} + +sub log_host_inv_exec { + return unless ($::USE_LOG == 1); + my $str = shift; + chomp $str; + + my $date = localtime; + my $fname = investig_exec_log_fname(); + return if ($fname eq ""); + + open HOSTLOG, ">>$fname" or die "Can't open log: $fname"; + print HOSTLOG "$date: $str\n"; + close(HOSTLOG); + + return; +} + +# log data to the general log file for the host +sub log_host_info { + return unless ($::USE_LOG == 1); + + my $str = shift; + chomp $str; + + my $date = localtime; + my $fname = host_log_fname(); + return if ($fname eq ""); + + open HOSTLOG, ">>$fname" or die "Can't open log: $fname"; + print HOSTLOG "$date: $str\n"; + close(HOSTLOG); + + return; +} + +sub log_case_info { + return unless ($::USE_LOG == 1); + my $str = shift; + chomp $str; + my $date = localtime; + my $fname = case_log_fname(); + return if ($fname eq ""); + + open CASELOG, ">>$fname" or die "Can't open log: $fname"; + print CASELOG "$date: $str\n"; + close(CASELOG); + + return; +} + +sub log_session_info { + return unless ($::USE_LOG == 1); + my $str = shift; + chomp $str; + my $date = localtime; + + my $lname = "autopsy.log"; + open AUTLOG, ">>$::LOCKDIR/$lname" or die "Can't open log: $lname"; + print AUTLOG "$date: $str\n"; + close(AUTLOG); + + return; +} + +1; diff --git a/lib/Timeline.pm b/lib/Timeline.pm new file mode 100644 index 0000000000..4cd676af93 --- /dev/null +++ b/lib/Timeline.pm @@ -0,0 +1,1425 @@ +# +# Timeline functions +# +# Brian Carrier [carrier@sleuthkit.org] +# Copyright (c) 2001-2005 by Brian Carrier. All rights reserved +# +# This file is part of the Autopsy Forensic Browser (Autopsy) +# +# Autopsy is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# Autopsy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Autopsy; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE. +# IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package Timeline; + +use POSIX; # needed for tzset + +# Changing the order of this may affect the main function ordering + +$Timeline::BLANK = 0; +$Timeline::FRAME = 1; +$Timeline::TABS = 2; +$Timeline::BODY_ENTER = 3; +$Timeline::BODY_RUN = 4; +$Timeline::TL_ENTER = 5; +$Timeline::TL_RUN = 6; +$Timeline::VIEW_FR = 7; +$Timeline::VIEW_MENU = 8; +$Timeline::VIEW_IDX = 9; +$Timeline::VIEW_SUM = 10; +$Timeline::VIEW = 11; + +# Types of modes for fname (i.e. can we overwrite it if it exists) +my $FNAME_MODE_INIT = 0; +my $FNAME_MODE_OVER = 1; + +sub main { + + return if ($::LIVE == 1); + + # By default, show the main frame + $Args::args{'view'} = $Args::enc_args{'view'} = $Timeline::FRAME + unless (exists $Args::args{'view'}); + + Args::check_view(); + my $view = Args::get_view(); + + if ($view < $Timeline::VIEW_FR) { + if ($view == $Timeline::BLANK) { + return blank(); + } + elsif ($view == $Timeline::FRAME) { + return frame(); + } + elsif ($view == $Timeline::TABS) { + return tabs(); + } + elsif ($view == $Timeline::BODY_ENTER) { + return body_enter(); + } + elsif ($view == $Timeline::BODY_RUN) { + return body_run(); + } + elsif ($view == $Timeline::TL_ENTER) { + return tl_enter(); + } + elsif ($view == $Timeline::TL_RUN) { + return tl_run(); + } + } + else { + if ($view == $Timeline::VIEW_FR) { + return view_fr(); + } + elsif ($view == $Timeline::VIEW_MENU) { + return view_menu(); + } + elsif ($view == $Timeline::VIEW_IDX) { + return view_idx(); + } + elsif ($view == $Timeline::VIEW_SUM) { + return view_sum(); + } + elsif ($view == $Timeline::VIEW) { + return view(); + } + } + Print::print_check_err("Invalid Timeline View"); +} + +# Call the appropriate function based on the value of sort +sub frame { + Print::print_html_header_frameset( + "Timeline: $Args::args{'case'}:$Args::args{'host'}"); + + print "<frameset rows=\"38,*\">\n"; + + my $submod = $Timeline::BLANK; + $submod = Args::get_submod() if (exists $Args::args{'submod'}); + + # Listing + print "<frame src=\"$::PROGNAME?mod=$::MOD_TL&view=$Timeline::TABS&" + . "$Args::baseargs&submod=$submod\">\n"; + + my $str = ""; + + # Contents + if ($submod == $Timeline::BLANK) { + print +"<frame src=\"$::PROGNAME?mod=$::MOD_TL&view=$Timeline::BLANK&$Args::baseargs\" " + . "name=\"content\">\n</frameset>\n"; + return; + } + elsif ($submod == $Timeline::TL_ENTER) { + $str .= "&body=$Args::args{'body'}" if (exists $Args::args{'body'}); + } + elsif ($submod == $Timeline::VIEW_FR) { + $str .= "&tl=$Args::args{'tl'}" if (exists $Args::args{'tl'}); + } + + print +"<frame src=\"$::PROGNAME?mod=$::MOD_TL&view=$submod&$Args::baseargs$str\" " + . "name=\"content\">\n</frameset>\n"; + + Print::print_html_footer_frameset(); + return 0; +} + +# The tabs / button images in timeline view +sub tabs { + Args::check_submod(); + Print::print_html_header_tabs("Timeline Mode Tabs"); + + my $submod = Args::get_submod(); + + print "<center><table width=\"800\" border=\"0\" " + . "cellspacing=\"0\" cellpadding=\"0\"><tr>\n"; + + # Create Datafile + print "<td align=\"center\" width=174>" + . "<a href=\"$::PROGNAME?mod=$::MOD_TL&view=$Timeline::FRAME&" + . "submod=$Timeline::BODY_ENTER&$Args::baseargs\" target=\"_top\">"; + + if ($submod == $Timeline::BODY_ENTER) { + print "<img border=0 " + . "src=\"pict/tl_t_data_cur.jpg\" " + . "width=174 height=38 " + . "alt=\"Create Data File (Current Mode)\"></a>\n"; + } + else { + print "<img border=0 " + . "src=\"pict/tl_t_data_link.jpg\" " + . "width=174 height=38 " + . "alt=\"Create Data File\"></a>\n"; + } + + print "</td>\n" + . "<td align=\"center\" width=174>" + . "<a href=\"$::PROGNAME?mod=$::MOD_TL&view=$Timeline::FRAME&" + . "submod=$Timeline::TL_ENTER&$Args::baseargs\" " + . "target=\"_top\">"; + + # Create Timeline + if ($submod == $Timeline::TL_ENTER) { + print "<img border=0 " + . "src=\"pict/tl_t_tl_cur.jpg\" " + . "width=174 height=38 " + . "alt=\"Create Timeline (Current Mode)\"></a>\n"; + } + else { + print "<img border=0 " + . "src=\"pict/tl_t_tl_link.jpg\" " + . "width=174 height=38 " + . "alt=\"Create Timeline\"></a>\n"; + } + print "</td>\n" + . "<td align=\"center\" width=174>" + . "<a href=\"$::PROGNAME?mod=$::MOD_TL&view=$Timeline::FRAME&" + . "submod=$Timeline::VIEW_MENU&$Args::baseargs\" " + . "target=\"_top\">"; + + # View Timeline + if (($submod == $Timeline::VIEW_FR) || ($submod == $Timeline::VIEW_MENU)) { + print "<img border=0 " + . "src=\"pict/tl_t_view_cur.jpg\" " + . "width=174 height=38 " + . "alt=\"View Timeline (Current Mode)\"></a>\n"; + } + else { + print "<img border=0 " + . "src=\"pict/tl_t_view_link.jpg\" " + . "width=174 height=38 " + . "alt=\"View Timeline\"></a>\n"; + } + + # Notes + print "</td>\n" . "<td align=\"center\" width=174>"; + if ($::USE_NOTES == 1) { + print +"<a href=\"$::PROGNAME?mod=$::MOD_NOTES&view=$Notes::READ_NORM&$Args::baseargs_novol\" " + . "target=\"_blank\">" + . "<img border=0 " + . "src=\"pict/tl_t_notes_link.jpg\" " + . "width=174 height=38 " + . "alt=\"View Notes\"></a></td>\n"; + } + else { + print "<img border=0 " + . "src=\"pict/tl_t_notes_org.jpg\" " + . "width=174 height=38 " + . "alt=\"View Notes\"></a></td>\n"; + } + + # Help - set to current submod + print "<td align=\"center\" width=52>" + . "<a href=\"$::HELP_URL\" target=\"_blank\">" + . "<img border=0 src=\"pict/tab_help.jpg\" width=52 " + . "alt=\"Help\"></a></td>\n"; + + # Close + print "<td align=\"center\" width=52>" + . "<a href=\"$::PROGNAME?mod=$::MOD_CASEMAN&" + . "view=$Caseman::VOL_OPEN&$Args::baseargs\" target=\"_top\">" + . "<img border=0 src=\"pict/tab_close.jpg\" width=52 " + . "alt=\"Exit to Host Manager\"></a></td>\n" + . "</tr></table>\n"; + + Print::print_html_footer_tabs(); + return 0; +} + +sub body_enter { + Print::print_html_header("Enter Data to Make Body File"); + + my $i; + my %mnt2img; + + # Cycle through each image we read from fsmorgue + foreach $i (keys %Caseman::vol2mnt) { + next + unless ($Caseman::vol2cat{$i} eq "part"); + next + if ( ($Caseman::vol2ftype{$i} eq "swap") + || ($Caseman::vol2ftype{$i} eq "raw")); + $mnt2vol{"$Caseman::vol2mnt{$i}--$i"} = $i; + } + +# sort via parent volume, then starting location, and then mount point (which includes the name) + my @mnt = sort { + ($Caseman::vol2par{$mnt2vol{$a}} cmp $Caseman::vol2par{$mnt2vol{$b}}) + or ($Caseman::vol2start{$mnt2vol{$a}} <=> + $Caseman::vol2start{$mnt2vol{$b}}) + or (lc($a) cmp lc($b)) + } keys %mnt2vol; + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::BODY_RUN\">\n" + . Args::make_hidden() + . "<p>Here we will process the file system images, collect the temporal data, and save the data to a single file." + . "<p>1. Select one or more of the following images to collect data from:\n" + . "<table cellspacing=\"8\" cellpadding=\"2\">"; + + for (my $i = 0; $i <= $#mnt; $i++) { + my $vol = $mnt2vol{$mnt[$i]}; + + print "<tr><td><input type=\"checkbox\" name=\"$vol\" value=\"1\">" + . "</td><td><tt>$Caseman::vol2mnt{$vol}</tt></td><td><tt>$Caseman::vol2sname{$vol}</tt></td>" + . "<td>$Caseman::vol2ftype{$vol}</td>\n"; + } + + print "</table><p>2. Select the data types to gather:<br>\n" + . "<table cellspacing=\"8\" cellpadding=\"2\"><tr>" + . "<td><input type=\"checkbox\" name=\"al_file\" value=\"1\" CHECKED>" + . "</td><td>Allocated Files</td>" + . "<td><input type=\"checkbox\" name=\"unal_file\" value=\"1\" CHECKED>" + . "</td><td>Unallocated Files</td>" + . "</tr></table>\n" + . "<p>3. Enter name of output file (<tt>body</tt>):<br>" + . "<tt>$::DATADIR/</tt>" + . "<input type=\"text\" name=\"fname\" value=\"body\">\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_INIT\">\n" + . "<p>4. Generate MD5 Value? " + . "<input type=\"checkbox\" name=\"md5\" value=\"1\" CHECKED>"; + + print "<p><input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\"></form>\n"; + + Print::print_html_footer(); + return 0; +} + +sub body_run { + Args::check_fname(); + Args::check_fname_mode(); + Print::print_html_header("Make Body File"); + + my $fname_rel = Args::get_fname_rel(); + my $fname = Args::get_fname(); + + my $fname_mode = $Args::args{'fname_mode'}; + + if ((-e "$fname") && ($FNAME_MODE_INIT == $fname_mode)) { + print "File Already Exists: $fname_rel\n"; + + my $hidden = Args::make_hidden(); + + $hidden .= + "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::BODY_RUN\">\n"; + + my $i; + foreach $i (%Caseman::vol2mnt) { + $hidden .= "<input type=\"hidden\" name=\"$i\" value=\"1\">\n" + if (exists $Args::args{$i}); + } + + $hidden .= + "<input type=\"hidden\" name=\"al_file\" " + . "value=\"$Args::args{'al_file'}\">\n" + if (exists $Args::args{'al_file'}); + $hidden .= + "<input type=\"hidden\" name=\"unal_file\" " + . "value=\"$Args::args{'unal_file'}\">\n" + if (exists $Args::args{'unal_file'}); + $hidden .= + "<input type=\"hidden\" name=\"md5\" " + . "value=\"$Args::args{'md5'}\">\n" + if (exists $Args::args{'md5'}); + + # Make a new name + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "New Name: <input type=\"text\" name=\"fname\">" + . "<table cellspacing=\"30\" cellpadding=\"2\"><tr><td>" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_INIT\">\n" + . "$hidden" + . "<input type=\"image\" src=\"pict/but_new_name.jpg\" " + . "width=79 height=20 alt=\"Use New Name\" border=\"0\">\n" + . "</form></td>\n"; + + # Overwrite it + print "<td><form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"image\" src=\"pict/but_replace.jpg\" " + . "width=66 height=20 alt=\"Replace\" border=\"0\"><br>\n" + . "<input type=\"hidden\" name=\"fname\" value=\"$Args::args{'fname'}\">\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_OVER\">\n" + . "$hidden" + . "</form></td></tr></table>"; + + return 0; + } + + # we will be appending to the file so we should del it now + if (-e "$fname") { + unlink($fname); + } + + my $log_files = ""; + my $log_type = ""; + + # What kind of data are we collecting? + my $al_file = 0; + if (exists $Args::args{'al_file'}) { + $al_file = $Args::args{'al_file'}; + $log_type .= "Allocated Files"; + } + + my $unal_file = 0; + if (exists $Args::args{'unal_file'}) { + $unal_file = $Args::args{'unal_file'}; + $log_type .= ", " if ($log_type ne ""); + $log_type .= "Unallocated Files"; + } + + if (($unal_file == 0) && ($al_file == 0)) { + print + "No data types were selected. You must select at least one.<br>\n"; + return 1; + } + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + my $i; + my $found = 0; + local *OUT; + + # Analyze each image - the image names are passed as an argument + foreach $i (keys %Caseman::vol2mnt) { + if (exists $Args::args{$i}) { + + $found = 1; + my $ftype = $Caseman::vol2ftype{$i}; + my $img = $Caseman::vol2path{$i}; + my $offset = $Caseman::vol2start{$i}; + my $imgtype = $Caseman::vol2itype{$i}; + my $mnt = $Caseman::vol2mnt{$i}; + + $log_files .= ", " if ($log_files ne ""); + $log_files .= "$i"; + + if (($al_file) && ($unal_file)) { + print "Running <tt>fls -r -m</tt> on <tt>$i</tt><br>\n"; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' $tz -s $Caseman::ts -m '$mnt' -f $ftype -r -o $offset -i $imgtype $img >> '$fname'" + ); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + } + elsif ($al_file) { + print "Running <tt>fls -ru -m</tt> on <tt>$i</tt><br>\n"; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' $tz -s $Caseman::ts -m '$mnt' -f $ftype -ru -o $offset -i $imgtype $img >> '$fname'" + ); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + } + elsif ($unal_file) { + print "Running <tt>fls -rd -m</tt> on <tt>$i</tt><br>\n"; + Exec::exec_pipe(*OUT, +"'$::TSKDIR/fls' $tz -s $Caseman::ts -m '$mnt' -f $ftype -rd -o $offset -i $imgtype $img >> '$fname'" + ); + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + } + } + } + + unless ($found) { + print +"No images were given for analysis. At least one must be selected.<br>\n"; + return 1; + } + + Print::log_host_inv( + "Saving timeline data for $log_type for $log_files to $fname_rel"); + + # append to host config + my $bod_vol = Caseman::add_vol_host_config("body", $fname_rel); + $Caseman::vol2cat{$bod_vol} = "timeline"; + $Caseman::vol2ftype{$bod_vol} = "body"; + $Caseman::vol2itype{$bod_vol} = "raw"; + $Caseman::vol2path{$bod_vol} = $fname; + $Caseman::vol2start{$bod_vol} = 0; + $Caseman::vol2end{$bod_vol} = 0; + $Caseman::vol2sname{$bod_vol} = $fname_rel; + + print "<br>Body file saved to <tt>$fname</tt><br><br>\n" + . "Entry added to host config file<br><br>\n"; + + # Calculate MD5 + if ((exists $Args::args{'md5'}) && ($Args::args{'md5'} == 1)) { + print "Calculating MD5 Value<br><br>\n"; + my $m = Hash::int_create_wrap($bod_vol); + print "MD5 Value: <tt>$m</tt><br><br>\n"; + } + + print "<p>The next step is to sort the data into a timeline." + . "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"body\" value=\"$bod_vol\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$Timeline::TL_ENTER\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return 0; +} + +my $OTYPE_NORM = 1; +my $OTYPE_HOURLY = 2; +my $OTYPE_DAILY = 3; + +sub tl_enter { + Print::print_html_header("Enter data for timeline"); + + my @body; + + # Find the body files if we will be looking for them + unless ((exists $Args::args{'body'}) + && (exists $Caseman::vol2cat{$Args::args{'body'}})) + { + foreach my $k (keys %Caseman::vol2cat) { + if ( ($Caseman::vol2cat{$k} eq "timeline") + && ($Caseman::vol2ftype{$k} eq "body")) + { + push @body, $k; + } + } + + if (scalar(@body) == 0) { + print "There are currently no <tt>body</tt> files " + . "for this host.<br>You must create the intermediate " + . "data file before you can perform this step<br>\n" + . "<p><a target=\"_top\" " + . "href=\"$::PROGNAME?$Args::baseargs&" + . "mod=$::MOD_TL&view=$Timeline::FRAME&" + . "submod=$Timeline::BODY_ENTER\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\">" + . "</a>\n"; + return 1; + } + } + print "Now we will sort the data and save it to a timeline.<p>\n" + . "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::TL_RUN\">\n" + . Args::make_hidden() + . "1. Select the data input file (<tt>body</tt>):\n" + . "<table cellspacing=\"0\" cellpadding=\"2\">"; + + # if the body file was specified then just print it + if (exists $Args::args{'body'}) { + print "<tr><td><input type=\"radio\" name=\"body\" " + . "value=\"$Args::args{'body'}\" CHECKED>" + . "</td><td>$Caseman::vol2sname{$Args::args{'body'}}</td>\n"; + } + else { + my @body_sort = sort { lc($a) cmp lc($b) } @body; + my $chk = " CHECKED"; + for (my $i = 0; $i <= $#body_sort; $i++) { + print "<tr><td><input type=\"radio\" name=\"body\" " + . "value=\"$body_sort[$i]\" $chk></td><td>$Caseman::vol2sname{$body_sort[$i]}</td>\n"; + $chk = ""; + } + } + + my $cur_mon = 1 + (localtime())[4]; + my $cur_year = 1900 + (localtime())[5]; + + # STARTING DATE + print "</table>\n" + . "<p>2. Enter the starting date:<br>\n" + . "None: <input type=\"radio\" name=\"st_none\" value=\"1\" CHECKED><br>" + . "Specify: <input type=\"radio\" name=\"st_none\" value=\"0\"> " + . "<select name=\"st_mon\" size=\"1\">"; + + for my $i (1 .. 12) { + if ($i == $cur_mon) { + print "<option selected value=\"$i\">$::d2m[$i]</option>\n"; + } + else { + print "<option value=\"$i\">$::d2m[$i]</option>\n"; + } + } + + print "</select>" + . "<select name=\"st_day\" size=\"1\">" + . "<option selected>1</option>\n"; + + for my $i (2 .. 31) { + print "<option value=\"$i\">$i</option>\n"; + } + + print "</select>" + . "<input type=\"text\" name=\"st_year\" size=\"6\" value=\"$cur_year\">\n"; + + # END DATE + print "<p>3. Enter the ending date:<br>\n" + . "None: <input type=\"radio\" name=\"end_none\" value=\"1\" CHECKED><br>\n" + . "Specify: <input type=\"radio\" name=\"end_none\" value=\"0\"> \n" + . "<select name=\"end_mon\" size=\"1\">\n"; + + for my $i (1 .. 12) { + if ($i == $cur_mon) { + print "<option selected value=\"$i\">$::d2m[$i]</option>\n"; + } + else { + print "<option value=\"$i\">$::d2m[$i]</option>\n"; + } + } + + print "</select>\n" + . "<select name=\"end_day\" size=\"1\">\n" + . "<option selected value=\"1\">1</option>\n"; + + for my $i (2 .. 31) { + print "<option value=\"$i\">$i</option>\n"; + } + + print "</select>" + . "<input type=\"text\" name=\"end_year\" size=\"6\" value=\"$cur_year\">\n"; + + # FILE NAME + print "<p>4. Enter the file name to save as:<br>" + . "<tt>$::DATADIR/</tt><input type=\"text\" size=36 name=\"fname\" value=\"timeline.txt\"><br>\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_INIT\">\n"; + + # Get only the UNIX images - since only they have /etc/passwd and group + my @unix_imgs; + my $root_vol = ""; + foreach my $i (keys %Caseman::vol2ftype) { + my $f = $Caseman::vol2ftype{$i}; + + next + unless (($f =~ /^ext/) + || ($f =~ /^ufs/) + || ($f =~ /^linux/) + || ($f =~ /bsd$/) + || ($f =~ /^solaris$/) + || ($f =~ /^bsdi$/)); + + push @unix_vols, $i; + + # Keep a reference to an image with '/' as the mounting point + $root_vol = $i + if ($Caseman::vol2mnt{$i} eq '/'); + } + + my $cnt = 5; + if (scalar @unix_vols > 0) { + + print +"<p>$cnt. Select the UNIX image that contains the /etc/passwd and /etc/group files:<br>\n"; + $cnt++; + + print "<select name=\"pw_vol\">\n"; + + # If we did not find an image that has a / mounting point, then + # we will use none as the default. + if ($root_vol eq "") { + print "<option value=\"\" selected>None</option>\n"; + } + else { + print "<option value=\"\">None</option>\n"; + } + + foreach my $vol (@unix_vols) { + if ($root_vol eq $vol) { + print +"<option value=\"$vol\" selected>$Caseman::vol2sname{$vol} ($Caseman::vol2mnt{$vol})" + . "</option>\n"; + } + else { + print +"<option value=\"$vol\">$Caseman::vol2sname{$vol} ($Caseman::vol2mnt{$vol})</option>\n"; + } + } + + print "</select>\n"; + } + + print "<p>$cnt. Choose the output format:<br>\n"; + $cnt++; + print +" <input type=\"radio\" name=\"sort\" value=\"$OTYPE_NORM\" CHECKED>Tabulated (normal)<br>\n" + . " <input type=\"radio\" name=\"sort\" value=\"$OTYPE_HOURLY\">Comma delimited with hourly summary<br>\n" + . " <input type=\"radio\" name=\"sort\" value=\"$OTYPE_DAILY\">Comma delimited with daily summary<br>\n"; + + print "<p>$cnt. Generate MD5 Value? "; + $cnt++; + + print "<input type=\"checkbox\" name=\"md5\" value=\"1\" CHECKED>\n"; + + # Create Button + print "<p><input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return 0; +} + +sub tl_run { + Args::check_fname(); + Args::check_body(); + Args::check_sort(); + + Print::print_html_header("Make Timeline"); + + my $body = Args::get_body(); + my $fname = Args::get_fname(); + my $fname_rel = Args::get_fname_rel(); + my $otype = Args::get_sort(); + + my $fname_mode = $Args::args{'fname_mode'}; + + if ((-e "$fname") && ($FNAME_MODE_INIT == $fname_mode)) { + print "File Already Exists: <tt>$fname_rel</tt><br>\n"; + + my $hidden = + "<input type=\"hidden\" name=\"body\" value=\"$Args::args{'body'}\">" + . Args::make_hidden(); + + $hidden .= + "<input type=\"hidden\" name=\"st_none\" " + . "value=\"$Args::args{'st_none'}\">\n" + if (exists $Args::args{'st_none'}); + $hidden .= + "<input type=\"hidden\" name=\"st_year\" " + . "value=\"$Args::args{'st_year'}\">\n" + if (exists $Args::args{'st_year'}); + $hidden .= + "<input type=\"hidden\" name=\"st_day\" " + . "value=\"$Args::args{'st_day'}\">\n" + if (exists $Args::args{'st_day'}); + $hidden .= + "<input type=\"hidden\" name=\"st_mon\" " + . "value=\"$Args::args{'st_mon'}\">\n" + if (exists $Args::args{'st_mon'}); + $hidden .= + "<input type=\"hidden\" name=\"end_none\" " + . "value=\"$Args::args{'end_none'}\">\n" + if (exists $Args::args{'end_none'}); + $hidden .= + "<input type=\"hidden\" name=\"end_year\" " + . "value=\"$Args::args{'end_year'}\">\n" + if (exists $Args::args{'end_year'}); + $hidden .= + "<input type=\"hidden\" name=\"end_day\" " + . "value=\"$Args::args{'end_day'}\">\n" + if (exists $Args::args{'end_day'}); + $hidden .= + "<input type=\"hidden\" name=\"end_mon\" " + . "value=\"$Args::args{'end_mon'}\">\n" + if (exists $Args::args{'end_mon'}); + $hidden .= + "<input type=\"hidden\" name=\"tz\" " + . "value=\"$Args::args{'tz'}\">\n" + if (exists $Args::args{'tz'}); + $hidden .= + "<input type=\"hidden\" name=\"pw_vol\" " + . "value=\"$Args::args{'pw_vol'}\">\n" + if (exists $Args::args{'pw_vol'}); + $hidden .= + "<input type=\"hidden\" name=\"md5\" " + . "value=\"$Args::args{'md5'}\">\n" + if (exists $Args::args{'md5'}); + $hidden .= + "<input type=\"hidden\" name=\"sort\" " + . "value=\"$Args::args{'sort'}\">\n" + if (exists $Args::args{'sort'}); + + # Make a new name + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "New Name: <input type=\"text\" name=\"fname\">" + . "<table cellspacing=\"30\" cellpadding=\"2\"><tr><td>" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::TL_RUN\">\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_INIT\">\n" + . "$hidden\n" + . "<input type=\"image\" src=\"pict/but_new_name.jpg\" " + . "width=79 height=20 alt=\"Use New Name\" border=\"0\">\n" + . "</form></td>\n"; + + # Overwrite it + print "<td><form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"image\" src=\"pict/but_replace.jpg\" " + . "width=66 height=20 alt=\"Replace\" border=\"0\"><br>\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::TL_RUN\">\n" + . "<input type=\"hidden\" name=\"fname\" value=\"$Args::args{'fname'}\">\n" + . "<input type=\"hidden\" name=\"fname_mode\" value=\"$FNAME_MODE_OVER\" +>\n" . "$hidden\n" . "</form></td></tr></table>"; + + return 0; + } + + my $mon; + my $day; + my $year; + + my $date = ""; + + # Get the start date + unless ((exists $Args::args{'st_none'}) && ($Args::args{'st_none'} == 1)) { + + if (exists $Args::args{'st_mon'}) { + Args::check_st_mon(); + $mon = Args::get_st_mon(); + if (($mon < 1) || ($mon > 12)) { + print("Invalid starting month\n"); + return 1; + } + if ($mon < 10) { + $mon = "0" . $mon; + } + } + if (exists $Args::args{'st_year'}) { + Args::check_st_year(); + $year = Args::get_st_year(); + if (($year < 1970) || ($year > 2020)) { + print("Invalid starting year\n"); + return 1; + } + } + if ( (exists $Args::args{'st_day'}) + && ($Args::args{'st_day'} =~ /^(\d\d?)$/)) + { + $day = $1; + if (($day < 1) || ($day > 31)) { + print("Invalid starting day\n"); + return 1; + } + if ($day < 10) { + $day = "0" . $day; + } + } + else { + print("Invalid start day\n"); + return 1; + } + + $date = "$year-$mon-$day"; + } + + unless ((exists $Args::args{'end_none'}) && ($Args::args{'end_none'} == 1)) + { + + if ($date eq "") { + print "Begin date must be given if ending date is given<br>"; + return 1; + } + + if ( (exists $Args::args{'end_mon'}) + && ($Args::args{'end_mon'} =~ /^(\d\d?)$/)) + { + $mon = $1; + if (($mon < 1) || ($mon > 12)) { + print("Invalid end month\n"); + return 1; + } + if ($mon < 10) { + $mon = "0" . $mon; + } + } + else { + print("Invalid end month\n"); + return 1; + } + if ( (exists $Args::args{'end_year'}) + && ($Args::args{'end_year'} =~ /^(\d\d\d\d)$/)) + { + $year = $1; + if (($year < 1970) || ($year > 2020)) { + print("Invalid ending year\n"); + return 1; + } + + } + else { + print("Invalid end year\n"); + return 1; + } + if ( (exists $Args::args{'end_day'}) + && ($Args::args{'end_day'} =~ /^(\d\d?)$/)) + { + $day = $1; + if (($day < 1) || ($day > 31)) { + print("Invalid end day\n"); + return 1; + } + if ($day < 10) { + $day = "0" . $day; + } + } + else { + print("Invalid end day\n"); + return 1; + } + + $date .= "..$year-$mon-$day"; + } + + # temp strings for the password and group files + my $pw_tmp = ""; + my $gr_tmp = ""; + my $mac_args = ""; + my $log = ""; + + local *OUT; + + # Password and Group Files + if ((exists $Args::args{'pw_vol'}) && ($Args::args{'pw_vol'} ne "")) { + Args::check_vol('pw_vol'); + my $pw_vol = Args::get_vol('pw_vol'); + + my $ftype = $Caseman::vol2ftype{$pw_vol}; + my $img = $Caseman::vol2path{$pw_vol}; + my $offset = $Caseman::vol2start{$pw_vol}; + my $imgtype = $Caseman::vol2itype{$pw_vol}; + + $log .= "Password & Group File ($pw_vol) "; + + # Get the passwd file meta and copy the file + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ifind' -f $ftype -n 'etc/passwd' -o $offset -i $imgtype $img" + ); + my $pwi = Exec::read_pipe_line(*OUT); + close(OUT); + + $pwi = "Error getting meta for passwd" + if ((!defined $pwi) || ($pwi eq "")); + + # Do the Taint Checking + if ($pwi =~ /^($::REG_META)$/) { + $pwi = $1; + + $log .= "Password Meta Address ($pwi) "; + + # Find a temp name that we can call it + my $i; + for ($i = 0;; $i++) { + unless (-e "$fname.pw-$i") { + $pw_tmp = "$fname.pw-$i"; + last; + } + } + + Exec::exec_sys( +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $pwi > '$pw_tmp'" + ); + $mac_args .= " -p \'$pw_tmp\' "; + + } + else { + print( +"Error finding /etc/passwd meta in $Caseman::vol2sname{$pw_vol} ($pwi)<br>" + ); + Print::log_host_inv( +"$Caseman::vol2sname{$pw_vol}: /etc/passwd file not found for timeline" + ); + } + + # Get the group file meta and copy the file + Exec::exec_pipe(*OUT, +"'$::TSKDIR/ifind' -f $ftype -n 'etc/group' -o $offset -i $imgtype $img" + ); + my $gri = Exec::read_pipe_line(*OUT); + close(OUT); + + $gri = "Error getting meta for group" + if ((!defined $gri) || ($gri eq "")); + + # Do the Taint Checking + if ($gri =~ /^($::REG_META)$/) { + $gri = $1; + + $log .= "Group Meta Address ($gri) "; + + # Find a temp name that we can call it + my $i; + for ($i = 0;; $i++) { + unless (-e "$fname.gr-$i") { + $gr_tmp = "$fname.gr-$i"; + last; + } + } + Exec::exec_sys( +"'$::TSKDIR/icat' -f $ftype -o $offset -i $imgtype $img $gri > '$gr_tmp'" + ); + $mac_args .= " -g \'$gr_tmp\' "; + } + else { + print( +"Error finding /etc/group meta in $Caseman::vol2sname{$pw_vol} ($gri)<br>" + ); + Print::log_host_inv( +"$Caseman::vol2sname{$pw_vol}: /etc/group file not found for timeline" + ); + } + } + + if ($date eq "") { + print + "Creating Timeline using all dates (Time Zone: $Caseman::tz)<br>\n"; + Print::log_host_inv( +"$Caseman::vol2sname{$body}: Creating timeline using all dates (TZ: $Caseman::tz) ${log}to $fname_rel" + ); + } + else { + print "Creating Timeline for $date (Time Zone: $Caseman::tz)<br>\n"; + Print::log_host_inv( +"$Caseman::vol2sname{$body}: Creating timeline for $date (TZ: $Caseman::tz) ${log}to $fname_rel" + ); + } + + my $tz = ""; + $tz = "-z '$Caseman::tz'" unless ("$Caseman::tz" eq ""); + + # mactime needs the path to run the 'date' command + $ENV{PATH} = "/bin:/usr/bin"; + local *OUT; + if ($otype == $OTYPE_NORM) { + Exec::exec_pipe(*OUT, +"LANG=C LC_ALL=C '$::TSKDIR/mactime' -b $Caseman::vol2path{$body} $tz -i day '${fname}.sum' $mac_args $date > '$fname'" + ); + } + elsif ($otype == $OTYPE_HOURLY) { + Exec::exec_pipe(*OUT, +"LANG=C LC_ALL=C '$::TSKDIR/mactime' -b $Caseman::vol2path{$body} $tz -d -i hour '${fname}.sum' $mac_args $date > '$fname'" + ); + } + elsif ($otype == $OTYPE_DAILY) { + Exec::exec_pipe(*OUT, +"LANG=C LC_ALL=C '$::TSKDIR/mactime' -b $Caseman::vol2path{$body} $tz -d -i day '${fname}.sum' $mac_args $date > '$fname'" + ); + } + else { + Print::print_err("Unknown output type"); + } + + print "$_<br>\n" while ($_ = Exec::read_pipe_line(*OUT)); + close(OUT); + $ENV{PATH} = ""; + + # Remove the password and group files + unlink("$pw_tmp") if ($pw_tmp ne ""); + unlink("$gr_tmp") if ($gr_tmp ne ""); + + print "<br>Timeline saved to <tt>$fname</tt><br><br>\n"; + + # append to fsmorgue if a normal timeline + if ($otype == $OTYPE_NORM) { + my $tl_vol = Caseman::add_vol_host_config("timeline", $fname_rel); + print "Entry added to host config file<br><br>\n"; + + $Caseman::vol2cat{$tl_vol} = "timeline"; + $Caseman::vol2ftype{$tl_vol} = "timeline"; + $Caseman::vol2itype{$tl_vol} = "raw"; + $Caseman::vol2path{$tl_vol} = "$fname"; + $Caseman::vol2start{$tl_vol} = 0; + $Caseman::vol2end{$tl_vol} = 0; + $Caseman::vol2sname{$tl_vol} = $fname_rel; + + # Calculate MD5 + if ((exists $Args::args{'md5'}) && ($Args::args{'md5'} == 1)) { + print "Calculating MD5 Value<br><br>\n"; + my $m = Hash::int_create_wrap($tl_vol); + print "MD5 Value: <tt>$m</tt><br><br>\n"; + } + + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_top\">\n" + . "<input type=\"hidden\" name=\"tl\" value=\"$tl_vol\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::FRAME\">\n" + . "<input type=\"hidden\" name=\"submod\" value=\"$Timeline::VIEW_FR\">\n" + . Args::make_hidden() + . "<input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n" + . "(NOTE: It is easier to view the timeline in a text editor than here)"; + } + else { + print + "Comma delimited files cannot be viewed from within Autopsy.<br>\n" + . "Open it in a spreadsheet or other data processing tool.<br>\n"; + } + Print::print_html_footer(); + return 0; +} + +sub view_menu { + Print::print_html_header("View Timeline Menu"); + + my @tl; + + # Find the timelines in the images hash + foreach my $k (keys %Caseman::vol2cat) { + if ( ($Caseman::vol2cat{$k} eq "timeline") + && ($Caseman::vol2ftype{$k} eq "timeline")) + { + push @tl, $k; + } + } + + if (scalar(@tl) == 0) { + print "There are currently no timeline files in the " + . "host config file.<br>One must first be created before you " + . "can view it<br>\n"; + + print "<p><a target=\"_top\" " + . "href=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_TL&view=$Timeline::FRAME&" + . "submod=$Timeline::TL_ENTER\">" + . "<img src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=\"43\" height=20 border=\"0\">" + . "</a>\n"; + + return 1; + } + + print "<form action=\"$::PROGNAME\" method=\"get\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::VIEW_FR\">\n" + . Args::make_hidden() + . "1. Select the timeline file:\n" + . "<table cellspacing=\"0\" cellpadding=\"2\">\n"; + + my @tl_sort = sort { lc($a) cmp lc($b) } @tl; + for (my $i = 0; $i <= $#tl_sort; $i++) { + print "<tr><td><input type=\"radio\" name=\"tl\" " + . "value=\"$tl_sort[$i]\"></td><td>$Caseman::vol2sname{$tl_sort[$i]}</td>\n"; + } + + print "</table>\n" + . "<input type=\"image\" src=\"pict/but_ok.jpg\" " + . "width=43 height=20 alt=\"Ok\" border=\"0\">\n</form>\n"; + + Print::print_html_footer(); + return 0; +} + +sub view_fr { + Args::check_tl(); + + Print::print_html_header_frameset(""); + my $tl_vol = Args::get_tl(); + my $tl = $Caseman::vol2path{$tl_vol}; + my $url = ""; + + unless (exists $Args::args{'st_mon'}) { + + unless (open(TL, $tl)) { + print("Error opening $tl"); + return (1); + } + + my $beg_mon; + my $beg_year; + my $cnt = 0; + while (<TL>) { + $cnt++; + if (/^(?:\w\w\w )?(\w\w\w)\s+\d\d\s+(\d\d\d\d)\s+\d\d:\d\d:\d\d/) { + $url = "tl=$tl_vol&st_mon=$::m2d{$1}&st_year=$2"; + + } + last; + } + close(TL); + + if ($cnt == 0) { + print "Empty timeline<br>\n"; + return 1; + } + if ($url eq "") { + print "Invalid Timeline<br>\n"; + return 1; + } + } + else { + $url = + "tl=$tl_vol&st_mon=$Args::enc_args{'st_mon'}&" + . "st_year=$Args::enc_args{'st_year'}"; + } + + print "<frameset rows=\"65,*\">\n" + . "<frame src=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_TL&" + . "view=$Timeline::VIEW_IDX&$url\">\n" + . "<frame src=\"$::PROGNAME?$Args::baseargs&mod=$::MOD_TL&" + . "view=$Timeline::VIEW&$url\">\n</frameset>"; + + Print::print_html_footer(); + return 0; +} + +sub view_idx { + Args::check_st_mon(); + Args::check_st_year(); + Args::check_tl(); + + Print::print_html_header("View Timeline Index"); + + my $mon = Args::get_st_mon(); + my $year = Args::get_st_year(); + my $tl_vol = Args::get_tl(); + my $tl = $Caseman::vol2path{$tl_vol}; + + print "<center>"; + my $url = + "$::PROGNAME?$Args::baseargs&mod=$::MOD_TL&view=$Timeline::VIEW_FR&" + . "tl=$tl_vol"; + + # Next and Previous pointers + my $pyear = $year; + my $pmon = $mon - 1; + if ($pmon == 0) { + $pmon = 12; + $pyear--; + } + print "<table cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr><td align=\"center\">" + . "<a href=\"$url&st_mon=$pmon&st_year=$pyear\" target=\"_parent\">" + . "<- $::d2m[$pmon] $pyear</a></td>\n" + . "<td> </td>\n"; + + if (-e "${tl}.sum") { + print "<td><a href=\"$::PROGNAME?$Args::baseargs&" + . "mod=$::MOD_TL&view=$Timeline::VIEW_SUM&" + . "tl=$tl_vol\" target=\"_parent\">" + . "Summary</td>\n" + . "<td> </td>\n"; + } + + my $nyear = $year; + my $nmon = $mon + 1; + if ($nmon == 13) { + $nmon = 1; + $nyear++; + } + + print "<td align=\"center\">" + . "<a href=\"$url&st_mon=$nmon&st_year=$nyear\" target=\"_parent\">" + . "$::d2m[$nmon] $nyear -></a></td></tr></table>\n"; + + # Make a form to enter the next month and year to show. + # it defaults to the current location + print "<form action=\"$::PROGNAME\" method=\"get\" target=\"_parent\">\n" + . "<input type=\"hidden\" name=\"mod\" value=\"$::MOD_TL\">\n" + . "<input type=\"hidden\" name=\"view\" value=\"$Timeline::VIEW_FR\">\n" + . "<input type=\"hidden\" name=\"tl\" value=\"$tl_vol\">\n" + . Args::make_hidden() + . + + "<table cellspacing=\"0\" cellpadding=\"2\">\n" + . "<tr><td align=\"center\"><select name=\"st_mon\" size=\"1\">\n"; + + for my $i (1 .. 12) { + if ($i == $mon) { + print "<option selected value=\"$i\">$::d2m[$i]</option>\n"; + } + else { + print "<option value=\"$i\">$::d2m[$i]</option>\n"; + } + } + + print "</select></td>" + . "<td align=\"center\">" + . "<input type=\"text\" name=\"st_year\" size=\"6\" value=\"$year\">" + . "</td>" + . "<td align=\"center\">" + . "<input type=\"image\" src=\"pict/but_ok.jpg\" alt=\"Ok\" " + . "width=43 height=20 border=\"0\"></td>\n" + . "</tr></table></form>\n"; + + Print::print_html_footer(); + return 0; +} + +# Display the contents of the summary file (hits per day) and show +# it as hits per month +sub view_sum { + Args::check_tl(); + + Print::print_html_header("View Timeline Summary"); + + my $tl_vol = Args::get_tl(); + my $tl = $Caseman::vol2path{$tl_vol}; + + $tl .= ".sum"; + + open(TL, "<$tl") or die "Can not open $tl"; + my $url = + "$::PROGNAME?$Args::baseargs&mod=$::MOD_TL&" + . "view=$Timeline::VIEW_FR&tl=$tl_vol"; + + print "<p>This page provides a monthly summary of activity.<br>" + . "Each day that has activity is noted with the number of events<br>\n"; + + my $p_year = ""; + my $p_mon = ""; + + print "<p><table cellspacing=2 border=0>\n"; + + while (<TL>) { + my @a = split(/ /, $_); + next unless (scalar(@a) == 5); + my $mon = $::m2d{$a[1]}; + my $year = $a[3]; + $year = $1 if ($year =~ /^(\d{4,4}):$/); + + if (($p_year ne $year) || ($p_mon ne $mon)) { + print "<tr><td colspan=6 align=left>" + . "<a href=\"$url&st_mon=$mon&st_year=$year\">" + . "$a[1] $year</a></td></tr>\n"; + + $p_year = $year; + $p_mon = $mon; + } + print "<tr><td> </td><td>$a[0]</td>" + . "<td>$a[1]</td><td>$a[2]</td><td>$year</td><td>($a[4])</td></tr>\n"; + } + print "</table>\n"; + + close(TL); + + Print::print_html_footer(); + return 0; +} + +# display a given month of the timeline +sub view { + Args::check_tl(); + Args::check_st_mon(); + Args::check_st_year(); + + my $tl_vol = Args::get_tl(); + my $tl = $Caseman::vol2path{$tl_vol}; + my $st_mon = Args::get_st_mon(); + my $st_year = Args::get_st_year(); + + Print::print_html_header("View $st_mon, $st_year of Timeline"); + + unless (open(TL, "$tl")) { + print("Error opening $tl"); + return (1); + } + + Print::log_host_inv( + "$Args::args{'tl'}: Viewing timeline for $::d2m[$st_mon] $st_year"); + + print "<table cellspacing=\"5\" cellpadding=\"2\" width=100%>\n"; + + # zone identifies if we should be printing or not + my $zone = 0; + my $row = 0; + while (<TL>) { + if ( +/^(?:(\w\w\w\s+)?(\w\w\w\s+\d\d\s+\d\d\d\d)\s+(\d\d:\d\d:\d\d))?\s+(\d+)\s+([macb\.]+)\s+([-\/\?\w]+)\s+([\d\w\/]+)\s+([\d\w\/]+)\s+($::REG_META)\s+(.*)$/o + ) + { + + my $day = ""; + $day = $1 if (defined $1); + my $date = ""; + $date = $2 if (defined $2); + my $time = ""; + $time = $3 if (defined $3); + my $sz = $4; + my $mac = $5; + my $p = $6; + my $u = $7; + my $g = $8; + my $i = $9; + my $f = $10; + + # we must break this down to see if we can skip it or not + if ($date ne "") { + if ($date =~ /^(\w\w\w)\s+\d\d\s+(\d\d\d\d)$/) { + if ($2 < $st_year) { + next; + } + elsif (($2 == $st_year) && ($::m2d{$1} < $st_mon)) { + next; + } + elsif ($2 > $st_year) { + last; + } + elsif (($2 == $st_year) && ($::m2d{$1} > $st_mon)) { + last; + } + else { + $zone = 1; + } + } + } + + # we need to print this entry + if ($zone) { + + # the deleted meta <blah-dead-2> entries screw up in HTML + $f = "<$1 >" if ($f =~ /^<(.*?)>$/); + + if (($row % 2) == 0) { + print "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR\">\n"; + } + else { + print + "<tr valign=\"TOP\" bgcolor=\"$::BACK_COLOR_TABLE\">\n"; + } + + print "<td>$day $date $time</td>" + . "<td>$sz</td><td>$mac</td><td>$p</td>" + . "<td>$u</td><td>$g</td><td>$i</td><td>" + . Print::html_encode($f) + . "</td></tr>\n"; + + $row++; + } + } + else { + print "Error parsing timeline: " + . Print::html_encode($_) + . "<br>\n"; + } + } + close(TL); + print "</table>"; + + Print::print_html_footer(); + return 0; +} + +# Blank Page +sub blank { + Print::print_html_header(""); + print "<center><h3>File Activity Timelines</h3>\n" + . "Here you can create a timeline of file activity.<br>\n" + . "This process requires two steps:<p>\n" + . "1. <b>Create Data File</b> from file system data ->" + . " 2. <b>Create Timeline</b> from the data file\n" + . "<p>Use the tabs above to start.\n"; + Print::print_html_footer(); + return 0; +} diff --git a/lib/Vs.pm b/lib/Vs.pm new file mode 100644 index 0000000000..2ce43f3fb0 --- /dev/null +++ b/lib/Vs.pm @@ -0,0 +1,8 @@ +package Vs; + +# These need to be updated as The Sleuth Kit supports more volume systems +$Vs::type{'dos'} = 1; +$Vs::type{'bsd'} = 1; +$Vs::type{'gpt'} = 1; +$Vs::type{'mac'} = 1; +$Vs::type{'sun'} = 1; diff --git a/lib/define.pl b/lib/define.pl new file mode 100644 index 0000000000..9bce1fa805 --- /dev/null +++ b/lib/define.pl @@ -0,0 +1,39 @@ +# +$VER = '2.24'; + +$HTTP_NL = "\x0a"; +$notes_file = ""; + +$PICTDIR = "$INSTALLDIR/pict/"; +$SANITIZE_TAG = 'AutopsySanitized'; +$SANITIZE_PICT = 'sanitized.jpg'; + +$PROGNAME = 'autopsy'; + +# Default directory names +$MKDIR_MASK = 0775; +$IMGDIR = 'images'; +$DATADIR = 'output'; +$LOGDIR = 'logs'; +$REPDIR = 'reports'; + +# Colors +$BACK_COLOR = "#CCCC99"; +$BACK_COLOR_TABLE = "#CCCCCC"; +$DEL_COLOR[0] = "red"; +$DEL_COLOR[1] = "#800000"; # used when meta data structure has been reallocated +$NORM_COLOR = ""; +$LINK_COLOR = "blue"; + +$YEL_PIX = "pict/back_pix.jpg"; + +%m2d = ( + "Jan", 1, "Feb", 2, "Mar", 3, "Apr", 4, "May", 5, "Jun", 6, + "Jul", 7, "Aug", 8, "Sep", 9, "Oct", 10, "Nov", 11, "Dec", 12 +); +@d2m = ( + "", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", + "Aug", "Sep", "Oct", "Nov", "Dec" +); + +1; diff --git a/lib/search.pl b/lib/search.pl new file mode 100644 index 0000000000..4ea1b363d1 --- /dev/null +++ b/lib/search.pl @@ -0,0 +1,51 @@ +# +# This file contains pre-defined search strings. A button for each will +# be displayed in the Search Mode. +# +# The $auto_srch{} hash is filled in with the search string +# The index into the hash is the name of the search. +# +# For example, $auto_srch{'foo'} = "bar"; would search for the string +# bar +# +# If the search is case sensitive, then set $auto_srch_csense to 1 (this +# is the default value if not specified. Set to 0 for insensitive +# +# If the search is a regular expression, set $auto_srch_reg to 1, else +# 0 (the default) +# +# +# If you develop patterns that you think will be useful to others, email +# them to me and I will include them in the next version (carrier@sleuthkit.org) +# + +# Date / syslog search of month and date +$auto_srch{'Date'} = +"((jan)|(feb)|(mar)|(apr)|(may)|(june?)|(july?)|(aug)|(sept?)|(oct)|(nov)|(dec))([[:space:]]+[[:digit:]])?"; +$auto_srch_reg{'Date'} = 1; +$auto_srch_csense{'Date'} = 0; + +# IP Address +$auto_srch{'IP'} = +'[0-2]?[[:digit:]]{1,2}\.[0-2]?[[:digit:]]{1,2}\.[0-2]?[[:digit:]]{1,2}\.[0-2]?[[:digit:]]{1,2}'; +$auto_srch_reg{'IP'} = 1; +$auto_srch_csense{'IP'} = 0; + +# SSN in the pattern of 123-12-1234 - from Jerry Shenk +$auto_srch{'SSN1'} = '[0-9][0-9][0-9]\-[0-9]]0-9]\-[0-9][0-9][0-9][0-9]'; +$auto_srch_reg{'SSN1'} = 1; +$auto_srch_csense{'SSN1'} = 0; + +# SSN in the pattern of 123121234 - from Jerry Shenk +$auto_srch{'SSN2'} = '[0-9][0-9][0-9][0-9]]0-9][0-9][0-9][0-9][0-9]'; +$auto_srch_reg{'SSN2'} = 1; +$auto_srch_csense{'SSN2'} = 0; + +# CC # - from Jerry Shenk +$auto_srch{'CC'} = + '[0-9][0-9][0-9][0-9]]0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]]0-9]'; +$auto_srch_reg{'CC'} = 1; +$auto_srch_csense{'CC'} = 0; + +# This must be the last value +1; diff --git a/man/man1/autopsy.1 b/man/man1/autopsy.1 new file mode 100755 index 0000000000..39f983d6a7 --- /dev/null +++ b/man/man1/autopsy.1 @@ -0,0 +1,163 @@ +.TH AUTOPSY 1 "MAR 2005" "User Manuals" +.SH NAME +autopsy \- Autopsy Forensic Browser +.SH SYNOPSIS +.B autopsy [-c] [-C] [-d +.I evid_locker +.B ] [-i +device filesystem mnt +.B ] [-p +.I port +.B ] +.I [addr] +.SH DESCRIPTION +By default, +.B autopsy +starts the Autopsy Forensic Browser server on port 9999 and and accepts +connections from the localhost. If +.I -p port +is given, then the server opens on that port and if +.I addr +is given, then connections are only accepted from that host. +When the +.I -i +argument is given, then autopsy goes into live analysis mode. + +The arguments are as follows: +.IP "-c" +Force the program to use cookies even for localhost. +.IP "-C" +Force the program to not use cookies even for remote hosts. +.IP "-d evid_locker" +Directory where cases and hosts are stored. +This overrides the +.B LOCKDIR +value in +.I conf.pl. +The path must be a full path (i.e. start with /). +.IP "-i device filesystem mnt" +Specify the information for the live analysis mode. This can be specified +as many times as needed. The +.I device +field is for the raw file system device, the +.I filesystem +field is for the file system type, and the +.I mnt +field is for the mounting point of the file system. +.IP "-p port" +TCP port for server to listen on. +.IP addr +IP address or host name of where investigator is located. +If localhost is used, then 'localhost' must be used in the URL. +If you use the actual hostname or IP, it will be rejected. +.PP +When started, the program will display a URL to paste into an +HTML browser. The browser must support frames and forms. The +Autopsy Forensic Browser will allow an investigator to analyze +images generated by +.BR dd(1) +for evidence. The program allows the images to be analyzed by +browsing files, blocks, inodes, or by searching the blocks. +The program also generates Autopsy reports that include collection +time, investigators name, and MD5 hash values. +.SH VARIABLES +The following variables can be set in +.I conf.pl. + +.I USE_STIMEOUT +.RS +When set to 1 (default is 0), the server will exit after +.B STIMEOUT +seconds of inactivity (default is 3600). This setting is recommended if +cookies are not used. +.RE +.I BASEDIR +.RS +Directory where cases and forensic images are located. +The images must have simple +names with only letters, numbers, '_', '-', and '.'. (See FILES). +.RE +.I TSKDIR +.RS +Directory where The Sleuth Kit binaries are located. +.RE +.I NSRLDB +.RS +Location of the NIST National Software Reference Library (NSRL). +.RE +.I INSTALLDIR +.RS +Directory where Autopsy was installed. +.RE +.I GREP_EXE +.RS +Location of +.BR grep(1) +binary. +.RE +.I STRINGS_EXE +.RS +Location of +.BR strings(1) +binary. +.RE +.SH FILES +.I Evidence Locker +.RS +The Evidence Locker is where all cases and hosts will be saved to. It +is a directory that will have a directory for each case. Each case +directory will have a directory for each host. + +.RE +.I <CASE_DIR>/case.aut +.RS +This file is the case configuration file for the case. It contains the +description of the case and default subdirectories for the hosts. + +.RE +.I <CASE_DIR>/investigators.txt +.RS +This file contains the list of investigators that will use this case. These +are used for logging only, not authentication. + +.RE +.I <HOST_DIR>/host.aut +.RS +This file is where the host configuration details are saved. It +is similar to the 'fsmorgue' file from previous versions of Autopsy. +It has an entry for each file in the host and contains the host +description. + + +.RE +.I md5.txt +.RS +Some directories will have this file in it. It contains MD5 values for +important files in the directory. This makes it easy to validate the +integrity of images. + +.SH EXAMPLE +# ./autopsy -p 8888 10.1.34.19 +.SH "SEE ALSO" +.BR dd (1), +.BR fls (1), +.BR ffind (1), +.BR ifind (1), +.BR grep (1), +.BR icat (1) +.BR md5 (1), +.BR strings (1), +.SH REQUIREMENTS +The Autopsy Forensic Browser requires +.B The Sleuth Kit +<www.sleuthkit.org/sleuthkit> + +.SH HISTORY +.BR "autopsy" " first appeared in " "Autopsy" " v1.0." +.SH LICENSE +This software is distributed under the GNU Public License. + +.SH AUTHOR +Brian Carrier <carrier at sleuthkit dot org> + +Send documentation updates to <doc-updates at sleuthkit dot org> diff --git a/pict/back_pix.jpg b/pict/back_pix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a5da64c9bda1ad2cec4418a7c7b055b97e2f7da GIT binary patch literal 305 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHt42;Z-f(%T8jLd?J x|Bo<uGcYos0(M45G$B?t0W=W?20;vw|F;-;m>C(E1epaH>>2W$rR)FS1OS=SCC~r> literal 0 HcmV?d00001 diff --git a/pict/but_addnote.jpg b/pict/but_addnote.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0946f296f4a91ab4ea595689ccd02031f38c1b15 GIT binary patch literal 1332 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHD43W%?f(%T8jLd?J z|Bo=VGB7YRFf%eB0Txy!Hg;x41}0Qt1{Nk}Rz?8^MrI~vHda=c7A8h!76w*9AvQ(B zg_A`>94{&f2L~oLDzg^~GB7eTvazzjjR6@csA#xQNLVB=Xi+eWV`8CF<3%T<|F;-; zK=uhT3o_U<yeoL%Eb-#Y{79)J#jZt4dT*~byp+0_l{+!CO5?Vj$YbyMx~tyqa=KrA zX}V-_l4I#iq1<D=ewmv>)nZ}_gn#KT&B~vx!P3opx=A6=|LL|G&Ew}*-`!fC*R$<> ztHsZYyR*z*)pWm`++W_CR{Jb^mp4<9j*+Un4C8S_u8N0Kvksa@#jsz|n9-W~YIA@2 zWud&Fw>{E%{!I<R%1Z0XCSEzZ)#Ssu&W^ts#upbJi3oR5n5A9>a@O<Ecei$LcZ*Ix zG^ggp-L29ksoQEakM-UT-0pE+B0<A<ng2Fxi!0^H=9~C?15;mGm8z`NX$W&DRy*Q5 zzw6}OuPVA8vlD_$ZEuCH_dh?EO?&ckqmw!wJxsguY*scWPbqsiGuY^ds+$<Q4O525 zJP%Rs$uD^|*M9L^vE^>c@w}4g6H|O$p77T`@4W8wgyp1?!we0JM@_5pWT&pS`RH@# zLPm7PTK26>p%eGE$eFL)W@~Mt8}>|h8}|~~EODcf^?uA7AG74`xD#4%W&($p(vy?Z z^ImO>Y)gvyHsfXKv-h{UBQiAj@-&*4r>U^dY+n9u;@63BGF80Kl{Y@#Dx0>l)8e5- z)Aq}cx+KG8Zv?z-&5FA$7wy_|_je4B$p)FLdvoJ2lo-!i{ws9#9Z$nW8?)+{?>Xk= zH!Wjd+d<{dmuF^%Us}D@{>oCDcolcf9doW1a=lE_tN0OhD02T|`+}=^_jTV}J>Hbl zSQuTGcI+vWkd087VU?|$8jJ5jrT6|@jZ|9LQk9+u?LTR<G_+Da*PZ{=YH{~l@ABfk zZYE66yR`Q9-V<dveQibk-rTZi`ckoE#e)YopT>5y?Bm|I+RigCYKQo<J;8rIsFr(e zU0||IEB3dOOs()DH`Zkie)frXof<`d_9-`Wx*n};DO?nPCwg<=-F>1dcA+V?F`9pF zv9A{uKl(M7{nX3<3}=%MbS}GOlc9e=p=6TB$-XD1rFR-<UPwJ$(ZXrq@>TCj)Y;E5 z-mg6D*;dYocDu7G?kSUknQG^%2OU%9uPRcz;gz&~8dFelQbpaRjD0J#JP&RDGwoPx z=EA5t<tMxwch3IoGT$fm;is-?m;2{4&AC>eze0JL-iM#AZgXmWh-BMuzan^9yrO2& zVn4eYF4Ot9Uva$b-eVUSxLn?jRqFiPuPh};@5yVd0BP<`|MsiND(OA{l#tBh=NsKN z|E_hEH7svGrDgK?`GLiefA=luo3Z=wQ&FkH&kq9E{JS6E4z{`1;^zkqki|;M0ZbmN p`&X}j{K82{<oM_C11Fl>Z!Haca?&vI*VFv93s!wyvhn)=n*djd6jJ~I literal 0 HcmV?d00001 diff --git a/pict/but_alloc_list.jpg b/pict/but_alloc_list.jpg new file mode 100644 index 0000000000000000000000000000000000000000..525fd081f3ff28dd75136354110695c71f43986d GIT binary patch literal 1852 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 T-uTS>`Z`JXt?Lrz|Gx<U#o{=6 literal 0 HcmV?d00001 diff --git a/pict/but_export.jpg b/pict/but_export.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4cbc75a024be2c929a5f8acdad048169b7d2573c GIT binary patch literal 2056 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 ScbdgNymp?qD*IUc|C<1^$a!V} literal 0 HcmV?d00001 diff --git a/pict/but_force.jpg b/pict/but_force.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a92475c71feecd87e414c36c993dba5eaea0966 GIT binary patch literal 1079 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY45rMCf(%T8jLd?J z|Bo<CU|?WmWn@4Gj4Z5d>`aUdOw5cZ5-f~N%&cqz42;aoOiUcCFkQ@yOe}&ztPE_5 z!iI@Ti$qdX*&PcTRYVtVG;(Sd6J%gyW(4`29cl$5gCG;LqT|9OWfsFiA>qWvgGwI) zH;PRBSk!b#h4ud}1|DWc1|~sfK?Zw<JId2!WD?Wn)SQ<3WZh&LxW+X~N&j?QU8uvR zFHf!VWJ3$<-oNcx@pvAawob*Ssg^=FyQVD&DZ2EoT<>)7qgNMAjfFaslKwNS(C(Xj zK>lEa(tFvJdWj2;o^YIKW~6nZOPTell=;%QV>@GRl`flZx{P_ov?uE{kK7Y-zE|y5 z(srzMVxyM#>jbBQiLYH&U0hqV>Q!o3AzzZilSYntEJ}KxZy7zC#uC%RDco2zPoqzK z>a_n1+BdFi&-U*Pc3f>Bb7Z>;hs!;2hI`d+g|o%PyjW(ctk+?*@Nkdndb)LO(W;9p zR<F9UGQjnW$ERQkmuUsFe{77ewKl(<|9Z{82jAv>PqojoUR!KcXfyr66UMoV_OK*N zhIs8f8{)ERmAc$s*T}}8`!if6CUc9GZrHn9Pdmk}Q(xIiE&sqg?Z>++dj(Xq<Bn7_ zv=jtQSDtj`;aYR+8>dz`@WjMs&8n{Cxc9P6IX7MWU%1@cz0!QUQy$r@xzI2BPj#X6 zjBkvKL-g;gy87pK-L6a39o6UK!y_IXJAe9Mm`QrV%e2rp?pvj|nc3&LPAjQN=-8*j z=)q*8*_(Y+=A>#*W}nKwr|D+z=jvV-`p@7r`9%MdBk`%nPX^>JJ9K{0?wl1fWol~l z^zzPjO8#iP;d98N<J;;Rs!7v~%pR{kwb$lIy1(e9>aK~?14a3FJ+t@}9lTuO!11Pr zZ@Y8SzioKPt=X=8!eE8B!KA|TBBfDRA7-@OlnLH^t9pmtw)=URS6G)nxwQRac)nAi z;^Qw-{MK)N?!SH{Y;V}5UC*}lzx(2Ewmapk-=~<_(r2F4Pu2dqZr0th`*+?ym~`X2 z#Fxz#EAIP$j=ih7csA>W>nFQx?a!8%WIQ`4_0!OO`OkIldSz}X$E#_4`Ojc__u}H& zEZI+vD({!}yWY7xc9%(U!t&pehC%a_f4tYuzrOtYx?NJWYgSKQeee9orvEnqg+H6_ literal 0 HcmV?d00001 diff --git a/pict/but_indexdb.jpg b/pict/but_indexdb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e51b780546e75ec6d474bdeec4f29dd7e5b6b47 GIT binary patch literal 1568 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?<Brf(%T8jLd?J z|Bo<CU|?WmWn^SP0*uTotZeK|jEoG-j3_cp%q)zoYyu37%uLK|%<Rmp5KT;s%q$G7 zf<kPHi-bi|R1+r#8#)F$O%i2aXrx?tP^qX{kb#kzk&Tswi5Y4SBZD9lv*JRbBxM#u zM<rpAz{EzUi4Q*<Gz$8Ei-Cukk%38&S&+e=;oXKu&S@5Vek|^jN^062C|INY{CSk2 z*xD&Cb`_?&eK*pW|7z-#_hOBXGI#1->ZYu#?7SJEziZOvlr7%7&*$rC_^!Uh!EC9( zzcnB@>tXQH9mW$n9)+uVFg#V^4PE}6<I}qh>sB*rJYH$mZ+3Z6o66&gXCkLO->y5i zW$}^X)Pp`Ehi5%^-J&~rdvpQ!;kk=6d6XoQ7SAZuT{$Dv&}+iVfWN6fG@I-eTIxq; zYNXsav*SRIUz62^J)d<~n#FH9Zm6cT@98?XHRm}de`phwITUzJDqzBtJb_TgbqQDH zQVUWG{<+@XVD|5Qs`cjo43mHO2!7>~TXg+b-eESLm$`E~zN;TH5p6kjN<Fs3<F<fU zK*#0|JqcB>sh&O)bd<Yq?9||B4}JWz*!9zP_W7Iw_qJ|4d!|`W`r?wFnu15&{tSZs z9go9I?ijGXDTvYd@=wU&&(0;OXPQMG`891f7F+w?Z~Muf)90kp7;>*m3xulNnq79u zDM2{#@X-zjrMlW_`)BvR=)W{|@|m!2foG3@aewJm*?H5~=7~FFVMg##LBX0!JIXz8 za4qgQF3xlR;cR}X`BN|a`JqwKE?tx!%=O@y1Cx%Zpm6?|HB+Bnag5S9_=v;vtlL-i zb1O^pg!;0~SJ;)5911J{q@w=bO6q&o_SCA98-0edTMb!)O%56=g}AJh_L|rlapD7O zc-WjC55~mg3|)umFSox~_jlVzvAfw>=hZuIZh1U$hT(KE=cMfJJfViiAAL^jHhVYi z(>y`p9G@ls8PpDmGUuDuu{Jd?`!a9ICe@B-nalJ&xsHFkDL7}MAd5<I+Bc1Lf{T{9 z`mUJwYty=Cb3QWK=&L`dm2@*nlV1Af-_`2+Uegfuw<&>K-a3w@o0C{(DDX&sj-6!K znzrp-+AVg0LP6PmM-Q#}yiy=HyRtdA=bOfl%e?8T)oZ`3{m&3=n?IfFsML+HjuSDn z`?oB#7Qbz}-C~UehfXT1Y0%BtX%fkOwfmmUHD{~XC||AfpCRmXSjb|_+Q|JqTk0n$ z#pO+VtE+Z3&s{ZY-Nn43+*iMOSC}2v>ojXyI$7qNl3Gl**|jCgnw?&Uh2-vKo!aum zA@RVPYnv}i?T<Jyzqsz!)isZAE{)E;P`NCw%K6htLuJELH_VvkeL606)w$5CLs00* zr=o}(r*=(Aw~kyBn7d2r{dZlxC)Lu^wyzad-f#8L>`m}3wJ28c)*Z(lKT>;sVo~Sx z$3gSn@!IW)XiRKfAJfZe@iOgu?DAQ?ulVOyoZFVD@oaHb^K*9}RYSd}g3CNZkAxmh zQZ1OO5v;OG&U(*w<Ecf3`+W?KpIdXN+W*~}!n=phbImV!@=0A@=Dwa!aozlT+uv2! z=b5iJPrv)C;QNDBzw1MHN0b!D?6s|#zIglB=q(q|7G*!#E4zQy-DQ2*ljBuiy!{*Y z)}%OQ)=z!+{8!sE7teZf{bZGOedumqnd@r%yf5DVwf0uVvz?}&;`;7i&AaSwdUE}w zFJ=E$m(8+V=S$eoxLLp51uf>}|4M9ocWaI{fA*h$Q?x2|)8zYa?fl2be)_=ahtqYd RYAuS^i?0{A319#JCICL)j0gY# literal 0 HcmV?d00001 diff --git a/pict/but_lookup.jpg b/pict/but_lookup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6bd6daf9fb7701f56d040a09e485e7246a13deb GIT binary patch literal 1458 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?<Brf(%T8jLd?J z|Bo<CU|?WoU}j`M0?e$8EbL5-j10_-jK~s<Ow25-Yyu37%uLK|EX?ez5IrDa23A2K zHp4~2A}OkhjuV3ul_muiE;MoyWj|P?+-xGqz{mvhJQK_wMg}Iqg+k1VhDpkfO2RB6 zfr*Vyg%2klG!p%Pi-Ct3B+V?yV9)Sw!z1T3tGHUl<6?%Kb_&cN*3Ykfwk2t|?#-^m zsnRE>H2z(*)4yUDYfEwA-zk5U7N7C!vfT0SRNX{>Lo2OdsYA!UEt$Mr;O5_RIwjtf zs(S<v6-EX*eUtIC6J5E-nfZq>YhX?&pXT-0&}C~GH<!-jyC-KE`D||Hoab-+1(wV1 z3k{1e-hbNjkEYozW5uM$t4)q>oEE>+x0SO~{_}3tYqOkZJp3uLX~NpYsowdPH`pfg zr?TC4OHt=_Ox8C#P-R%>U6b*ab^FX?8;*ChJnov@KI6lRPqG{b9xPuXq?mPA-}1l} z%?nGdmP}pBv+H!1rsqK~MwL12Ggp>A-)=VX!-D9{6D`Y2kM(A5n_KoWFL(RFVC|4L zrZ6EdPfx9n2c7x3CKf&Xwfl#c^ea(~?-oK4&L0o^8$393d+pOG5&l^rhAd&}yA%$z zCZ>p-%d_7!e@RGX=S6pO`J4WiG@q%vYCc!8Xzuou7htekwBWnv1ul2NK0V2OJ~wKz z{)MYlJX!fj>fs^5=&l`x6FGu5C@?<$9<KVmSRmYWn(KnrzAW<{^P`SwM|oMUxc8_w zQ)J2FS-tPnuTAvwdR{#9%D4MZUiU5D9(nW<%kG>C56!8vO=6e33f<X7`{d1}wJ#*U zwK|YI*OSdsXy@7O?UPsvqAo3b#klgxtH`Lt)rayXM0e=+d3D7!Eem@PRBYqymE{l- z)Mcp5+qO<GdVzu6EWZMa{|prxX7?p7ORTi2cg^B8_`54*wok3!#Ox4OC+{~)4n-}s z_~+KMrX$#upY5c)`N<7km)@7>J#i?Nx!Au>;K7R9{5b}zS(nUzRO_wSt-`K8J6XqJ zr;_)DyH2zFR&HW`bNHZ(#kK&p(5G_NhKJVwXK=cqXZgr3@u+*(ANHp)P3P8cy|-5U z*_PcdN4A{Ud~&P9RKY2VSrab5sGX;DsZZ!f{ggQe{_d;T`)$spTc1k<6@EE!J-U66 zZJt1I?tg}3vs#a4s;Sy_aBjQ(Y`dMeXS<Hsmz9iPOb<_K58A`t7!<fYajpFQ=;z83 z6M2p~$%wk={1Fehv@JSp)&|#2hbJsgK6=i1y~xy+emj<j`2|er3ESMjz_@A8>F>SA zr^{(Co!0HbwDzpqcj4EOu5ptfapkJ1DfBK-D%E8N=ivifO`$V$CN21Q_vy|#%hjbn z9OkLb_VV|#d+pJ;)+RIhJD<P8<HxhVJUMRu@Nf41oiG1xp7pufZvAEbnkoD4U(LJD zcW$M=f4$4a+rQS{%6T;@|HUlp`q16JbAx>U3cKgO+Mc<2mFNCN8E^lFy)`TKH2>l& zyMNW)W#?9^{p(!3{cH4=n^#rtUo<KEx4LY$)sor2)cWpU&AXf)GMS)}*_Y$D6tWBV x{ySrE_v7l#3uTf&{|edp<S<vAeb)IO7V^s*r$3yoTUE2=Wt_fkOxCRbHvwm8QZWDk literal 0 HcmV?d00001 diff --git a/pict/but_new_name.jpg b/pict/but_new_name.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a24bb42ea857421da071bb977e95469751b65a2 GIT binary patch literal 1435 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4F1fFf(%T8jLd?J z|Bo=VGcYhSFf%eB0Txy!W_C741}0Qt1|~*k7FGcUMrI~fMs^lvs1A^*5G#YAqA;7G zlF=fO6jgS|L}Ss$h01~qj7-cNObo27P^F9vOoEEchJg!(l7y9691{y4epGUrxbdKo z$p2dmJj@_zW<dsfhBuejP0O=BzBE3sX{nrc*5@b9I~Lve8X~`L*5f8w;VDsJ+cpJi zCH`4>cyizEpTg;Tvv=;flCjR@mSo<(Ee!(87H!Sg`6X`0I(>bemP6Zk8?>5=>tr@f zQi^%|TGKyM!u`gbaM8>~U7J^}H9A^7RZ(VL`$03edtwis)}$OVY`Kvl>>J(Y^xCUm zVy%j<mVR!)mJk`Y&(FWjj8@6r_F?+&;y%OdP3QOQd+m2{n^w=`zNU|6P97>MinA8- zM)k)SYgwM-Z8_T|bF5K%((+I4!rrFKKHOCPpkE}>$#~3>Z~2pTzS}(JUR|jf^GiR* zEd5z=qFKjO$!LcBu>GYOo+}xB`)wBPnyAHlch9Hw`Fs7U(x++uXYg!ERQc^>5am4i z<8g_}3aUrU6j$|ZcRe;mQsq^jke<WJ??-06>yY&MtDL*NW%Hlst(!df@8+Hr<e1TU zA|ce_B8R7-_d>2`-EI6U>c#6?-Q4bp>7C#HuBFlJlBve4-LrC6*S=cy?y}#`FGovO z@0fI{YYGG7p|A2!EQ;3sXOO?A^MO@nu94(M*`<ms!6qk-l|o#OY}=5U5Uap7?Xuo- z?dc}_{)AWdik*qcIG|*!bzgtNjT5&WBn2~-CmqyOSg5O|rm<5zCS&>iM7{IxHNVuT zmPa1o;9evgQ`}P|?XR~ZRwZ)otTU^(oa|Bb+_sqE%1oBWd6yi5${D%V%D(<`=*pYm zQiBUWY8OPjU&a;f`taiE=a-^he=Pm6u6%idO{dV6S9f+edpuxbxv6ii<)jsUQ_yUR z&{`wa!^ZplwUe`#{AXzBaNc#kv%On<!TiJO?T0Q~TnS<S$$H3Yx1q>^a&^yAxd|>Q zAun83&W#n8ynQSGm-ETr>~9}hE_l1cDa-cpW9u#2{c`oa61`LNw*6lE?U>swZXu-! zlP4)_P2vi(T-c=NwNtBhU3z67AOF9b9&8_KM3%34;G)yf5$W+bUTM0KU&-x4n+HC( zxuf=ID(1$wpMDpz@hktg*9+G%-dMPOtEAHnFY|lNZp(5m{8EwsaeB(W`>JmDJT6$W z+@7=Z+tt#o>YobkZNKD{rMSay!R}ehQ;H66-|Lb3DN0JYd7r0$>@&N^pBxI-c}q{& zSX6fD&55@TTMX8is@>9^Jt1=Gw|kxnKUZj$)t_m9z3OGB?XJ`%>`r+f-m8T<O7r(5 zmY!bHa;bD_K|<H$!jP`J0f9m657vKtIzQcR{xQob=>g}0=YQHBo+)ym<)n~*%$~iR zyW{G8_wBzo<KnH`f7X84RI<HZ!ui(hxBpfj?y0fb5Gz+JvH14i@OE~-HG=0Ci&WRI z`tac4)h5d?N&Wd><78y4Hn`jM1cH<|w}){&zu0BF|7t}+!K;HZzYN{C|60$-CmW$W z-%TU_dg}UFr{DYW$wp{Czt~l!|N2k&ZOe;Z@1Ea3t$OTMbalG!<-NtL-{);N-8l91 G|C<0yj!KgN literal 0 HcmV?d00001 diff --git a/pict/but_next.jpg b/pict/but_next.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5639baeb50091ab6043b3d8a97d66125f3f8468 GIT binary patch literal 1336 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY43W%?f(%T8jLd?J z|Bo>AF)%POGcqzD0Txy^b|z*<OmRkLRwgz921aHkW_Ct4HfD$(MkZz!K~@GKHbuil z!YQikB94KHg-XE_7aC0x;|NL?6=Yy!VrFAyVuvVaU|?im5?sivXegAV%;FfBs3cq{ z(m3&=ky8-s|62?^Ad3Z=1sUua?k?QOXOpty6?5O3@K>Tt`wsBge15%kp|xL6cv?*T zrunxFR^HS8!|}E7->LeHgYN|&hR#->Vp96b_U`MdpKZsM3l=8&J}qUP;I*Q8OaGDv zw?hSIoxTZh{9YHj#pIZb_!fDU7nNl{Cifna30t;hrr<@*V>3#&?0OoQduS>{W=HWV zCO4tPlOEX~Jx<j>>!vO`zrNXRmP<Ro<@}}7jiy+w-7T=@<)ZCUJ>gI5U)6cl<USK` zxPD7!{WQIAm!1|q`D*xj)|REl`RlBX2Y)F)vEtCZ#PXF}m(98?wlsEqpPK4kZttw> zDcdua&QeLu)DF8pO{q6M#3D*5WZrBJ^2f2V$QE}OY7TJP-MBA4<|)~SbP2y8#Z znW?2ZrAzdJ?BeHbH=VY)M5nL#waWV@H&^}9dxe*Fz0y+tbi1+MDO>5rE}1L$wuv~L zn}4Rd_Q&(G<CnGx=9^wsy8df*>(LtzGfz!u)wrCn?2p3Pi~7usVf%B%CRwO%_~mG` za?Pg;Q+1dar0XJ1tb6xJY^~a)3r>%(y8rI{Q|J@A!^<`#f5-geEP*X+g7mxI>)yzl zuA%L^K4NCMsGDl;+LaSh*Q{}yIMLN4EP2Z05N&C_`<o@$cg<lx(5I=mt%P&uwI#DY z{#%{o+Il_r+@9{*F4b+$g->ozj^wfX+|Bh>b7DwpL9Scy$K!RMrk59Ny}0wbLs3(I z-fx|U7kyvb>aY09d+L61drB{(S;d*w=$P6?vm5xgJ#2ced1RYJiup{-qsDn6_x<h{ z`pwYQ?^DWc+;sY{*Sn?SJC5^SezB(hnBx8?8Pl)p8qVIPb>XuS(`A_{=gPeEnYJuh zZS-kjXvDg|KjQBk>dYuF)7$PC`OxAqx5BJX+a_9F_pnXswp`J-<FjA;TvkuUts!0N zd3VA$-RaUlk{cY=J@1B&+RMN3dk$>#o}+&;MPkj4ABo%MXctdwTGM%ZZ^(jUm+jXb zx8RTt%DZX7vGP9O4~C-?r2}6*_bH#LStYu1=@g5pyep$$d$Ow3H~F8x+hxB0irA*P zd+WM)NgG#Bdt5N<_T?FwljpQ9nN{7m@|dc2oNd_b*=>_Mp9Jr?9ib^bed#I7ouBL1 z*FWFPnYSnK-Tp-vZ&ubzIIrq^`!}3V_~KdBh3h9}fY`h;m)!PwF5dn%#=@l7Q|hN$ z-~Fov4=$cn$$m1+x<2%9v%ASe;+0N${bW|v_5TdkhEKw0zkOD>sz!4&Uv5o&@87Vx T?`Qe`Gi+aa%AIe`)&DmE33nyg literal 0 HcmV?d00001 diff --git a/pict/but_ok.jpg b/pict/but_ok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bb2996fa2f3ccd958b8f3ccdbf788406799b6ef GIT binary patch literal 881 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4BE_$f(%T8jLd?J z|Bo<qGB7eQGcqzD04oCv8zVa-0~4w+GYbPF6Dykl10ypN3lk?3J5&cF6Eh1d8-t*b zu%e-3V&g)kMItGxflh@+&WlY%*##LGSs0kvSXrT}85kJ^nV1z93K=RT2`jTWCLUZY zQrPIUXw&~&3_Q$?3`~N|f(-Ty-#d;O3*2VivNDTdr3+KBO;zEuH}6=S>UPB_>UqDr zxBa?kXRpPVmq$HY{W}gV@vL@>IwhSWJgNB6;t3L~a;EmV9o#avJGi0C;6KB<o0&^b ztgvdI`K3sz(@J{dv^&$}Cal#}JvNQ0ZSzUz_BifkXB`ZV3&b;R-gRzrcU|;mJx{YQ zCR#o}GP!1Kn|1B5O7kR{k_w@H@)PF9M#!w0&@hvS>q3L-q)^TtHLJc$?g@vcmAkxg zYtQ3Mv0v%__T9I{b@iWDYJWWccB#%zowfjx4MxoKAGYLAQ&D@>nXsYU*J`8K_ht7) zGS*)GrfBUm+vjfX^yWMZIqx&Nm!^GXRrhL|Vv%s=Hgn)QcR#&<ts$=`Oqjs8vAndm zELLfIRGCobXRYpK$9lc;f>ocmw|slOe%GfEsXO)wUVRZoeeYI%IeLfvXn%hb&x<*8 zHr<RY`?A|?vs$m8!{qcc=VH>YJg&Z|vf{~OKT!>fPvX-S>{BUvdeZLEkGq0OQ3u<v zR4IptEQsK}x_b4QK4k$hPFrRUp*hP~uky=Z_|L$<|7H7^`MH`as#kBd_g|CuzUZ&b zruWCH`@+`5{+agMFR%Bm?z30@$A7QaW4!q2r0MksXZ`!X$Hn;di+Pp)Fb;nF_xg0< z#YZR2t>d}k|24Yv`u=J4b#rzXJ?`#T{m-B?)%%HIu6(+GMb*yo<n>JtlJ@_<2>^w{ BHyi)} literal 0 HcmV?d00001 diff --git a/pict/but_prev.jpg b/pict/but_prev.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46c4f397005d169866102814cac08802f19acc4c GIT binary patch literal 1574 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 CT#<1A literal 0 HcmV?d00001 diff --git a/pict/but_replace.jpg b/pict/but_replace.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c17557a59ec5367fe5e1970346c8b71060b3fcd GIT binary patch literal 1273 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3{K39f(%T8jLd?J z|Bo<CU|?WkVrFDO0<27IjLa<Tj10_-j3^RJ%q)zo0t}4IOsou?OzcoCOpMGdf~*XR zLc(l@j)6*xL{e1Q6P+53f|`;|L<JcbnHkv`S=nH!85snbm=z5d3MDDC2s;KQ7EWwb zGICn9_`}A74?l{q{=db*!_3IQB*-ktV9)Ta@_Mzs?Bh-A%MC;OMYmQtF31zuHrLAi z#muMuEWYOgE2AE>@datb>lJDmB^o{Pyx{gI;fkd3+Dpj>ulv$&FrPD14E|kwo?Fr2 z&C&Hqq73~H)Om~7iGA+4Y#v?Qw>E=Ou}Npr>Pg~3YARVF@;ZCDY9_wt3jDdAfAY?! z@5;V!Ym6<={l@RXmy+rf#Z|h_A}d7vSX_rde}zxv&I7d#6AqcYDQD%~-t5W9wKQPD zWK~zcJwBg0bX-@q3T!bxk>h_*yIKEO8H1vrH*?NR7ydJ=9_h_{YkZ!kQi!!fZ|5bR z*M0Vu4~r6aTA5zE^F__W^`-BLgj-BHtsEDo1cuEFEjYH+AzEkt$zql2LkB*^S(l_< z-FBwiH1hK9r?I(Lc|$L+&JCM-Y0LUF<)|%>&T)M9=Q5nyJ->F}{msQ6j?LTfD>n6o z{A#WEPcoX}_5JI`I+*(WX7b$VyELImb5@|1%Zkp9V;fo%QWID+dX2Tp%C)>>*q-yf zJ+gGSQtGRloYL04%VOR-3Pn3~otft9<M6F-<zk!7J^`N<HO@o|<tfBj_s@Fq_=I4k z*AIQ+CuM4(E4P`a?0M|Jb=Q;CNt;gXN^yGZ#GwDmC8~U`-k$J@r<NP1+<JGiUP5KL zQ}WY4)Bf3i)ajVxX1w{C^!6KNI|CO*vm|V};W1g_@hagr+t@w@{9g6A+i%_+RsSza zSq49RTDN@@-@W;wNyVnqxo>8#c|S3{)%4iIh)MS?6^-+`SNirOTxE$Y{L2vad*O;! z;dL{n9S^pg-CmY7Ti0i2(W)=?{X6Gy^B(SL4p<u57UI2z<E_m?$)l+kHO)S|i^e)s zGDm5B&yKs3VROo8!t9A^%Eu3Uk632$l_71@e}<dpPp8d3ul%UIVxq-lv&c_D97c6X zTqg@6X54;enjh`K#Jg^;`(?lPDH+#V)P=Ir7=Lre%qv-{F~4-Op3;@mzWaPM%eE^{ zTqWgG`$BKe_aMefwVP6GB`dx@wl`ana>VnG#J|=4LQ@*Im@nG=vi!^XubRJi8{Fi- z9e7@T*Q;`S{Uzn)+J8dU+HE~v8EgK1?jLcB*s$-BdxGBQe~pt#xp}qe{{F=x)%B}B zJh*wa$^1)FKS*5KYJ=Oqp1`;NRv&Io597FhvCDS<)rx|gR|lnk8M<%(wVsc6ZiI5Z tn^xg}hEw-ttGBL;-f}s9t-+UHmb+_LmG0j-<&WL*lFxFRK1~0A699bu@3jB` literal 0 HcmV?d00001 diff --git a/pict/but_report.jpg b/pict/but_report.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e283c36212ec407630b1956482b898960f305bf3 GIT binary patch literal 1339 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3=zzXf(%T8jLd?J z|Bo<CU|?WkVrFDO0<26djLdB8j0{Z7j3^S!j7%)7Yyu37%uLKI?5vznJs@F0Rt6z9 zMaM<LhDstSqN?l@jV3t<2PPIS+~^dPEGEdn$jr#b%EH79)xyXi$i%F;P$)^6#n3TO zNjR}^qtnEPMnNL~Z!z#NGcqs<G7B=;GkniTXqPkg2vg+xvOZF)GxkJxzpd5Bj_Ayb zrKZ#6Uu=KqlWKkBKLeBNs?w*;zAE~Hed+rir1lF0Cfj++#q8Xq%+go1YLVU>yI#+b zvZq&r3Irdmx?LN1@w1AY;m&C*4O=F0Nv}zYzI(FxLPp42T`BG2ozn5!#U{?+V^gS# z{;+^!zJJNVU9Vj&{I&D8J?AKK5>#P~x^wSc>RFeyW=ZqB=3k3%TFz3{x}$2l_cYGs zT_sA6{Tn{r3Ruw||I8(3?aO;RR<1RO=B!V(v)H^NAZ^Pf{q0LnPS@buZuw`~S?5-V z^-GHsjZ@D0Zds>(+B`?~@5CmZcOv$8GxoV>e2gwvHuKBRVDtI1F6QRSsJtUTwX74T zKUmCC)tYyA#Ts+NJ=1OqruAe`>F@hERciINt~KF-g`V$J<)3f_X)+&-jtsp1Wcx#( z;J;Zlnkk=-J8hM^l0A2)nHpF0q_jI-Yh(9kPI$82Dx)$ddtS$ij@k7*Y3ubK3BPoi z(IjFWQorJUp3uu3UJv(rU*23Qa#wFc+_xsylPZ3bm`zwYD)Z6`cZSN&6urM~$L-DQ zrIPZ`nW=;=))crKu2}o!-M=+gC*C~2ciuxegPii2!4jYOtUM%pdCwZZxU)X3q%LmT ze}?_3x^L|cJ<{=Ru-t4FvhDM>LsdHGE?KpuO)>2;D{`CQxl!fEl$m0iX1XbFe4ol- zz#G_`v~$HX-SDLAEaf3bK1%LwJ2w5T<3eMx!yjhE{?#oJV|toz75{A0W1-w*w^fyn z@GLkY>1MbgLBiqs=6UOVPP%L5#`S2;`{Q-8tW81M+xFF`+kzR}u5A0buvGR{$m<EY zk2m%`F5WWv&@qp;isP*33ZIFtTG#bR%T`eG+F8G?1vm0u9^iO%<l@wApPyb03sK8W z+oHX#-hZ9o;@66?kJ(-p&Xql|IcDO9CLzv6N{m7VvqU&&eOi~kD)-LHeUtAUnISQa z;g;^tXCl3OcF(ESce=RkM_I3FZrcJL&*UyP--L@DtI{~vR_#1<<LRoB>oR|j#uTgG zu}t|@a-w6SRb=7hXXdwCcBL^*J~iX;ofbpA6xY>Lt<2OUw{Kezwpzv{#p~$lO;7#u zYVKdZ{PWGRv)4O+@A#!NTVMa`?5ld8{(U{%Q)Rg>mbYg5;?uvc^YO}DSB_VG0TOR^ zH$8FvWR=bSy#)_0o-H!{6xXl+KE}eNIHs2v#jPLS{$1V9)|Wly^^?5@TYuEb-h6## cd9?jr|I0UfcgM?L?|SyW=6;>r9P$4*0l<zR3;+NC literal 0 HcmV?d00001 diff --git a/pict/but_search.jpg b/pict/but_search.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed5287e349e2f92564d49534908f4bdde0799155 GIT binary patch literal 1118 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHD47SXSf(%T8jLd?J z|Bo<CVqjooVP-%EOw4TTj4Z5-3{1?7jK~r!j7-d|Yyu37%uFmy94zcmIc7#C7C}}9 zAz?N}5yy#2%E6OE*bM`XMH3qrZoK%>S&)H|nURHqg$-s4BZD9lv!c)<5ktp9r6A#8 zmcYb~Mjs|FJXoaMm^A7CEe0NDMg}H9W<dsfhP{j28aSdpO_X`AwD(-mMXCF*<;p@A z3(Q;YdZ_=vckNrhTMv}|D6dePmj1G_<BN;-YoA3`7h6gz0$1&r`B_O{Vp>>_f;W@M zv}yNQ_eO+Uimr<k+4e*C)sg2)J)1OhKSW<`wiHR7W)y8B^0$7D<cY;PlOEnKTFcaV zz3cQIo+V`mi#EGGEBencH`6EBBF}DnO3L=z!B#~d8tm>*VQRf}#A8XK(#DKWTMvf> zZq1q!uFmqf=XvnA%(UruGySaRA6lOCX!nu%+jV!B**&P;BGhp6+w4DrIvNv>&E3xB z-Eusu*KXcS+0esZRfW{j65b~EtW{6`bIq`)k%7~EM$G-3T>0cFoYznDp1ADPS`bjS zQn#XW#j4{vt=6;R-Z!aDuCutkcl8+-x5E4rRpxhtTJ&xu)p=Lvvft4zdoa6n_sx`| z=mYHD9mn3KPq$K(7Y)(LE7-cYiuJ^+k8hK$j`b{3mSkV%oOOHq(I}<`DihxYz7{)r ze}i*Ep!4sX&CyQ;%sm{Y-OQQSP|+^+Xo>X=!<|pEr*x>ehP?1vXTI`o(A4MV&E1?l z_Y61P?OQ2j%$pqf{A<wKz3I1`H)lBCGOvi9s=JB3a880u#^*KZTV@?AzPRZt$KIB_ zI<0P(7hy{y?-vKLi8r&$*}Fv@V_eg@=e~51ZgqK$JO8%xJLPA!avq8_XwO&R=9_Tm z>NB6EdO1rLhlcj9-W}0-eM#loM636i+k<8V&3pVSBh1MoZT0-PbBlxaPu_Tx{p<V_ zRiZZx?lb?Ak68Y+XWde+hsz&aEq~i?y&~B7d#tsr;?2;N64m;=3v^?ds+RxEJ9KAO zO@&vvVerxpWruky|3z;o%KZ3H<4nlQB#sN}tLmq{kpU?%7PX3KGU0qR|LJaawfS;F zJxBefDfGoaH55M7G8VOR{>w7SJ!bX1;7?z^=N$nVqjh-4>Q&Percb(m;^~!lpKHBz gi!VR*pC+^0ebV{lm!Cc3-xc$hS8j=X8~^_%0MNm#9smFU literal 0 HcmV?d00001 diff --git a/pict/but_view.jpg b/pict/but_view.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90a0ae9b60482d54a3956a2f8fd60039dadcfd3a GIT binary patch literal 931 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHD47$vWf(%T8jLd?J z|Bo>AFfcH(GBO|oMiy2!c4kHfW(H;y31${XCRR2921aIPW+oOEcBmv1BQuMj5G#W) zn_{5jL}d}9;K?C|iG__Djm6jn85o(ESy|axVdgV3FbOI$I|>Q2h!_?s1uY6pY~1Kn z6g=^wQIqojTMRtRAO*~V4E79nS_=&f)van*+)nVfdwK0bPSDf%lLA%i_IzB$vNk+; zvBs3E|GW<`eiU)WR<Yrj*X?hYuGX5HzucPj<9^8Yebcms9$m0#%3O3oIcf4T^C$h& zCa=l5?bDT9=kYV!>eynR36rI>E>8S(O?FO>m|LVvp6hq7DPLZDXYKOaaHn@;(`^_1 zLnmDARWnaC+*~9epfF*osHmvMiWR%U5<gpC*4W;X7s)R3sPf^{i4|+U$^2)KJ*sLy z<*2tw>`tz?OWAC%h{R{Cw~kwVm3`Z~wKLKrSMYzSVEA4(Us7e$<n^)2t($+>it4$G zoSWlkB4ilMqP%^&=hkB<W@cJXR99Bq!gn-ot*&eSi+NHzceXYCu-rGJkn!dGEXO4; zIHhymhxs`l*`#mU8mHMmxxev*vKY6;=`$9$Cq{TWJ@i()>d_byc*Rxq4@aq~&S}Ro zMV1Zsgm3G1u3wT`A}A@U|DQqovE+-&o#)eUo8<QyMfh-^<K(iJlrKCwX?l&9@9M;& zvbbMv^#+FyNYvY@mrHP}rLMI4@@7JKN{xBP>dOT|`!{A!;{R;-@JV>Y_MU40+2NJF zdpt}kX3L$>ia)mc%;jZq6$>ADwX23Lj$l1~e*@>T!}Ck(eYV>1+SN^3b0y@*t|l{? z--~~xE@qo=@9DN^`Ozza8=l{lzpN`^^7EIMsi>Xaf(bXY!(O`Q_b-bw$SnRch39B| x_X_1a{!QD<m;PtCnf0gS?XRraQwkER0&jDdYi=x-__))0w~|@@z5V}h0syiWLu&v4 literal 0 HcmV?d00001 diff --git a/pict/but_viewcont.jpg b/pict/but_viewcont.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76f58842eee5c730cac18badbefdcf86db88006a GIT binary patch literal 1924 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 literal 0 HcmV?d00001 diff --git a/pict/favicon.ico b/pict/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0a4ba44527995af4c14f35423c64ff52c518e87c GIT binary patch literal 1406 zcmZQzU}Ruq5D;JhgA7&%1~CQ(1`P%V29S^f14y0&EQgEu|NlP&!=md9DM<+o3=9hx zX71X@z>rwYz@Tf#Flj<R18?3&22(E|1`Rb01_p^LhV=GMhQkLBGBAkCF)+JEGrW5F zih<vwf}wQgYzBt(Squ!VTNoHbtr_MWxy;bDWi5kyXfT7Qo*sjUxHtm?izov_U@pV< zZCe=_7<w2Olyn&ws+Te_*!VFp2<R{{%sj)um$ii9$M^3H931QnOo|Q+iUtM@bC2v| zn04?t0|O%$1A}!014Hg21_nN528P;=470XvXJFtFVPKFpV3@k+2m>1f8v_G7AH$Tr zyBHYeU1XSba6iMJ-@h3cN*6OQ2+A_d+<k&!!O?RJY^>Z24BV0o40&@I*qE6a7}&TN zX6`%4z%c(R1H<g|3_pMUVwk!AD8tNs`xuxQ85kI5oMT{^cbS1<;WY+^1y>jt=3ZoA zm~$Riu#Sq4hQOc?0e6rK!2}~1FfcGNF@Om%eSJnoMkXkqL0nv1Twfo|2Ppva#bJCV z5SKw*T;Cm}o{52pK^!ci57Ny9=8KCnh%@LjFn|;=FfloU%>!8uRU!_OWn^>*+YNRD z$a+S1cZfU_gFBed09L>RQlQVk$jHb5R=@-T`rx9DfdQn0iHS)clw&~{;vEPV%4Yzn h0%=F^!A`+XG;lC5H1IJnJm6zs_#nf;@WX(C0RS!qYnK23 literal 0 HcmV?d00001 diff --git a/pict/file_b_alldel.jpg b/pict/file_b_alldel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e82f225dddcf276465c90e7be790bbeddf72efea GIT binary patch literal 1789 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 literal 0 HcmV?d00001 diff --git a/pict/file_b_allfiles.jpg b/pict/file_b_allfiles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac88e0c2711fa690c927cca15e5fd590018bca98 GIT binary patch literal 1658 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHD3<b=Lf(%T8jLd?J z|Bo<CXJBAtWn^SP0*uToZ0t-RL1so28Ac`+W>z)<21XVJW>z+4c2<ZcCPro!Rt7;f zA>qj)A&Q2Mfx+w(7b+zdHeNJxQr>7>EGjO@z{t$V%FfKl!3@#D$iT!bs3^2ZSj5mV zFfk~YrLa+H<A;e04_-8KnzTuo_5Upf9%e=cCP8LF2789P3l25i(MwA6-qPi@WT!&^ z{KImL6W5BZop>}fzWJU1*2{0A*R|$zzRZ_<+u;1B<n!s&#WAgi&Tm!>J>prr=ws%h z7uO7Cg=p)A?(6ttI630#b)TNqwSqsAN_%~cjMjc}f7rHh<ucEWkuR2?|9m*&%4H4F z?NNT`TyA`QZ>;+3d6><!+p3|NS3+HxKgBOCEI(hu<f^?fbOZC|qWNGwBG*i#eI{I5 z!Rj&7ccN?P`?w>&H^?Oi`>e{XUjLSR9kcKK@Y#J@91MH9R(b7IQc8c^8=mq~yZ6SA z*4!Iwz63w-*>!B)t(2UwDowEMDq*ihjqWU}skd?4xN=!s$+P5b9&7bH_HV5&=s(4J zJyhjm#_hvJj~+bU@2F*bX3Da2+Pymk#Fa}zx4Pzpo1FBt7Tzv-U;npeRN!f!!artV zNBb{t%@?biv-a}FuZ-6=YBtUfu4i4^DkPoxb#jpB0^Qe{fA`*Qo%Oh;FOy$iXRVHI z>5^aJ?_;E{GcoWjH&_(<vbW-1|0PG&qZWeillCf2)SfHpv&q=!PT}?KOIAtmxmuiQ zEv^&g`N+s_wm1K&uWjeIedX=^9vx?`dA49z+0mpmrHeMj7hOACv1@wbx#;q<x%rl7 zzFYT2zr6EL+RkEIb$0aGle>SHzj?TA>%GM~mlOBLuH0=aymrxz8(ZUUpN?PjM0VX& z0cMpM#VV$%$?4NSDLe3)PpX)da9&G^QSBzH?5T#XPphoNn=&_UYpq_K_S)-r%%5iu zcbkWvXU~c6x}B0I+VV8mLBZvW>r_LbH*Xw|NyeN^XIkK<^G$x$g=;$}UYoD{H8fUy z$=1H+D_`IHbX{%reay=D^VFA#3e&s<ZG=-A8NN-la`2kJ{oS$k$|t(Yq@*mjbzP`t zJ!Uaqy4BV3*6e1h$N#jVY+mTOea((b<ymOG>;B(7{!f*wzU#%W7J9ZlcxLVN>?=** zLT|5IYoV*{nbr2}cox&uNC%CHuD&NH^0r+sYvNK^J?~<rl6slVeI+UB>$9@TMVFah zJ0<vL)xT4jx&Dz$H0^Iio#{KxyGK9sq~KyRh9!?XI+m^F>6hJd=3m6+{|s&wca_&Q z_|Dgw7k7GouXM9(_KVd~p0j)Hlb7YF1>W3sC*r!UH^)cW!h@D#EQQ<J72l_S`Ke~= z_w0n+g=e>-z2=3jGi<ta*?E7tso1R@?`#il+B4rdE#wlHq`By+nS8q*Y`MhzsEvP9 z&#D#Q-^{DnQxwx;V7tAwe!{mq**`Rjx#xLiE?<=P*#D;K>U$g4t(ckiq_bzwk!r4+ zzB?{^EttJ+tyG2Mve_c<Y&M-%b^W-d*j%r#*md?C`(s_Ql6wO<w>SP;yY5hg%&}Ry zWz#c_Ps`hKuIc?6clf49j6chrV^^jcl}5*J2-&~PtTLx#*Y&{D^35u1b9?vLIs|^_ zD|J7tlX9|uJ!kY+p|XuEc`~p1+agkqUvF8q$nTm$@8P+DA5Qbk`1N7R70+8o1a}m# zvXe}lEFUK{tJ6B7$+FyP@xy77hNTa+OohtYzi~Xh1Jk||tp4=QtMWV>K*syJ%w6Ls zvm4bo(xesLb@r`vpZ){l9yyo2YaFdv6uP^5XYKetQ)$sZ$z^6ga$Dp(S5Ke+eE*5! Ny4+po;%EK82>@mX#t8rb literal 0 HcmV?d00001 diff --git a/pict/file_b_check.jpg b/pict/file_b_check.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68049e674a4b13538ad1e65aa330177c31571ef3 GIT binary patch literal 474 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cIo41COtf(%T8jLd?J z|Bo<~FfcMQpa51jMh0e7F-8_v1_1^}CRP>(cDPzbCT2lJAr@8!VG%Y%$Bjmlj70?* z7+4wDIpIne7#Ibam=z5V3JJ5YItC^dHcm8hQvQF7frpuqfk}{Akini|&#CepKdWb- zE<Sjamm8_Cs_p3%YsjFuX?>weKWCN@w`8qaWYl$`*y734g;^pZ%e8Ctf{h-%K6778 zF71-AbI#7dy!5kM1wFo6nXo^buJLklOZSu0NAm8ag?_)C;J@{4-88X%ER{-qY0uuI geht*0ve>V|-#5lGSoru=;Z--iG?rcyV*h^=0MHm`@Bjb+ literal 0 HcmV?d00001 diff --git a/pict/file_b_expand.jpg b/pict/file_b_expand.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86b720efa5126dae8d836e156b9cfa4f92a87626 GIT binary patch literal 2292 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 TSUBr{6fOL-^`*XK{r{T)7y|ry literal 0 HcmV?d00001 diff --git a/pict/file_b_hide.jpg b/pict/file_b_hide.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5689c05b18cb36ce96a771a697cde40c99d137b7 GIT binary patch literal 2112 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 literal 0 HcmV?d00001 diff --git a/pict/file_b_md5list.jpg b/pict/file_b_md5list.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9dac25518acf9deaa84115d9156f7e9b62f0dc34 GIT binary patch literal 2716 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 a>EdOl`~MW~|MRKf)SmrcS01<ee-i-PY}n5L literal 0 HcmV?d00001 diff --git a/pict/file_h_acc_cur.jpg b/pict/file_h_acc_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8907e17b7b98daaf1e579501ba8d72243b0a4888 GIT binary patch literal 1413 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3{lLCf(%T8jLd?J z|Bo<qFfcGNF*7nC0VWn!MrL+4Mg}HkMidD~CKgs^HUS1kW@Z)!Rwfp9h$bdRW)?wK zHU>o@VME765m6<hz(QsA#)%h`oSVf2L8_UVnOR{bF)|1;2{E%M8U{KxPE1r1E?l_r zU=Zv7TMRtRj0{YI%z_N|46h=~(i4uXZ7kZmZ;fl=!#)<JC957TTBRy{A-uL?x5TGi zQQB$cEY4G{o>y<WwWw$Jk{=h8gckI4>YJU;TDnU~az$@=K<iGAEsm<j3g%Hup4_+- zon7u}o{<wR7pHTs$l2lGs;e4$6BYEEe(25EY?R5cpQr1v_0n>!qc;;f`QsF}9a$LE z^YUbd<3Z6yD}<(U3YOjWiP+&CRPx1Z$EQhdiJfl!az5R6*pg3&daSq9oWLI9=`wLs zkc*a(mafegp6ZqjotG~xe$uaKvuC|{+iP8)J&rwZra1N8z7)w+5S|j?q!Q%2XA8GD z-$grtbiu3IH_OxxA31z|1+R^^Q^r#xmF^!JE5m(~?^s>dXO&l}<UFo^tS^5f_ZFqu z=U3la(l+(pk*I=)r>ATE4EBC7+g5d7=XLS)@QV{$O1D`o-V`fp!WyN}lzV3S=MUHB zu?fs5S{=XFtFvUv6YDt{MN)h-yBwvWtC@BwEx(eqH84~pRCKM_{Bw~%*qBzlnP&S@ zb*h)HY1cZP45#Ok>o_MovkdyaN9?ueF6ka8^Qf#SkE#seBLCGh1PU_)SiS2-eKQ_E zIdpdaE0@<7XQ#$J-E3JPD!N$Y?}6>si8ISLvpN4~usO0ixG?m`3qK<_ZmHtfW4+%> z*&{nw>6%}!p8nRu!!6{>@#H&oSCl#13f`=Fnq2<uy;)7~8aLw}x4dZmWS{+#oYPe- zSd3ZvR~cF@;!>NlM?5uNFX@Zs6m47EGc`pgXNa@SJGEc$&?fKQKi-_ExPQ!)`$<;{ zcTIQ2j47Ma*K{l~dCZl1X;lf+r-gO0Iw?+~%;r_4O0n|0g132Rp68BpZA-Z<yZwA) z!rc5hNAwds`C?ZzH(90sI<wE#`$Ye&$<=?OyI$Tp*%Bk!#96y!%Gwi~`46q%S$Frj z$8G)NTX&eZul>0AtcBifJCi$!`;_!tr-?GkZ`rkP>L=Nfw%D~jd)Jk({L?C&6_b6_ zv$^S6K+){hTd^(c9DcvG5nQ}KH%oesvf0H&&2MKPvN>3>V8&bDJ*AQ<w+#e^mv5Q> zX2y1f*!hR<mK`jbd0|tw#bd+X+jlRy%!p)Zf4t~e=5toZbBbqwwexv2KVNZJ?S{eB z^xFcO$?IPl=eZuvE00axu+w3uVPTHU4!4MteAT%Z<3yOA@i)9ZU#ep0`$u!-e}<Ve zlsv3OHmwa63)uABsCth_ckf|0ulow>!rL7!9=$Y;(=ofXJn7TACwqdgM@d#rJCRfp z`myk()hcWEcO~U|npr0mEt7Ul`Y2LeCZo^4^r*|ynmv0<Tgy4N2AH~LG3?#8Lamp> ztwq^Ma3RNqmJBBoMJa)~`%e88UB7Ip_=|}t=YIEpD*9(tw0f1}F0Ir15B^U1*`ND1 ld;6Z(uh;)JySzR6ckEx0Df=({yTASNn}4&~R>c3m2><|REV=*y literal 0 HcmV?d00001 diff --git a/pict/file_h_acc_link.jpg b/pict/file_h_acc_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50d9ca2a3289308e6919988c79a3095015aa6342 GIT binary patch literal 1153 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3{K39f(%T8jLd?J z|Bo;<GcYhQGcq6pCT12^c1A`<Mg|lKMvyq000Sd4GYcaVGbdCN6C*PV11p=LqL8qo zp-7;TXkwvJlX9?0h#0#d10xGaH4`(`ct!?6CT1bSKo-TuiH?a%!i5JHZVdW=i-Cuk zk%38&S&+e=;Z<Z=YT}W%jYWI+t#K`U*vF!@WYxn(tJFHbalMZhcb5yB*7Yqtp`&Ph z%=@tHn84}9^QBmVLIfwOKD(J4vfahmRPbuHz`7t^0nd;VydgnFF?pt2chBkGVy4@# zFP3hpxFF$bsW0m#71l5DuB$X>S~SF``5d-hTCR2UW@0CQoWiyv3xj%Ip3HDOD0(r3 z)7!}<cH1hA4bzT%`4(*PZjxJKr(3_APxl?R<kO)Z>n$}Wu!nfMOxzUYqRS~N?r$Pf z&6y~C`Nr~_vWF@w<Mes2Ma`^emb|IaD!YBjCYA^5PAq8gSTeg}!J@-U{9BAWzIuI& z?cDIu;Oi@9f36q4GRs^h)^TY?U6rZkk4b$1GNth3$HlYXIKAaq_W9Mfm5NKtH;Vho zSQb59->X$CoPK2c!<a{JUI*=%Hr@PeK}@&7sp)$kY>!xb;ZBm^uFFA}oG&}fo>Uui zpt;+tK`Z*#s_@0fpB$R?pW#a9>lbGiy}lVaXB#))#jf;g-*bZXz6G49Kfh7y%AM3Y zE5S`}+;YXS$FJYKBAceRVpo1_xBe<8C!^zPR&tNOZItjaZckmRExq5oV)K*SB*QsL z#zi-)rBi>L@Y$(&KyijjZD8kBfk2a|FLrDFcqHyD>1_P+Q}W}okOMm`zJ(aw(O21R z+jqLXx7Kt;e30e@-A}rYl7ddo+oUw%a*yV8uaz%YA3Oah3Ovzb#FqEtt5RJ5UC(RY zCHGV1oZC`1%Wgm4m@qqkuAKM=#ZJ8|jt6Cp|E9&uEq&sC)^qQ_+@sl{MTz2U2~F{y znp#gH+rMmn7ytRpQ|Zhf-?p=T_`1)evd^*X=9kNbZ9h78ibZ5G*|+T47y7|;N71Vb zryo6!nSUbE)H`qQ)EO3LsqC6NVwc|Vdcwc&@<A!<Z`T&?JY<|JrD1n-kMbGuF3!GN zxvzs_R-IvS`S@1-pQz{w@$?T%cPH%hc@b$kr*Ouxx9?sm`RFt`f4rD%^0{fjbAf07 z79O6Y@N<px<OqXl>5l~rldpeSxz6=)R%vYZjg$Xg&p-a{Kf~<rb-zAsj$K-|<Jv?Q PS3wb%KtTv4{{JQbp7Oib literal 0 HcmV?d00001 diff --git a/pict/file_h_chg_cur.jpg b/pict/file_h_chg_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f987ce883e1a3c8714efb32b5eaf8452c551064 GIT binary patch literal 1409 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3{lLCf(%T8jLd?J z|Bo=VF)%Q)GBPqC0Y+vPRyHPfMn(o^Mid!FCT3PP76ArEW)NUuhU#KsWM&a$Wn)kj zG87h3QWkX#bYlOISU6FTfr*KciH(7o6KXgk6N4bLqL86uV4^Tfp_0gl#)%6LK6Gkg z{eO#rhnbOqNsw8P!JgsE>2JlUoA1opD&aZ5taRV6=m!Q*rnk;oRnE((!5p$kQ!D)C zdg<<K>C#)cugsd;c7kzTk?Uf^<Lf5gD(%cTY4hrs#HW_U_D{GJg>9El;NPL)8R&8) z<?CI)#rtNxyyo?U&Hrb1XsY^*qX|pXs~5geTCQJS?{+diZ1cx$vt%pEC-3l!*&BJQ z=g9JOcaBX{+_ay(P|ln9PUEK5g(>@{Tu4sxSe#_ew=s54RAlM5xY@GXlbWnmH<z%? z%B_;_SRE+;wnXB_MTXbXE$#9KN0uBZ%BjA?zHrluzLR;uDi<_$Svf9D30i$=*T%1( zn4^9F@boKv6?E4>a<W}s`U+FxB7xE?Q%*HZo-;+Dd#a#!WAJ;|D}U|0*RK5`@ku{W zN7r21_w1%Rk!z~1xuG((?Ti=XG(%k#LVYKP`S9+}W>OIsO^W(Z_(IM_EjrHm<g|OC zLWSbX{xh`JAH7~vKVxahV>{-z!P#25pJ&hKNo5cYRm#2QpPYN`q{D%gUxmD~&p$tO z;)vvhF!q-E2=BulGc>oYnRj^JoloAOtDh&_S2~vF&1-X7D0w&kgnoX7**UWd{8qnq zT~&X7XRN${o3+>EJJLUVxHfH6h&?e=&wl2U_sN^&JHnjXODy?!a(VN4BpDr3YdJB8 zDK{oa_kzpi{_krIQ;+r-u$Qhk$e0-(mi2Va(zy-k9sfMD+WdUlC!B3te=pB(!;*r< z#{?^6IsPvC&SM=ScKLSvzODZ0qS~@t%?sE&ZU0@@D%`f9cn<&TJ%`+Mnfdn|<SaX# z`p){y$-WO9q8kIQ90)iQE1KxvalI;Nu4(?NV=_;IT^2t5v%gYK?Uu+V`zcB3uVuch z4;N1rh+BC4$JLe~8HVVV3V!L;Qem%OKYD8^@KIH2eXQ5-8QZ#kdhUPaZ>aDv`}N`X zomEHvGo;0>y{VGlAyKf-Q(&QUd{5?=BAajbANd(9Q`0rjQdlSS{;K(nnIBd<?>cpF zzq#LEA0tb4KYPASAwABTHgzU!8>h<@>E7Z!`e?e^t#zJh#(U0Aj(Bjm#ATJL`=|d5 zrOY>u@0j!_q?b9f=Ic&7vsLSAmrWNw^6vPA_;s7s_9h3c+Yq(Ab(3-L4wr;wOEu43 zQuYWbZn*qn_G_MbC%9HgSF*kTGD}HXZB<_G_mvkDjl~}4Oe>do(0fhW>oxxhRhENS zzA(vJSuFOg;)(laG`)EC<g2P{3T9+(Kl55>qVDgl3s<+!D_O2K^Y)qE7puN%-JUAq z^r-XNl=V;7*>8OOP1<eQd#f2?EmxCo>dsbZein7#eYWo$)-OA5>OV@_z34xKaLk$; z(UQxAGc(sLl5#QW$P~DwxWw6`Z6dFdon5@Vzn;~FyeX!VdZG8%tw>#3!{7Aj$)Eb} jr&n#x%WuE4HoU*Qef8SR)8VyW%wvlttG~9G|NkZcb2l)5 literal 0 HcmV?d00001 diff --git a/pict/file_h_chg_link.jpg b/pict/file_h_chg_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dab273e0c039b89bd1c208f1f0890337d4913ec GIT binary patch literal 1148 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY40g<nf(%T8jLd?J z|Bo=VFfcGNF*7nC0TxDPCRTPfMkqkYFfuW-u(Am-FfoBture@1q?ni)Sy&ka*%XBg zm4uZ=9Rm|Z*b65*2{JG;Gc&O=aza!wFfcL*GARl%I|dpi77DW{eQ2Dx@ZdwICXxTQ z7<iZ&8JGl_1sUuaUe0`1+<N%Q)GmX~^*UF7ee7S*7Fn>ovOnN~a)RvRj7c-@zg&Op z(Z{8Rr7Y#D({D_3;Le(Hq?pfkiqov_f=R_`8?J9rjr`BB!H~uC%Up)K1qa<83$C1e ze2%ZXRoLv+G7ZcBMT_oT@%Ko+oB7^%?Hh$<@4b&#_qcy{UG2`Gwmp`s3nDg~wuh!f z<-U3tcBSKLrHNv$@+*T)GjA-}H#@`d#3YFw-fgd<XB=6&-h18k=&TmAQ)d^bEIr@2 zNv&M)&$(uqZUNq)2b0&Iv6womXLr20<CV*Xyqk7=s<KRZW8luJEPcN1*Ts*Yn66EK z5%SKxU`b`Yu!`a1SqnS@IZQWZ8Zr62o6w~9c9HjnZNJ}I?LR;9*3BBOa^)T2>`IT{ zEI8AVvP#a@nBn$>uU-zzl9V_%+D<e!7F<!7Qk}bM`_W449qW9Xp6}Fi?>buZROV^c z$xTx&H8#g?`Q1`&pD=AxG|Tt-Hhv%f{WX}Q-r?kSS*Wt<ueh?Ln@hvH$xr6g&-_$g zc$<Gkg!A$#*8Hj38mTQ|vyLn@Qe)JMREbS+dA$Aex*eMy9aCZ4`FMqn*O|wfW>cfG z|FF+J{8LSD%BH(^&Si7<8&Aqo>6==0NRN%R-ed1!e(%JX>f-O$BPt_i8JQTeHOQ%a z{#H7<FO)en;y;7UGc${=e2Oy{iG7@L=5D##*>Z-)WHmk?HlCx4H7386{q=U+J*oXy zdwiaBCMA^o+4rh!X-4OTKU2-^XBJ;N^CU8(+0<|Uv9n4W4sf0bU+_5R+SY3|f7jmL z(Y|F#`Fz<dyEJX*D$n{WbDi3G=GV!6m7J&fSKqYn$<%!cnU_wwIxY39GxTo@-?#nS zWI;7GEr$~=8<wx{DSdJLNn&T?&NFfQ*6w^46fl!*PF3EljYldyA7}@JOC(E%>$)pF z+MX`0vuW1Z_a<|$v*>5^J~Eg8^`F7#c$p7SLpI%?T%Ev+s}%dOPir`?-&aq_w6 z=ew`1je8n3Rrr|Lt4n4P(@u&`o1VXr#h{x1`swf2C7(6+B;I)t_kPixgqYdkKG)C0 VP08rED7Z-3#jT@PP)h0lO#n~?yYB!1 literal 0 HcmV?d00001 diff --git a/pict/file_h_cre_cur.jpg b/pict/file_h_cre_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0df3fc9a0e82d51b3fe13e458784b6fe6a05471a GIT binary patch literal 1389 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?a;nf(%T8jLd?J z|Bo>AFfcH(GBPqC0Y+vPRyHPfMg}HkR0$?VW>yw90R~297Dgr(Rz^;UCMHH^7C|9a zHU>puLnRSW$G}7*r^1N~lbn+$yQr}XGB7eTv9Pc)F+)@{Ffs@-2{9`g2C_INDhU@h zPTXkZ^dU%Dg!TU|1|DWc1|~sfK?Zw<FK51eZaw^D)=>%1`O`}G{Yrjd@ML=HtX1W_ zj2g@#i!`;uAD)-a&eiPNAb4e3w9pR5JnbFU*H&vWoYQG8m=!MC%=xwLfelAXu7Jne zNfHZHgIl(3XH2W-shyyAq`g#Q+uoR@mQ80ICDsXTyVE-9l$o1Gms5MGXwcr^&Ko=4 zde*a=9uIkt6ZLxnzmlXydw<57qJ(|7HmP1d<);|c{mgIbk59Za_v*yE1xKWpO#WtD zE%U&1!YP-w$4z}^{QEAuIILRH(vdRNZ=Q{ETG0vNC(Q=NnoW1Ud~^&t_xLEUo@k_x zYS5NdmH+1CzmEBv`XZ!Uc}1+{wpYEobS-B!@lE37PF0<v>MqD3D(JN@MJ43t2kGke zSG8Q$6R&7*yV`bm*WXZ)3DP-rkBy=@mh0cl-9723>di}n8|=OrF`bKe@Fr~1%cM(J zkInYqd2W9df7hbG%+JsEJ^pj9y)S#xxfha#zH2pFy1G<47OlK0Dt<6{UYTRp1=dT2 zA!|hLgq?4^UsSE8E&6^#@x)|f)wX%5orZVY3wq}*n4L4bz;E?)*Hv}*UYrx&qNwcI zX>+ii)v;%>l0$ib+1u>m+qDf(9P$MMH|2TMMirTCPBS{L)^b<;Xk@{a(<?eAMSp#| zO+RXDu+*-~o}hC=lM`;Nss7LKY47EW8~T&)OrDZ&RP;$$X?I`ZPQgQl?ujSfOel+t z&fUQ~_2;#HvdPuC|9mtLzS60D{c4q2>T)@+-}=k)s@d4(*RaX13DcY|Q?2&o`QlxZ zPB6H3U*gX{Td28efl>(jm!}4IqFT<JS!E+3WBOCw?5U!+!Jmuv*1orkcJUcY&p2kR zpLFzG$4TFvO_2hNJcZvaoU~}^TlIj@RnuP|>3ei1Z?dF`3g6DDYIk}Zlm!;QwPGvS z{(RGpJI4KqmsG+cl9YEmlUB~SQ+UwqsoAR=d(R)b`tkMgjl23Ym#R&k^UCg&dd8Ip ziBIO7$hKCV>D%V?GI06kIi0*S*6vqQVsXw>&phy_>w?izM|-*Xd@lJ;Gx{EiOg`|q zi$~@8a?@RhUjJN^wz%=Q*^e`)9yA$hP1I;<PTY61_2^ZBR!`ROmvQ0AWvrj|SE|~q z{bG1A=IN*6PZ28%3}@WbeUiE*C)RXRnzil0K;^=#uELJ%KfPOT{_g$Sj%S;5b2}za zZOg7b`&wOIbZ4@)j{&3XnlsvS`W`VUEELiT70nF&@t=X;ATM`u#ms1n7uyshbl2}m z`n&mVZE)P(^zy4Qb9dX77h7-FTA8=xRJtI?gO&m(3q=`$J`Q&lRq552k53X&@4g!S zY}Y-@l^Ur+{>$H3zFPC;+xqg|-nu{TmU|U4?~_~}djHkFv;X)v-Tf=?UHYHl_WI)Q Qe=GApg&tdP?)3jA0D(U%Gynhq literal 0 HcmV?d00001 diff --git a/pict/file_h_cre_link.jpg b/pict/file_h_cre_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3861f661ef4ae1cb86f947ee51cf0107434f26d0 GIT binary patch literal 1103 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4A#tyf(%T8jLd?J z|Bo<qGB7YPvN9k87A8h!RyKA<Mh0d^Mn)tVMkZz!RyF|!Mixe9W(H1}E+$5hFoU3w zqLQ$oV_;&TlZdF;#3B=RaX|(~W+rAf7Iv5+j0}QILd=SREQXGWg^j`!H!2x@IOr7A zlq~Z976T76BLkBlvmk>#!^`P6&+6Jv4s{bszioAYuJ!|iC(~Q!UbSg!n9cBRw$h|! z|JK&zt~FVvb->*yvRY^dWA3Yh;x%C*jB~<x4`s%L@u<J&Jy0RYaZ6$1V--Uu-^-qv zc}!>iZ2aU{reeLUTl?rS4R7rZWzj=nw<m0hbUSfW&?Dey&Z^m8eS<d^-kS7h%5|Bm z2TpAKt{~eHdBo~lck^V{Z&xSk&0X?HTqN$v%l+#Ea?ZX?`e`)lu=Ohc6CYnaXI#zg zG2u=@;IV_>Z)J3dh6+sNnOySn<t4Lp-G+G`X>6C)h^4o8aZP<&v2eL!=#)cwv)}G2 z|GhQ;+0JjL53G3SZm{H8beGwSEl;lqluYo5*3?<3WzpfVqAU8lqSEs1j>~t{O@0u( zQ|8d=*P^8heOH}avH7-6->TK`C*&);rFrYxoEA#n%|D@^e}&p@wL8Lht1p)OU*9F% z@|MHnQj)(w{G<cN0w*e1FEP54Z+zPBP?3UpK;W7?6Mk)Zl9_fUwa=Gxmwwl#hbyNC z3aUJQf9+QFx3wY1*82-~t$C<v#@luI{=c<n?RuwF?LBGMdq-yFXQkaShl`Y3iW1wE zH#t5`t@!wa?bPq``xmd7Ub}zi&>Xo%$NTEEmD3{gA8g)sBQ1SG!1c$Bepf?-^(?;5 zo;<JbmA3+;nB@|A`EsS;PzRSg><`x{uGq>sb7n}nfkpbeaI>e1-UdHT8d~$7)-BLF zb-U|W>J!uAMMlAu2Hr{{o=SBgMj;{3E|s#zUfE~0q*Uy2$&8Z=6^d_#%q}uy=y8hI zJdk(Vw(8QhsmE7dQVEMlQr>#T%<bZi$4$AXa<4wv=RdjYSJkU;rh#uwmRu^{w)n}S zvR*$nS&=t}b0(hlX>)oQxO{V^khEcRor?=c+Z})5#?RscMz;(6r!QX}D1Bj>@(x#( zcNUM@go<C@n)RPS`^29ZyAL-183g|nPgl2}{^a@dzjLZ<cb)&ecK5$iyNos8JpA$J adeHS5yCyDDc5&<I6_ipkamncZe-i*gcc>Hq literal 0 HcmV?d00001 diff --git a/pict/file_h_del_cur.jpg b/pict/file_h_del_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38a713b9ab044ac68e3479d4a1acbeef7d355cf5 GIT binary patch literal 941 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY42H~%f(%T8jLd?J z|Bo;<GcYi)Gcq6pMkZz!R(3W<1}0`k6d6V)7FK390R~29CRQdE7Ivs6W=19!K~@Gu zAz?N{5ywO&_QFOL(TPTjoRgbX1sNEbnVFecp-LGT7#ReagqT?r4IKj$CpK<WGGhII zi-Cukk%38&S&+e=;bPvuM>p1%AG&c;?xEfjflZFgY$BaiF0LWj*Av$-3e}uvQ(~y9 zapeKu(`kFwHAIJMvD-ZSyf%3k*IS8zF89{;lfLvk(fCwx=kVK|>+`!qwL4CWJ(y}T z{qvg{yM<)0yr}8!KdW$*@41jC&pL+<>XI^FrIhFOy6wzfDz@5hM$4LW)=jn|EeCI` z-f@CO<KR+mm9^oEMKgMnQrDjT__EiBN73ME*#4@iLN7HYyenLILf9-#d!|&xr=+QC z!{6Gj4$WE}7`i%2*IqLHfdtp$O%dOZOk5S1*%MkQ#-j7CcK?j%+Os=8S(o<aZBV_P zd?;yK0K*DL!6QW%`qtWpyzG_my0fOkD`Y}^QfQHing{=)C-45<_-tu--1fuN%g^sG ziA#5ES2DlcGVuy?GN)#r@QJ-KyF?AM?xk*s{30mG(!9R)R9NcnqE}DE;*$BEAIl5) zvHL&6k<=qX4lfHLg3FWpnyu&QZp?~ZuDs&N%jbP=Pj_-Q+i$h;ZVwimpwPJaOBC<A za0O4n_mgr{#D2(%J<XP6D`s4yJx7^0VwY#gpR;+D%e#_}KYw!UPEYLPtHmd`$5e^j z*Hc&DeWYVgo)qh~pFDFO-Ie<BR=YJ;LE@^pcxZ9aOMjcV(`U9h3om-u-S2rd@Rsel zKJTumohnKZ>(<5UI;SyNFJIEt>Gh+c@-f#t!K?*YT~`>(ZY-E3A<)L6*vOfDXZ@nB zpN=g0qY|mH_xQW4pAS#13*tSrX7}IzZT@@8?yfC*Z}#o=-<gTG*Z$M{J7w~J2G>9F L%LT8h{=W$T)*Vr! literal 0 HcmV?d00001 diff --git a/pict/file_h_del_link.jpg b/pict/file_h_del_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..253db16e8c571653a3bf19303e99d324defedf21 GIT binary patch literal 694 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3^L4&f(%T8jLd?J z|Bo=#FfcGNGoS!g7B+T924+S^Mn)uYCT12^Mm7NkMrLLvRwj0s6f+|e3xgo55SyW} zv52T5yJMn~vWjY`m>>fa6C*P-3*2l*CI&%fMMELSK$gVDi5r!Sg#X`S;9+KDU=m~& zWUyzrxar=bgpV^1Jvb?^sIMZh$&r~&q_fJ!H6;7`gzGo;rhQ%C@6S84GJ^TamDk$> zc(YXw-mkVR)2Vb!UCbru@nP$yxQTOG<rg1&CO_@j-u+^$;wJ8iY25MA{PR~^$&l`y zR&tMSfA%nRK6zx4v-SiX&SUPjZXM4T2d;~L>ALH7t8!xL9l^H}7S<BSmP@4vKgj3F z-#JtEc;CTwVJv%cDty9DF^F;~S@cB<Uf+H-PxPYOu^Udtg$nnMoOxnU<giyYSoiI; zPZMQ|@3Y3+)m6Erl}HpR*I9VVI++<vn(@%4`{?O~L0gkQ8#ae82v{(o^v9$e-Mytd z9!TUq=2zXeDd5}g{|p{yI#e1jJ=n19-EmpAa+{cqS#iM=uO$`yywc~BBP0HI$Cte6 zGTKZW((#$~pJq4z`Oi@MF#hTO{yXg9!T#~fFaMs}{Byb1(;wfbJ-fQ4IABVv00_?i Ge-i*T<ka*4 literal 0 HcmV?d00001 diff --git a/pict/file_h_gid_cur.jpg b/pict/file_h_gid_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e775b344bdb256afb445770a8a9314b1a48a64f6 GIT binary patch literal 953 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY42H~%f(%T8jLd?J z|Bo;<GcYi+GBPqC04oC{6Eiyt8zTb~Gl~RAoQ0K5fPs;Pk(r5=k%JkciHVV!g;kJ2 zkxfY0Fi}Z_-7&CnqR}E{XVK(l6+w_<7A8hkh*AayMg~D9W)?+5N1?z(rHKoJghl?} zV&GwBWMC3x7G$tzxU9ePs;+5wsGHF8+gA5$wO>EpsroQoYwlqOABLxflS0nz$&I)) z<L!d}Ns(o$39LH<{3lerI<$8BOoh8^F0Sd}J6^h6C^7xp9CjCuP%BQ+8nf6h{~4y` zxy@p~-%@ws@GY_HXKGAtSf-irhMPPz`8xCZ>4@GL;*N^@bSGyve_8chYQuvF?wa_+ z?SbOQYa=rZVmcme(A79m<WN5QrAmO?w!>YXbEjL^?z-OGq`qcq_}#0;QC>x|b25sg z_|6<v=+)iZ7%Le3R$^U9sH>=JaqIENI)9iMZ&|DMS4=AP(K9_7Eu7(WUT;NZXt=@d z-OHQGCR&P!CG81}@0Tl4U(C6U&uG(>NX3xi)un$<?$W=$Fm~&y9mm{PHhy#brSqw$ zrBiAbw{+*9$$Fw%cey9cYds~gg{96VT`q0wG9Rm$u-0jvN6bZQId*=!dhC_s^tf#0 z<XsIdC-{HXPAw^^SH515t*0VWxV7lSbB-IfrY)%(=A`X)yP-MjOXm;uzNNWSPF+l| zo$Y3$WH_U<TUWaOYQ)DKSD7yCOcfK&77cFQd+$i13nv42-`-!lTFvhouHInWUTJqp zZ{bAm1N@vni|5R{r{em!;Nqn96NEc&J6b$?X*zG3bZ+pDy^(jOFSYr)Ti<At#9UE{ z9e@2+$hx1rcxR*6I#141+Cgy>-M1$m`tW7PiW%oGzkI$<bcgG1hi_f481`=4pf;^V zbs=Yl)9l(azl`VWdg&i>oig{k{K>1|U!LBs$@Y+E`@jC%>fhyV-+G>3dHe12zq2#1 Y-~FfeZ_3pF3?J*ezr3<qvj6{00GJ9_MgRZ+ literal 0 HcmV?d00001 diff --git a/pict/file_h_gid_link.jpg b/pict/file_h_gid_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38833628098e304ee60396383c984734bf865f40 GIT binary patch literal 725 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3^L4&f(%T8jLd?J z|Bo=#GcYhQGcq6pHYQefW<~~P22^oo7DgskHUS1kW+ql9R#uoECPro!K~@GKVG%Y( zLq{c1G4{lRM#?7Qf((o-3@iwB42%qdOw5XgjzWQnO2RA?7X~FMi~PUEz{AYQz$C~l z$Y9TKS^v(f(`h@lW*JPid-J;LW&ZZ#Mc#+bhMMv+YA}Z^^$gnaacjk;8Fw4{g(AyT z6Iizf_)oC-bZFb@H52k)o8(Sxyzy?!BOk4Q%NZ{+iTbp3?cJpxlm1ifNn%6I7xxl_ zXRD=tcDKtEPfISyx^ubZ@^$0wrz3i2h&egeM5|qDe;T^h;P8V8?vnlNd|Snj+eBLC zCFgFBI=JofmFp{BzPz;abJ<cuwJT3rD>r;v9d58U?#&0km%<Yr)3lF@{`mOpP?f># zgvZ*Nu9HOFjZ5QCS}po<KX&V>9mm`=8=pCT2|i^cq>}V%nz_hNr5J6kdyOakou0gj zWt5*Nd3@%!EhpQ;MHi+nD&##HucTWyqh$RO$=qw3j4ao(s5#V6-}E$P<DdS#2iNsf zWD2(yJt=O<<M&OJ%u$zImz*PVwy5))-;cA~g0)>|f69?~(QzzEO=pXI*7Tq6w|rNf neW_Nx^6{VBwf_4Q-v8Tse)IA-FH#P7P8MwBIM9;d^#3LRCnfAd literal 0 HcmV?d00001 diff --git a/pict/file_h_meta_cur.jpg b/pict/file_h_meta_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62d64d95d7831aaea0fad1291bb29737c1ea4f14 GIT binary patch literal 1080 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY40g<nf(%T8jLd?J z|Bo<qFfcGNGcqzD05dBC3mZElBf2;PGb0l#3!4A~BQrA-D<eBAR0|U$GmD@QD+8ON zp^~tOV_>3@lZqJo!h_1jqJj*J%uLMeOzcpl42%qdOhU|x!Yqc4fr*VuB85g17jAS4 zDq{VAi-Cukk%38&S&+e=;pOptW*_neZn1sjD?C;+?PfrTP_CfYqI#~itQEx%*GoS3 z*EfC}E!niHeBr@A&0E!;6dOd((v@R8kgfIkOXjpWr5+B|%T{Qua_~HSJy=)gKxcm0 z5$=sDpThQiy}4~={ocN<qJrV4lcvVS+wTtjxUSCVhp6SmM}o8O{LVaaRCCW3<u0~f z>Bovob7k~fL?)~(`lYtu#_X-Ce+6SImK|8bAbpAJn3Q*KeaiQBGnZ|isTNq|BRZ$! zOu9_aVi$HFwx{hy%BM7@MhShn>p%VLwKxA6W@sMHdf2xj<jB&GDI1NHg_WmXeA2Mv zV$q68p%ztod)}Uqn5OL@?sDnsboG1l`^?qSYo2_*@x)_NvO`C8y~?utJ}=fy)DQ^u zI-Glmb;aeVU9~Za87_~WT(J~AU3Ae%rNnFQAK!V$lgyW?i}J>$YfB4Uv;A5+QT<+r zOVM5H^Gkj1D8G8XtT#th!^{14@Y{pmw4O{*Vf*H9811YQoowDYbK6N(TQR4Db4~AL zpBH{-nw-1nXl^5m=qslXuj-Q3vl?Sk)SKIx7Pg0n^=|g${Ss3ApP{#0FPpph_QeH9 zjwdg4U^nvH<)QJ-eM1k|U(L8>M?DWJy$o7zRk(L=ilU~^B+qH`tM~oWQcZJVU{3rT zy@x0E`h=T02hVmKxue_Az3z_M?S6L?wY#BAcGGoSRh}QM$et0~qHkl^y{y5fdfQs1 zJjo+xh4~GQUYUHHV&5q9?PvVe^tIVhRpD)W)#v6-FP-{GYNuYA^!&1%X_Cj@<s^6? z-L&-f>Bk{GtUOm<Jeb6PXsMsshi|X>zOIPZ=PWPKj=OO%yS?=7qXW|_(i)Q*wTgsR zXI*8xDizZj>auO>wKA923wKWz&Q;~gaGE8stVKU)>%;R-g8SB;pLN%G=Tz$ezA4c! zbFEgNn)f#_Rx|mnKa+d%fe+T5Pa|)>`JQF=UGs8j?$U}+m;I94SN>X9|NkZcbsmm^ literal 0 HcmV?d00001 diff --git a/pict/file_h_meta_link.jpg b/pict/file_h_meta_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d691cfe2731222df8d204212276ac7cae98276a9 GIT binary patch literal 911 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J7=7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o6C5xzF)=Z-FoOtI77$=%V+8{?Hg<Lnc6K&SPA)D^P99Xi$jr>l z%EHRY#>UCZ&B@Kn&&S8d$IlN|1f_T&Jg^WZ@&5pWAP0j8gE}*#AOn*iBeNjm|04`t z3=B-njEoFOfSr|%gN2h3L!5<)nU#%QfPs;Pk(r5wl@+Q5#Aah>U=$MOP%=^$6;yOG z77t1iaZwdyU}R=uW@X`qDr8_{U}g~#RuW-l6f|-QN@_9|RV-XsG-=T$W#{1H|F;-; zm>C(E1epaH>>2L5o&E83Ut(_4d8LFW=@a+8J7=1ErBQU1(56p<|87k^lJ()|9;*-i zS`(+7{bzb7&F$^F)Z^@T__Q`e6or<qouk9wanC%pZqnpOC!5v%#R3`P&sbeD)pX$$ ze)wyvc}XP$udJLp7gMrZ`pw|`vo_rKP5rag=cQtX)Ajck?^Noa{@Z_h)t*)HuZkb4 z>RgUZS~B~|o2*wRmvxIo6VDi@Yot622|9D_Dqr`vhDA&ERCWCdUNLRH(k@-mxL5jH zudT20G}!a~%-@|)y1y0dNtw0cV*K>xm5vri#8Y?Xeh}@Gz3H()aKEYWqO^A$qDAtu zWl?Ec<xCVZK8Cm!RI_bda@e?}r+Q`G`z^1ZhAq5vS8jTA%w+B_x{OopBJ(3UF7-d; z2tI3VAA5Y+V#$NNuPV1Zc>VESne}@4_M&w<q93$AsWH7^H`QDocErp%S!S`vyhCm> zXQuFMdbMq~@T<k&pH3_}zu@XBQNF7khbFGR;wdua<KHSjzh#zfb2%llq+0UW`2J>H zTQqkum)+FRecx_Q+Qh0a`sha2+Nzl$YeHu4-fdqK!YL%SKF_6K>Oae>Q^tHQ1xCV` z0xc?kRJ`w9=ic*r6VHi`IfwtOT0eiS;|;wT3>?Aj&!W1v&AIk_`|*#{)I3_wo_#G8 z*mIZXZIANl#+3|5KY1vx&)xOvPHNcc`?(X=)!S}u_;BR>n{D-JYiIwB{%d!1!PV2z Y<saYq-%VO}aUsWrmJBBo#rpp@0SMMb$N&HU literal 0 HcmV?d00001 diff --git a/pict/file_h_mod_cur.jpg b/pict/file_h_mod_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f08924e959bceefca05ed73511f9af94e2dd61b0 GIT binary patch literal 1364 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?a;nf(%T8jLd?J z|Bo>AGcYi+GBPqC04oC{6Ehn-3nL=~Gb4%&6EiC#8;bw~BQrBIBO5adH$)o~BQuL2 zD;tBNkcgpUppubrqA0tQaj;ln<HUtQNy^SDDXwaQ42;Z->?};o5G@Q0j0}QI%!-DA zi9*6Gj!I4<jS~+BDYO2+#lXYN$iO7XEXZKb@bdVa<byNX6!Hb`%cQT&oyzK{c2Q)N z`peJ->+bH(K2~-4_MMN>(#>J>R=%}7W?8!H-r5OIwD$K;V!d+K!sOC){deM1>)xz> z==){9RAG<jr=7|HLT=nwrL~T!y42-FA5njJG{n;=YSP6mmnK~lJS-F_weI%1MHxN< zJl=DryF9L5X*fB#NO`|%_ZstLH<w6#mbMOQ*P9|Ixtinq+IkKq3q4o8Xz^%OvB8n3 z!l<I}3^HCJT)`UA?`CUeFYXWiI{jkIojyg+H=9M1%hwx3eHN~()ajqQOR?|iEmN=M zWjids@^}8y+$rOfZuG}@+pWUWR~T|X2B(|~)=*RO;##ySF2zYycK792nX2|<@vi2| z9j=Q`v^=TX8Yk4&(5HN0g_G0XIiY4z--E*nUu4e~J$bgZ`(~kJ&+V>|jE0vDpCW1| z$_2Wtx-k9psrl*OUl-Ls<28%hC-JFmnJRy`YUf0WnKC=wCow&Cy&0&oD)-K=&s!Ce zBGxj*My|RtUHz=xoRsNvo;|PIuH-UVipBZ(JFncI>8>T64o$0Kc(-$iE%wd&__Lr@ zQ8;_@ij?rvK@*KsY80El)cxd>i_G3`q%Bk&R@9ciLqm8@gUg!()t!Rv0T0)`nsWbe zSoH@rA@kmN{_;zG2N@bC%?oWxov9F~=6rnC2H|a`TemXG_pI|Sd1CfRaJA}N?ws!I zqaHi+Z{A%h=WCV2v$foM<EHbc{N^lq!nV<0{h-mD#`IIIeeTDn>I%JmEV}&h>dCQF z7QS6P@48rv<b$O_QCCZro?OnxmR5V<PEN{PORopllq%+5=B%H&ZhQBQ9f$KgQ*UgT zs<`Ly*_O0h`eh4VuUL_=Z#w(#$E#L<c59SKoHa$`mS^Pa?U!p#{+=x4cI&6n-CKVR zF4=T2yxLq;IbC^Gsixw-W7j7YtjhXTvn#=Dy#)8ti}#)dOw|-F4{kE6_~&8CyYAJF z<f4a1w(QNbF5aYYA<k0amF<sG6{es^wo8ANhP^SFxZ}vlyGvV7MWsA=`Et^whY_{U z?zY%x)XZwP@>%}et?Q!ZM&UaXuNX^s?~#t;x@eQR>gj3eLrxc@pPO0)XWZJBIpLgI z#<a@L^1$Uj3;(hdA7Ax*o$S}OnRjEizNmdw6?-jxMQO^;8!122gbthCnRP?xZO+Q- z^6IRK4GU+@l@W6MvNE{Ny5cq8R*i6d&hmt?y@pBG>hh2MbN_s9@BV3Zw&7R*$kfLC zXP7qiTKRh0D(RgOJy}z{T@cW3>bkqTly?8wC!gK7=3Oe^RmV%+=jLQSTc2uY)ijI! kKSRgM{m)A7{b%^~?|$&{Z`E_`V@=Dy)~n~dbNzo40PBAx@&Et; literal 0 HcmV?d00001 diff --git a/pict/file_h_mod_link.jpg b/pict/file_h_mod_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6e7aabfe996bb10897e621c3354b58efa16e47d GIT binary patch literal 1100 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY40g<nf(%T8jLd?J z|Bo;<GcYi+GBPqC0Y)YkR(57KMn(o^Mid!FCT3O^HUS1kW-wrd>SAJKW?^7u6I2v3 z6c%w*Vh>C-Ds(b-4i*z+U}R=wXJKN78P3Qc$i%E@7?>y|%;MNM(Md_<U{KQkTMRtR zj0{YI%z_N|443;YjyD_fINVd*XK{YgZ7r@Q-$j~P>OWS!(B2-q`mx=XZ{KahlMAvg zU)5c1eq3*R^wmu=t>GU(IqaIboNZRn)4#26;~(qR&C2)uxLo4M{On1lj4BCB-A--n z43wWO_L1{PVW^PLv?W_|O_uCZvPkk$UiEg@RbS2~#?InN6D{t&Jd<+cPRIL`Nw0Zt zT%0K8eNb@`+r=_hBc}_czb{;zp_3HzWQm`}I=?iDZa;0mxChLg%N7L9bh=-1(`!lL ztGZ1eLh{@N=6s9n+PM4r4BhI^{Wa6v@7?Q2-dQRe9P(v_OjY}pADTO5oZOB6_-?yZ zc=`%M?#JMiQ^6W)N?u%xR>eJW5|!N>w50Hrd}IYk-G<K#f6PmtaKHWV&L^Mb?&q&p z(LdgszRd4bZ0gPB$1PQ#TkO1_dt#!>u||Q9zbDPEyLmBIDL~<>cjLB)Os}lM{rgY1 zXmZSsnd_{y=c}f$l6z`|y+GW<!>4u2p1CIZWt|H+`<<1kcml`V8T^Gx2A^b1?*{w+ zo4Wjdqrt>IS#Q2qgx*jPF!DdO!Dq8F_mLA7pTn5S&TZSaK>6d;lX-L6?l_sI>~^}X zbn9b~Ui6nQOXYm6a(K4Z%)N0l{i(WNP!V&){K*MB{Twzwbvmy6_{g-*vX5PtKVCh# z?o`0r#dFu`au^@<4vH;}3VL$6nc3KWg1NM$x?j)^)2{QvKaPd})xGwynq4CIq|R<J zp(W-sDmV1qcD;K=wp5fy{9{3_-PgHw1s9ZgjKf-`J+;rr?z1>Ef2W~JZojbZ-SwM! zl}|MAtu_~*S!A_*(j@5@w?6qvEzR|x?!$KVHDk#x>pQ0=Emg{URS@pp|0H=r)VtMf z=6WjL-q#*)w^rh7`goE(@crj26F9v)zUp7wbhmAixx`HCEgN=5`^=HGH409C5Pof+ z!PFFsjeXglFFm?DH6~s}((|GI0eA6lWe1~g=e{;R(Ya3b&*pDttGj|Ooc39l^+l<p OOG%?+5t!=!e-i*`&Yy4q literal 0 HcmV?d00001 diff --git a/pict/file_h_nam_cur.jpg b/pict/file_h_nam_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19c3d43d6307aec2b3699edeec4a9e931e684b72 GIT binary patch literal 1097 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3_i?^f(%T8jLd?J z|Bo;<FfcGNGcqzD0TyOfb~Z*v24+T7aVBO~7B&F}MrLMaCRS!vs17DZW)=oPRz)E; zLt)22B@uQbC(*=(%El^!3`|UnjO;ATP=yQ(jDk$eLW+itfsINmi4&bf79M2%e~W>K znUR4>kXewyp5b=(q1o-mEkDJ((-uFycl@NfIGZ1vYm=zBW29@)2EA4Drn-b&4BJ&y zF@5o>dfg+dr>#qFOzeLep?Sk2a^p0f<V_mdf;Uxq-oJ}aQj%J}V(p^RCEK`HTOHYY zBDLg7-!y+I<HK@6HznWk7bs~r^$V!}^|<?8D`VHK<%=$^GAou2njum><zt(`)i-<8 zCT{1P96ag5+Y-BF*Pbrq?<!p$VPt!??$GP?hHuisxvh*RFZN9f5ep4G{&)vp-xHVE z>8v4lS7nABd>naCXO`GcksO^(%7$|ay?O;?4P;OA7b&08m>w<kt33Mc-`9En8O}tN z<y)+NsvB@KUd&rq$<W9$uV01rSohK+lU^=wx<2=$dpOSpKToY>Rt6EqF4rIJ6U`e> zr7T#K^t0>qi7BbU%vmXtY0D-q$x)RSdwOftcBZwfE5BTu{O&mS;ut^E#>3TXx2V<R zo-dY(?)$hrGKs}T%~J5XiuL|FN7ra^>2J@Xj>`vVs;={X>RPiWWbb;TH~$%AE1Qp& zO?qN%-cd7s`kADilA9#%d3POQX4H($xM8_iVd6!FoU5VRXBfo>oe2B1bX|?e>Lq7& z^J6dmN_bgz`O(B+<wtel;&KK`hpU2piZmtd3;2(S&+B_4(0_N&yw4eVRw`a?+}Bp^ zxs!KmcITq#c|X61KHL;2<7?jY@YC|ccaO@j9`<Dyj0}(IdufxKQy^EF#9{u*@K%_} zMXQo^=5xc1HdRfJ&t3XD?(T|LmnWQ4%b8KxIX!Uuwt#;u#pmzVhn<(c_wB>JsW0|@ zvo%(Wzf!fA=Z&Sk&O;sJ-X}K>Oz%$h-ah@<N(nB>l{XKn$S?J}_4e|)4WE;im78oY zSId4J&G%S%#<8alwp+{mIMMa|(t{sbrB1F_MQx^S`jos?Cem5M(u2`~l|h6dfYCv2 z>HFnT472}M+r8cD_d<9}!`syRx!b<RFWn#Ic%;z2<?Zet{kgZ^>DS*X`}SRD`u*FN UOV?hTueN{6SH@Q}<p19U0Iy)0kpKVy literal 0 HcmV?d00001 diff --git a/pict/file_h_nam_link.jpg b/pict/file_h_nam_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76c9de71e733b887e1b59b6a37c53e08cb10ed3b GIT binary patch literal 834 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3`We1f(%T8jLd?J z|Bo<~GcYnTFf$+n7FITPMvy2YBa$!^GYcytn*ak76C(>F3lmHWBS@S<P>4;@P)V3Q z(8y6)L=dEgnT3fNrk#<AL6F%nP)N~nB1>Z9!h=dq|8FtyFf%eR2{H>Z*fYGn^&|4m ztYgA&{MOH0KYg}*>JkgLiADxSQ>XGMOuNZH$#w~ojqutz^A;}*sJ}K@=xK22trWw* zt68f#z0I~=;wf{{T&X)v;PX%O2Mk5FXSX-LUXjBmu{KiLi;rVxcFM=qwT5r=ME5KG z=?plrD9v&I4)^^^HuBcl@@(ruFIUF2UYV44`I-V>+UZLj?#fP2-yGSK>VM04cSY(y z_jPL$PLu>c@;AK~-hV2&C_wV#wTHVIlG>s^sjQG-@cQKB_FM3Az>8CvtzJBQlh*ot zGwD34_1E=A@`0yDAq_{rGv_N^?Ki1d7r5=|(QFxsb!Sg}RC(9C?sE0ZGt7UJ7k+WC zTxKAp?)F;TZu|S4eQU2*UD<HZX`ZkQ%ch9w^KBY~rB2HKyu0Ume36)R-tmu%epgJq z`R=s*@p~T%Eg5n(c3-JGefpVUZ0|##{M4gKLM&TSJ0Dc9PHb6qQhHMIEcWClInw#Z zmKHy7)hz3|Zx#OHpu39P1E0|TRn@UERTox!WfwZ$$Vu6MVe-|;W$RT{nxEb~e^#PW zH7rS%f8D13a>+cGs|%!L^B;L0IuKeuH+s>P-To|F^OB{-b&NzGt4v)wDe-9i-dn4d u#LWI`t?}hg?z;Fb2j?9w`uup!ts@*#Avd<JHFBFM<&r751WXD4zX<>f#UF_P literal 0 HcmV?d00001 diff --git a/pict/file_h_siz_cur.jpg b/pict/file_h_siz_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..17b4fadaa92f3c5446bede9d16079305d0d9c400 GIT binary patch literal 1007 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY45rMCf(%T8jLd?J z|Bo;<GcYi+GBO|mRt9DkHg+aP1}0`k6bU9~7FI?!0R~29CRS!<7G|g(W=19!K~@Gu zAz?N{B@xF$_P|6Vr$$jRK?X)<W+ql9cBncAMg~D9MImNGmcYb`!Xl213lADO1u3)s zzs11A%*enb$SlZU&u~d!ULi7fdr{;~xzbZlWpYe*e0#BU(n3jlR;`U1cSBBUhyF@F zo_y<6;LaoNMyKN<9duVs=bu%W8NhC-=g`N*U+uHJ;z-7Kvr?P%+ttFwo7Va5h|Jx@ zbf$LIjFe8k*V{hxsXVkfyZ1mqZ`370Ro1AhwIz$ztx{Syb@?{S$4~yGURb<SPSJl$ z?3(Sd#}Djqn<kJ}<gU$iO;!8On$TsQuiM)0g)=HRJv<@Rv9C#reIkc)tnU@UnW5{H z^nLy_c>UHhKmJ)M**BDVS7s>Z_H!~na;F@#2rX_4*stERxM<^>QroB}%WVGD7`1e0 zI~lRN{8RATT$g$5$(biY%lJFyJ#ga4>95!pD|A=!)U_w=z869zR!{o=JJ~yb1_xtx zkzv8=l;-)%AGO`K*nh%cO7OaCAB&`C?D)N4=O!NUp3P!abCk6^o`fs3t-bOqZS83r zPn#dTN;%?t<-H>{T8?^D)m#X#sXjgb(9BFfs|R=EOS(&T`K8Rz_^B@`dh~YIYl#cF zZ>3|do7#2HQ~R{>yWYNO6Ew9{-g;fjkMnkYu&ug5M_A|c+SIKpB_38T)iIj$B2_i! zKLc-*l*Ysp*S;-_Kc|^~Mqj9B-D|%+AwM1+S{SwV`^t-nY`Vv8>VB7a<9JPD$^xs6 z8rL_hym6$~N-)}|$|m|v8sBSUwJS3%E(R{UZ+Ts4qR#hhhjn6=mpV<~Z{K^~B-B*P zD0D^NrOs<p*1zqkJ)U2v<+=21R$@0xqMiFA?S$w@zOEhD74BH+eG)yf&T+-BS0Pz{ z_kB55-#+QL)T-39qamt|oC!`50`v2yFW(+E$3xE}(&%mI`E>%z9B2P?K2<mW^`EuZ d@-C+rSMPRPe>?v9^6TqV|Mq@2-}UPMO#pxfaM%C< literal 0 HcmV?d00001 diff --git a/pict/file_h_siz_link.jpg b/pict/file_h_siz_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27527d69a2d58581d11f25c57d1bc702cf13730d GIT binary patch literal 749 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4D!s3f(%T8jLd?J z|Bo<KGB7YPGcq6pHYOHUc18wf22^n-W=0lPHUS1k77%2H>0oALVqs-t5L6Tr4lGn+ zH#8CvWME`wW@2H7sbFAa5M)vmVm3^i7$nT%7}&V*ppnS`TMRtRj0{YI%z_N|3@^py z6N0YYo-}vj^T<edX<j|slAx0TJ@Xe$jhJn|?T*^-^~?5@*<A|iJ*Q-@v+L6-#@x^y zmCJOs7@n(6P;O}cTsr0bGiCQDAHG$be_Snm^26PeKQEo$c7ogR%c{glD%LBv8yuOV zK6874h;rDL7Ei~pt?~OqLf>xE`Wm};YybJl(_*-+CVu8R64TU{l6<l=Rm>%0<t?9v z8TkpbI(MxUT^Ev-d)_KCX@-tt=|qDPkDJTP)zTcb5<Uvw5NMKCz7rOuTGFl^eMr`3 z!Ci^fhyMKCy8rewCWg4%5<3D;vfIa(&W`N<+sNr^b!$%~?~IM#9g9;W^d-}DzFN42 z3!Yf#$Qyn0chTC%bAu{BO1a$7ud<uADUh>k!k3>Br@wxS`J+2kvu}sl`Yqj=nU<3h z7C+gO5-xu1>N~>)w?9h9TsO59pBw!(`BiMKu0l|V=cTD@?pdqPNm_KvPB}BAD)`WZ zjb{!@9$Q~CGf&%N#q1Ve=Fqtl*M|46U!|45R_A6?Q75OZyQ#(1I6);9fq7rghr6{X LI|(l2{(lnyIy>&K literal 0 HcmV?d00001 diff --git a/pict/file_h_uid_cur.jpg b/pict/file_h_uid_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa1d27ea3187815a95bf7cbdf5203a6098d46cb2 GIT binary patch literal 923 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY42H~%f(%T8jLd?J z|Bo=#GB7Z*GBO|oW)@a9b|yv!CT2zy31%i1Rz@}f21aHkR%RAvm>e@B6N?}#gQAcy zo1qB1V_>4FlCp}CAOj;aGcz;7XhsG>CLv}PMMKBHM&ZQ5i5rzz|KDQZVP<4t5@Z%+ zuxGf&crrKb$)t+MGXEJicgs#Xb2MwQfJ@o5RrZUnW>2#T+^ooG$C<iGO)D?NCtmGi zrAwQE#e0>Xn{+qM-0~#cvtz2Z@k{@@ZXc_NV7|8t>W;d^b^1K4>~Hhx;yiu-_|}s} z2Ii3hs(n(c=PtBg=)P@gS!n1oRUPhzZEdkK_J<zqm;Di?W779&P2pmXw5@XCJL?%2 z|7SRxc{TjDltctmVA1OP`@Q;XHf{Q_?IdHyiH|E6Np=U$><MwdXtniBxN6kC?vSrb zYyK$b2X0F3K9pGAvoupeV1;;gyylilsc?;LQL;6yb~iNq8T>e&3Oa?`t-fQETO8Bp zb20m4_lG&^DNaF4I_-}9Rq-+sUcr7bTxXu`(+k~4m!4?5suF$o)cYcaF4G$_$5!#q zn)7U-?7XVNv}d6^!x--=@P~Q#u4MbJs+{}ipPRoZ_wn<OA2D*VyO>_N%<!PM)oAaL zTXLH$qpqjS`|;*|<mbw)H^&z}XnC=8+S;^U<9@+2w@eRRDPYLch~7~sW^h4cop8On zK~I+c<0#!)!|b0o4|YtOwKO$i1=~aSPnU~5jUL2Ryxo&2cd7MXcH4q^VZR0Y9Q#$% zT70Iyy0w1M!<jq7mj6_DNxHeb<a}?X(#^8jUyC14J72ZdT2f=>%Gw!E-LBS&3f8Xf z@%~ZNutI9_6<yK1qbABsf{h#pS{7_y{p)pnkC*<T&b)xwSN~33f6g+03fn`sn7ZyN n^P6S6e_h`4uI%f(P?NW>&xfrFnlVK?+520N|A#I5|8D{S-(^QQ literal 0 HcmV?d00001 diff --git a/pict/file_h_uid_link.jpg b/pict/file_h_uid_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29bab9c18fab59b73c9f4d91010c91cc552aba61 GIT binary patch literal 685 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4ARVuf(%T8jLd?J z|Bo;<GB7YPGcq6pHf9!fRz{F8iZ}}+6EiED00Sd46AKG7Crk%3BNK}tD}y2%yP=S< zsAHf=Vq;KJQLsvgm>>fa6C)EVGb>CfBNKxlv!alpW1uigVqxRNg&Uhh{@-HYVP<4t z5@Z%+uxGf&xH32G%A}IVGXI{7S*y<My6UFT@h)tYebd$KX*Pj}4l;jITb^QZH|DvT z-m}b3mo@{7_bNX(>292PsYrXt5wEE;KP;cmy38z}^XT0S{RgLdPNjNOA6}etl;!Ey zk8g`&dU-FoNG7+fdS0adMB`Uxcxq@=(%A<oY+H0M9sR4q^ZNLd(pUVCKdj%)>AQ&c z*7a4n(%sr2(Yk#5oaX0<s5hvy6m=}ro*(*^UpnTx@??{!-v+;|>;!sldt^WGf0S_Q z;CIF<*V}scvtGDfy7a_3Ym)A}r{y~tT&2FS8?I_jH=c7vdGq<{JWoDt-1dQAl%eX% z*+PT$MJZ-y4R@T}nsod7%a07L%!{O6Wi}MJ9hw>UsHFXzyLQx@$>)WBZuq`?_dbm; y69m8Iu3Y?|L4p6as&#n!`qSU*))fC|SR8-r-^F=%5)WPaaF8RR#lWfl|4jh#quA&G literal 0 HcmV?d00001 diff --git a/pict/file_h_wr_cur.jpg b/pict/file_h_wr_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd9d380ed717fe727c1f550d0058f1c2ea5631b4 GIT binary patch literal 1336 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY43W%?f(%T8jLd?J z|Bo>AGcYi+GBPqC0cI9fHg-lPMg}HkR0$?#7FI?!0R|>UW@aW978Z7hCPpS^K^9g9 zAvQ%}Lq`$zz(gY_r66U|#)%6L8mp8DGB7eTv9L11R5LI#2r>yVD>@3Z7zP$9i8M}3 zT<8?E@!-d#B4yV9w-|Vs85x)anFSf_8Lsl{9@g{L?kmrDx8d5$%Bpp{-IH9?A_XS9 z%P-4vZ~S<@`@&?Gr%DHNuF3Ry+1<ahPP_1U;h#3nCzGY8?2Ohn3$ebHmgcb3Zt1JG ztsi9leLc#G*BmyG)!P#Jb7gc~_|bRI1ftS(^3)V2ii8{N7Fe|8ZJ7FkD?u9zl9FmC za~^p%(dKqrv-7;;%>Nl;<dXK!kNvpr@1}1WSNaY1svAFi_gX5w@U61Is-{;=p0*4O zcKuS%Z|f)ZdVJ>ISj?wt(xg#bCghdv;=Lkr7uUSTJq;JizO!EjE8x8J?8DmJ{F0sA z$+=~Zv?GsPoHEVHgHt-J?<z|`rpb~gh6TF=o-GkL(D6CO?1Yl^oc|1opRH!+rU&^< zdon}aQglzd%=NHqo!X1unN>H;SRrbX{G&Yh?Y~`j=l^V)W3kHcF4v5y^4Z0#PnU>K zd%Nr2Q!$U(hgKb0ynN#IxjUJKj%F~u^mUslC9t`^v_h}iw!Ux2L1D?=y&Gj353dRr zx9L=A$<y9BIXjp6vuwtj?FJ1>mC5o?R^Qu};#^`YBvGGd6!D*-@afJ7rw^~i=WBLs z4Hji{d!_Mk0?P`;0PRg7C21co$K36VO#gSd@r7)WS;zdhq4!kZ#v2~-Jfd>qSiVl- zne_d~5AFD|eA}*;?TJTEE%LN+FAsTl{bz8Petzz$4cx*9z8gwDocJa1(3xiYCrc}y zZ>!{v_RpX6pMgK`)5E_J=O@3szxcK%k9DtqS<fj~ZO0Ys-ZPp@xr;6DU+;2ZldGOZ zVOZ)zvx~obj8?X9lPEdzP4t=tQ}@Q=J1p*B^KO0*{_$%6q>{`PSHq7tYnuGNyCK!* z!5;N#2@4J5KK@*nHc9i*yOYH|28UA1QYWdpM1E(;{IN9OHug?l?wN;X52x(+pVW4D zC(nM?$Lw#z4G-NY__5}sS=je&<$Id>RVHrOzH{4(>e=bKzMGiJ7ufo8e3p9hecO|? zKbcDEGb}}K+?<fNV{N~7YGG~ftV{O-c@Mv>h}}0)B}c{g%5QIt^`|3uXK(QlO-npf zWXb#4*|B|(WYLx{N9`RvKYopWbn|)CwRxd0*M~okUV1nAN89?QbC)N7Iw#CxanHBM zdryq&?#i0XbXUHoFO@dLFWGAK_T|TGvabX7#R<K861I0^)1IVai936H%5S{9_UM}b zGS^SaM+|Ho<(b#)p7xaK5>H6yvxyuRS~8qW6r}`uIow*5oy1+UFCTXjy8rgg?`^OA zo_XGyP!;fg*{wRQAHmO;_|14!pYrzfZ}(+y%lYdsm3{lJp}l|m<x<VZ%Xh|K`M1J< JtCaZvn*gK>AjALw literal 0 HcmV?d00001 diff --git a/pict/file_h_wr_link.jpg b/pict/file_h_wr_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..709726d663f642f0a364aaea76b3c3fe44b7e3c5 GIT binary patch literal 1014 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3^vS+f(%T8jLd?J z|Bo=VGcYi+Ff$+nCRR3fMrIa9Mh0d^Mn)tVMkZz!RyF|!CMHH^W@ctqs2o_BL6A*R zh~3ap*eFP(aiWrwa)}@VBQqmA6AK&6bVde2CT2xL$3P)rmcogRN<kut3pXD8=#*5X z{QnjM4>KbJlOVGogFVAme%-@*-r9ZT8E+F;FFn2L^({M2(U~bue&_7ZymMdp_4?5_ zo{I`5ChVP?c;ck_^-tlV8;=+MY2$n{S$fK*Eh{%Ie4jaUCexH((^tuU|03(}n^94G zEwO`d^<J@>%WLDpkG?&luyV%Yq$Ey3*EI1Ykv#vbjkau?rgAl17QPwbr!KnWbDk96 zaoaxje>-fC{b#6KemnHb>5aZ8o(WB!`QdwMukns=6FWj3vzR<>85r#5-CDjZwkyxw zV6(WvqhJrEc5^3Bzu!txt+N;0`NI2#t-U{>Zqu9KBFok*JNIaZt<NkH?aj_pT5U1Q zXwnH!M&;aZWp@NOTs2$r#IRs_z}d1_U8lBxTF-huef{G#37tK+dpF879$uB-J<ny5 zlXcg3qq6N8@`cwIA9`|#q4Qx*{if$@eNME!sM3|Fmr2?9&wbjdL*ng$m7ivGtxCF) zlItpC#4x)_lxerx<HhFd)&@^gb)Em0w|zmW;1ZYr3|)O6^+i9+xXf|#=}CJkQ!M%Z z@xz#!;A>ks^Ba#&b(vJrUmo(a{O`8wu6enZ*$f-a<&6b<XUMb8(KuoJck+6fkMo?? z`pc{Su`Qp@|1;Un|M7nJwJHYRWzV19Y&3D(Z{F1K8JsIFnQfc>r%KzYQz|C5YO+4( zTKS1>p$1>uWDV_^b{%I3%!&NTDEK$_?)=;N*JJ)YdGqp0Y1WTBr+xQZZ|zw)N4(|J z84)$@J$2c}o+2M>HbowjNHp4QbW&)M&ff#F`=_jZzwVy9+MKhKvo}nC{AA;DKWF|$ zZv01Mj&nP=AN85+wf9zeC7Yb5a$?-s+`~85Jl*zog7CeDuhxR^Oog9ao;dsdl8!kC j53KB!WP6>p+w{@8BN-hR1s5s1xOMajN-3GR{=W$T5f63l literal 0 HcmV?d00001 diff --git a/pict/hashdb_h_alert.jpg b/pict/hashdb_h_alert.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55301aacd7eadcded069585668d40a3474c405dc GIT binary patch literal 2419 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 F1OTo=1pWX3 literal 0 HcmV?d00001 diff --git a/pict/hashdb_h_ig.jpg b/pict/hashdb_h_ig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edf80bbadc96f8b137c461a99b05dbf7beda2f34 GIT binary patch literal 2640 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 literal 0 HcmV?d00001 diff --git a/pict/hashdb_h_nsrl.jpg b/pict/hashdb_h_nsrl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b333af90c19ac2f680246ead9725025d5702aba7 GIT binary patch literal 1147 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY4ED^7f(%T8jLd?J z|Bo<qFfcGNF*6_m7FK39MkaPf2tblxWMXDv6<}asVPR%tV&{a)fJ6m_SlJkaMGPI4 zj6~TL#R3bRf|QNL6B`#6Ih&}eaR@RnF)=YQGO<IoFfcF*G6^v&8agVm6fQJ!N)lH7 ze~W>KnUR4>kXewyo?**(=bf4nCCBowC8R$o+pthkl%-`6i*Un_DIcF6KXG}v`OR&I z#rD5U-w?KE<pKVgi>{p8<W=dW!e?^iP~eoK678L3kLs4s)A5-3yh8J>&MVo9D^I7@ z7s?1Ny?DVu)>XuCDbq6!5nJhP9W3n9ad&r{+UP6!2EGfuck!~zI%(0bw(MOKSz=6z znjbY@H4roi^4Xx`WAI4E-Z$#eArHClMH`>pTD#SKYxwG&OFE0MxL(R^nDBrp*sG|; za<9c|r=yWOCMufry<S&6ck1rK=yPkoUo|ked~Q?cnpsT_9aDTf9NYwW_gPH4_;S|H zMrFHu<qXp&iJE#GiDWgsIdcYU%*`_a9WyLE8IF}_9kS${_NGwtg#E<^X8)}XP70<| z8XW319^ZUxUC$J;_Pf!|)!#n07J4xyZJk`WXc2$r#}7$QojN@h74~qb{jqSrDN}N} zbd&lkml|Q6TSqEyMN9Tx`WqGWYRa=^As25owRFtzGmsFuqxibL!&xY2TjceL55hhz zkJ$2B#OT)CLt*bjUoW{}D&W70XYmm>B`&?7-y0fzq@ATaV{KM<NL|i-wKRY4^i?Lm z9?z2M6cwJE)(~japsL`Nxjp|_?A6k1A^nPBw)=LJr<R4E^}Or$aPfrjZG8_OE|1;# zh-oD^$GO-=5x;8h_)h;<9D4YT-ih6cmA9sdeK)Q;8@icw>gqL%Jl8D{IHtp(#vpr< z$M)RrD8&lSxn;AfZk3wl$6bE4_O8itVbjko=h&27rW~8`?1qer;PHvCH@z*(^31*$ zHj!`t!bypjvp*%;{n>N(-x|&7w-vP3UaG3P8}EO4kMY-{ltT&AYR>UxI9Y$xHa?yp z{A<3W{u?V6w)n}5TMkRqO*g6g6Cd((g5I`$Ghg#Q?dx9KxcucVpBvSICmwx$9DdF= z$Z@i~c4>PQFMnji>ms94gAR8y|IV{~IjK)&&WId-ulaS_t+(t^4=+A{@@iYp&fpr~ zjV(KL7I!wNnP1Xu%hx|Er}1L3{C4So`=_6o!=oAJa>@Q>tg-v_Kl7&hPoAo|uP&Zt R)7i7TEY5D8Y83qcCIE*}w4DF| literal 0 HcmV?d00001 diff --git a/pict/int_b_calc.jpg b/pict/int_b_calc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db33eca6ba0396288096a5e37e5b3e872402cb17 GIT binary patch literal 1824 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 literal 0 HcmV?d00001 diff --git a/pict/int_b_valid.jpg b/pict/int_b_valid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aee869b6e65f18e68ede4ce08d69eafd8548e593 GIT binary patch literal 1660 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwP#=ywH$jZoo1XvlFm|57^85tRv8Brua;;aG;jLeLz>`csT><~RnjLa+yf<hv! zY>I}9go9I5Cr)w<R7x~TQW0e@Y+Sfex!FXJfsu)oiIs_kl@+3gfssjYp-_@Cv#_F} zBa292Vd6%mpbw1`4?ev3(a0(J|1Aa{W<~}kL1sY)dxq~8l_d@d@l&>UOuCqNTTrmB z^nrEYT91`i&T7n@`onpH1dGcb&6soVg%@6$#Vjtr$nMIj%9b}hF?AikgXSgNl-TiC z@Y_<GgPRNse<{E9s%%bKbUINme3JIJSP<uV^xu=0(wC-Y)h?dutnTDBJ3N*-^;}@n zwv|<1|4z$~dJ%44D9OLl=Vh*GiRz<QGV{C_%7`wUk<&A^rJT)SOId{5_4^`QbMEfj zR9>+1n2e?S!jem_ddc=D<-4A2lk0iomalw?;kMf0>091Q>0a6WaeJxwjv^gVF-4Qf zGnZ7ocHQR0KI`d$v?d2t#g<TEZ`VMP?LvB|_B~sE>-|Nq3-?3JpFFR02~9}ZahO%* z;))Xw8MOPv?=tL7eH7oMnl|^;nuIysdXp5FYDZ_hn8atY=DdEt;?j-BVrv@=<0o<o zX@%ZixniYA_QE$#8&_WC_K(fjP#Ix!T~B<%y4Bu_Eh@U#V)y25wVpLUd%vrQ`Blyu zaHwtk%$<WL{E`-balbX?Guz2T8FQgSDZxLK)W0pC=JY~Q?sH+AcY^kpiAoylPpvuk zN^3>n-z^r)6`o}r=-8H;v`8sjZTGaLu2x$j#TG3LoGBTc-1$1f<x;D5SML@1s2N=$ zNsCL_uT2zLan$V<|5_!@K(M$=&|*>P6?R)Xmiil>HE~P%wma;Wf-e6I?{w?4k^Ahw zA7_>eGIQM`R}fY5Z|=*u$=2JJP5&#X>7W1LSuA_#>6g#k&6oXWD7byi_w|%4tutkb z=Gr>$lLdbz-p!N<-Z$~|G~UIF({8`oZ*{f0m-X_kevaaHj$gl~-n_DEMSXIyVtQ0+ zRI%yhr^|O9v~x>(TpW}W=)$>fN5ZOGQ}=sGMNPX}D!=IY)~}!1IrN>Pm#^qp>AzBV z(#u%asoIbAz1+@Sa`T>&dbne<Amj1{N7dqgpGqz1xSa9!W_W$!vKP)lGb~RZ6kl~@ zRmNWXYc>MMXV%?$eez~l;FKjh7Fne+J5TqmycASy;3OXU%`&CMW?jS<nJb%4-!{8C z^WKZCr{3?a_+3+1!x48sFi`lyt9zF}8RvZWNS9pZE4utfUeqgtKO4JjUNhZ@PFinj z*|f^~jsMi5<ptLa-)2u=YV+4O-1XGjQ2*k2?Mpu2*&g-m=cXs=GY(IjX{)AFGI?4{ zaLO&QMjzRn`%a?LCrgj`c7A!kePQ)9YhUSDZLgA&`h~MH_R6gGsrbX6434gfkJcCw z=B8yHP@5^})f1Ap;MXOksfN2}xa5R-9=RDP6zm()?sI(pOyvXJCsIYu>^tJR`lZsU zRlk(}^qNNWCMkUm^`E)fnEmvhv(swKZ~s|yJ8s#&J9e8-zTKYO(`A1-zt*DLo_AV( z)aSXI3tw+P(JrO_TkOZb*KLb=FR9y3mb2gWaGCTH<C}($f3K5D+~qt-g!J;ibl-pS zynb^z->uDNR#$&~)B4Y#CZqXh|D@10Vj?@sE5&qw@7FfF{qb&GcgEuOAM>2QXL~J< H{C^VwPBXgt literal 0 HcmV?d00001 diff --git a/pict/int_h_data.jpg b/pict/int_h_data.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf69f3704e4de9f5ba945e4958b33a99463d0271 GIT binary patch literal 2058 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 literal 0 HcmV?d00001 diff --git a/pict/int_h_img.jpg b/pict/int_h_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a22cf45eee60064970f62bbb0512f933eedb798c GIT binary patch literal 2005 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 literal 0 HcmV?d00001 diff --git a/pict/int_h_str.jpg b/pict/int_h_str.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8b3e8e75183f672994acad1851bcfe21059d957 GIT binary patch literal 1553 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3~kJef(%T8jLd?J z|Bo=VGB7YPF*7nC0cI9fMmBaPMhHNXU}R!uVHIFtWMO1xVrFAyg-9_mGPAG>G6=CL zvKuN1I|e2i1&K6HOi~uz__0VuOpt+ziIJI^8LAi*9D+>DiiVDXi9&_KER6@1jGX@8 zV&GwBWMC3x7G$tzc)ja~yK~6Xy@%I5zE-F?yIJqnyW*5DRWEcG?tIC$O1o{zA|<=f zKU=TMsi#^inYlLK?Xz+DTwb`WaQov0+K02QFS?~Y^XAqoK}>fyZ2S7U_1Zl4WBZys zKUU8?pt`5Wbzj@>Q+o2tZg;qDTz2w0H|HAxCe_%~hr1qZs!ZQyyQ}g-=05khby5qu zv>(h2{qSm4=kkqpEt6{2B_DlcZM)Je$LMJkV?^gP(Z<3+#+Y9L+trL8uUS)8lNTwi zJ>}z#tvb;sHl(iF87*XUNdLBdppmrq*J_i9H+S3?xc+A_e-u+On|pP{hnPxpv&+ld zMe5dePC9;EDqME$CLzA!I=Q>%pHqwZf6Totl(2{8);!~lBB4d~%a1=?zBRMsipMRv z=wp@4DNl9hRKAe6*z`!S&#JQdnfy_cZPwu>DhqeN>)|@*t=wnonVX#~Ibp)9@C}y_ z_3rEupZP#v^w7`JT@Ug$YbtrXusylXY>CH?wHqE6EMAZnd)iTQv$F0Ag++Nv>-SrH z%lNQQs;<fVNBNh_Iw{wVPP@HL;D}#HVEmm7UqMHo@D=Y|Po>A)l?n>tJ#PJQ%jPiN ztw$n^E(Ba{zvH00^udn!q}QQG)0QeK1@HJHm>s*>`$RV5WVbmJ`qb_R25WGB6|;J1 z_43WVB$ml5D#NAsr^YSa)NjN7+$}~(@jrv&&-RbL-a%LIGF^{gTwtkQru?D3(#KM~ zSa-+Qo`@3@D^)A3blwK5hVfoter0)g;;&unH^=Rfi?ec$<v3C{sdn#l^=(aIMV0P+ zJqKj0tJOqBQ=bZFyS>U&x#2!<|Mj)!Cao%boTO;Gqg~QE^7K42=66iKyS6;!%6C*V zunrB@=xV(zbuI1hslQA&F3(%}q_^yHPixP$`X{;}%8`==q$4+6lnIr$6cnD95PPJf z%kFJySX`cc>K);oIb}}iC9~RAeMwrkEKj;=_us(WZS1E!KmRFQ^LYNTs{K1s{Bk`{ z{J74)dUfx<dVy_aA}3nB+@5f9bUf~PzW%M{B*pK^pRZYKNA7>gma|Dmp>SR9nUtc^ zJl?r0ndcOJ%PF2J{`O;It_aJ=&5Ja?oU^GhJ*l2`{dnpwR_)1dhn99u6S_2Y*Y5CB zeUDU?TVo#VxKy>?R`Q5mTXu`;x%*|iTx?A*$Ck34zvcb%^UuBA4gu>Ph$yOC>S$;) z^Ks8rp7fTb_*v+`)9d1uR)!Yda<cV#ye{_psh1PCZdf6(s?Sqt>&29_fzG-UB`msT z=sXULKQ469)?NAcWv{R4X-h(voDA!0Y1?*cn#Y^z<|o5#o@iKaTl9EQh1&AtTb|7A z`X(5CYDGr%>9b33o%&s|S!$icdgVMTwY5iiPiWnk-?sXAcJiv&lU7sA_jE0*FY9|J zdn+u=-m7P8NG%$BuFt}l6z5`JR!&ftS~RxiCwJvxi82v^1~7o5-6my+ic_~zxw zr`8vjt1n#L*QNejM?+!Tvc@MWuD7oTP2Dutq{c(n+Pc!}@U%PIy7_MHe;cLxWW$0r zB83+V3uX2!Xm2r!`D5BYF=W+_w~Dg$amJ1dco{O79i$j8ur-)4LOINw+hq-V*0=As YEn$3mXP@+jncpAZTwuI_m+}8i077+s_W%F@ literal 0 HcmV?d00001 diff --git a/pict/int_h_tl.jpg b/pict/int_h_tl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1afeed84e02ea11d23704a72ee1c23213c89cb5 GIT binary patch literal 1124 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3^B}%f(%T8jLd?J z|Bo;<FfcGNF*7nC0aiv9CN_3vMhHNXU}R!uVHIFtWMO1sVqj%vh3H~pWM*L%WKa}h zGh}xROjHssR2H3R<P;<#F37;d#Kg$V%nCPyQIN@ySuwFu$T4uDk(017%l}&pJj{#? zOoGgU4E7AKcl~g8_Ig`)vG-bvpXA@Vhc65)w5Ls6yroc-hhbBn^x7ZFk9JpH&&vFC z*k!WS`HV2H%#&fJWhSP*oBIDVsOFq7l$mgbfyGCrRMh*EnsKjO+lI@vEd9yf*6mih zsU^7~<*n$J>VGQwcmJelWYp9=beUMZ#<t8WxoO6Uw|~=2UKYr2O5M3ZGSWDCV(nW4 zjh1z@>N}K#^!255%d!$YHrOtIJ)I{yf1{&0Z-4{q6{XPFiGsqVq1X1a{_Rvgb^2Df z^Ayobx2F`$4O8vTo|<{_#%%kEYUaL4SF=?$Prln5q;=j?tjF|EBtyg}9c7kRA9H2@ zGsI>8-T8Ud)|<yAg{sfIxgxN7aisU0%LZy1JdrB#$z89Ca#`!NJRiHd-Ek1VQ7yeF z>}(a!?-PY-1~GDp*8_aK&xwkMW^N9eFmbExUEeE;b3-+EPB_uw=Inh!)V08)`{SY4 zW~*1Xaql|8%eeUW7LUErHB4P@zGh9DyH@=x`{r`J{@JgK5|eKo@~aYjcH7llrah{G zdDo=HA5W+FTPv;GzWm#t_Ga&G&Bgy2mfSA0QVGws`deD^;?1J<k~-ZCLNjikSL=Vc zukiErlIu<WyqiR4F59y1&E12yi-NareYyE*gx;T^n8m^#55F=z;?Vqbam&?Yt`mHF z3vcZDn`>$nQ>Hd2b;ct8OLK!3GS=BB=rrbZObP$>DtGDZg54)v|1-pv+ikzTu6lR4 z&^66dZ;a#nr_D1lyL!~cFzmo(?lrkrv$YO=;hZ%;eahM1_-)IaPp^p-<-QQ!skDph zm7Ghcz;uq?%glbfUK;E-S4HxBRouyIS(+<uJ+)u%JD;yKrYXo=(ZarXVrTi^t<RQm z|N2{6dNXqScQ%8fY=gb?@5xN8F>(0)QE+k5P94FoY@OU)6Q=VYTfP6hy>F`8%Q*Et z%v(ymv!bmg)-AkPXCVHl@IuB+rxI6@>x~?GKYwN)-?Y}wSMk`+h6`*BCX5Ss8Cj2a reL60aKVRa4@B)R3kA4=9dpACoVk%)=plI>5u;+RGbt$G2_Ww5l7DS<- literal 0 HcmV?d00001 diff --git a/pict/int_h_unalloc.jpg b/pict/int_h_unalloc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce7fa58139f09bb12d104c9715a5232e7653aa1e GIT binary patch literal 2398 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 Y?q$%sQ+mv3?!TQc7pQ{_mH&Se0IO*t{{R30 literal 0 HcmV?d00001 diff --git a/pict/logo.jpg b/pict/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d9c29c3826757ccb30110bebf418ddc79121a3c GIT binary patch literal 39208 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_dat_cur.jpg b/pict/main_t_dat_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02bf5442e84a7dec1a0f90f16c75a33c9490666a GIT binary patch literal 2140 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 X_T@dg`r9V=@8SEtr=r$e|9=wz&+MzJ literal 0 HcmV?d00001 diff --git a/pict/main_t_dat_link.jpg b/pict/main_t_dat_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e40990093dfef4c2c9591bc360abf67f1a7a91d0 GIT binary patch literal 1821 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_fil_cur.jpg b/pict/main_t_fil_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91a4a83e20501b946b05609807e09d7e5908d2be GIT binary patch literal 2312 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 QWH*RDK98$e`~Tkr0P$@Kp8x;= literal 0 HcmV?d00001 diff --git a/pict/main_t_fil_link.jpg b/pict/main_t_fil_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82b814c7d6cca4dfbc31853f308104f9506c733c GIT binary patch literal 2002 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 LoX9kE{{Nc*#u$ir literal 0 HcmV?d00001 diff --git a/pict/main_t_fil_org.jpg b/pict/main_t_fil_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..150bdb49620d650abb431975e7a90b6de2d89f4c GIT binary patch literal 1416 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?<Brf(%T8jLd?J z|Bo=VGcYnRGcqzVGQa^7GYcyt8#^Od0xk;j2op04n*akN6Eh13D+?1dM2?A(nL&_6 zQAjvAaN)&Cmsr`v3>^~-l^TsiL?=2GDH{tiFflSSvoJBktzZ-kWD*flVpcSCWJwfm zJa{qb|1Aa{W<~}kL1sY)dxpQ)`X=?xDy;nIE@Lu_>sCkiOS!s#*}1WP=j<ePqE_Xr zxeEUYvW(wRqQ@*%{E8`Pr%!rmNT};1m01xhO+41+A6%yV!-U^xp{k2xUe>A(d&#pl zK~YJ?T#wr==Q3xP9?9T7=2|KiACboTdizZwuUD?zFK%dfl}{83`rei(?-*)t{`CFE zz8h?!E0#EQYG%%HOU&LIHb?AVt;|t9bK@;S&RG>Vm#G`9vwReOaqUaydj5R}H{W+L zX0wP(cInVsbf@n?eDCIq%Osm+IzPun3GZ(*ie7EXvfXvV8P%$@KWzU_Wtp0CWum_R z?Qbu?wIv+?VVgbU!Y=b!Vs~VfOD2aHbJXoASNc4qkLm0}{}30~e?f}BU1~X=BpG&V z-{-#cwfkw#eA})h+rmdGx87zuG+k~jX%!R|zh!B;e%i&$$B#V}{Ie?O;J;)^lS}97 z^;4(4pS^CvtX*jeeY#g&BbOW%dlM@4$?Ug2YrNTg@m7|1SFE1iel%HFdgY@Hx_8|V z*{o8RUnPD;Z;^SSi|@*FU;Z;}65-q?)c<nX#yeGpiCe`&uR4~w*fV_o5S<h`w@YtY zs#;7&)=YNBYpbF+2E9<&safHFR*6^i<l%*iIWtx!%rYsOyU<kZ%A^m1JnPPeA1Y8v zwS4E=_Da&&v~au70#12HP2I1v7Dnycw29@;<v(JItLN;=l+9#~&J>V2BF)48Xr=0= zD~%D|O9e`&9o<!w_i2yPj%93ju5@_??@u~g^T2E8*Lg<_I1UEBUbX5(&uj($3A>i3 zPkFLS)k1jH)W1?cvs-TN@|RMWdb_Kl{95pwtGiVfsfs)a7Kjf&vr;N$YK&`SL?_#+ z$YZxHu4miF|CTZRlT#V@Wy*40;Z3F&{;mAD;`;L2%m2)+Kbp3)#r;x>8E4mt$*)Cf zeWsqfcT{$}`<!ndJ{&EXesWhw*<HEf+lLSHDyzLxyj@axKA)e*q-XYu_S}olZTHw1 zTr$dA1XX|7gC@#V?)w#eFi{Sdo&MEmbC8PHR)N3WeS7~id`XCvk&Hb&DR%dw!0oq7 z+?(fFou4er{%5gDX5}(g7KR1^CI$x%Mg|2aQ{LwEoNwMuR}P=Lcw6$FwQ~PyoujXO z<|c2G?&#C%iCc2=nswq1cTqR}pp@6L8}2A~Ef!yCRN8kVPw;49_m!De$8*d%9<6|C qX(<dz`l{x)@iy-vi&chIlhq^Mwmp;ymDuY!c}>~j0<sMJe-i-iJS|oL literal 0 HcmV?d00001 diff --git a/pict/main_t_ftype_cur.jpg b/pict/main_t_ftype_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c72918d7f8ec4f6cdc160c79efc6720535976adc GIT binary patch literal 2081 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_ftype_link.jpg b/pict/main_t_ftype_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9161ec5fdc1ea495905da6173620490adf293c13 GIT binary patch literal 1764 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_ftype_org.jpg b/pict/main_t_ftype_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..801c1b075a92baeae0b4e1c39f1cd43d09c7ddc2 GIT binary patch literal 1340 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?<Brf(%T8jLd?J z|Bo<qFfcMQFf%eTGQa^dBNHnN8#^Nez=atY7@3$^*aW~72Ma4JR0|^$GlL+DqL6T~ z;l)XdF0rzSB~DZlaSSYMG+yWwq%2w_$iT$F#>mRR#0)cwQ8186h*?BQ(a=$tC9$ya zVAB6v3_Q$?3`~N|f(-Tyf3NjT>YY`x=a+Mzj*rSM20OveU!N_TdgWX4VWGBFvmcyt z_|Gs=F8rHZYeV&}nkjEOW;b8*T0ZmQ<*i+>9h4Fx8hp++9Z<@XTK=rNNv*HgX;Iq2 z9B!{U84K;Q7@P~%Km9B2TdK6Ybc@!@NlS!M>fH1m&Uai?xn3`-DY#{+ET_0<=Z^5t zmV)K;E||T@40*NBlaq0(^rg#XPWQK%`|3~JD%U#s%!`mot2=xef|{BfJ?u}&%2(t` zUSpp1>Cu9TEg?CaU(QK4N1mu(eR}<!f2%)Fz3=mUQBd21Yem}cUVaMRr1VbmOMkil zq`4D$5583SJf%<J?2>)~2D>EXU+oKJdfW_Ct1ni?8SY&t`1!`M#rxzGh41{0l2UB% zJubkY@K^cdymh|Dm%F968vB>}&X{lUSa|80>Qy;MejZY~R%y9t_KGFCW*b66nv)tf zXb9)Hl^nfzbXMrX{-oDFyJDi=ozOkBmW$o1M=~St$t{DUUN_1XupPSadTC}rlxqv) zg83X1MT155yI5wJyz(eCzQomaThr&vGZp>14Q`uC-~OF<YU;LKugrtCOfiW$Vk{Qt z(-J&aOJs}R#$D;FZWL&UL}{rkV49@s5%A;Jg0lg)e1&|K`F01yRVZ%VU8^C^b4gV{ zq^ouDbAjz!rieFtB}A<%JgW99<khwL(cun3%lNu4%SVW<Tm9qD+<dU#uK0;<e7AD5 z@N<stNUnXU9+$OL5BRKMQchcO?6$?F)!*b_B+k$8*S;q-<=^B@R#ATo|IA&mcf)@M z^$XW88Aks+a>Ybf%}c%_JoN5)GpoC@edW0qpWAMkC-FS<cG^nC+a;CfbJg3#dS@+Z zhe|}5WlfUZ?mp++rHaIio2xv^?#dP4_I%j7m?p|^?wj-UMMTi)zSG~<hSfE=hAgsQ zw0L#(uMc|5+1}o<<lgkt%j&m$a*NGRcAo@^4i<(60VW0q4n_tA2=n;6-ww+~c3&y} zBYpC^%ul%)Ni&YVvgv*Dx?PbcSYogH#65Eho+x%Di?8@(K6#x?i=j`_S2?#&rH3c9 zY4*e|K5@@)N0Go$!|p4U(kHL;IY}%ttm;>;w0d~LS>%|0;FEmy7)uVaj5L<m>stNc Qw*Hg31y3T9X8ykk09nWso&W#< literal 0 HcmV?d00001 diff --git a/pict/main_t_img_cur.jpg b/pict/main_t_img_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5de656e4a65246e1acc8983fa96cc3ff01b100f4 GIT binary patch literal 2353 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 V^|`!9SAW~&{sVbp+Un5%Hvv3P7U%!~ literal 0 HcmV?d00001 diff --git a/pict/main_t_img_link.jpg b/pict/main_t_img_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51c1654dfb95cffed252a2ecfdb1937713f13c62 GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_img_org.jpg b/pict/main_t_img_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdc0d2935524e5896b803c1a4bc4c788dc86f2d3 GIT binary patch literal 1487 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?<Brf(%T8jLd?J z|Bo<qF)%VPF*7nUAOIs1GYcylJ0k=j#2FZwnON8a7?>EDnAllaIiY$OnV1;_g;*3X zE)ouAWiwQobV<xHFtKoA<3b~+AZ23_(T##2Eo@9oOw2ID7zG2F6or(SSwsvS6NNt< zY+RW1{}uxeGb00&AhRHYJ;U#H{+g59^)~x0@|20uyu@J7_4D`lwOf;_&Az3~{MqKm zF)ysuB}4C8;0^7Q<)+G)^W|a$<&92yID|MIbxzpyh~f89*R!rQ74k1r%+tKxcS~`9 zFZi2z*LmGDg_)LZUMk0xj&=T;p&=jae%7PA-;PTz_q0=+nvCv`sF%t4h09CD*St`9 zwv*-bwuD6{-b*$$-2b%r*@_7}&hGe@+&{1A`NU*{88`nkFicWv+~?XL67!_wN3Z6A zlmGT>{|)#XH1~<$>V=wTEsJNXz3dQINVH-<wZ2sF<E$^ye`TgIs!4n>Yq)z`e%stD zemk}2owAx1;ug4If=I8(JB4ptu4jJMEa_+o61*kOx&2c2teNqW>ot7Uf?Uiy-H$Nv zUkUuwSJzTxJ|RE1duP{usrOqK)&8(}W%Kcs%Dwq!69rk0vve>h{8@c+f7!B`FK^wh z3^uiF+2}iQp2l78U7~>nCiCZ3zB?-YcG)`LS!|qqiOc#@JHHpYNekHCQSn?LcX2`g z)byz**QE+v_3GKZEzl@ok%OFjO>Ti>a%1(ff447dcj)C5SL;`PNWB+h>^YrZGRAw^ zH*TdzW_#PWt+C;3Gi>?i*t+=42_>WG9iIdQj;s-F*!o3u@B5gi>7Gjsf14NcZThq_ zAz-Dpo~YC5<(oZ~4(-m$ZPqT>=XFwN=Csqws}9Qu>8yErwe#Q&2Dx7|c4&Fs{H`V! zHM?oGNn+!Uq_cv7#nlaL`umo4*(_dr+|E9=r=sZRj7N8uOg?jM((AjOYl|2Ar*B#p zBdIQOf9c<;9?yI>r+T{erg<uA9bnjT*ywxjmufBN4(-gHKa8A>m&L_wJ|wA<sdva# z_9my@@84M~JDOr9XP)JFdgIZVm1&2$7RKK-G%o9A)zHtCyA?4jxmfh`pV>S2rB3M* zQ*-d$!Wd<insz(qakTkg{x9a~zkdHt`Vn>gXS{3X)W5}_a=G93f2xxC7sT`abN7Zf zrDloWF8$tIX>+@Lw~fqu-zPsVS4=-0`PA&qT^C#P$&Y;>#p@dNoxS3Gxzf($p6aK| z8UrBVy7=X}xIW1<lWu?7o$<S2)moRD?!I;Ux9=pzo|CcO&13dGYU^+LW{&S~<Ze9> z4B%pP&|qa)Ai~rDVKU0kezVX|bNY(+f26(FZN5^KoVB?6N)7MQ>%LBAtIYShAGj4; caz%MS1l_)`*jUduyKd=qU)SDM^Z(xj04Z8yM*si- literal 0 HcmV?d00001 diff --git a/pict/main_t_met_cur.jpg b/pict/main_t_met_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64016bdeca984d722a58c4321800da4a43b1907b GIT binary patch literal 2151 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_met_link.jpg b/pict/main_t_met_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfe4494153ffe652e09299998e4cab5dd2aadb87 GIT binary patch literal 1832 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_met_org.jpg b/pict/main_t_met_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5c014064d8e9c2bc1ced606167c1fa897eaecfa GIT binary patch literal 1399 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?<Brf(%T8jLd?J z|Bo<qGB7eQF*7nUAOJHfBNGc7J0l|lsyG896Eh2&0ElAdVqs;4>R@DIW)Nf%5)M{0 zyf|smB@tFOvBbiON`Z||LB@^?i<CtL8JHNEnOPYaVLBKX1p}Fwg_J}T4IPD95(^tA zZcO@ri-Cukk%38&S&+e=;rCiuRcVu#m0#LrB4&7=Vz3i@{{C$4>XkS9c_vA%%D*_J z@sCT<{tYi8*v0*u<^~F$k()eoUis-b@1q<(GgPci8Z|3_x`yAGS-mf8@h7S0F&mEs zeBfQWT|Hrqs`12$=UKmNO!yZz$8rC!KkMJ6Uln++c(lY^=2)kzg6gI)wFaH1@`A!= zT`QiH+T3fK>$^1Ptlzmq0e2VWbk6ByQ~Y~UZ2QxR{%2RnYk5gAW=!3pDHftWE78HR z_GI_IwBGZ^3wYZ(GR%CM{%)E-$KO=&SnYxX&*tn{>Mic7Idv(wk?>h#zATw^r#QX& zoK}m}XM|s{*i|F)s-u{FN#}D-8OPb4ataK!F3!K&7mAAa#GSgn>B^p@KWisH-{_}& zT~5jG`Kt>Td2Dhl8W`D6SsLHnxvb>Tu`kOqj|L~HUo)KSt5X<qqw{M^ug=n}Mpjqv zLfxgu!;dH>+|F2atGMDxPiVXM$-gD05ATRv$@n!>Z)(fRo!wcgMq4vnG7CDdEd7`8 zs#Is!Rr9Y4wR5kCGis<Tv^=TgtP{DiuPt-S{TD93v_wO)ZUuYlYOqOdRW6&^WF&3( zaz@*nli5)n#aCXgt-2bj{FdQC%9^!ilP16OojB*{x_2|Z#ogvl5*H14ygo!_;qsVV z9kba9Q@VqLuGFYc3goMv7BDG(=Pb3uoK<r#U3z(9+u6wmQw5b~YMehNc3YP9UE;bY zUdy!?En6b);o)G)>f-6;F~NV!nLkM;J3QtF7S|t4bPNjinf5Ad_O-v;8rd#LPW>#n zbhE6_rs!*d7r~*Tt7@`|YhS9zWi8bMKARW?Ze|;9JCzywLH<STJh^{idsH=l`m1Cv z{q_7)F86KuCtpmz^o0E@H03$%IjQ}e_}$ez&-Q&!Pujih#m9Nq{NAK5xjng5;O#D( z^sSS3^C}M<TX1u&<>?C>mQI(QerapU--gbxMe-L5v$KD_(^>ZH?ChP~MnAkvzu6rV ze15|6QNs}j0VW0q4n_tA7KR2elUY9e6w8#Q_ZH88aLaGT`NGQ*tMse-nKP{tcerVF z-&=g(mfws#!LCK$S9~y=yiB?!X~o`GHoQw-wmqb+!WnyCX~(zg?0fRE?NPF*|Nol+ D-4-YD literal 0 HcmV?d00001 diff --git a/pict/main_t_srch_cur.jpg b/pict/main_t_srch_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b99415c84b83ea6f473c103c520fa01cee888ae GIT binary patch literal 2497 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 literal 0 HcmV?d00001 diff --git a/pict/main_t_srch_link.jpg b/pict/main_t_srch_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8087c4a48bb9a39e1b063f4bca601a0657ad0645 GIT binary patch literal 2184 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 Q;(y8AF&DbAs{a2?0L+QKk^lez literal 0 HcmV?d00001 diff --git a/pict/menu_b_add.jpg b/pict/menu_b_add.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a50a3c0b18105b65b81bd13c62faf37aa0b9288 GIT binary patch literal 2208 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_analyze.jpg b/pict/menu_b_analyze.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab8cad740061be354bf0a27cae798a6e5ec391ef GIT binary patch literal 2758 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_back.jpg b/pict/menu_b_back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d42433316343b73e8ca5aa4ee1b72df7e3ab1e19 GIT binary patch literal 2410 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 WKRuFQY?C<RB%g2L-hZ_I|4jg6g!z5| literal 0 HcmV?d00001 diff --git a/pict/menu_b_cancel.jpg b/pict/menu_b_cancel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e0de235f772b19076b3f91d97df469dc27bf0bb GIT binary patch literal 1632 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwP#K6eF#Kg>i1ejTwSQy#Z85tRv85xnp85o(ESy%-a7+9Fu*ce!tIU#Z&Q3gR) zp+&(WDQt>{6DJ9)ItD6<7A{OmY}^>6Y}~BEF37;h#L5D~FpC(O1Q#YTD=P{Kix>v7 zI5tk)c<@7F;X@^(p#QfRc$gU(m;{*x8SELpo0U9kaag@e+Reac<v9lidy5aUg=;-l zUO648CVEr6Q9yyAZbDyr^^qU4nh9yQA57n(H1|-2Tkby2YA4x)hm3PSc;6Cu$0s;D zzbWoQdqF|Z?HZwPE!NE~i|@>SpP&1AtK%atou40OtXcV1z_?vIV(Lbv%!ZzBJ2goL zw`+M;PeN_fr^d6&9m$-^UVR}urFgny*f~jWtBbFTw?#?^Z&KH4)n{gOad2>96VJ1p z(6?fr;u`0OuH4xrZ#P{&8ECvM(LW?-*@sXMLBnOL6GP@slx%3XSZ}>}d)DzwtUGRV z9Oay{?&74Pv{hPn`aCA=uwpYxSQyASVTG#T3<3MuQ$lSIt#adLJkr)3`+3vd1rHBL zt+hN{HtDR+<Q6`cWk&ppU5QL*++vbm7d_GuU3dMPqQw0W&i8X?tmG?swdL_dORhHU z78dS|oYsZR1v7dUg*`q0v;3mlv0n@G!Qs(U-MWK_ph}zlVEPutJ2Gl))}~BuE(?D! zuzzUJY2DCTb#j~bloNr!d=eNn{wzB4JuuX%|J#MDHmq75B1?UqO=w_nSN*Q{)YWRu zCS6zONqce>4?4V-aJif`=h^He@ijhfS0$I-XnoDmyUN&iBlk5y>5w##xRTk5vt~#1 zBV2NWm*mYVO<nhW*?TVIkXH|yRaf?BE?SkbhI7RNozMwZi$dN;=}u<sk+IjiZ62|0 z+U@Ci8~Y#n$mgDTQl#SX`YP|wsM}k`dNVbHWUkcYTnKdcShY!GWrmE-_8yn{o@_2! z>4wXUJGUM>zG(G!=XiOCXLmwk6-thpvAy%pvAcPCbIzx>s&4Z$j+-8Y1iKq>S?93E zI)rdB2&+Fbym@=edhd=6C8A=QUt&!RU+<GnT;iE^|8wqx#k<bhnjcwl>DUA}lkmP! z%}}Gvy}s9cPc(F%H4-@aQ|F^b%Ol<2uLH7vl)YG0GgYZ&_ia0^`5blLv1h&3<jF3N zT)y?@*%kfM5~pTu*pZ?&=g^|$M?L{F9Tk{5&OFyw_?4_}KI8bJwMUEGFV>1|ertI) z<TlgZV>j-&-@NLjC8AoqPAu!G_`12ltieotw^ya8UFq#&+0@x1%vZRmy1S;gXunI} zgz`nN*LZ!{pSA4%#+O^TzD9o7@q4TKn+J3I8D^f+v)Q&b>feRl*+zUd&*gHj8E&}s z_P&O!j=TPp#{5~i9dR3byx#_b7#linEjGC=us2a~t6Sza#i~QfSv{9?oW8cWT~!WS zaM7q^ro%%)p`cqU{Y2$$J;W6F8wG^t+~2^E^lf5jXsuw~vFQ=LNlHIM{daEqtp4~v zLt4;};`#5UOMKP;c=*qG_1i_qB}3}B-TGB5^w((mbGhOjS+-^06xW^n$5UIk>W!P! z62B@n+qzY646Z89>+FwTwVTJ(BYjcw^;hc-^9D)2nDO=3>J5iO+UTw*W&SPQ`rxzw z{K6}a&OG?>?yrAb`#1BN{n@|is?M~Kd)9WGyu0l+3+Er7Ql)!yv;S9{_D}D9FW#&F Ge-i)^V4lSQ literal 0 HcmV?d00001 diff --git a/pict/menu_b_ccls.jpg b/pict/menu_b_ccls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..879bcd53726cc6576bf795afe1c6833401373bbf GIT binary patch literal 1933 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3>%mk1sRwG8JPtc z{~uwP$iT?J#LURZfB-D4Ow4SI?2L>IsNxJv%q)zo0t}4IOw6q8Ol-^$O^i&;EDWrI zLTrnKMN(814IL9FP6}3H4=h}$Y%FTj^hr#Rfsu)oiItg|g&ATABLkD*!X##8MIpmL zVHOd`#EFF)jXpG9RQl)?^#2wE4>L#svmk>#!*3mpJ>C!Z+zevV3ZGgL7;d^TZ1?Vz z`lY(8E6P{a2mY<r>YjT#`e0^i>vK_wa-)g=7Ok{>w0*&xnEF<`i!q;t7eQG5hE|$K zkN*gMEAm-*(azW3@Az7$?KI7bNq>HKZhoEa2W2hqlj%a{-5e5%7CnrC5<kMa{fm#i zWv-me8a<1#ebxPp>s3)NWtT^k@~nLBlX7gz&7S`Z0uw}*mHV^kS4>#g<*?#T^{rC5 zU)jq|uWelFv+Gr_WrlP1ZtwPd=jGa7Qy%-YPHa!|Znc<qpQ~Aa=YNK7&tIBWx7{Ul z!+BGetUb~9^w47_>7oOM;fl|q_?mBVr)EiR{IqV{=eq}&9KKm_JL8elF}Lj(FHV!5 zT)ch5LyrjO{tZn*>n;=owI{CYp3cv<`ysdV8Qt=?h0Aivj^zc1O?98P#GKRcw*F4V zJf0KI92uH^qI?&p?aq2U@9lzu$8UB#GvS!J>hSuU^3Fa77t4S=UFE73!H+B@4_#Bp z7oKYwGAFc6G4|{2^~EeDy3cq5*RmYG8o7DJ8vi3@$@)jjlvy2raztn4vNDUdu8~=J z`f-10Samxy6Hmx4=dPA>doS|4#VpJFc0Ji_LA$)mj8{$})r|pR3|G#cp4fK1MpU-< znaJ+ErI)`uJluA&)55gv%dx`co1Pul%V~{BZagg2{C?;D3CgdQ=r$kX$`_Y^=)Wbz z=IFhy!oq(dzg=yPyjTtv3qIr5_2Fbs^-cdR!KeM2`c-#$I|g{<^ox9}n__#bzmIDT zi`<1m`QGepA07&9ib>3Dj9z?F@YJ;G4Tn~}^W^OaFFT~ybkba7oltQ@&FfQoU0-&k z==@l5U#T`z^z2d#Fhk^4a98gq^=lJ-;R4~TW~%=Vug|NRbT!ZS8}BEbw3H2(-)vN~ z-tbw~(xTPu*6c#<BYzVf*_N9<-F}Owc-yqe?|ACEnseV4D!6IsE%w{AbN}*urV}S7 zXYbspTlVak@%(~h%_;9?<6QE&rr()!m|tq{^2m(h@{DMX1D^w{^(18XaP_M8`h8m; zw_^5E=^b1C2<GKodvc<?%+R^@(5sM#Jn!z^OIX8~IDJQtmgBe9y-iO{dlE|jGjO-v z{+_2Bb9#R6SJi#I8w(eE#-81=Zqw$xsSL*xw?DO2G~_nE+%)0b7oHb(5dy54vR^m( zc(l|yUUyJlwEkEHvu{}akKUx&cdUDEC#6hVTadKp?9SK4f~PN@y0S&=$+l-42NUhL z2tIB+%*FTa+9l?NfBR*RznRN^Or@$??|Im*yvux3u86J3sZU-$N8d7`@QNbqPM*Bj z%<T?$*(Hy^uz!5>XBfBm4D*f0-Rrks{u#dSau0`$t=P?5-En8Poez<<>&{s$>+4{Y zdaUrH;!&1%qb*CfNatFt`S(mqfk)$51dHp(>#<yd1-()`UWecQ>zT3nzR8glZ|=Mi zuUKo<a&YR7Ahj(4t#dw2*~)4s&8Ha|GUuO!aJ2lrsOniC%62ZlQdM_ns_)x-j5$hN zE2l3keRDeG$1<rar@NaXg=MyO{y08KCeD3v@5LOmc?X`^hspcbMp>U$Xx=^luk%BP zZ{HOUzu7nY+cT5dIg*Cz(cz4qK_Q(*axJef8H*-~9yB|}_WH2MkAJ1lzE78W#8LKs zu3gw{vpZ~yxYs{gT+{h=O<{Ph=25qw!mmA+U78b;KhbVWSFT3tF=nvHq1EfkJ5Ho} z<VIer=jzmYUFH*Jz}%!<eX!}AO7k;M(Klshm2R+B%06z~m3Yv@uJ&rxInj{)uQtyy zPXBl}`9Fi{v%4?cf5dI=SChM1w`kFqf7xj(4u?!z^TpSy-gL8%si*Nplb3(4oi(_s za^B_g^3TyGheIaY3j57Jn{$~r$Y-FGmG=v`&x=Z2<vFi&<%Ieb=gjL*Kiu>F_-VOQ b*OM2^TKrxUdwwGS+aJHRt?umE`u`>Xb6-Ps literal 0 HcmV?d00001 diff --git a/pict/menu_b_close.jpg b/pict/menu_b_close.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebed7dd19b09858c175852c608d8dcaa91c64ffd GIT binary patch literal 2495 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J7=7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o6C5xzF)=Z-FoOtI77$=%V+8{?Hg<Lnc6K&SPA)D^P99Xi$jr>l z%EHRY#>UCZ&B@Kn&&S8d$IlN|1f_T&Jg^WZ@&5pWAP0jO!*XUuK?Wv4MrJ|A|3?_+ zF)%VPvM@6;AOIT^3oAP#GY2OlBLfpNBeE0=8zVC-6T1Kd1IXPhEG+C0Sw<#i76w69 zwu{1{>=T7VrYIUN3U+K<$dRbzBpNu$SjEIuOk9wGk%^g=jg^^&i5YAeBLkBlGs{Jx z5LQt|!@$XlMH~|gCkiiAGHTrDq<rvU(<HY4w-|Vs!O8>~>=}N|b=vCjcSDGlpX+L4 ze@!EAg9pr-XVO^tr_|ip*&{wLK|IP;ds%J}|LwJA{~4x8KIf?0yrNKW`U5tGU+zYE z#eSC=cC9&;WUf`D+iPkcW+)#sW!p>Trj*-OS#@g?*Lg)=a%VZYt>ntzh{G{cW_diA zX?AYb{M8cKlO}u02&>(^9Q-wzw<su6x#>!I+mG7)H>PuiwVo{4<n}gHph#@BNbHqY zsV)vIBGzV{J0e;I1O$Xd7@SX8g=|g_IsH@hw7JC$lj<D}i_R{cta&}gr6O1ThEDIw z-Lr+Oc^$2b9xvHd?Wr+qtw+(Ko-AIDxB%fDDW6pjxz0Rb**AmbkGfozmfGb*e>O4R zap<sXagi^bSyGhd_EOs3`Ayl{wyWNjpE!4=T-|(ZHA9zQfW?ZL4Q$S*l4dy6I0dra zye*ONz%lw*$R#C)i12c^YX+;;9cx1u8L!hl!ErIXYEs_$nUDNJcoxW1?i1pdxO3;s z-s!iFi+yZt-}m&v(@O_;CCUlLe%<x&)@{!PTaSI4?BIH_rFZH|YvrI7Ni9c~h)&Uv zaIiU`EL0pnW1{ZT3lBK|PK%$masCwcm7#Lmw{vdJ4z%7CsQJFZb@F2?1*Hw_^P-xT zYwmMqoOSf*b|1Ho%mTBr6=f%Ubt^r)eTAOe8re(ptpZp)Zth;BwXk8K;Y5!G9VeIy z>aq)5&ni?lHR~oC2z-y6)1B<&f3+v`da8bv$Ag(-$7X;cY7;1;lx|!W{+i5N28yVZ zXsIMn)SmKHDTpcgcHlq5TK~?CZM$_%CLWAh>$&ZYn5RP8vmcVCymoBD?3av;m&qQj zEDO5FCGl+5<f<lK$74y_D}p}%lvtp~AlZISCHUE;=j@F?O@#RrG)yIfpIR=jj&bN; zb#8HV&RpBo&O4YST9`Ur>RZB#vks~4ioCfsqG(spPu*&lGObe&g<DRobYcI<@#u(N zXL5VfYD4>iJx<1=-OHQO)ZdABIBAxA@Hz7L&_@ney?LB7=I@A8<XC$7pt10G?jwpK zyDIcKZ&a7=l4jj&{kZ({8|Hk`#d}T9{}R!jk~P(EZq<}z+2mf!w6E<tfuSNtBh^$2 z9|W}=N><o*^?J}VlOWYy`A2^G?q+8f+npf3=)jA-k8<{_9-mw`*Vit&S%2#@LxGM@ zxB2hpME{$=LwfP{-<SRWGaQ?FYpVD9{8!(Ou6wsKY?*d}WzpBoEf;cj7>n}?<%Ehc zpI<K*?BmdEc|^-|%9qJY<mc=#OOAOU^}310<!y8K0>vM>a*FwL^>Uus)D);L;h0$c za+Cb0fV->Rt8?~tZrN7pyJ&S__Lc64X%Ft5c|ApV(aDPwL>zy4Ha`eC(0O(S1LGN^ zPjh_Mm9qT09`fg{uHN2~t-l@q+4q>ei^{witmiQG<Ag+xBRQY%ZMB`g>AURwO{Ka^ zcGX?c+}&Gak@t7?*%PXMcf;mJ6uoqHnJS*2#W!))k^*Lt6yCms2}LvPgkKeB2CtS5 zICbb`HSY;K-4?qG*P0H?$Ct{5iX8JWx~ueg+uz$}Kab45@5-0@ZT-$|D|N!Brs!*5 z`?XzHWQAz-y^cp`)^Cjd-L5B;H`nN^m1IiBtj@(VoEui2wsSh+m+AkX;bO2aKX0+r zak~$hKPBEC5Q<lkxMyh4c3!BQ*Z0(Oqc_go4K1$M`O`n#*&rT&JN%C8)h%0o$G+`$ zRC@EhZgPcDx^I5=#Z}7}Z(eSh^)joA=S-I2oH>3S0-a4Qf|^GIgickfJl|QeYW)P? z5<8(wo->}^(_>+q{C9$UiD!F@c>B|<{!>df)Fr&(WfM@&vAZY#w3<0NM}1r9Ij)eh z+|R6Wj0deht()7>^yQGKsO2ON-LM`J!*D?+p34S5e$3z&y>n~p<R=HWG93QVKa1~{ z`JbhS)BZlbTe9NiT;1QPg3t1D{xd9)zP_Otlt7g>ieBASp_Wwlu%bn2x<AVq|2z5u zEkQ3I%<TN#`beNF)<zhd+y%XtH*Jso?RG?X&4U)EpJxtA=rLBOOy6^Wb#2gkwQu`Y zy`14X+vKRL*k1)!1OEA^R8#%*YM%2R3f`ZpZoc%#$|oEC`OP}O^nR6S<7Le_jglVw z%Yk}%1^)u%SGX=V&*g3qWn(|kaqk!N<|~dNMdHtNR4#4%T;te!f2DLSPe}E``9HoM zcTqpUbJv+)faz%DmlBn~TUq$cEN-mpIg@?h_e&}NDaX2l7Zk4F`8MR3O<Bl{d9&BX zebw3{@odwP7c$xJszVLiQ$0Ih?z(bi)raI+r-h+PWv8mCFMAyvwEAFQwvJ!pv3<|C z21`J+`+BWsvs|;$ie2jWysJKmH-nO@^0u1dH`4NL$T8y^7aze@9zE{xIIj5C${uSe z8-L$x%a(>W%Up|?%iLReK5Lo5n~aaP=25ez#_<$KCYA7+KDS*p<M77CN50(6$_lM8 zJe%5i!Q%RyZ>y5|j`a&)E?v1Y^uck{Y3c)M<krBcHjAyMre0d|qs^&>e@2Ida>_27 z9rABhs8kvr{$rW=vn}J{Uz4?&pQ~eki>(wkSoH7K3&|OK#Uc;h>^^(`^eLM|ng8-N zPrnq~<>+{8kEinE#=RWJ1a8Ye-Tha~wermGmuVIDx(^E^VtZT^|CArHt_}Zx697rZ BG0Fe{ literal 0 HcmV?d00001 diff --git a/pict/menu_b_cnew.jpg b/pict/menu_b_cnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4fbf24758bef9998596578ee224b2aed0f9706c GIT binary patch literal 1768 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_copen.jpg b/pict/menu_b_copen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4df3f4771bf4fc551bae6e2934db4bd4cd8ee28d GIT binary patch literal 1913 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 XxxTb}=O@K~@%@`NuRVP_{{Kw?7B@t2 literal 0 HcmV?d00001 diff --git a/pict/menu_b_fs.jpg b/pict/menu_b_fs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32bcd63ceedf6b8005cc8deaafcb423e9cc9bf07 GIT binary patch literal 1924 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_hashdb.jpg b/pict/menu_b_hashdb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffd2a995d08009e54a563bcbe782d6505aa7ffa8 GIT binary patch literal 2257 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 N)bE}%wk!RA696hW$xZ+O literal 0 HcmV?d00001 diff --git a/pict/menu_b_hcls.jpg b/pict/menu_b_hcls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ef9ec634ab402ed689051374a6f6121ce25de60 GIT binary patch literal 1921 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 Q7r$P0^SY-`*Z;o>0PqA({Qv*} literal 0 HcmV?d00001 diff --git a/pict/menu_b_help.jpg b/pict/menu_b_help.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a0d06591a801fbc9f0377b36d66c0938125353d GIT binary patch literal 1484 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwP#K6eF#LURZfB>v)Ow25d?2L>IsNxKaOw25-0t^f+%<Rle%xvrsEg(?_5mrH= zMZqbmY>E>n845cFDkT;+CW*2y+-T&a+^izVz{tqX!pOt|)xyBQD7cVGD2Z8FQJ6)< z&@u2s<3^>zi3cAVIR*W{#lXYN$iO7XEXZKb@O!pZv6DjRUEaqMx>{v77??lzGigsa z)Em5t+t-}yP4|Tk0S0>wcaxYSU#x--%+8+_FVI!ac~dy|llLQmcf1qL?yKxm<a>Zy zV3OA6Ga4o3CCB=Mh1P}_@Jhz`ec)OozQ&;a%NIuJ<mmEgCZYbXdbLHjxS3zM_I~!q zYf~RC+_kIu&?Zxl=K)K#RI^+el{He`4oy4U!5%Rq@5qKTor@zsD<-&vNvfaw5!A47 z^6FqePO)E$!Z|oZwl_@gP29!$m?8SJK+~O_|C0Vp@#NnnTgvC^xNM2*Dm|&qo{qa_ z_3_PeHMp7ED%`>FrOWX|mp;d;$XumLGsCr)w0I95W|iKZr=-d{!B9kX;VbdZ3>Vjv z5usf@oSEVWFM|Cm`c8P0+U+OPk0{=eR?6MyS>q&o5R1TUhzd0}Yg4AfN&&wcn14EN zbGqSVn{r$9REox5H3Nnzb%7a{zM)PNKh9iL!4)c?={56gLIZ=l>W^uuu2yRf+z1T# zvR;~_B*6L@ugOIJwApFmd%Rs%sex!I)j*Tm274b|)aqPzv-Le&XNa%a8T|?quSJ>L z5~~j`3e~v3b57xX<?5p+F8J#lTf(Qsy}eLpmB;Ti)hAapPb_`y`*&{g_VzmIOzE06 zRuXZWMZ9|agLcRK-MeCO+&Wz^>s{Sm{i3y=uI2BKo|@bj!syeW7b-l}n)~|0oc#Rh zOb2<+v<5xW>o{xYs<cr!v}5(R4L$xHMI}FSy*j+4+H2mjJyE`{x3Wn=W6jKSGgVJC zHni`|zoz{1we)(edyic0I#w@M`euBiFVwTHwRy(Yr+1E88LMVIcJ-Ya%HC}wt`mFL zW5t?@XE^14@~Db>f0?m3r#PbT>ddK1GdHZN2>E8(cc*ZpYTDB6ZG~Ck;#nU};^yA& zYHlp~c&OD?!Kle;nYfTcr;1afhb&jblP5)CuNIdi)l`~pPfgS@_T9{V&meONk>O~% zIv``Fi_e0Rj!ezmkan*A{Xwi9%x{#Kif6xJkl4E<G&DXXe&Ny^LK1@Fr&iVaO`lYE z|F2o(hp*c|Y+h3}{oBp&^Zcbtcbr)KZ+7*|8Jj=dO#j$#r8}!XPVTVj#QzKn`|htg zEZDYOcwT$&{?Imwtb+5-$L_B>%wuYizVLDW)x<WbImQ=0Zhy7mFt4BFi;CM{BNE$| z^L(+%{k6v6aBy3doY~(niNuwMZTY3^R`VEKc}PWrW~%>kegCQY{+lm{uj#TKUvpo+ vG2*w*rTFRZyq2nJ<>$TMm~emhr_F2k%X@rDoaAfY`NVy<mCw!d|8D{SD6K^e literal 0 HcmV?d00001 diff --git a/pict/menu_b_hnew.jpg b/pict/menu_b_hnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8cf2e8c5ab3ed2176e60049c7f46871968647629 GIT binary patch literal 1745 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 UNl$(X{MjGhnl3$k+W!AH0gRH;lmGw# literal 0 HcmV?d00001 diff --git a/pict/menu_b_ifnew.jpg b/pict/menu_b_ifnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec8355f99bf052a53827ac0f6e2763d5b1d16d72 GIT binary patch literal 3564 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_inew.jpg b/pict/menu_b_inew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f990e32d8fd0872762f97fe119da665ab44383e GIT binary patch literal 1831 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 O`MvX4`nmo8Zvp^tVImp; literal 0 HcmV?d00001 diff --git a/pict/menu_b_int.jpg b/pict/menu_b_int.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5fc0af25213a370f00e24004df8ca07d75d56b0b GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_menu.jpg b/pict/menu_b_menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..124a7e098032178d7696048a7a798b9d11a29c06 GIT binary patch literal 1846 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_next.jpg b/pict/menu_b_next.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1f2c254ff6ec2b1e6644fd7264e4e4ad77ca42e GIT binary patch literal 2327 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 literal 0 HcmV?d00001 diff --git a/pict/menu_b_note.jpg b/pict/menu_b_note.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eeea7bb1012d71b132c88b9d0fd09f8622cc4068 GIT binary patch literal 1871 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwP#=ywH#LURZfB?*_j7%)-Y>XfYgeb@(Ow25-0t}4IOiUas%&eRcNhU^S76w*9 zHbtRD!oeabs)mje*_DhY1tvBoi54#0=%no2tRg1Jz{teP#LCRf%nH%P$iO7HP$-F6 zQQ0t1m_@{~P^od^#>9(39}Ye=GX8&yfrlBSf?1Hkp5ePi*^7n)`!!2DCJW}v2nyES zdSI;_r4)AA(A8)CAz6k4O6pI&u9a8Vik&zx=T05RU(JxuB42`M_aBsBs`*Ua)pExl z!Cyi1l1f5^*IjscxGuUU+gx^2$<Yl?rUI_2S4A$ZZmI~KeK*A6*@A}*u0ea>>4jzM z-QLW`^>p8>9CPNfYrFeorXF12;NKk?e$-~qYlGs`rxjOMteUos;d5+W`kWaT7<ZOz zXRz*j)8)+3x@y<bRjZ;3V!1;ljq1f~yJktB(Ud$V8Tjo^;p`Ui=+wQRm+>2U@G3pr zqw0FW;>FRD5SjHdQFSMsD_e~%`wskGV|1ot-EPgjU(ycTRw~`{uk50@ko;bgP``2p zPj**ZgH><lJxYzfdhKmy!-{fk&DF(=1Qd3(Xf0aBvESm+jBK@ju9FkrCp&jsJhe94 zQ=v*H`tOO8!8!u(pBkBH$NWv{`12@FZ{JD{J&srXvnm4LRTSo`OgtUJn<*GO$#|Pz zkAsn3**DJv;?nN&2_X%a1x=1j7K~S2)iaZyZTFic8}}UQ`TWj<)x~=6me4>>!Ia~^ zEHf6p)HjLA%0Brg_M4VwzQK}WtEX(wdH0^4x<`GMQj1e<OT~nVqN374*J1)oGFC{& zb6iS%v#jkyN7x>4WJT;bn%7la_(S>2Qkx?$mYd5r*?R?_@#`uMgbJ<Yc(`MRu+sdE zg7&R8TiF>x-<wOMY-8HbDWuf(cWPRBpo*6LwzkDhmL&-;(MAUY1+{~%dtF4gwoc4Y zOi6PKx$vm!8poO`qVuxM1!}XBrc8OZxRCwYL@%%6z#Yx6J(j9kuDIj)bxF{qJ*V|k zs;Ahz>-AR9nVDMWdtBdqop#I06<iAzEb(fV^n81-<>$tA)8gJP7jge9%kVz&_lvEw z8xP*GQ*QccZoBVn$FVr)hL?47?p{gd$u#>|D3<eS!Z~h@lx-__$9F$CE^l>P_L;`+ zC#LO-_p;b3Y^->H*{^2$g|wWBWqW&DZv?WP5t<zxmeHnnT-7_vQ+%Uqt_w$hz`l@w zkFM?0d)u>0ZAI2Sn}l_5_zW(|wMJGaPFBC6FYYOx&T^xzJLj~^GM2@;?ssYp9YYU> z`ndbeVbzweylbxPkiTx-_ZHC)4~jkeFW(G3_U+N5O~$OB411TG_P&cfb+EuG=je^| zW;d2pGO6s?@@QK`XQoV{ztxHAYc)}IK1<m7ug_ZW_U_6SSy^$upp!Qz>$#o2^z6pW zeU@BTzHa=TZzw9$^U}NU@9(USc^$Di7rdFS9kl1#m-kxw72}tq2ad7FGPIlW9Qbx% z+Hu$W;<tC|JpC=~@6hq&!2aG-DPdO^aZKR7E)%inahLUhOkUwo6aA?n-`B3ZP}nLU zzw+7g<0WkKHU-9hYQ4I?K+n8lTGGr+)3%LD8~$#c@yzg+qe0<L-W`v)*7Y|uEtfAj z++nhh@0ykM^_$KctTts{ezD_Sq_s)?h5dS`vx^kY&A4;?=9IsiLbpeHgj~5@Am;I) z^V9ae`BQ_|oqI28P`sFtm$~up6dC@$=8vpzYp&!e{JJitT{dYBh;>QR(+`w-GDVgw zH<j+N+tL*jl6ObROl!%bj1^rId#3tLm;HNEjwSZ6#<JA!O1kj^Dw9vhA38a;aSg*q zmAY`BbN=Q3&Ph~OJpPfmY}d?R1wYsM=U(l*waWf-={~t+{?l#p`*xmtac9@tPl{`W z|DBGze>LYy&RtdOZ@$*`p__eYFPS}9SvmJ#O5MM5zkc%Jbl=Fi{89VYr-uJDxHNzH o&#<*cF)Q=FmP_dETYs}{PR$?fMYl9A{|#6C8+9~rZT<h703_-hG5`Po literal 0 HcmV?d00001 diff --git a/pict/menu_b_ok.jpg b/pict/menu_b_ok.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e682233fb41bf3932041dbbbfcb97a2ea281ad1f GIT binary patch literal 1355 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwPz`)4B#LURZfB>v)j7-cd?2L>IsNxJv%q)zo0t^f+%&crI%$!giAjJ$Ktb&Vz zQ&bfv3QZDbGjt48N)lyHENoo3(MY*jMUa7!iItg|k%Jkkg@KVtaG_9=GPAIVq9Kc8 zU}9n8#)C>mA0|Hhe~W>KnUR4>kXewyp5gawt70dG(7XJCJz`U>a~K%E_A}n<&2shi zxzu?hJSDcpp@H#3OIrDid2LfJ2<LwAJ|)PPcz2@NeU?27`4Vn|MFgJl5*C=WJN{Sa z?JZedC7ZVu{9CiCwqW_?+p?#Qx?SX3c*<cz>lPhGgVue4i#^{}g<h0?8`>B>t7F4g z3-ezqZ}tT(UD4RHAari8<xVR$%@c1H9!UvPJh05?D8HOSr*5Xi@>dgovbcTuKJONP zUD?~p-_NEjk~|UIr)g0ZvNlJHb=pMJ{fTG9-ZJ%_w`g0pct*!M5BJ|z*OaF(v;_M@ zq?q$f=e8fJPdSR&PR!14iVJ8r$iXcz3#ww4#G5PJJe|((82B&AZ0=srQgw2h_LLKW z-)0<O3jES(e5z}eKz%RY${U&?4okJtO`8}PB~9;a)zVz;Ix$O2Qv28;X%XI!F5Vi! z#=aZ5_gM>ibuPQndY_{!#MkVI-Vc|cMVZ?a%MU3{6$VKQimaHG+Y$SrW2wvK9H;j! zu37=}P1awi{<QqglvRb<XIA${D?Qzny{LKGtIf<Jdzc=aT$XZ0^Q|;*?!t$!ckY^% zf62}A%IeVC7aM<w=*_<MG{ob`@{qb2;o5!|YC{}WOj{rSb82LFxT?--1BU>nQU?$9 zfCF|P{g0WMpSzsoxcb*7jt%dYYCpEET2&tO`^&$%A#WG$e7p2i=<eE%+fFMPCu#0d zms501Ib{>$IpZ4RkJ@|HH3gMXYpyh3tT%l(zv!>7x%m>SDsf4W7bTTqN%U)R*n*2j z9Wxzn%5+}29IAL|@%5EVM;KoyF%{2#!yqwllGdvA8^vElt~!z}D86e|t-tq4yZOIz zHlIFr|Ipcuud?4B{%kW}y3FFl;y>HFZyTl`PMtre^4!fGUvHmik5d0;diisB@{GKR zcfR>#{#?D`a7kOWn#rH5HxhR_+fJ6M%X(vQS8?9SUVGCriM$EtQ;yA_wVTJ>BYjh{ z|Jm3!=_STD4VOP#cbNB*<eM3nKZhr_z2u>yK{xHE6xORp|F+S4+i9G9ZT<5D-9HUp p`k(%*8Z>FDxqth@gpVJ7MQ*!q&+#SNRn|WEMBUrWkZk+^Hv!jWA>jZ3 literal 0 HcmV?d00001 diff --git a/pict/menu_b_ref.jpg b/pict/menu_b_ref.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7a4329df9430703aad90c5cabcc77823a6b2326 GIT binary patch literal 1672 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uwP#=ywH$jZoo1XvlFm|57^85tRv8Brua;;aG;3@pqnoJ=e%><~R5Q3gR)p<od< zMZ<|olNJf5s5%BFDyy&;CW(qQF5GBj+$=80z{tc3f-KAsT?~v&f(wO`logo`1BF>c z9F;yK7EavQc<`aqN28$sw-|Vs85x)anFSf_8NQp9JZo`Sy-V87z-Q$-2L`*353CE< zdaS&1cE!xrGS>?(91QYPlxN<3R3)pq!7%ro_aQ-lgLxfCx9`;Fa6Tg|*qvV#C(u5_ zN?GjQlRb+31|@E~drww4$tAp)<5>6Q$z#D&N0NgA7n_Q>-oEm(Z%W?8iPBoPBTddY zFnL$|lxfQ^s!rNB(PPH%I)S<W85X2ebI!S%Rg|zQCDI_UB-mitN{1(=lRG4IMGhz$ z^km=p&oI5V`_jFPxOG)0GgfJ=4qdLc(ap{0oq%S8`yH0cO?i3xU(0WLF5Girr_Afg z*Gs}WuDpD;%W_vrp6dmprpi+%1b8j~D2W%om>9N8-qE>oq08odexWC$mIg0h@!~nl ziN<h;Q=CUqSeY7^sm<$jEH@Wa_Fni!#C(>Bw{6PS>9H(XTb_z%F{Nt?9%8d{h*cBi zVw>rpx~w4f?2&)#esf8m<voAL#BwX&?#z9h8}Iu+Z(v<Nb$PwR`7-S%*0JJ#_DWSA zxsPt&ncku_FVPlH*!2WgPx{bebMT^$;ms97MymV=80?qWY!Xl8_&PZ!Tyw(WUC9ib z?zeQ#z0z6{_;-t`AEVbIR?T3`B?=6JC-*&F8R)lmn(K-cA?u|%G6Kww37RbQdNeyu zJjcgX%g}c{_clS16-UkX=-qG$S}bzw!|p^uub$xSLvLGLwJK)X-F()6%XHGBpSPnH zcTHZdvRLrD@8WIUt20i@FR2s=^*O|p`OAIF-f!0fcPVX~a!qQ{oH*l`afbcOS~soM z-8WwwlI;-c<)G@PY?Ub+>@`7fanZ6AG1gPNngTW_7d*ZCTHxNx?(JUt@4man_chMS zLGSRYUaQO#Gf&TC2s^uV)!!7Jv*P+fu}jTgOwU`CaHn&|s+z5$-0BK#FHcEr$?hrN zeZ|dmZN$st!ER-*)`f;xPN}<@R@9st(_pcDbyVzCzrGp4mkW50p4j1-6359J%f@uu ze-)EegM;$I>bH9nc3ocdd!hXD59yEXr>{S8@8nLmz3yvu_BwT}-XgQFXhFxWWnY9m zPdCe~7FpoqA7~_1|LpqeOWOPI8lG*klPW6zF;VA6mEPJvf?M9S&xx#MX5(7y<2n1< zgI?FF<Vlm)U3KXQ%U%?6hq2Z9)TL?VrRPk_E4S=gy|t@grG@^g0<F2bFE`ck&FY=_ zddsh4E;U;{-#Th}Wwm;)UK-iu%kqZj4x@lar^LZ4Hv4znUMRDB?q!*~M=mNK?%Q=d z*zJv_=<0RtE0aLcSUJ&ZWnfosMeK%-rEZ#AAC?_bnkupEdh2bDt`M*SCCy-|t!$lB zTu!ldbWEC^wZtN%>Z?LTgDs1LUvUisoBo!rRjW^mf5_Z*BwJ9tYgL`^^ci;ZubhgT z_56?OGF#t&b8MeazFnH!(`Em1+x9}CKbxk1?zg-v-5<Np#dJ~q#{B+wJCh9VDiz-} zeEfS|MB*-I+sShFyPmd5FEJh*LPk&iGk9$MY<2(5)ziy#&b6<Nmv>tKDRHU&@=sn% kn-0xhp1x3Vd-|=Y^w+Cw#V)$de^tr<>e^Jd&Hrx#0B0$v8~^|S literal 0 HcmV?d00001 diff --git a/pict/menu_b_rem.jpg b/pict/menu_b_rem.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a6f73498d1ad3ba02768b161fdda1a745dfe29c GIT binary patch literal 1681 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY49l4r1sRwG8JPtc z{~uxKXJBMtVrFDyKmZn2MkY39c1A`9RB;AICKhH^0R~29W(E!x7FJe>7A8h!76w69 zp+&;MA}OkDiiQ&>IR+}RCl)5Dh&C?VsN5{bz{teP%)-db!VJ;D$iO7HFo{`NQApS@ zkVRyoW8=oeLM5XQ2Os{w#lXW1l4cfUuxI!^$EL&~A%4m(7tg}HZ!WGsuQ$Bz&FGAp znWcR*zQvB=fRg%4uQTrrYQ-idTI~2e@!QhiJHdzM#MGYn9W?Jz!E$l=BD*Wgcg)c| zdi+lRR?T<nT!n?-mEU?*cOKe#?(y&5+dFvX_@wNZw8U@D&An1K8hNLU*rp0xcb#bT zD{uOTwPN$0Z`t9*ytC=qv$h#J$#&1nVxB#jxX<Fb;tW$gJKv=ZuhU+v+}0u#xb@eO zQ1@q3Dt9O@NxmI_h~e@t%{SlIXV~<vw$!Qac-?V2iho0t-`X|INgq}BPoEobx8l|1 z4{JB>Jv1fuaFe9ItNLS}8E4-vF<5p>I#($^Be}Zc$Itbx;WtVc8yka<h<N<{cym+o zoEblTiZ9MK%shU3!a;@|;f|~-sxGRVZfYHSdLVJ@eJ(Te9dVbdH*Ztem2+-3m-g8% z$!(w4nmMU#6Ae*ybqW2nBKP?Y7nAv$q;q9Gq90dJ-~OrN(c_dOb9$q*HqOa>E35tD zWrk+dx9GTq-|yUi!}0e@cfyyZ+2D}Vn)hg)$fL*a+;2_!F5C(UY1<<Y{q*df)UNa| zv<U9%-zlFJe8*38p^UlEkrT_Gbj*J=?^bhy*7w;xM$wG%OF9Kz>q65i168!_kF_mc zWH}|lCE94yBBe0zch()+q0?L!v`(BU8GP`_*L8xiW}@@7%s$j+CC&CK4BX!Q+GE+J zIU%_ZeqGYsvRqWU!fs1fuI5p<d;DvaW_vxbKE5^Wx!r>YM!fs}#KdS6-I{78)7baH z;#*fk?{vS@3sX0R{b!IrnXPM)5#w>8W6gJ+o#)vj^sMS{pL^;Pa-!w%O`V15%HG9h zK{wQ&IrQ*xn?LHjkaNr3#Kc3SCO>s;&*$8CY>JB$1sX5RD2wUu`%%)jDlB~C=gK{4 z+~R){A5E6Ecw#$A)1b@s>h!>s+=mt`Ejzu0tE2hJ)UcmrH=bLUz37`@FLiv?<isb8 z92%Sd-TL11GqQ8DY?`0DZePcfPv$Mj_IfsNcRIPa2D9x*WSf|qz3AT3eWlA9*xh#f zJ#b!ss`;_a@vmGj-<_=AWo(?9V(_-?n9WD^z8hwr`E0(lmc*vMzpZzc&CsliYw6O` zAF73N(Yad~-aap>+iUmt>JOR6E84m?)hCsg`EOc&>eM!&>hro*oTtU+_E}rZ_$-p+ zaPDoa3&%hEz>1}%`7<-OGi0`IYrelS)Xw^Jsr-p`uiu`@w76lE<acZilaLT+kzC8` zOD0p+wH`D(p?3OV;g5f%-Dh@O7jWKQ^YYW~$ZZcy1!C(#akRBhdmHXpgGK9}yC+<7 zLOqXsSkW~xXR6;!*?pdJEV0cR%Tj+R>Be19nS4Y3(96=sH4I->>OyADkvsq0Z2RGJ z{~0dbGkq2RxczgSfA49TtQG$mdN2K|=&qX`{rmcycT&^W-A|HwGyhlAmw(w|i+O{B z=XEakf3`KVZKYb3+FbitSC>gGnfYQ?$-nHd8CjFk7iC`lxi%_smFEB{TRZ!oviINF z`M)Z&eq5b-@ax@wb*I*UOI&t;``@s&1u>dAU&_Q{ZRMx#$^ZCiz3XnX%)j9i{>45n JDPRBpCIG4F<VFAh literal 0 HcmV?d00001 diff --git a/pict/menu_b_seq.jpg b/pict/menu_b_seq.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d903d25a19d24bd2b2718e4fea2d0ba775c31593 GIT binary patch literal 2451 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 FHv#7fFcbg) literal 0 HcmV?d00001 diff --git a/pict/menu_b_tl.jpg b/pict/menu_b_tl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..212be616c47567848cfbdabfbcc6990b05874173 GIT binary patch literal 2545 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 VovqTH<ZZk9M15GHNqYSMn*clld|3bh literal 0 HcmV?d00001 diff --git a/pict/menu_h_cdet.jpg b/pict/menu_h_cdet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9bcfa77e405814fabfb2ade971b6ed41d024d0f GIT binary patch literal 1537 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY43n7|1sRwG8JPtc z{~uv!U|?WmWn^SP0*oxIZ0yWTj1Yh<!NknMD!{<V!pO|b%*4tHkz!(GW?>a%5Mom_ zWOq~&4irf&oEW6M@Su^Xm>>faNS28iq7oDqf=tYchC+^kg~ExAN<}RHZ!z#NGcqs< zG7B=;Gh8qI(AT&?JLdQak(!7_?o;&7Y@Qdb5bDG~%lq_gB}pH(s?_k<!bfEvq$NWt z^>k)yY@K%HT8MGF)OJ>N!$1B~YGuv6ntg9dLt;v<Zj%U_l``q5+P_)4YqC0prSr}u ztUTJ`{il!PX{bYO;nw1HS-mS?1g=+nHYd1mvU7Q+9CN=~RPN>Plhl1ra85e@xF_qf z?AlF2#gorl#AJQbiQCm?pfaghXkS9uiHqhM3zb&o9bdNUXl93yuD$ic>%l?1zDF`I zT?zRoCgZHT_|8<}i^fYgMrvkw3YI^W5S=s4T_$VNt!u}O6&0_nPh8$AT`Zwrd?5BZ z_uFf$8+V;q(y1P2|CG-<-!3)#%;{xYnogap+jnvP_UeZsr*>$xBsq0nU-a$L4V@|P z_OZ-6eOk`cF*MGTnPcXQ53Bxlu6(gSQEC0uJq2AWV!Ajcl?1B0ii*Eju{YS?^*5*L zoTo9R8`hYsZ&5C4+Um8se}}t3NS*%ODTaSb=f`fnoHY0Oy^!$J?R+`QZcI+dx}(-x z;5RE-Nj}u~<cd|drZ6q~wCG{GO6aM)XkH7S9gn>yinB{MhQFHmYF5;`-A!8M6L+X^ zhpw7g&D+hW+jel5=7#;5(|<JmW7&1-aN07KX<~CTpB=r{6O(a~gC~?DRD9E-<+a5P zRTtPAOc)m!<rQtRI6qBm=bj(yPd#4Eu=<H->ZZ!X9ZRy>7FenX-S1g`wO;k>qdyyW ztv&Hwr{K@pBkOb?xh@rdd$?-K%s0mil@If_%-3GGOF{X5*5ixeG55Gt*ERVZdfS(H za>>m~zIA&&v!68YsfwP&xHV0+(4vpgU1w$OF^{RnU#_p(lP!{e{w90O<Ovtf?d?DH zut@arW*zOtJrg&qj=adt<>AY`gmvSw(+d}s|N8Fh6}a^1%IiC{x0!7--f>rWlSC3v z#-9bUY0q?&GMC>H^!;pirq!si<y7v$vSY<-S1q~!dLwUf!zVqPFJGJgeO<lV{i>I7 zW6XvS2FH-&x0vi^o-1CjmldU^SUK5a{h6mGbF$Bw7q5#evT<Lvc*E@lhu<&Sxr0AX zl3mnx<-A?D7H?CTUQ{X(b>1)YiTp1sk4r*rZL^Ava_(gwlde5Jqr!EAy8y?w)jMC! zza6#eVVr*11?4^QwXTtle&#i;3wjP%O?okRRj`WFPXU)D-6`4cRP0}_eYSLV!M-O- zH%s|;{JDB0bjH~w=Gv-4U1l0`4@`NM8P1z)dTi~lwNLhXo!40PMCRSITc`RMcE&n2 z#~xeK)6g^V$uWb<n+ms<@8oo42w#+Y-OJQva@F1wcJoh7o*MCE*H!1o(<a~J7Bg7+ z(N5`xlvb6Zc;FvVQ!zWO*AF}|ABlP0UHD7dB3xKZXYsaaKg`zbsm!?&;3>i|nR{z( z$-kbk&Axh#MoaB3ty<X~u=GjK-#yFkPr5F@eQ~&om7mlkj$LafTIi*kO)T^K@p|1# zbD@2g*?t~+a(42ORdTagwNpjH_IYS@bzEZ=WM$dam1wP>ckAa*p(l@nJ!V~F$Y6Gm zVt}MRUWV@Nnsd@^?QJqxK_X0icUNwgF1#$eae+8U5r=izvOBrQeaenC#DetI|Gx<U DV8(I` literal 0 HcmV?d00001 diff --git a/pict/menu_h_cnew.jpg b/pict/menu_h_cnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9488016824ea0d4f837dbf2e670dc77a1f833bf9 GIT binary patch literal 2960 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3|E*L1sRwG8JPtc z{~uwP#=yYD%*e>d00*q>%q(n742+BnsNxI^j7-cdtO5)SEFi$l%*_hc0}>S!Vr63x z77<l6RAP4wG!jcx7B6gcnz%41Y0)KP6%*C4$xG7IB?K9mn3x!uSee*i)-eh)DKZNg zItC^>39~dVEWD@`l%y=;{QnjM4>KbJlOVGogFQpu<3lFmdb@Xg{F-@J>&$kUnB&W5 z>pniTZnoRfAY~z@Q;c0U?WZ3;?`vHoa`V6v&HQqS^I2YjueZ2w;o6lk_ng;JaSmCL zg_f5KIyhOlY%C5RVD309Tx+n@(oy~Vn!OwTGbm;MuHW7K=lcgv&MUtgQ!h&z*Zo>| zS1pvmaHi!9zgY_+d^Jz7@d+Ne9y+^a7oW$9y(c$jmx`?1GV2h(ybhbl1;0XrMlLmj zk2)3%iMM@MEnP67`S+@O%dbfV&a+iAb$`Hgc4fom6--J2(-;)bEbffD9kh#Osvh5i z$Zek=8LkZtOnU3mwNof8qbtp@i;aV!eMK9ORo2!iON2tw@8;dxYt@n&?O3cdsZW&U zptIK`RpAxI4tuzQT3ibKU9Ts4#=q9ju|F~E-~D$F{xjJAVe+j`=h&Gyc?z$U_Jma` z6&x<hIlBxb_!W=&Ivo9b@?KUb*Wb)ct?LHj#zht@o_oz=FHmM$5vcHS8r#>3zdP>D zm%TNoRasc(vADnWW%uRZRlT*A-1cBG%4`jI^=F~giK!t6ycN9762z1;7#=UIDSLU6 z%h|m2S9IB<?HbFH^n45T%3kVmo#5n3^I4>((>D9Z!N(ofS5L~TVoophdvQZ#`RmKC zOqWRQ&B+vZ^gM9XMEUsg69u~BSwWmOelH@tf{!ioI^>?j&74>iv_iA#n9fnZ1RXV@ zj|>Oj#3eB~iFzNpy)-29a+ZGA&94q#JhSI4pBreoMAL&Iu;YwDyNz$@&6UoR9Cxk# zu)}um8ojS-X<fmcPo`z=bc(1r&c5yO^n?knU++Z4E?<(B_Bv#BsIaHslC2zTRvZ(Q zzo=8;{<-*Q)}{APT5gE^y|_!Wv-$MA6V+ZziUU8FbL<o8vgujn$>`_s`P0$gq7`eG zw#?4zt()w#L~3I|yr-Y0NAbFiex8nw3_4E*X6*4{WaN`L8n~T%#mO00GtaMF8FFh~ zsD#eEqP$uak%y9xG78!y9$IaAyhC!^-P><BPk(Swx^=-0VULJ8UNdH&5H(;*mgkV} zGp*7WW}0+1eW#hO=*JnM*&HTiK~o-0n(P+ba@2r>p`oGSM`F0|ttsuQyNf<=eHU0H zqSfX9WfJ$CmAj17CK)n3pO)kM_14}1k8A;U?q#WhfktzJ4Ns|RHJ(|d$kBeYt-<SC z)Qg3YSAMn5E!pYU9i8^ol_$N8B{-ss!K-Lhg-ETP@)1RzvYIaIqpPQQnLFNzcG~v$ zsnmoQT6)1L51n`CIcwaR!0<C^r-P^PA)AMX&q*B3+;sY*Os8~W^rz`JFJ04YS#G(o zse8#=Q>o|Hp2{ndG`9F8Xf`ae*~9!$rYySqCSS_DgVyu9{TJNcyD{5qt-|8iq<2DV ztu#xHik_L(wD7XwQYHc4Bg@QhcP^b>KE-f$%C#3SEdsTcUUpow-^TBB-er}NQ?t^o z4r`@Z?qyI?>(@VjcBA=46BEsKN_WkxzFI$<>%KxZB}QfI`XHBJmcX<F$C-~T3s_Zi zu=5zJoZ{hmRxgiD47)y~ZL8CM_uap(!*^VCRo2@p`at(mpq01UUC+xMN1U8HPXDYa zJhAHKMt#F?EVtj>s(+pulcGL<gPqJvZW~wD=Bpf^9(M1pdw-QZ+4k10MZ7CQl&|Fd zu9Qm3Y+E$p!P?-mpwbfA;1z1KY$~Qp<wX{(RdSxRzAz}`+U~B8eU8gavsZX{9$2oj z(Pv3RokfHA+vBnscNgz;65TubPIlMXRTgngcMs2=dr<3PP~Z)fT}g~as!B!$8Un`{ z80FlKSKsuynZAs(ar4d7XTJMRxtZ?v@6~~lP$lW>vnDw3CCJ&PHhlcpXKClQ&+L;_ z8fUfJ#Io{je-?)d&lJr(%QI==YtI13EnUKoBL4o_xa-F2RckB$CH2hQu9x?$_Si;U z>p6=y&#qgfaB8`rK*`18MV!(-NvbCW<P1N^DIRxO^)fqr7sJdudi~|=V^%j!br6=_ z6S8`uD%ToeKF()zEjViuJO4AxEx7+c_84zozsp|h?0`j=?{8RjmE)?i-n&_vlE(HP zlc&^q9N0Xk`S5|oJ=*Es%bqHBsa?6<zGK?gxDOE_o^MwjUF_w;lB6fe7+zAy_&`md z<M5e-Py3dqu3h!-nSWsaO@{KqE3f|^Ss~>5>XqnZA@@e<?V1jk{_rGCf3NX){*$9Y zi{1n&ykmNpQ{LBDarIPj^ePiE_A*xCiK~vCVGwpQU_8_R^wZ%hJF`n;9lx4h?R)p_ z<y@OkuH9J^uj#DVkdm}3Hqe|wEvT4-<M>BsiR-SnUoxtB@7h|rF6yh+#buZ0Tzz?h zsWiKFafaH;iSjQmnq@52Ib<xsl6<<ICwI}F;LXQV)Yvy<9nDR@Tf1}j)VN6|*ZM?r z7Izk(_K#_@=}Oc*Gv|QOlsjotER()n%UK`OWUQZc?uFSb&BbwB^`fj3lstoaIvpQ% z9^sN@(F|q&(b;mq&QS1Jr|+&vL$=kX>{{O^9zL)t`0dh|fY}<w*EnWg(wMJusDWvj zk1<2t50OIAz;%jyzR4HvPP+1vFM>HG>&vO5u}a4lJe#I*O7)Ccz>F20OB>x7m_Hs@ zyYhUo_nC|<$%^w1u+_c%#(w&H+||=h^JeAy)brK1)NEX8`78Ye>n``LWs~3hl3m1h z=Hio=OWQ+=ekt-*ggv#K$=o*Y!cDP@Z-0x&Eml|e{Pp?tr++sd)GRkv;E#UU*SW9k z<ieT0I=_5Y?np~LzRYG>`~B{JC*OY;<CyR(aE?@Mw^gX(^d+-=Hm6n9^Tk}QQEvP_ z|MWWvz75~Lo&USvbF)|d%THT26`uK0v!i&n<i6l}i#0cVbG!83aa*oT=}oCxb3MyV zB}IRAf}dN?WI7dh>qfh_>jsaElT#O;?l^z?skg*&?yvrp4B~$s|1-${XGra}-~O}q zXv5|ES#LUCe~DIE`SPn|RAl0(rSlgF{VJUG)MBP&?YwrEzJ6`zX)!%Bi#9#Htg_eW z@Dz)rm~&MPX3cNjT>Zwo+q!MJ<3w}AwzP1$x{B4GzIq64{kHGhWABCcRb}JC{MN<I zc;@|C@#XUm2Y$MxF+5uNR`=|(*9-0{#qzCIw=*tznpXPjr}yKgJ&T1I_*VQiyso=5 zXV%O1z!jI${U6)>4g6i`eW%C&P6S7Q?Ly`L{1-;QN~3sY)}+qYZl7=C`?G3E`l<NM z+n!g4-QD&zd&^Eqxp`~u?CW>8++z?u<yi{1iEXp<-)_%^GZGh`J~{tmJ@+!ZitwkF zOjUh%7e*JIym0!@v1KtU>*MNX)b0qKc|5@Q+xJUvD}EQJ+_5;jJ=1vcW0`qtGV_a! z4Rly%{!XqaU34+u=s$z?<f*HsDgKG9OHt+zKP>dqEsf17KmGmQ=(_(5{4%{MD*qY6 zFaF%{pCP2Yfz|Yv_nztA8}fr$W=7eDe0<1Rmy+C7_oQm^D;=@d_I}%0&DSn2Y%DIF z74yPN=<Lj^FI$u!w#F59HmGm^J9*yv?c47BbhghwG0Wq_eDy;%i(BjJR!S60HvYc} E0LQ~5uK)l5 literal 0 HcmV?d00001 diff --git a/pict/menu_h_hdet.jpg b/pict/menu_h_hdet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55d96bb1cee2a6b6bdd3eca8b9d45eb1489522e6 GIT binary patch literal 1506 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY43n7|1sRwG8JPtc z{~uv!Wng4rVrFDyWPk%^Hbxd!CUy=+2!M+-FfcMRv9bs-FtRW*Gc&O;b1;MDm>8K^ zSOpn`*c1)f9fbpxj6@O(l^dOclA4Ssi<*gZ2r@8%lrST#U=(CxRx}KBEEEz>Y-HK^ z{}uxeGb00&AhRHYJ;Seedz2j)SOo9vEwPJ@Jvt}#)BLo<lO!qxY$vh>hD<o=%Pao$ zi|Dm(>C&<X9{Zn}UMc&sHE3q-@%Ql>A9<&+G8(vqhKuxY3bX!Ru`5`5Q+}gL*+1t8 zU%qk1rk4xp+?ze4@W>s@xBKPYzb1P<+8i`ta?<;mAH6Kjcy8O;E7<ALD$#o+z97_i zhd|L1i?4pOrXJ7EX_>X|r+lL+Z|AyrCyz<x%KX)b7I{hBv2=amxqH*s>v6L`sLY!@ zr%?K4E7!bRCO;i+?aA4Yk<#1Au~N_0TuN={HtSGtCqL8uQyzqWikws0WnJyfp>TVX z{q+r}4>Y`3$XQy!eO=Z)DxA4=rl*i+#-5eObmcd6{W!U7e%PfGbJ;Gg-(I<m{Z%=~ zGA-sQrxtyCeLLue&f+y6RHpyC_Hox2IaikH7hJC>h5k@d3l0Bt<x6~{qRslpss2Az z_&@W_>;9nf#{T3BiMqY*&rL30JJB6=a~<cOhxNYV`>)LW^Yzr?>kpPp)_=M1#<8_i zb+@fi<CKY5vVX;kCaqZw%Y$xpPCd40ahBt&dGD4z6Y^U%?aqx9FQ(txJ4D(SEz+tn z*%}*TP$c)sohj{V*4%w9cRuR2T(r^Xs6Vv)i(*x><@LJRM-EIn#>U2!;NjrWrP4hm zB<@uAn#Q>d7kC*i$g6&0wY>eazx%M{rPl$gpQhz7i_K&Gc~y|7<)V4+@w{EXK1LaC z-?yZCmdx@_YxnazB-h?ud&oNB*~85>@?sNN1Vzlu?%h2V5%YRY`KP5@y!~3z+PQW= zyc5)Qt9|a_kSE909M7^pntaaRU0lJ}qRAs;<?UyO%D-NZ)Xp|}@r7gkwX62WSFcoy zzO(z7?jhy1M}Pl%x}n41?xZ}kgOZ%T_0^uL`uzy>KOALUY0ed15c8+p@N}H+8JX!^ z(jONuUdr~#M1M19SK(EjqniYO)oyszG3&TiclZy%j1MgqZ+~3tyqdriW%R=0*%f#D zeU(Bnd0+fyo&K`@*{QCJMW^&kpPlnJdih=X*hDsIon1V3zqFeeR@pD$OXmD|ZQk}A zPbI(Q!c)BTQcvbr+S<4`wXN=raMTu`WhNB-Zo?-AGqtAFt5=Q%U;gM@?)oq^eD@}n zdzMdZ%63hgqqmdWZ^M<qJXhtZ@dlH&Eoum2-K2bLzud2#nQ3?QcXDj<Uf*Q@i%DQf z+9a*Qt3tBPZ-37(dYD+1dw2W#r)z@imfzXywOncalR4Ke-JTS9@UGB=L+TRKjF_z4 zHPrO2KAAXAat~kd?Puv$sYRjrwI@m?pXz*ySNw79EBnpR&ZNl)_Jt(=XV_+_VDr~f zf4S{tsfUk0E}fpJ-p}><pXTwJN}*lP5?yAU-o$&1v;Aa%=OM*c3Z7T(W$oRhqb^PG zS?)WZZ`v&1Sl8FW(oUx7UAF_*-<vs8FG}4^Q)*rDyS%?Ed-EpeMg8_^e<|hu<ixUu zKP&F1Yu-3B`=g*i&klz!-^V}2m+iT&8+mj0ItNe^;{_))2q~evJG{*7@w)0{hja%M XW`~4rZ)0!V?%Vmcml2vC|K9`vAXIEL literal 0 HcmV?d00001 diff --git a/pict/menu_h_hnew.jpg b/pict/menu_h_hnew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0293ccd5c62ecc4c48d6238adcb2c631f2e25a9 GIT binary patch literal 1856 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 WGGs72NHJVsYcOG4fXS)<e-i-Y9TWZl literal 0 HcmV?d00001 diff --git a/pict/menu_h_idet.jpg b/pict/menu_h_idet.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dff892fa72ddb121eaf8c230ad3fc93109c6dfa3 GIT binary patch literal 1553 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY43n7|1sRwG8JPtc z{~uxKU|?WkVrFDyKmb-o7A9skb`C}eKu9n!GBLBV2rw|RFfuc-GO;qVg5{VPnORr` z8HCsj*%ciFm4p+G3MVdf5(#Qjo~$A&W+uqM#KgqN#KI0%3?di>nGBf~9RoKCIk6Nr zF1)CeB>evt0}nGJ1Ct=LAcH-_*Si(&4i{uv!%HoCZk6Xg*%xXMJ>zNp$%M6AcYd3! z(zGCt-*2AfhwIrHn+hj+e7ip>;Idni@0w=|-6wh6=Cg@rIWxJ4EB$PsRrcJBdt9mc zCp0r>roN8sJ(T6#aa!%uTc?7Fp^V1ArwSI#3hTSU_FLQP)rmacjZ>~z^s2?weil1u zFQn>nB{cUCQ&--D53`pRWW8H-s&JvQS>utPW?gwoZr9mXbj%Gj-JP}Rlu$_A>u)!O z|1)?p|4qF5PyCIi?q|O2(4!R(i#X5jS7Ml)*>Q;F(c)7bS{)C!%=q~A%JsE34{0ZH z#y(lS-l6Js|GmqO#$u;xZY1e23OzKRoVR1;&+J9t-acIBDR-k>xH;^E$LIHo$0{0R z1qv^UhTRcSQ2FX4dP;BSTC)n*Nt?>!x4oYFpJAh;qwBG!r2?S^T`RiwargYp`p>}q zO{FKRa=FNkwB)O06Q6C4<9Kpi()Q5>A)!T+mS5cTXY1_jO{Y$#Z04VE$#;eJjLA`T zD_qW|ZQDKT*0q4sMU{M4&n;f;XVvWE7keztqg76~Ti-tErY++Joz-WXCJDB$Sa$T( ztG#8h1}f+NGfXLbXDgv{_l6<kbn$GLj|*0=Ds_<GvGIA!m8G&98t1AjFWlSvXI3?v z`sUxA?JQS{pLonu+V6VlO6e(P*%Y=06UGI0Ns}3O-rds9_)#^>-8_DdyGA_Ywj}p2 zvP-{bU!Jk&-!k4g_xfk;bh+`#G$^_AbboM&^Zf5#c{Qy%lMh?;=yuf?eLXj8ZRF#t zC(`53FO2%mKGlECy5>K>>TG2mH>x!B&HohCTJU2f*Lybsv&X+SKVD}w>w3t2-XEf$ zv^MYGuy5I;u<(yEvxR#icFWH=!Wh2)1c&ZMjoCh{dw+Wt_h>ye-RiHMSv8#@S$z8D z<g-yx;tL|K*d2K=QB5`ZtSz7VA-4;b8ZGW@FBsNuKm7GttkRw{AFp^!-zpyRwI*xf z?mCw{X*1NP`ATo~dYBu2Cq#5g@5JAm+J9wNuex2ZuSoDt`P*a5$|inS<eDACr+8dY z)HOg^NQTe&+t2LwZGoF7?Gf4Ce&?U=i5;!I>~fOfX4iWEGf0`ZE%f3MoK$@>Hg}7Q z-2T3GYt7a!{V*Ztak6uDUvXn|dWp%q!wc7UeA(PKjlpl*jl5LWfQx27#TV6<-mAGf zW%>L@zT4BzJubVuXrI+~sf{zmlzqJC+zIXT^Z2GTiK#(Lv-D8a<Cu&!+cfo^!!@QW zTGt=1*vqUmea<48jB~TSbcI}VThve7`4r^S@b2~0OWmK#Dpo73n&sLqA{Tx*XQ66p z?%bN)QW7UVoDl1nX;@}|N@IRe-$U0gzh0Ml{fpL1{KRS#ca2x~c<vjWGm8)Rdh4iI zZ#bVQxr?bqK_yQ0;pM2ku~R3#|HgdpK~bJ;acN{}_=!1dX2xA!tMYxd%uH6+qe4IK zx<~(KkenvY(s}vv;fSl=p(fX_7;aBpw?_Te{YG=K62>2%`&{{?4sg14>^qw4B5=iA zf2Z(gSKs72S5@|K^@m+Q5pV&V`gj>Km>r}TE(lncExVI@yv-`v!LPxDrMg_-_lD1} d$EQI&#s$i^cUI*cO1~}_#Z<z$fS2+AO#s3ceNF%X literal 0 HcmV?d00001 diff --git a/pict/menu_h_inew.jpg b/pict/menu_h_inew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1671f20cc442b7d4298de592b52262ba5bd13839 GIT binary patch literal 1808 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 bE^U4IFLQx4im=_OlBM-mvwywd|9=wz%Weyt literal 0 HcmV?d00001 diff --git a/pict/menu_t_cg_cur.jpg b/pict/menu_t_cg_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ace65321d056d8e3adc9e976c57627de4d29d79 GIT binary patch literal 3648 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 literal 0 HcmV?d00001 diff --git a/pict/menu_t_cg_link.jpg b/pict/menu_t_cg_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f758b5cdd58d519f0ef017a70f068c6b6018f39 GIT binary patch literal 3340 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 bT+nt<ZM9~|buqD-l2N!@+R&yr^Z%OwiDKR~ literal 0 HcmV?d00001 diff --git a/pict/menu_t_cg_org.jpg b/pict/menu_t_cg_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..152db199670b79cb3b70a533c27f0d74a1973628 GIT binary patch literal 19559 zcmex=<NpH&0WUXCHwH!~Mg|WC4+e(+4>_K@R%E6zF!=g1XfZG_a4@hl3NbJ<FfcGO zFfuSON-?m4*$fOxjM8v+7NZ7K4HE+cqagzm0|SEy0|P@5qY<3l)}G100@XW*fq~%! z0|UrLkf{*bF(p4KRUsfFza+mnBfmhwT+e{P$iTqF%D~vl&_uz=*viDn%Fu*?fq{W} z0VBk||Nj{n7BIohJ+Xip&UOSTWME)mV`PS?Wne>gKcg7J{fu(R?q_0znZc;W1UH*~ zC)7L-s2{*I)-Zg_zytP6yt6L@)Bkr2d|)0!N&`se|Jw{L3_Khh9Go0HoSZy@++5s( zqWnBO{Gt-V!lJ^$5`sKn0Hwfe41$rDo12%9SAdUCK!lHvPXt8pi9oanLMR?6g`pQL z@c#gVAP0jMLjyCT5(ASUBeNjm|GNw<3>^QDFxoRPFtRd&0o2RP42(=HtZeKYoLt<D z=#q>KOw2Gz0R~1EMrI}!CRTPf4pwF!V@3uhL1q?3AwyQjz(irC!bT%Dk%<d8Iw`A& z1|3W?HYsYl=*+G<Dfq*~kIBWRVv9C4tGP@LNpU^2xWr8SQs|@9Pn%l~UoL(8*-d@Q zlGZI#k6d~3W$D(VSD$_jODk)ewrtz6YtO!!yN9Qjw@+Wb{rL6g-vt?%m>8K@Sio*# zXJa)5J3-M<h{Z85u~12v)u?fz2*?EogD!qBR!MqT)HKOCSTwoV<fAGZ$N}tXriU)M zOb%Hrp5hv6R+9P%?gZQ}P)9i7|1Aa{X0V-t4E7AKfBPpaJEdP;ZnS*o@@4`1m$^Yl zdA@SrGp|Z6j;gq8UH@XyuG@0umPe+}wAtA9&A-{iaAx)f*KaZFzv%z5|KwRaUHdQh ze+K?PlX`FJtvmH{?YdpRRk|8^6`Nn)`7OhnyLMexS!{{T-QX2pjy)<jeWS}TbKSMv z@749Q1OGm$d-*&3w`~5;N_{Nm<!`<Gt?bFK<rg+E9X~i(Jv(vY{<5cnbNdpw<ziwt z7=-=(y}0hae?tAm@2cNteESppz4-Ar<KKGWzr_E^|5Vv`dg{N{{|xQ_JiT`FHs5^3 zUv{I~H?8E)ZReVR$mz9b&61OEPV~@YI<~i0|Mud!uKwR`XYa4Py7c?R-%I6=_rLki zuw?R^o$)W?f7Cyj1UL0t+^xI8I+fY$%TC>@)a$+NQ}?Q{z--@w$FIVqp7*-2pI`p& zm)+Yw@At~z>qV>O?3?8`J*{6@|L{M<ByX5$Q)U)yt~)OLa_80E9__|I&()Xm&fIF- zbZmC5(WQ^ctE(d-*uGm|DK4vJn0_z$_Q&uI)&F=9zR`yp81TE)fU~rhFSFV_?AyC+ zx9_vcO{#WhfB!A=`sBLnxoe+3PtKjdcenpv#{0j||1&K1esB2p$Le>_cm5XKw_E#P zVPE>!_K!YmrdwySocN%%H1B?Nynu`f{~S%jr@|_sVXM`9j>O*BRsa9O+czdb*R8f$ zF39-gS-z#RUe$G4*te$RTbd8D`hV`JSYXf2bzFQ`+dG?SlTQBIzU<l7L_asT({)S= zVT(_O2R)BE)0LB~w|435__cY-TT9Dw{wl}rei3n%{qg<WwB5N&*Hk8K-0IhpdGFcA zZ}0A>uK)6%VNUw;mz)0y+P}HO|AqO__x}t}F8!U|_^+XU-hYNavr_A{5BANPYxd>% zzn_gqHW=NynVY}%Tled)+|9Fo-cR2zf9dwF^OrVX`o+c0_MCCotvk_~8@KNKX4{bS z<r}xm`}lj0_rAElxxoGc|L6Pv876yw%VYn=_^<ju!>7z3mxfn$2mdqFOqN}@wm18) z#yZxdO>cL*zppx{e|LA$nm5w6f<3o2OL_E6cHRBAwt9Q!FLATowYKlRY+v;6?1BFb z4)*8k|M}|Q+#&yh{pb7t3@4Yyc?flwasFoi`^mb1^=xr`UDL8)$4nt+#eYk0H}CiO z)3)jTg+*1BNzd=;95;)O&8aB+aX0Q|wOQ`B8_)k0#p7`2j>TK&e@y<*Q2RIZ<$AT{ zk^IMtb+%sH<^7#M_~q7(Z~iTNqElm?vE+(;|GO1eUNdg4{5Eal@3_a|m%rQJ==^QY z{FmWBgYAEYpC<d$9@H<8f4=`egW6Q>F57eanE(CE$qDQ)HQV~OVBLn}?Uv^hA27a7 zdasuoxBlX;{pW*^EZlL`YC+_?jo+$G1U~EJ|IM7gI1nj%keuwbXNr&Cv-pIU|Ac-< zPPuT1^M3N)tyk_B&+&h@b>*#78#hS4x)xiT^H-72aL@0Ke`i((clSE#En0T%@xqEp z??2y*d2)09#hf4NZb7{hGA4R^^sF*XdLRD(;@i`+cl>U*Q`9~C_u==}^FRLbRWJRQ zbl~cRFW>Fc|FwLPp8fmqd(OQ4_xyYG>i-<sf5tmBq<a45{|ru5ydW(t+s(hX-xIh0 zmlXd@b=4}{^Edx9EVN~N_V2^*L(w3;-1Gl480vo(x*96?{LO!c3-g+b>nmy>Lhbv{ zFk|}9&a74a#oy{*_&e_0zsK&wG_dC9{~6AB|2eWX)P3h~`!DJX?%cm8U*QebTl}Bl znd-l!s8x&a{GI<x_yX8<3ePO}r`7MMeVFv0VaA*yyC(LO<88;5*PZ`=^Z#4z4~V9Q zv7P~gg_EZ*iz>Lr69AJ)1W1ng6-YpKgN=PfZjM4(YEf}!ex9w8p`L+~LTX-eeoAIu zx~)=Zh?}m3lD!?5jiQUcb4X->t3p9eW^su^K&X?Cr?Y~RuD-rwK|xNcf^&XuL1{^9 zk-ol5h>Jpik7sa*f}x&)zP_uUl7do3NlAf~zJ7Umxn3ejxn6R9E=Xaqen3%vL26M+ zrB7yYiLRlZfnG{Uijp0d4a6E0ciC~-q+}+S*l}^%WT#fzCFkct4J#<h%q!6gNK8+4 z%P-1JEYS<_^~f*Etjf<TNz4gKEw<4IspsN^X~(X=Br`cXwL~wuC^fMpzX+y>)26tj zC^IkJ4$ZpEy!70}yu|d>A{%|E3NB8(24|L}<~kM?B~~JgP6To7xHvfxPQzgaVb6gK zDN0Suu`@Ta(FZd?=Hhixa!zJyUJ2YeoTT{`hfATsn46#Cl30?8Y<NmyNva*F39M^i ztZQf*VqjtgY6Y7_+316%2)ehpB(WsbEhjM@+0@LulGOCnB0B>ceHasDkc~bxt#I1t z!-5$uMmYWW7lDE%u_QA;4`$hLNj+G+21+}yz%xV*$I%2tUIGeEPRz;7gQwKtl6cU( z1xh&Jvc_<<%;DsOmoMZcnXuHNlFZ~`Sz}@G8a(NY)>l-huV4X;mOqC}v4g{V@H8}9 z{D6Xj<R(vXX;KKJ)mxBQkXjU<nU|Iy4{5*=*XluOmO7?nl@^zzrho*4Qj-x4OL!{8 z-<Uvac$3%~#oDHW_(c!1>CI^aYZQV44%Sozu|Zu0w6;EK*8-<ELAsGl<>a&hSB(aG z2FR5o0bz4v6KtwY&CO7R5sg|-khRzx4fQ)lBcH@@CAFE)X#;M|W47~6QQG-<lLEGe zKBo<=g^JeFN2+#_>RlvJtSJMONa4LjM3fe!7LACci|$WQBEph(bqy_0k{vWj;}AAC z$DVdAQH4j-F1W)As`ZglDM@L!AhpOdFD+j$z&8L?aQh|ZB6`}?Ep7D*a`gi8i%Wu& zi!uvJkjFak=3vT8Tzp;xrB>*mOJ1UGPHIUB>M#sQo*G3W9?z3sEE?+?nCluCh8UV# znOIsGn^CJ+#OS!gn*(Gft<bzg`qb!nf*EVs4XxRzna1$=6_l8;6pf?RI=10EyoCZ? zs&z!UfgGpk_1&;5B=LC`M+(MKi{lU;zLh)b0QBHV!36~=BcX!F<xNnkg;w&R!3sX3 zl{{#cgDRCgwElDq@C<{@`@uT<@UEeOfu4~8a$^r)JzP+fS(aFm>XV<GjW8%JF{e0H zA2hdxPiskK0aC*i8rzt?Z)lkg8LL2Y7JR@JpB<RqgiYz8`x2iiSUhP1_ai=y$X<k5 zjOjzz)FrwXVLr6c2TzFFae?P<UxMat87jaF!N3dM7#NuDF**Ey_x~L;8&eQ-I;#fr zAMjE&nCuNE4e-*m6wsnA24-gP61e*RkY#XS)4)Uq2ZJQz1Ta$pOkyR#Zg>lp5`Zjr zV*o9<123ur$+4(`<@mrPn6PhPfXqnqg1MlDb8=vnlBj&<&tN_$m;^f&tcnZFXM~uc z4w=v90{aIf!3a{r{1wDx@L<qSOJiVU$Vp2BEsz5n0TEd^a~5302rM22T22Sn#mHa^ z7STnBfX(~?mMvgl_>UDZzW~W&mHJPK9LR1^5HT<?Ffp)zd7veT3=EKP09gtNO%5;< z6dsHW3``CX3<)I`Ij|hq7_bRaAU<;-+=n180|RJTA!z9$A44ufDnlMaDMLI%2}3+X zGDA8;JVOpcCPN-WHaKh`>XAuCBo4?7kXcAVpyYtU1#_T|1+nu=b8^65WME)R$}i1J zDfUmwN=8@~lw4xSzyMyo$PkiWppcWFmk!bg!ak{KCCGfIlKfmKAMA{v^bD9h$Z2fF zIho0+#bG%<#US%h>|q7VF)%O)F)%Q&gE^iqP_sZ*v8Na1mlmK1vE>(Krf24*=9T6$ zFfj1A27^rZ2a7Q<Fz_apmgKvq=A{-TmZX9*979NDK`K-+7ep~g1Z22pZaOHV(c1sa zrA0X*t`Q+1&x5RGU;qU^s)%oKdMb(tTVhU0NMbsQ7+-Q~PEJT_MTuvzM~JUaQht68 zC>e0Tgi#c8X5<%DIp$=h!$OK5;&~64Fet!NQqvMkb4nN(7&yyPi%PI42Mzv%g;AAr zC#5^*=j0cGf)X0If)Mka+~E=+&-&%(rGktv$uICPEh$cgB@B=pS59hL35F<7QhrHE zelCVMcTr|~2D)-^?h*tU#=yu3$(NwT!jOc^2A1Uk$+BOChCXQFtQG?UV*>+&J;+Nt z86+4ON0;6*j4r)>_HA_O?da0m(WSSeOK(S)-VT+ew~!iN5mdu7go0{#P<x1<!I2?_ zA)g_MA(cUaA%G!+A)ldyA)lcb%qn1DU=SvtLV>}YL65-zWFW)_Hn0us|G|AWMuz_n zg*>3EYV(Tq5<#1dz>8`t5)1S}>uwor>?;ZqK`UAnl2X$%^K8}M@7}MjkeOnu9&YMu z;9KCFnvv;IRg@ZB<rk7%m7Q#vq7GW;YY#R`w<57XH!U-#B(<nmA+<Q!R>?UCybQR) zsv@x<H?<^Dp&~aYuh^=>RvoOtDzDfIB&@Hl09I0xZL1#P8=z2<pP!SRS)yR1XQ5}L zYiz8ekXDqKn_8Y<l&xT>XR2<;WmA-rW)<Y(1~srKCCyeH>M_uA;c{cW{GxPyLrY6b zeFGzXBO~3Slr-Jq%Dj@q3f;V7Wp${&%m}zPl<>%m00)P<9T%4Z*eaLQV(?T}W`3SR zVp4u-iLH8RX=aL*SxSnznURs1uDN-lv96(EiiNIaa;mAWWm2k<g|U%|ajKb_I+p^} zx{AaCUtjDt!eSsdS6|(ZOF_W~tk%jUKe;qFHLt|e#SRi;Df!8nDOLrr4PsVl<|Zb| zX=z3v2N>XRfQ>$eVO$C}`k)|0@|PVK7ep+`#m$b(Mjsp_px6O9M}g*mi{>^cC@73t zLQ*J?2G?kCkrV<XDIQH-qrpW|2#}<BG<A&z7fB&NlH$?SH5yzbg#by4M^o2maFG-O zBq<(EU8BK8S_mLUg;MiUY}L!v?d`B0=_16($0xuiDj*;#CoCu|rz|BZDy6I>4gyNh zqgbF6_y86Rf>A_RSWHq(T3lQjbef9@h#=!g7e|H@Xh*v6{y)M{$pAjig^>|7)CL|F zV_;@sXJldno%6!Lj1UElo`H^Y5ny0qWM*MxVPaweEqnkA3kEVP8VZRlbTkrXNpxzQ zSg4dVX_FuW6Eo;69)uZ;f`LLziiVDbPDRY9hoSuY!CLsRC}zoz_3D}v6*3>TR)znx zdE9m{(qzrfw1SMsZTBKTJkzt&dCu|56x==y!cxzUNzRe7c({EU2%DbmF}5%%Je;os z!r8MW5c(pnn;D#WaPc_ro{b>9E+=v3!Nq;jmB}C+bK|gav%8Ghr{gkapN{R^*p|-L zXOa69gnNsVdCqa~skp!0N!R2>$YtfHiw`h*)c?QmmnAeRezMDxZ(r={`1JN{yYg|@ z=Jvnxhs!xWd<qJTS-Qx5`LPJg$A!_GJvYoTs_p5XA`(&`7kX9XxK7`y!o_i`)4b&} z4sl6pbGkd<O#jc|X|a6W#PzFFd`>QRRh%X~WzqJ&=abKJSb4twJM+hR?v`62QC|JU zua)~xpY-m|n)>*}B%>v(eoO4w8G12)LF9wKs(&S;r))g8Yt<^NfNeH29=m<=e7V_g z{!gKpSspq&i_AZ&9<96d^*_VPvQ^u^ESxU$Ps1isTYRm`e$_P1YJK*p+m?&0TpLiC zv~0oOGkun)pX5(j+N=At_~Bud$2wa=^Cy*F4gRV!GyVL0wv{OXh5p}4+&4|?iJ5oe z>|~`Wg?^XT>=&{7ly+RFs3$hs|Kc>y`L2sqHCF1*w4W!MsdlTRB-F0(`B9ld--}CE zEmjp5wV66+VWd@H{z~-=F~2`#R6ba=<g({3T~lrwY0qV=w+2T|I;(2o-2Hdb`V~{6 z&PqI;Jf*z*a{W)v)K=E83{&-058v56R@GRk>hf*nd=sV5hkaGw{kd={B<b;yT9)PN zXSJs)F8OyPX|DO|e>^+C?N{ma|CxS4+r~?4ox_VuGbX#m@38-W@vm{-67^56*R&^X zUzxtcW?QMUd8V$^V%Z%LmnvNoB16*OIvw81Ev2zWV-3q^x4Jtz)&UzAbsg$D;BSH{ zRe+E>ba*?8E~2HRVRnVjSNU>W{GZo@Lk}Z8ujSVtOkl24)KLB={eb<(H>O(sSM~od z{nfrBSf4KIZ*6g2FYx+w*MofL3~wG&NxfL$yt${Wuv4-mM&Qk3**QsWvEnS&7RS>i zCQ`0Q?r(pB@@yNm6^(W?Q=k05{BMTk44ch6UN$^SU|z;Nvw?30UmAl|g5?Yb;)MR+ F1OVx@H4Oj& literal 0 HcmV?d00001 diff --git a/pict/menu_t_hg_cur.jpg b/pict/menu_t_hg_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72cb1fbacd8a0a8f1f76c66ee66ae857d9f0e470 GIT binary patch literal 3573 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 literal 0 HcmV?d00001 diff --git a/pict/menu_t_hg_link.jpg b/pict/menu_t_hg_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97f79c8f3e9711cab83fd9f94c45c1f01d743016 GIT binary patch literal 3260 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 P2opShWnf@n|9=wz@58iV literal 0 HcmV?d00001 diff --git a/pict/menu_t_hg_org.jpg b/pict/menu_t_hg_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37f4b110451a7a88bc2f464f6aaa79aa2714a2b2 GIT binary patch literal 2418 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 SCMqrI0`9sU6a@1BZvp_{Dl5$Z literal 0 HcmV?d00001 diff --git a/pict/menu_t_hm_cur.jpg b/pict/menu_t_hm_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67a9ee4699f6a9990705b25459aafca434c20e85 GIT binary patch literal 3736 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHv3@4Zw1sRwG8JPtc z{~uwP&A`aO$jZoo1X!7vS=iVa85tRvK?FjEk%^gwl}&(wk(r5^g@c8anS~i72@+;t z6%=Aq3=(5EOq_U8X_0WSV_>0C<3nW;(S=TvHkyQR94smoWME=sW?^7q=3oNrV_;xp z5@Z%pG!$ZS3>0QfEL8f?IC0^|gGNplm6M8$|KDQZVP<4t5@Z%+uxEI^^`R6Oqk{%3 z!vYbeh5($**j~w-dTqC*{XK0NYR-DOEDZ{Y&OO5;7g$;^yMzB_<heIW`O>B~UvllP z&y4-r7vgJpd~xQtJ*VC;3vsi6h<-WMaa^u<`K`~|`(_48JifT)cU)@uWi4fyDzo|7 zXV(2nbxH1byZp9t>V2OTJ%ulB)vh<%{c@^cpRKh2)@R|hMvG`+<mtS_4I6(|Ecj!f z@}FU?o7V^absg8Ebk}QI{OQfjdo}O4?dd%0DPe6%4FOzCe%JQ<S+ABa>XZ1&`16|h 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 CxU2~P literal 0 HcmV?d00001 diff --git a/pict/menu_t_hm_link.jpg b/pict/menu_t_hm_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e17433ea435378aeb2828ad57d7922fd714a995 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/pict/menu_t_hm_org.jpg b/pict/menu_t_hm_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5fb204ae57489b7bd2e863b671f7c5cf5bb4d913 GIT binary patch literal 2462 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 literal 0 HcmV?d00001 diff --git a/pict/sanit_b_norm.jpg b/pict/sanit_b_norm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a86e0e6ae06c8077435a206fc313c4bc98f3cec GIT binary patch literal 1448 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?<Brf(%T8jLd?J z|Bo<CU|?imW?*JyKmcYIRz@avHbzDUW=2M22}ULsW>z)<1_l-uW>$74R#u1}MkZz! z20<ZKVG%aPMZqbmhK`97CyBBzR0=FSXyjC+Y}_m+$iT?V$i~LR#0=5Gz{nuTq_|Kh ziCI|L&@oYoMI^AX@Zm)xr~kJYc$gU(m;{*x8SELphviBxy0cm@Akewxz~U_o?1${? zDlc}dx;cH)E60-CJB1qRJ=}ty=`t%C=l)Rr(&D~jmgemIgZfJp->G%|{2hN{R?zd6 zdQrI>Prn!2nKoO)LE%K%naO`2Dso=FX}j@W@tg!T_skH%PL<-A=zSg+*XJy*GF~DX z?N}<ECeJA?E~?Dw7r9E6w@u^7x!|64o99h+l$h}9)34*6+w+>+#o08rmoTNB*4U(~ zw3P3n&!Gfn2LD|e#%Z2RYI8+qxIfW5`RcCTx@g|d%FlUJGQC#x8Fnc!g*>sZX!*T} zujKHzStY&}e_Ac|uZ7C&$a0OId)k57%3+z0-vkLYriBh^0Rp$TX}|GoOgic}A@D!L z<;?r}x~EMp-|jP+_)IB6$uv+QsHFdn(A&42*C*fI75~uW(Yc3H-`uX_tW^~GF7jeo z?tYei6WWnOq%&1Y!*P}?zW@W{XO8BlY7LPR9Z9FwZ(3P#^zXXk&kqJ)F~2?8YDadH zh(Mc33j=fhQ%U2ecO0XP5<ar%8T;;N{oJRw>#pXk+#~vPWc8+;HG3p}j&Hixr{X^u zFaIsMD!ws9*Sy%?^WBU+0#7Wvy%=VmTF9j)=<z60rj2)@-1@x|hXns!Oq&o{n<?ba zd@|*wuK4OT88`E$TRVxj^Rzv3H%nUAkhtP&K}6r|nZXY_POus>ORzc17XR6^@?OW( z>scG0o_-o6Da_+hYE&<iWv+djhoN_-@}0cx%!@iq%BJo$?^xy{a42S(r{`Qn!xbtG zzMB+&?o5!n_qOAi?A%lH<4P8X{MGWUGrp>AvU%A?qw=!+ym0YwC!HID?5k8}m_&+9 zIJ8h%l8JFLQx4}p!{X<u%vw8?6jvWwfBe%bo6Jj7S6$3rVtRLvX<S@u-mJCSRe5@g zHo5wmvP;Bkun1rGa*gLT(C|;-D08>0v@|j(_OR8yxPNNm<QZ~PC)Zs`Tx`0TSGwks z=hmE;U41k6ZQ>3+<r2K~k)O;qhJqTWDF#Q5%&+KhzIAe1O0jIOWBpNHVP^xEqtjR1 z(7&F3=<(gPcIP-RHmDVK_e8B){m04VvclW9b1HXkXo-5WzSih6qw*1>>);r%*tPf4 z%w>0+ejdE^GQfJLiKj5f3MQi)i~?R;j81B^%f@U=o48o|rKbNmt5_@lt0jf2%jaIL zdpLQ4;q&m1i%M(lBkn(W`JZ8(*?RNCSN}7}Sbd1BwV!pj$J$~|+`NC>!OK5KZ@76h zDgVJ%t9sMjymP|TXf9aheanzpSo-gzY42|AF_ByU{a47DZ&B0h_GhR6mXJTrG@mQ8 S-+$XX(MR9!J+Hd@|0V#q-ZJ(8 literal 0 HcmV?d00001 diff --git a/pict/sanit_b_san.jpg b/pict/sanit_b_san.jpg new file mode 100644 index 0000000000000000000000000000000000000000..601b8d67c04ef93b1649be0b0bc2451cd64e9e9e GIT binary patch literal 1558 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cGY3?<Brf(%T8jLd?J z|Bo<CW?*1sWn^SP0!+*-tZa<zjEoG-j3_dUOf1Z-Yyu37%uLK|%<N3;5KW9s%q$G7 zf<kPHi-bi|R2`Lq4HF9|I!#gzTzJr^s98mnU66s1iJ6_58K#4Qk%382h*{Clabc3M zvJ#6(VB*BahlLvtUNmwF`hSaohZ&@RS&+e=;d?}(;$~TWy9tlGC0gb#V1BoLer?*8 zsBOWEMIKI-J~*ZEuhOP@A2UP*&mR90{H?3s&@5DM>2)z)n;D(6PWPRf_b`n|V~yrd zeqCjwCTR!tQ*)QhZQ32U>ea;7L!a_Os+sdWH@;pidUt1+Px^zMd7L57@&u;~=Bj#X zc}+d)6%-USsnAnt*;02SiDNIKdK0v&zM9Q*2~%Ac;&OD#f{shvy=-@b_IBo0JPov{ zW-Y#7;xXljcJB6@YGErb7s?jS40?FHbi!1d+v`kP6?7gnEm*{H#_vq+R^2s^Gctb! zWNt|kNy)w|u$?($_wA5}7A%~GC)K|kHjS#9|MWhq%i6Ep-Pdo)vasHLyHbUfA?3J4 zlOg-hJ(;%tAKo`j+I~gVe%+Rsa_%6#ZO>voSUrlIIRjXd3|SrCvP*GI<vm+|Feu`F zz#P9#m%L}6SoD}NxcI})fX}M;6f9Cs&Nj=bF<5c8Mp?7{!6Y+-j<A|L^{)0A>*A8O zowD5VudD8&zoA*Mzop<2nJAC%4U9j#n(wL|2$gZO*pc=r?eP8ZPrH<RPt8-DC*h=( zw2mjmNn{NNL++0-uXnE$)`~=mHHllUxVNaT^qBUVr7~CY1MRI`RkaoWGdML|J-fS3 zOeBl#M&Z#l<~mMO4r(&!S?|1cYwd!bmuqX62Hg01@=J$yZ&b?RW!e(g=KW__xI1~z z&Bux-!cL!Qlk60GY~x$Rqp~pOX7s_MYue9+uqb++GS2;5mVaU9IyKb=cNB%&4?W%- z#NzbjREgY*YX4)G#4~!lHXYjMK3($1`h^_6I}@`im$Zw?$*}HlvMKlxx@VW;v&B9# z5w81oRI43+s43=ZUVOpo&h8a6N-tLAIh)P+wz}zVD&MX%oG&LW_?No;lj5G>+5Bb_ zKQ7LFDmVF0Labn(5*L4d(4D-fEiZn&eVzUH?CzAn{E69#v$HNuWB=(Z9<r$A5trys z;b#YGvdyO+yJ*;R?S9eg4QXl;Iu#dhO`mjW+R0goozrgXq=lDoOyuPEo_5M9IyX<# zHHPi)j#_tq#;8B53M=^=ORq_@zuTE(cTo3K&0XUa)7P)N)p=TZvyxwt^jRmNwT)8? zl1whIsIY5~u`3aL5>*x|c_&z;S-ny4;JtmPe8tcB?4OkMcuA@3p}Q+})qP!s^tY=& zb=`Mjvb03+o-HElS<<V;K27D>XR7-ybIaDtGfX#3W4nLRalt2!X`idUrNyUii_Z0L z7ino(d8lkfW1ITpI7372ghcOWi>o?+UeZd{>@3&lHChzI@^AxJQ|L^eNh>PeeY$fl zcyjOW#5Q}YmzuZwcfAzct!K3IJD<P8<HxgKp6tuN{o~rd=lQ?mXML`=z5lX&@2U0M zzeaCuZx8dn{QTl9>-x~$ezKA3c0Ctw|5|&i;MGaXFKK=EujXBD5A!^~*re>=>asaj zoBV1e7jOR>z2)K6NyRVD%I;rvcRAmh$@ASZ-u?}HYf+jq=a;d2{;TbohgYi*Vd%2` zR|?sMd;gv>xO+Q1?MQC_^*1YnPqt3_YxnB;hXT8KZ1H6=TVH-Ty|iL)ak5$V|C<0< CUWRP| literal 0 HcmV?d00001 diff --git a/pict/sanitized.jpg b/pict/sanitized.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bec0da750b1534fe54a516f8d0e25c13481879aa GIT binary patch literal 18357 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 aJ7v$!*!N;7v~z?K2xx@>O}O>{Zvp_YP3K_% literal 0 HcmV?d00001 diff --git a/pict/srch_b_lorig.jpg b/pict/srch_b_lorig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01354eec4e47d6e7396dddbdce76a355eb908cf0 GIT binary patch literal 1963 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 UW&aM>>|eiV^SY<c^#9)k0HpC^&;S4c literal 0 HcmV?d00001 diff --git a/pict/srch_b_lun.jpg b/pict/srch_b_lun.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a2d2b720e6ecd7a8e1ff14d8e2ad1cb15328b3d GIT binary patch literal 2180 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 KZ@XU7|C<0n_Qi7m literal 0 HcmV?d00001 diff --git a/pict/srch_b_str.jpg b/pict/srch_b_str.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d9371452a5001e11945c3cfc67f0fa209d8eb93 GIT binary patch literal 2111 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 literal 0 HcmV?d00001 diff --git a/pict/srch_b_un.jpg b/pict/srch_b_un.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1a4b4d2da8b8d38d84f163fd8d406711676cca9 GIT binary patch literal 2445 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 FHv!o7PjUbN literal 0 HcmV?d00001 diff --git a/pict/tab_close.jpg b/pict/tab_close.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a63dd24ba231299168472dea3524db52727b4f1 GIT binary patch literal 1357 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?|Hsf(%T8jLd?J z|Bo>AGcYhSFf%eTzyS*@8v`RV6FVaV6N)$k6Eg!N3oDxd0|P5F6AKG78#_b~qaYJA z3xg1=Fq@*Gqll7`GJ9g-#lVS+E;$D;JlHhJ*i}rBfsuuQg_VVo6{3TIkwK7&S<x_1 z$T3lgMWnFNN%+IWg%^#Q{@-HYVP<4t5@Z%+uxI$))A^&vO!nsGE4K}A<it%?y|h)6 zVTX%L6>H_o*lva=YcH%Yo~p}#ckh1n?UfNVb82$7Dhd|$J4Cn@hj=bz^gX8{Bgo*f zlJShj5*3Rh6Ayk2lXkk-HIJ>HdxH0>hA)|!iAN27Y*==e#j4*pdxP6m^;Pb@snd&+ zXDAwk@OhTV7nr&HS@lt1(*%_#7ZO(VT3xzh(zt?A!N$dEx>m~al;j;pHVJY}Iw#&S z@9`VS$#JdX#=TY1Y<ip8Z;CRgyc4oBo8GarboG=qjA#5`Ea>4E*d)IrnqO6OhsB$7 zMmg8tu_e1rI($y+3fC2nT(5AJB`z5{bDLCVoZxpYZ1GIzu6-=EJR`a?`tnreQ}*%Z zJ|Efs`Mj_%*!Ig@@BGQPS3NoU&Zc|n^9wj#QdlyB-C(CeJ=czM`PfBKqIQcljJ*5r z$UV{(Ox)ktEc@*!=ky67PkI8qxV{=)&Jf>|Ajc5EC@;10P><iIN;CUI3Oc8=<{vqD z@5YYV^F^*HZasEB)yU}PiDkvUJ5C2*Q<$0=wKzEQqv)L<VV#jaJu0a^$pU98RJ-2r zNgD-SD@%Jhwehxfl$#t6TiKgw@x^9mmQ<bWNz+l(yz2Di!xhn*%F8yZ7Hj%=%ss63 zM?&$JnnQQ$QQpQIzfVh>%gS-<I~{Rm|N8Lke6gC8rN=^MD>4|}e!JEyFm5Y5UrAVb zseq@#q?=6qyH;E@oN!S3?X+8Wen(1tGqN~XBAM;@QhUDawMe@>qeD?%2fPpeb9|ue z{l0qE8`h=2Woj>8ba~|5T78FY-u{=bC;n&fEh^_-d$!a}_Wskr)I!6jdsl7U(aJyT zAOqv?1DV@hPp{b;l_bgdpTV5}`@DZo{zds+xvv(*!j>dwE-Is9CoG$C(mNws+NCnK zbkD0J!Yk*j(J|ZgP&L9WoOg>>OuM>@$RWvKFCiiA9*0#q?t+QMm&{(h+>pB?i9zZ0 zgIZS4f1ayuZLT!Bpc8hhB__6_F3bPv$}O5tPCHD`*nX$1^~FT-xSD?@GQs!RAFWO) zSzETQBwWf%WqUzN!og!UJ3HA09=UGWV8231E`Du<|J&D7o|&z*-F9h1Wth9x0n__t zf$;(JCUpE{`LnF1?)<(rk9OIf{GCuH|9ZY@t<#Rz>=Uj8`u=Cwva~RIALpF!pAS7> zE;B)<?MdN3lan)-giGBPYQ1`=e&dhHUl+V`yPDNJ=gsMf_YLJ9Nt<4|I6Y`bR;ikU z`y>C&YtNQtn%_4#Sa|7ra6I$2hd)DJ1u@wR)y@@aFK6xC*s!7Lc1V+6i*xWwM$uQ> j^xi4SJAYJv9lX+Qb;ye6-`(Q2-#pYT9%U6h>HkdtatH~P literal 0 HcmV?d00001 diff --git a/pict/tab_help.jpg b/pict/tab_help.jpg new file mode 100644 index 0000000000000000000000000000000000000000..632e27006b00f6a18c51e5b20f31ed9dede5de0a GIT binary patch literal 1253 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL3?|Hsf(%T8jLd?J z|Bo>AFfcGNGcqzD01GPvGaEZ2BLg!dBeDb&GYbPFE1LiVBQp~V3nLdBGei#)BQuL2 zD}#_Qo1&qkNO0lAi%Ld|E-8z#2PQ6Tnj~uM>?+8>$jr>d%EAn@hLJ&#Nl}PdiN(+{ zFj1s%qLJ{zhfYoZZ!z#NGcqs<G7B=;GrZSPiTLQWw$s8hNYy2D)yLQUb58CM<oZ() zt10_1Blc2t`gZ*{P7-%Qi`eEhTC7?0Y;E?OP)#59J30F&Z?az#n-zEcF7K4}F|%i? zb|>6=x^|!Q<+C%+PHB<(8Lg~x_SMJ3oU@sj@5oJcV#&TK$zT7ba><RuyKgViKDVSS zbS00J#iwN{86utmeRGPI%dl)pkx8nZ?xIxLT6(`KSK7FDYsF57ZM$BqG!eR=+N9{Z zXvN|dt(7r6#(wn@lV6DYS@fwWEs9$!F5zr+@3GJ$tFE=4eGacvIuBnpSg}rga)B#H zQkO;JgK6bGS=Y5v&-?7POt4w}^?OO2!v4)xDZk$~DOh-@$cTzoEfby<swihME#}qt zP0I0h&(=PAqNh7W=j@@}YihP4zb8z}TU(tTRp_ofw<265`EF#}jk)3W?2F5tb=ZQ7 zG){{b{Z6jWvbnMC#;d@6%d*}JZFUb$+$wsk{@ky98ILBa8ZRvPoOC09;|`T;#~z;R zRL`|)uwQa1wz+(Ebiv}AjItYICKay!&hgG#MMTz1`oQhXz;jJ@%XJvecRu<2({-O( z_kN$3%Nt$qncaJFclWWgB|DGn?iFG-dc5n6XJE>1ch^lhlS7xYwIn&MTpseU^>AUo zm?g*T&OC*dpu?6Ygd}sn?YqD6t+&u^-S<0QNA>M{eSX5^KC6#uMmkLlQ{$R6X0#XX zuuLrsNjjX%w0wuJZT;8Rm-cVx+!1y6>NM&7r!L0k8a~~-D(!*L??_QW@pIj6&$_1v zJvx;n$@t}tz2y5R_I$!w`IGe;1Fg=o$+)KqdKN^=9N}HDQcK-RX;IO!jWWhwK}=J< z-mW+@d;ZtY$|qZXZd<pd<-xSXKQB1_cD!x0*FGlh(#h|Cs~l#YW!ChQ(;XJ(t_XSb z`t(!9ABAhVD~(<Vy%qc2cWJ)bl;v?Xe|GR?zIT7Nb(2-np4I2NmUFr+Gdjt4KTrF* z^_;r}Q?<i=Jq0HF2v5$ODcsJNd0tj)??ENOZiD=~m)|Uw1Xk)9oi_i^5X|*#-9KT= z_xGospDx!hXSzY*--44fmn8R@t#o?z&Yt<6ydQIr+0m=MvBw`&AAWi4%I2h3?Oks# z8{b{cn|5yRv5Drfemg&{-}>~}l|CntqI!*9n8L=5rE%K3yShKwKK$}HD>f%KXw~_5 StNrKxC^!&$RVsSZ|C<1i*6qOn literal 0 HcmV?d00001 diff --git a/pict/tl_t_data_cur.jpg b/pict/tl_t_data_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9d9b10638a30653b203b5f99107d915ca007465 GIT binary patch literal 2906 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 bp|IJ#NG@v8#*cNOS86go1zdf%|Nl(@B@r<X literal 0 HcmV?d00001 diff --git a/pict/tl_t_data_link.jpg b/pict/tl_t_data_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe8333bf274b8acf0ad68cea2502698ad53dabcf GIT binary patch literal 2580 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 literal 0 HcmV?d00001 diff --git a/pict/tl_t_notes_link.jpg b/pict/tl_t_notes_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe01d8c05554a886039c72e519a95283e67279e8 GIT binary patch literal 2216 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 literal 0 HcmV?d00001 diff --git a/pict/tl_t_notes_org.jpg b/pict/tl_t_notes_org.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03c643b84cc6f49571ff4f2219c4107ce28e2c45 GIT binary patch literal 1715 zcmex=<NpH&0WUXCHwH!~28I-d6b6R>Zx{q!N|UoI85kK@7#J9A7#RM)W8ia4$xljU zNIAg3z`*$bHbV;o8w(2yD+?PdD;p;pD;p;_2OAp)HxCyVHy0O=01p@l@bK{q@bmEq z3yX*d3(H7LOUuZ^0V6v*J1-Bfgn)pAl&GMn6kLK>#{UBhf*cHL4C|N~1sRwG8JPtc z{~uxKVqj!oW@Kb!KmaCYRu)EfMzA<Sl!1YfiJ65}07Nl!F>^4oLgW~km>C3FgoJ|? z4KGewbV-DjP0TTHVq)RKjY>vAqRLK9o19Gr8JHMZn3$MBMnZK71~M^=2q`JD7&;0k zE<E_r=>IJS9%e=cCP8LF2788IZz|lH7%n`WqO(Wj^Yb5<QiP0rj#y9nX|h>n?$TEx zDY-2k6*pOa&3L-|PP}{Q4t|SWH6pJ%mOacrQdsgs^Qyod`OfG$r+T+b=jN(tUUIUV zsM%=gr(Ce<>r=tMYZ)qirYPu|<@ze{uQr%Jv+cpPLgjCFwq2dMIoo7e=ix%$bf@GQ z7iKG{ZVLZayFX;lo=4>z*A?EIEy!%OTcWU~f2XHM$fnbWlnbW5Hhb{lb6=cv>gg?0 z>=v}0@G#aoqqxIw_2)n8zwP2Hq9%toTiMNyn`qsVZ81a1a=VTtW6Jz0C3AsmCAR*i zPfyLAz0||!)X5Vzi96)iyr{Zvw4g%hLgoSEo14~8@q19Wr)JSPz4@$Gi=<oY1&>~S zusp=MpiV{Xt#XrBs@-oT>EsV?p}wc$Hr)Jnv)7<n=8i<#!J|d-tc6#KIheP6s`~hE z<C?jK2Jy}EE7t#E+f;IdkLPQ4EVJUS#-y7nl1+Ak2jAYgY+aj^yJ*X`U=1G&+vGOC zbv)m@mL2h5qf(d*rPFPzX4K8}bY97~%sb<}(dDUzJliaNo^Z_OU76*%GS*41&P$Rh zbcW;)6)%NLHUAluI0BnaKlOH9uv{c9?CJ!OmAB4jCEsW9{TKdMJ5=dXOmyC|t5)qy zx}1?(S^<`|n;KJV>;Czzns)22<&xCQ;Asx$Sgsm`q$Pey&#rko)!wHiWW%a-;luH& z*Cl6&i5LmZPn?$_w(UJ%T|!s1Iq#(@3YvVZvvzx)R*l-Kzw6>zrs&W15B6+3`m|`0 z0P_mQNjlFrIDSuU^epHri}qL=&9^Nymr>RASR+e?%95G~vHOko-@JHw+Om65a|3v% zG)#J!vo7K1_J{AAG$(p}$S4fC(fPI8bGn$tsvMVJhup;+?<IQN@(gZP-=^dlaof1E zT=2}!$z97GgMF9W3Or#nXXfMOmwfN5R8Mm=+4to7U)TBvrjwW12A_CvLM}Q?Odv>C z+hB{$^5-JuEBiOqYcKLue<dq4X>qe!^u+tQE0%Xwf9lzvy(+p%yQZt{v_HcmzLFW; zo6HtY&T7{<74LUpWw6&>hd)7U<_jdtX}pL#djF8^cK4odo5~Z9%$>cWJ@?{c+ck4< z6iS;1^4(s1tUA(q!y~i2MY1q8Id@&G^ZF&<ro21cadTHk*<Cr~TPN?f3vMnIc)QCc zee2}ie9CFB6mOSQoX=J-lW{wH#d+I{kMpkiy|L(}$auk5Rr%9feZ5K#{#fZ0&!Bje z{mq@M%Pf~oq?UW+Zv3k$Z*l8RuZFwr-8q}?slGp@{%zON3T4w*+y67<`{}04+Eky| zGtd2$@73;RlUFv%Im^VR98+y!Xb@mxaNuBMP+&o2vL)aDCh>jsAD+NJv)BJI3Vr|i z(esa&Pcj>B>De!__1(w5JB3f@Y~SnNxMi-P-_ggSuI~dM<f{8va~ut<zEUCWd71B! zVMyFpIkrnBhd1<uii1@eyip#+3N5bfD?Gj}<o@TU8)o(^+skXLpK0oK&i?TKn*dia Bz*hhO literal 0 HcmV?d00001 diff --git a/pict/tl_t_tl_cur.jpg b/pict/tl_t_tl_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed69d8bb2511b86e499b460d817bbddf9844a8d4 GIT binary patch literal 2844 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 aI>jdC1us`=%f7$0qd!+$NwdHB|4jgEbQ<RX literal 0 HcmV?d00001 diff --git a/pict/tl_t_tl_link.jpg b/pict/tl_t_tl_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1da8edd58df6f0a30a0377d819670d82303ab23f GIT binary patch literal 2518 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 BgeCw0 literal 0 HcmV?d00001 diff --git a/pict/tl_t_view_cur.jpg b/pict/tl_t_view_cur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b621d7d857b3e437f9b7da200f40138522aef2c4 GIT binary patch literal 2681 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 literal 0 HcmV?d00001 diff --git a/pict/tl_t_view_link.jpg b/pict/tl_t_view_link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94016071364e8948b80a50593f21f3e89fbd822e GIT binary patch literal 2351 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 JyXXJE2>?`oJ~#jX literal 0 HcmV?d00001 diff --git a/xcode/autopsy.xcodeproj/project.pbxproj b/xcode/autopsy.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..f04caa4f2f --- /dev/null +++ b/xcode/autopsy.xcodeproj/project.pbxproj @@ -0,0 +1,138 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXFileReference section */ + 02B041C40E9070E400E46A87 /* .perltidyrc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .perltidyrc; sourceTree = "<group>"; }; + 02B041C50E9070E400E46A87 /* Appsort.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Appsort.pm; sourceTree = "<group>"; }; + 02B041C60E9070E400E46A87 /* Appview.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Appview.pm; sourceTree = "<group>"; }; + 02B041C70E9070E400E46A87 /* Args.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Args.pm; sourceTree = "<group>"; }; + 02B041C80E9070E400E46A87 /* Caseman.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Caseman.pm; sourceTree = "<group>"; }; + 02B041C90E9070E400E46A87 /* Data.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Data.pm; sourceTree = "<group>"; }; + 02B041CA0E9070E400E46A87 /* define.pl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = define.pl; sourceTree = "<group>"; }; + 02B041CB0E9070E400E46A87 /* Exec.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Exec.pm; sourceTree = "<group>"; }; + 02B041CC0E9070E400E46A87 /* File.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = File.pm; sourceTree = "<group>"; }; + 02B041CD0E9070E400E46A87 /* Filesystem.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Filesystem.pm; sourceTree = "<group>"; }; + 02B041CE0E9070E400E46A87 /* Frame.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Frame.pm; sourceTree = "<group>"; }; + 02B041CF0E9070E400E46A87 /* Fs.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Fs.pm; sourceTree = "<group>"; }; + 02B041D00E9070E400E46A87 /* Hash.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Hash.pm; sourceTree = "<group>"; }; + 02B041D10E9070E400E46A87 /* Kwsrch.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Kwsrch.pm; sourceTree = "<group>"; }; + 02B041D20E9070E400E46A87 /* Main.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Main.pm; sourceTree = "<group>"; }; + 02B041D30E9070E400E46A87 /* Meta.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Meta.pm; sourceTree = "<group>"; }; + 02B041D40E9070E400E46A87 /* Notes.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Notes.pm; sourceTree = "<group>"; }; + 02B041D50E9070E400E46A87 /* Print.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Print.pm; sourceTree = "<group>"; }; + 02B041D60E9070E400E46A87 /* search.pl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = search.pl; sourceTree = "<group>"; }; + 02B041D70E9070E400E46A87 /* Timeline.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Timeline.pm; sourceTree = "<group>"; }; + 02B041D80E9070E400E46A87 /* Vs.pm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.perl; path = Vs.pm; sourceTree = "<group>"; }; + 02B041DA0E90710300E46A87 /* .perltidyrc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = .perltidyrc; sourceTree = "<group>"; }; + 02B041DB0E90710300E46A87 /* autopsy.base */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = autopsy.base; sourceTree = "<group>"; }; + 02B041DD0E90710400E46A87 /* make-live-cd.base */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = "make-live-cd.base"; sourceTree = "<group>"; }; + 02EF3BBF0860F668001CA8B0 /* global.css */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = global.css; path = ../global.css; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXGroup section */ + 02670C57079A2F7E00BA95F3 = { + isa = PBXGroup; + children = ( + 02B041D90E90710300E46A87 /* base */, + 02B041C30E9070E400E46A87 /* lib */, + 02EF3BBF0860F668001CA8B0 /* global.css */, + ); + sourceTree = "<group>"; + }; + 02B041C30E9070E400E46A87 /* lib */ = { + isa = PBXGroup; + children = ( + 02B041C40E9070E400E46A87 /* .perltidyrc */, + 02B041C50E9070E400E46A87 /* Appsort.pm */, + 02B041C60E9070E400E46A87 /* Appview.pm */, + 02B041C70E9070E400E46A87 /* Args.pm */, + 02B041C80E9070E400E46A87 /* Caseman.pm */, + 02B041C90E9070E400E46A87 /* Data.pm */, + 02B041CA0E9070E400E46A87 /* define.pl */, + 02B041CB0E9070E400E46A87 /* Exec.pm */, + 02B041CC0E9070E400E46A87 /* File.pm */, + 02B041CD0E9070E400E46A87 /* Filesystem.pm */, + 02B041CE0E9070E400E46A87 /* Frame.pm */, + 02B041CF0E9070E400E46A87 /* Fs.pm */, + 02B041D00E9070E400E46A87 /* Hash.pm */, + 02B041D10E9070E400E46A87 /* Kwsrch.pm */, + 02B041D20E9070E400E46A87 /* Main.pm */, + 02B041D30E9070E400E46A87 /* Meta.pm */, + 02B041D40E9070E400E46A87 /* Notes.pm */, + 02B041D50E9070E400E46A87 /* Print.pm */, + 02B041D60E9070E400E46A87 /* search.pl */, + 02B041D70E9070E400E46A87 /* Timeline.pm */, + 02B041D80E9070E400E46A87 /* Vs.pm */, + ); + name = lib; + path = ../lib; + sourceTree = SOURCE_ROOT; + }; + 02B041D90E90710300E46A87 /* base */ = { + isa = PBXGroup; + children = ( + 02B041DA0E90710300E46A87 /* .perltidyrc */, + 02B041DB0E90710300E46A87 /* autopsy.base */, + 02B041DD0E90710400E46A87 /* make-live-cd.base */, + ); + name = base; + path = ../base; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXProject section */ + 02670C5B079A2F7E00BA95F3 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 027355510E7C4D6D002BD6DB /* Build configuration list for PBXProject "autopsy" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 02670C57079A2F7E00BA95F3; + projectDirPath = ""; + projectRoot = ""; + targets = ( + ); + }; +/* End PBXProject section */ + +/* Begin XCBuildConfiguration section */ + 027355520E7C4D6D002BD6DB /* Development */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Development; + }; + 027355530E7C4D6D002BD6DB /* Deployment */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Deployment; + }; + 027355540E7C4D6D002BD6DB /* Default */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Default; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 027355510E7C4D6D002BD6DB /* Build configuration list for PBXProject "autopsy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 027355520E7C4D6D002BD6DB /* Development */, + 027355530E7C4D6D002BD6DB /* Deployment */, + 027355540E7C4D6D002BD6DB /* Default */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Default; + }; +/* End XCConfigurationList section */ + }; + rootObject = 02670C5B079A2F7E00BA95F3 /* Project object */; +} -- GitLab