APLIKASI TROJAN REMOVER MENGGUNAKAN VISUAL BASIC 6.0
Laporan Tugas Akhir
Diajukan Sebagai Syarat Guna Memperoleh Gelar Sarjana Strata Satu (S-I) Pada Program Studi Teknik Informatika
Oleh: KURNIADI SEPTIANTO ( 01502-037)
PROGRAM STUDI TEKNIK INFORMATIKA UNIVERSITAS MERCU BUANA JAKARTA 2008
LEMBAR PENGESAHAN
Yang bertanda tangan dibawah ini menyatakan bahwa tugas akhir dari mahasiswa berikut ini: Nama
: Kurniadi Septianto
NIM
: 01502-037
Program Studi : Teknik Informatika Judul
: ”Aplikasi Trojan Remover Menggunakan Visual Basic 6.0”
Telah disidangkan dalam sidang Tugas Akhir Teknik Informatika dan disetujui sebgai laporan Tugas Akhir.
Menyetujui,
(Raka Yusuf, ST, MKom) Dosen Pembimbing II
(Dr. Rusdianto Roestam) Dosen Pembimbing I
Mengetahui,
Mengesahkan,
(Raka Yusuf, ST. MKom) Koordinator Tugas Akhir Teknik Informatika
(Abdusy Syarief, ST. MT) Kepala Program Studi Teknik Informatika
i
DAFTAR ISI
Halaman Lembar Pengesahan ........................................................................................
i
Lembar Pernyataan .........................................................................................
ii
Abstrak ...........................................................................................................
iii
Abstract ..........................................................................................................
iv
Kata Pengantar ...............................................................................................
v
Daftar Isi ........................................................................................................
vii
Daftar Gambar ...............................................................................................
xiii
Daftar Tabel ...................................................................................................
xv
BAB I PENDAHULUAN 1.1 Latar Belakang .............................................................................
1
1.2 Ruang Lingkup .............................................................................
2
1.3 Tujuan Pembahasan .....................................................................
3
1.4 Batasan Masalah ...........................................................................
3
1.5 Metodologi ....................................................................................
3
1.6 Sistematika Penulisan ...................................................................
4
BAB II LANDASAN TEORI 2.1 Model –model Proses Perangkat Lunak .......................................
6
2.2 Unified Modelling Language (UML) ...........................................
8
2.2.1 Diagram Use Case ...............................................................
10
2.2.2 Diagram Sekuensial ............................................................
13
viii
2.2.3 Diagram Aktifitas .............................................................
15
2.2.4 Diagram Kelas ..................................................................
16
2.3 Malware (Malicious Software) ..................................................
17
2.4 Trojan .........................................................................................
18
2.4.1 Struktur Trojan ..................................................................
19
2.4.2 Cara Kerja Trojan ..............................................................
21
2.5 Jenis-jenis Trojan ........................................................................
25
2.5.1 Trojan Remote Access .......................................................
26
2.5.2 Trojan Pengirim Password .................................................
26
2.5.3 Trojan File Transfer Protocol (FTP) ..................................
27
2.5.4 Keyloggers .........................................................................
27
2.5.5 Trojan Penghancur .............................................................
27
2.5.6 Trojan Denial of Service (DoS) Attack .............................
28
2.5.7 Trojan Proxy/Wingate ........................................................
28
2.5.8 Software Detection Killers .................................................
29
2.6 Sumber-sumber Trojan ................................................................
29
2.6.1 ICQ .....................................................................................
30
2.6.2 IRC ......................................................................................
30
2.6.3 Attachment ..........................................................................
31
2.6.4 Physical Access ...................................................................
31
2.6.5 Lubang Software Browser dan E-mail ................................
32
2.6.6 Netbios (File Sharing) .........................................................
33
2.7 Antivirus ......................................................................................
33
ix
2.7.1 Program Removal ...............................................................
36
2.7.1.1 Launcher File Removal ...........................................
38
2.7.1.2 Infector File Removal ..............................................
39
2.7.2 Definition File ......................................................................
40
BAB III ANALISIS DAN PERANCANGAN 3.1 Analisis .........................................................................................
42
3.1.1 Diagram Use Case ...............................................................
43
3.1.2 Diagram Aktifitas ................................................................
47
3.1.2.1
Diagram Aktifitas
Untuk
Use
Case
Melakukan
Pendeteksian ........................................................
47
3.1.2.2 Diagram Aktifitas Untuk Use Case Mengelola Data Signature ...............................................................
51
3.1.3 Diagram Kelas ....................................................................
53
3.1.4 Diagram Sekuensial ............................................................
55
3.1.4.1 Diagram Sekuensial Untuk Use Case Melakukan Pendeteksian ........................................................
55
3.1.4.2 Diagram Sekuensial Untuk Use Case Mengelola Data Signature ..............................................................
58
3.2 Perancangan Tampilan .................................................................
60
3.2.1 Rancangan Menu Utama .....................................................
60
3.2.2 Rancangan Sub Menu Deteksi .............................................
61
3.2.3 Rancangan Sub Menu Cari Dalam File ...............................
62
3.2.4 Rancangan Sub Menu Cari Direktori ..................................
63
x
3.2.5 Rancangan Tampilan Sub Menu Cari Dengan CRC ...........
63
3.2 Pemrograman atau Pengkodean....................................................
64
BAB IV IMPLEMENTASI DAN PENGUJIAN 4.1 Implementasi ................................................................................
72
4.1.1 Skenario Sistem ...................................................................
72
4.1.1.1 Form Utama .............................................................
72
4.1.1.2 Form Deteksi Trojan ................................................
73
4.1.1.3 Mendeteksi Virus .....................................................
73
4.1.1.4 Form Hubungi Saya .................................................
74
4.1.1.5 Penambahan virus list di file signature.db ...............
74
4.2 Pengujian (testing) ........................................................................
75
4.2.1 Metode Pengujian ................................................................
77
4.2.2 Skenario Pengujian ..............................................................
78
4.2.3 Hasil Pengujian ....................................................................
80
4.2.4 Analisis Hasil Pengujian ......................................................
81
BAB V PENUTUP 5.1 Kesimpulan ...................................................................................
94
5.2 Saran .............................................................................................
95
Daftar Pustaka .................................................................................................
96
Lampiran .........................................................................................................
L1
xi
DAFTAR TABEL
Halaman Tabel 2.1 : Jenis diagram resmi UML versi 2 ................................................
9
Tabel 2.2 : Notasi pemodelan diagram use case .............................................
11
Tabel 2.3 : Notasi pemodelan diagram sekuensial ..........................................
14
Tabel 2.4 : Simbol-simbol pada diagram aktifitas …………………………...
15
Tabel 3.1 : Kebutuhan sistem, aktor dan use case pada aplikasi Trojan remover 42 Tabel 3.2 : Mencari aktifitas di aliran utama dan alternatif pada use case melakukan pendeteksian ................................................................
47
Tabel 3.3 : Mencari aktifitas di aliran utama dan alternatif pada use case mengelola data signature ..............................................................
51
Tabel 4.1 : Tabel skenario pengujian ..............................................................
79
Tabel 4.2 : Tabel hasil pengujian ....................................................................
80
xv
DAFTAR GAMBAR
Halaman Gambar 2.1 : Model Sekuensial Linier ..........................................................
8
Gambar 2.2 : Class diagram dan sintaksnya ..................................................
17
Gambar 2.3 : Taksonomi program-program jahat .........................................
18
Gambar 2.4 : Gambaran proses umum komponen Trojan .............................
21
Gambar 3.1 : Diagram use case aplikasi Trojan Remover .............................
43
Gambar 3.2 : Diagram aktifitas untuk use case melakukan pendeteksian .....
49
Gambar 3.3 : Diagram aktifitas untuk use case mengelola data signature ....
52
Gambar 3.4 : Class diagram pada aplikasi trojan remover ............................
54
Gambar 3.5 : Diagram sekuensial melakukan pendeteksian .........................
57
Gambar 3.6 : Diagram sekuensial untuk use case mengelola data signature .
59
Gambar 3.7 : Rancangan menu utama dari aplikasi ......................................
60
Gambar 3.8 : Rancangan tampilan sub menu deteksi ....................................
61
Gambar 3.9 : Rancangan Sub Menu Cari dalam File ....................................
62
Gambar 3.10: Rancangan tampilan Sub Menu Cari Direktori .......................
63
Gambar 3.11: Rancangan tampilan sub menu cari dengan CRC ...................
63
Gambar 4.1 : Tampilan ketika program baru dijalankan ...............................
82
Gambar 4.2 : Tampilan ketika pengguna mengklik sub menu deteksi trojan
82
Gambar 4.3 : Tampilan ketika pengguna mengklik cari dalam file ...............
83
Gambar 4.4 : Tampilan ketika pengguna memilih file ...................................
83
Gambar 4.5 : Tampilan ketika pengguna memilih file ...................................
84
xiii
Gambar 4.6 : Tampilan ketika pengguna mengklik cek direktori ..................
85
Gambar 4.7 : Tampilan ketika pengguna mengklik memilih direktori mana yg akan di periksa .........................................................................
85
Gambar 4.8 : Tampilan ketika pengguna mengklik ok pada cek direktori ....
86
Gambar 4.9 : Tampilan ketika pengguna mengklik cek dengan crc ..............
87
Gambar 4.10: Tampilan ketika pengguna memilih file ..................................
87
Gambar 4.11: Tampilan ketika aplikasi menemukan virus trojan ..................
88
Gambar 4.12: Tampilan ketika pengguna mengklik tombol berhenti ............
89
Gambar 4.13: Tampilan ketika pengguna mengklik tombol yes ....................
89
Gambar 4.14: Tampilan ketika pengguna mengklik file signature.db ............
90
Gambar 4.15: Tampilan ketika pengguna menambahkan data virus baru ......
91
Gambar 4.16: Tampilan ketika pengguna menyimpan data signature.db .......
92
Gambar 4.17: Tampilan ketika pengguna sudah menambah file signature.db . 92 Gambar 4.18: Tampilan ketika pengguna mengklik folder log ......................
93
Gambar 4.19: Tampilan ketika pengguna mengklik file notepad ...................
94
Gambar 4.20: Tampilan laporan virus yang sudah dihapus ............................
94
xiv
BAB I PENDAHULUAN
1.1 Latar Belakang Perkembangan teknologi informasi yang sangat pesat khususnya teknologi Internet, menyebabkan teknologi ini menjadi salah satu media utama pertukaran informasi. Tidak semua infomasi dalam Internet bersifat terbuka, sedangkan Internet sendiri merupakan jaringan komputer yang bersifat publik. Dengan demikian diperlukan usaha untuk menjamin keamanan informasi terhadap komputer yang terhubung dengan jaringan Internet. Dalam jaringan Internet terdapat dua sisi yang saling bertentangan dalam hal akses informasi. Di satu sisi, banyak usaha-usaha dilakukan untuk menjamin keamanan suatu sistem informasi, di sisi lain ada pihak-pihak dengan maksud tertentu yang berusaha untuk melakukan eksploitasi sistem keamanan tersebut. Eksploitasi keamanan adalah berupa serangan keamanan sistem informasi. Bentuk serangan tersebut dapat dikelompokkan dari hal yang ringan, misalnya hanya merubah sampai dengan yang sangat berbahaya. Salah satu bentuk eksploitasi keamanan sistem informasi adalah dengan adanya infeksi digital. Virus, Worm, dan Trojan Horse merupakan contoh dari infeksi digital sebagai ancaman bagi pengguna komputer, terutama yang terhubung dengan Internet. Infeksi digital disebabkan oleh suatu perangkat lunak yang dibuat atau ditulis seorang dengan tujuan untuk menjalankan aksi-aksi yang tidak diinginkan oleh pengguna komputer. Perangkat lunak (software) tersebut
1
2
sering disebut dengan malicious software (disingkat dengan ”malware”). Malware mempunyai arti program perusak atau program jahat. Aksi malware tergantung selera pembuatnya termasuk juga Trojan horse. Trojan Horse atau disebut dengan Trojan saja adalah bagian dari malware yang terdiri dari fungsi-fungsi yang tidak diketahui tujuannya, tetapi secara garis besar mempunyai sifat merusak. Trojan memang tidak membawa pengaruh secara langsung seperti halnya virus, namun potensi bahayanya dapat jauh lebih besar. Pada kesempatan ini penulis membahas tentang pembuatan aplikasi Trojan Remover dengan metode CRC32 untuk menangani sistem dari ancaman Trojan. Aplikasi ini dilengkapi dengan pengelolaan data signature (data simpanan) sendiri, sehingga memudahkan pengguna dalam menambahkan data signature dari Trojan.
1.2 Ruang Lingkup Aplikasi yang dibangun adalah aplikasi Trojan Remover. Aplikasi ini akan mendeteksi file virus dengan nilai CRC (Cyclic Redundance Code)
dengan
panjang checksum 32 bit. Prosesnya memilih file yang akan diperiksa lalu mengambil informasi dari file tersebut, yaitu nama dan ukuran. Setelah info file di dapat kemudian aplikasi akan membuat tabel perhitungan CRC32 yang disimpan dalam array. Aplikasi melakukan perhitungan dengan cara membandingkan nilai 255 yang heksanya FF dengan polynomial file yang telah distandarkan yaitu EDB88320 menggunakan XOR (Exclusive OR) dimana nilai EDB88320 tersebut akan menjadi perbandingan untuk menentukan nilai checksum yang didapat dari
3
tiap file dan kemudian disimpan ke dalam data signature lalu menggunakan hasil checksum tersebut untuk mengenali bahwa program tersebut adalah virus (jika nilai checksum = data signature) dan langsung menghapusnya.
1.3 Tujuan Pembahasan Tujuan pembahasan tugas akhir ini antara lain: 1. Mempelajari dan memahami hal-hal yang berkaitan dengan Trojan, yaitu cara kerja, jenis dan sumbernya. 2. Memahami proses pendeteksian keberadaan Trojan dan penanganannya. 3. Membuat aplikasi Trojan Remover
1.4 Batasan Masalah Batasan masalah pada laporan tugas akhir ini adalah sebagai berikut: 1. Aplikasi ini dibuat dengan menggunakan bahasa pemrograman Visual Basic versi 6.0. 2. Pembahasan akan difokuskan pada program aplikasi Trojan Remover, dimana pencarian berdasarkan data signature yang ada. 3. Ada 2 jenis Trojan yang bisa ditangani sebagai contoh.
1.5 Metodologi Dalam melakukan perancangan aplikasi ini, metodologi perangkat lunak yang digunakan oleh penulis adalah model sekuensial linier yang juga disebut model air terjun (Lihat Gambar 1.1).
4
Pemodelan Sistem analisis
desain
kode
tes
Gambar 1.1 Model Sekuensial Linier
1. Analisis Melakukan identifikasi masalah dengan mencari file sampel yang terinfeksi Trojan tersebut dan perilaku atau cara kerja dari Trojan tersebut. 2. Desain Merancang aplikasi sesuai dengan hasil analisis. 3. Kode Melakukan pengkodean aplikasi sesuai dengan kebutuhan dengan bahasa pemrograman Visual Basic. 4. Pengujian (tes) Pada tahap ini akan dilakukan pengujian sistem secara menyeluruh.
1.6 Sistematika Penulisan Penulisan laporan ini dibagi dalam 5 (lima) bab, yaitu: BAB I
: PENDAHULUAN Bab ini menguraikan tentang latar belakang, ruang lingkup, tujuan pembahasan, penulisan.
batasan
masalah,
metodologi,
dan
sistematika
5
BAB II
:
LANDASAN TEORI Dalam bab ini penulis menguraikan teori-teori yang digunakan penulis untuk mengatasi permasalahan yang ada mencakup malware, mengenal Trojan, antivirus,
model sekuensial linier, dan UML
(Unified Modelling Language). BAB III :
ANALISIS DAN PERANCANGAN Bab ini berisi mengenai hal-hal yang berhubungan dengan, analisis kebutuhan sistem, rancangan proses implementasi, dan perancangan antarmuka.
BAB IV : IMPLEMENTASI DAN PENGUJIAN Bab ini meliputi hal-hal yang berhubungan dengan kode program dan hal-hal yang berhubungan dengan pengujian aplikasi. BAB V
:
PENUTUP Dalam bab ini penulis mencoba mengambil kesimpulan berdasarkan analisis-analisis
yang
dilakukan
pengembangan lebih lanjut.
serta
saran-saran
untuk
BAB II LANDASAN TEORI
2.1 Model-model Proses Perangkat Lunak Model proses untuk rekayasa perangkat lunak dipilih berdasarkan sifat aplikasi dan proyeknya, metode dan alat-alat bantu yang dipakai, dan kendali serta penyampaian yang dibutuhkan. Model yang dipergunakan dalam karya tulis ini adalah model sekuensial linier. Model sekuensial linier untuk rekayasa perangkat lunak, atau sering disebut juga dengan ”siklus kehidupan klasik” atau ”model air terjun” model sekuensial linier mengusulkan sebuah pendekatan kepada perkembangan perangkat lunak yang sistematik yang mulai pada tingkat dan kemajuan sistem pada seluruh analisis, desain, pengujian dan pemeliharaan, menurut Roger S. Pressman (2002:37-38) model sekuensial linier melingkupi aktifitas-aktifitas sebagai berikut: 1. Rekayasa dan pemodelan sistem/informasi Pada tahapan ini dilakukan proses pengumpulan kebutuhan pengguna pada tingkatan sistem dengan sejumlah kecil analisa serta desain tingkat puncak. 2. Analisis kebutuhan perangkat lunak Proses pengumpulan kebutuhan diintensifkan dan difokuskan khususnya pada perangkat lunak. Untuk memahami perangkat lunak yang dibangun, perekayasa perangkat lunak harus memahami domain informasi, tingkah laku, unjuk kerja, dan antarmuka yang diperlukan. 6
7
3. Desain Proses multi langkah yang berfokus pada empat atribut program yang berbeda: struktur data, arsitek perangkat lunak, representasi antarmuka, dan detail prosedural. Proses desain menerjemahkan kebutuhan ke dalam representasi
perangkat lunak yang
sebuah
dapat diperkirakan demi kualitas
sebelum dimulai pemunculan kode. Sebagaimana persyaratan, desain didokumentasikan dan menjadi bagian dari konfigurasi perangkat lunak. 4. Generasi kode Desain harus diterjemahkan ke dalam bentuk mesin yang bisa dibaca. Artinya dilakukan pengkodean (coding) berdasarkan desain yang telah di buat. 5. Pengujian Setelah kode di buat, pengujian program di mulai. Proses pengujian berfokus pada logika internal perangkat lunak, memastikan bahwa semua pernyataan sudah diuji dan pada eksternal fungsional yaitu mengarahkan pengujian untuk menemukan kesalahan-kesalahan dan memastikan bahwa masukan yang dibatasi akan memberikan hasil aktual yang sesuai dengan hasil yang dibutuhkan. 6. Pemeliharaan Perangkat lunak akan mengalami perubahan setelah disampaikan kepada pelanggan. Perubahan akan terjadi karena kesalahan-kesalahan ditentukan, karena perangkat lunak harus disesuaikan untuk mengakomodasi perubahanperubahan di dalam lingkungan eksternalnya. Pemeliharaan perangkat lunak mengaplikasikan lagi setiap tahap program sebelumnya dan tidak membuat.
8
Untuk lebih jelasnya lagi bisa dilihat pada Gambar 2.1.
Pemodelan sistem analisis
desain
kode
tes
Gambar 2.1 Model Sekuensial Linier
2.2 Unified Modelling Language (UML) Menurut Munawar (2005:17) UML adalah bahasa pemodelan standar pada rekayasa perangkat lunak. UML adalah salah satu alat bantu yang sangat handal di dunia pengembangan sistem yang berorientasi objek. Hal ini disebabkan karena UML menyediakan bahasa pemodelan visual yang memungkinkan bagi pengembang sistem untuk membuat cetak biru atas visi mereka dalam bentuk yang baku, mudah dimengerti serta dilengkapi dengan mekanisme yang efektif untuk berbagi (sharing) dan mengkomunikasikan rancangan mereka dengan yang lain. Di proyek pengembangan sistem apapun, fokus utama dalam analisis dan perancangan adalah model dan diagram. Model menggambarkan pandangan yang lengkap tentang suatu sistem pada suatu tahapan tertentu dan dari perspektif tertentu. Sedangkan diagram menggambarkan atau mendokumentasikan beberapa aspek dari sebuah sistem. Sebuah model mungkin mengandung satu atau lebih
9
diagram. untuk model sederhana, satu diagram mungkin akan mencukupi. Akan tetapi biasanya sebuah model terdiri dari banyak diagram. Tabel 2.1 menampilkan beberapa tipe diagram UML versi 2. Tabel 2.1. Jenis diagram resmi UML versi 2. No.
Diagram
Kegunaan
1.
Activity
Perilaku prosedural dan paralel
2.
Class
Class, fitur, dan hubungan‐hubungan
3.
Communication
Interaksi antar objek; penekanan pada jalur
4.
Component
Struktur dan koneksi dari komponen
5.
Composite structure
Dekomposisi runtime sebuah class
6.
Deployment
Penyebaran atau instalasi ke klien
7.
Interaction overview
Gabungan sequence dan activity diagram
8.
Object
Contoh konfigurasi dari contoh‐contoh
9.
Package
Struktur hirarki saat kompilasi
10. Sequence
Interaksi antar objek. Lebih menekankan pada urutan
11. State machine
Bagaimana even mengubah objek selama aktif
12. Timing
Interaksi antar objek; penekanan pada waktu
13. Use case
Bagaimana pengguna berinteraksi dengan sebuah sistem
2.2.1 Diagram Use Case
10
Menurut Munawar (2005:63) use case adalah deskripsi fungsi dari sebuah sistem dari perspektif pengguna. Use case bekerja dengan cara mendeskripsikan tipikal interaksi antara pengguna sebuah sistem dengan sistemnya sendiri melalui sebuah cerita bagaimana sebuah sistem dipakai. Urutan langkah-langkah yang menerangkan antara pengguna dan sistem disebut skenario. Setiap skenario mendeskripsikan urutan kejadian. Setiap urutan diinisialisasi oleh orang, sistem yang lain, perangkat keras atau urutan waktu. Dengan demikian secara singkat bisa dikatakan use case adalah serangkaian skenario yang digabungkan bersamasama oleh tujuan umum pengguna. Dalam pembicaraan tentang use case, pengguna biasanya disebut dengan aktor. Aktor adalah sebuah peran yang bisa dimainkan oleh pengguna dalam interaksinya dengan sistem. Aktor mewakili peran orang, sistem yang lain, atau alat ketika berkomunikasi dengan use case. Di dalam use case terdapat Stereotype yaitu sebuah model khusus yang terbatas untuk kondisi tertentu. Untuk menunjukkan Stereotype digunakan simbol ”<<” diawalnya dan ditutup ”>>” diakhirnya. <
> digunakan untuk menggambarkan bahwa suatu use case seluruhnya
merupakan
fungsionalitas
dari
use
case
lainnya.
Biasanya
<> digunakan untuk menghindari penggandaan suatu use case karena sering dipakai. <<extend>> digunakan untuk menunjukkan bahwa suatu use case merupakan tambahan fungsional dari use case yang lain jika kondisi atau syarat tertentu dipenuhi. Di dalam use case juga terdapat generalisasi. Generalisasi diantara aktor adalah spesialisasi aktor yang bisa berpartisipasi di semua use case yang
11
diasosiasikan dengan aktor yang lebih umum. Tabel 2.2 menampilkan notasinotasi dalam pemodelan diagram use case menurut Booch, Rumbaugh, dan Jacobson (1998:187). Tabel 2.2. Notasi pemodelan diagram use case No.
Notasi
Keterangan
1
Aktor
2
Use Case
3
Batas sistem (system boundary)
4
Garis penghubung (pengendali arah) Gabungan (association)
5
6
Generalisasi (generalization)
7
Realisasi (realization)
Tabel 2.2. (Lanjutan)Notasi pemodelan diagram use case 8
Stereotype penyertaan (include)
12
<< include >>
9
<< extend >>
Stereotype perluasan (extend)
Menurut Munawar (2005:179) setiap use case harus dideskripsikan dalam dokumen yang disebut dengan dokumen aliran kejadian (flow of event). Dokumen ini mendefinisikan apa yang harus dilakukan oleh sistem ketika aktor mengaktifkan use case. Struktur dari dokumen use case ini bisa macam-macam, tetapi umumnya deskripsi ini paling tidak harus mengandung: 1. Deskripsi singkat (brief description). 2. Aktor yang terlibat. 3. Kondisi awal (precondition) yang penting bagi use case untuk memulai. 4. Deskripsi rinci dari aliran kejadian yang mencakup: a. Aliran utama (main flow) dari kejadian yang bisa dirinci lagi. b. Aliran bagian (sub flow) dari kejadian. c. Aliran alternatif untuk mendefinisikan situasi perkecualian. 5. Kondisi akhir yang menjelaskan state dari sistem setelah use case berakhir. Dokumen use case ini berkembang selama masa pengembangan. Di awalawal penentuan kebutuhan sistem, hanya deskripsi singkat saja yang ditulis. Bagian-bagian lain dari dokumen ini ditulis secara gradual dan iteratif. Akhirnya
13
sebuah dokumen lengkap bisa didapatkan di akhir fase spesifikasi. Biasanya pada fase spesifikasi ini sebuah prototipe yang dilengkapi dengan tampilan layar bisa ditambahkan. Pada tahap berikutnya, dokumen use case ini bisa digunakan untuk membuat dokumentasi untuk implementasi sistem.
2.2.2 Diagram Sekuensial Menurut Munawar (2005:87) diagram sekuensial digunakan untuk menggambarkan perilaku pada sebuah skenario. Diagram ini menunjukkan sejumlah contoh objek dan pesan yang diletakkan diantara objek-objek ini di dalam use case. Komponen utama diagram sekuensial terdiri atas objek atau disebut juga peserta (participant) yang dituliskan dengan kotak segi empat bernama, pesan diwakili oleh garis dengan tanda panah dan waktu yang ditunjukkan dengan garis tegak lurus. Setiap obyek terhubung dengan garis titik-titik yang disebut garis hidup (lifeline). Sepanjang garis hidup terdapat kotak yang disebut penggerakan (activation). Tabel 2.3 memperlihatkan notasi-notasi dalam pemodelan diagram sekuensial. Tabel 2.3. Notasi pemodelan diagram sekuensial No. 1
Notasi
Keterangan Aktor
14
2
Obyek Nama obyek
3
Batas (boundary)
4
Kendali (control)
5
Entitas (entity)
6
Penggerakan (activation)
7
Garis hidup (lifeline)
8
Pesan selaras (Synchronous message)
9
Pesan tidak selaras (Asynchronous message)
10
Pesan kembali yang tidak selaras (asynchronous return message)
11
Pesan rekursif (self message)
12
Pesan hilang (lost message)
Tabel 2.3 (Lanjutan) Notasi pemodelan diagram sekuensial 13
Pesan ditemukan (found message)
15
New 14
Pesan pembuatan obyek baru
15
Pesan penghapusan obyek
2.2.3 Diagram Aktifitas
Menurut Munawar (2005:109) diagram aktifitas adalah teknik untuk mendeskripsikan logika prosedural, proses bisnis dan aliran kerja dalam banyak kasus. Diagram aktifitas mempunyai peran seperti halnya diagram alur (flowchart), akan tetapi perbedaannya dengan flowchart adalah diagram aktifitas bisa mendukung perilaku paralel sedangkan flowchart tidak bisa. Berikut pada Tabel 2.4 adalah simbol-simbol yang sering digunakan pada saat pembuatan diagram aktifitas. Tabel 2.4. Simbol-simbol pada diagram aktifitas No
Simbol
Keterangan
1
Titik awal
2
Titik akhir
3
Activity
4
Pilihan untuk pengambilan keputusan
Tabel 2.4 (Lanjutan) Simbol-simbol pada diagram aktifitas 5
Fork : digunakan untuk menunjukkan kegiatan yang dilakukan secara paralel atau untuk menggabungkan dua kegiatan paralel menjadi satu
16
6
Rake : menunjukkan adanya dekomposisi
7
Tanda waktu
8
Tanda pengiriman
9
Tanda penerimaan
10
Aliran akhir (flow final)
2.2.4 Diagram Kelas
Menurut Martin Fowler (2005:53) diagram kelas mendeskripsikan jenis – jenis objek dalam sistem dan berbagai macam hubungan statis yang terdapat di antara mereka. Diagram kelas juga menunjukan properti dan operasi sebuah kelas dan batasan – batasan yang terdapat dalam hubungan – hubungan objek tersebut. Diagram kelas juga menggambarkan struktur dan deskripsi kelas, package dan objek beserta hubungan satu sama lain seperti generalization, realization, association, dan agregation. Dimana generalization adalah hubungan superclass dengan subclass atau parent dengan child, realization adalah dimana sebuah class harus mengikuti aturan class lainnya, association adalah hubungan structural antar class dan aggregation adalah hubungan antar class, dimana class yang satu adalah bagian dari class yang lainnya. Berikut pada Gambar 2.2 adalah contoh diagram kelas beserta sintaksnya.
17
Gambar 2.3 Class diagram dan sintaksnya
2.3 Malware (Malicious Software) Perkembangan teknologi yang pesat, ternyata tidak hanya membawa manfaat yang besar bagi penggunanya tetapi juga menimbulkan dampak negatif dengan dibuatnya kode program berbahaya. Program-program berbahaya itu sering disebut juga dengan malicious code atau malicious software (malware). Menurut Bambang Hariyanto (1999:292) Ancaman-ancaman terhadap sistem komputer adalah program yang mengeksploitasi kelemahan sistem komputasi. Bowles memberikan taksonomi ancaman perangkat lunak atau klasifikasi program jahat (malicious program). Gambar 2.3 menunjukkan taksonomi yang diberikan oleh Bowles. Ancaman-ancaman itu dapat dibagi menjadi dua kategori, yaitu: 1. Program-program yang memerlukan program inang (host program). Fragmen program tidak dapat mandiri secara independen dari suatu program aplikasi, program utilitas atau program sistem.
18
2. Program-program yang tidak memerlukan program inang. Program sendiri yang dapat dijadwalkan dan dijalankan oleh sistem operasi.
Malware
Perlu program Inang
Independen
Bacteria Virus
Trapdoor
Trojan Horse
Worm
Logic Bombs
Gambar 2.3 Taksonomi program-program jahat
2.4 Trojan Menurut Happy Chandraleka (2004:79) Trojan di dalam sistem komputer adalah suatu program yang tidak diharapkan dan disisipkan tanpa sepengetahuan pemilik komputer. Program ini kemudian dapat diaktifkan dan dikendalikan dari jarak jauh, atau dengan menggunakan pewaktu (timer). Akibatnya, komputer yang disisipi Trojan Horse tersebut dapat dikendalikan dari jarak jauh. Trojan bersembunyi di latar belakang dengan cara membuka port tertentu dan menunggu diaktifkan oleh penyerang. Komputer yang telah terinfeksi dapat dikendalikan oleh penyerang melalui versi client-nya. Cara kerja Trojan mirip dengan remote administration tool, dengan sifat dan fungsi yang sama. Program remote administration misalnya pcAnywhere, digunakan untuk keperluan yang benar dan sah (legitimate), sedangkan Trojan digunakan untuk keperluan yang negatif.
19
Menurut Eryanto Sitorus (2004:156) jika sebuah komputer terinfeksi oleh Trojan dan telah dikendalikan oleh penyerangnya, maka beberapa kemungkinan dapat terjadi. Sebagai contoh, sebuah Trojan dengan nama NetBus dapat melakukan banyak hal ke komputer yang telah dikendalikan antara lain: 1. Menghapus file 2. Mengirim dan mengambil file 3. Menjalankan program-program aplikasi 4. Menampilkan gambar 5. Mengintip program-program yang sedang dijalankan 6. Menutup program-program yang dijalankan 7. Melihat apa saja yang diketik 8. Membuka dan menutup CD-ROM drive 9. Mengirim pesan dan mengajak untuk bicara (caht) 10. Mematikan komputer Contoh diatas adalah hanya sebagian yang dapat dikerjakan oleh sebuah Trojan. Trojan lain kemungkian mempunyai fungsi yang berbeda bahkan mungkin lebih berbahaya dan lebih susah dideteksi.
2.4.1 Struktur Trojan Lima komponen yang umum dimiliki oleh trojan adalah sebagai berikut:
1. Reconnaissance Komponen trojan ini bertugas untuk merintis jalannya penyebaran pada
20
jaringan. Komponen ini memastikan tempat (node) mana saja pada jaringan yang dapat diinfeksi olehnya, contohnya node ini bisa berada di hardisk, folder dan file. 2. Menyerang (Attack) Komponen ini bertugas untuk melancarkan serangan pada target node yang telah teridentifikasi. 3. Hubungan (Communications) Komponen ini membuat tiap node yang terinfeksi pada jaringan dapat saling berkomunikasi. Komponen memberikan semacam antar muka (interface) agar tiap trojan pada jaringan dapat saling mengirim pesan. 4. Perintah (Command) Komponen ini menjadi semacam pemicu apabila target sudah teridentifikasi. Komponen ini merupakan suatu antar muka agar setiap trojan dapat mengeluarkan perintah (command) pada trojan di titik lain lain. 5. Kecerdasan (Intelligence) Komponen ini merupakan komponen cerdas yang mampu memberikan informasi bagaimana karakteristik keadaan trojan di titik lain pada jaringan. Gambar 2.4 menggambarkan bagaimana komponen reconnaissance mencari informasi tentang karakteristik node yang akan di infeksi, jika komponen tersebut sudah mendapatkan semua informasi tentang karakteristik node yang akan di infeksi maka komponen reconnaissance bisa langsung melakukan serangan melalui komponen attack. Jika komponen reconnaissance belum mendapatkan informasi, maka komponen reconnaissance harus melalui komponen intelligence
21
dimana komponen tersebut akan memberikan informasi karakteristik keadaan trojan di titik lain pada jaringan supaya file trojan tersebut bisa saling berkomunikasi melalui komponen communication dan bisa langsung melakukan serangan atau menggunakan perintah command untuk melakukan serangan melalui komponen attack.
Gambar 2.4 Gambaran proses umum komponen Trojan
2.4.2
Cara Kerja Trojan Trojan masuk melalui dua bagian, yaitu bagian client dan server. Ketika
korban (tanpa diketahui) menjalankan komputer, kemudian penyerang akan mengunakan client untuk koneksi dengan server dan mulai menggunakan Trojan. Protokol TCP/IP adalah jenis protokol yang umum digunakan untuk komunikasi. Trojan dapat bekerja dengan baik dengan jenis protokol ini, tetapi beberapa Trojan juga dapat menggunakan protokol UDP dengan baik. Ketika server mulai dijalankan (pada komputer korban), Trojan umumnya mencoba untuk
22
menyembunyikan diri di suatu tempat dalam sistem komputer tersebut, kemudian mulai ”mendengarkan” di beberapa port untuk melakukan koneksi, memodifikasi registry dan atau menggunakan metode lain yaitu metode autostrating. Hal yang penting untuk diketahui oleh penyerang adalah mengetahui IP address korban untuk menghubungkan komputernya ke komputer korban. Banyak varian Trojan mempunyai kemampuan mengirimkan IP address korban ke penyerangnya, misalnya media ICQ maupun IRC. Hal ini digunakan bagi korban yang mempunyai IP address dinamis, yang berarti setiap kali menghubungkan ke Internet didapatkan IP address yang berbeda. Untuk pemakai yang memanfaatkan Asymmetric Digital Suscriber Line (ADSL) berarti selalu memakai IP address yang tetap (statis) sehingga mudah diketahui dan mudah untuk dikoneksikan dengan komputer penyerang. Menurut
Happy
Chandraleka
(2004:82)
sebagian
besar
Trojan
menggunakan metode auto-starting, yaitu Trojan akan secara otomatis aktif saat komputer dihidupkan. Walaupun komputer dimatikan dan kemudian dihidupkan lagi, Trojan mampu bekerja kembali dan penyerang mengakses kembali ke komputer korban. Metode baru auto-starting dan trik lain telah ditemukan sejak semula. Jenis Trojan ini bekerja mulai dari koneksi trojan ke dalam beberapa file executable yang sering digunakan misalnya explorer.exe dan kemudian memodifikasi file sistem atau Windows Registry. File sistem ditempatkan di direktori Windows. Dari direktori ini penyerang melaksanakan penyerangan atau penyalahgunaan. Penyalahgunaan penyerang melewati file sistem adalah sebagai berikut.
23
1. Autostart Folder. Autostart folder berada di lokasi
C:\Windows\Start Menu\Programs\Startup
dan sesuai dengan namanya akan bekerja secara otomatis bagian file sistem yang ditempatkan di folder tersebut. 2. Win.Ini. File sistem Windows menggunakan load=trojan.exe dan run=trojan.exe untuk menjalankan Trojan. 3. System.Ini. Menggunakan shell=explorer.exe trojan.exe. Hal ini diakibatkan oleh eksekusi setiap file setelah menjalankan explorer.exe. 4. Wininit.Ini. Sebagian besar setup program menggunakan file ini. Sekali dijalankan maka menjadi auto-delete, akibatnya Trojan sangat cekatan atau cepat untuk bekerja kembali. 5. Winstart.Bat. Bertindak seperti batch file yang normal, ketika ditambahkan@ trojan.exe mampu menyembunyikan korbannya. 6. Autoexec.Bat. Autoexec.Bat adalah file auto-starting Disk Operating System (DOS). File tersebut digunakan sebagai metode auto-starting, yaitu dengan memasang c:\trojan.exe. 7. Config.Sys.
24
Config.Sys juga dapat digunakan sebagai suatu metode auto-starting untuk Trojan. 8. Explorer Startup. Explorer Startup adalah suatu metode auto-starting untuk Windows95, 98, ME dan jika c:\explorer.exe ada, hal itu akan dimulai maka akan menggantikan yang umum, yaitu c:\Windows\Explorer.exe. Menurut David Sugianto (2002:16) registry sering digunakan dalam berbagai metode auto-starting. Registry sebagai jalan untuk auto-starting yang diketahui antara lain: 1. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] "Info"="c:\directory\Trojan.exe"
2. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnc e] "Info"="c:\directory\Trojan.exe"
3. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunSer vices] "Info"="c:\directory\Trojan.exe"
4. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunSer vicesOnce] "Info="c:\directory\Trojan.exe"
5. [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] "Info"="c:\directory\Trojan.exe"
6. [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run Once] "Info"="c:\directory\Trojan.exe"
7. Registry Shell Open [HKEY_CLASSES_ROOT\exefile\shell\open\command] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\shell\open\command]
Suatu kunci dengan nilai "% 1%*" harus ditempatkan disana dan jika terdapat beberapa file yang executable. Setiap kali file dieksekusi maka akan membuka
25
suatu binary file. Jika di registry ini terdapat trojan.exe "% 1%*", maka akan digunakan sebagai auto-starting untuk Trojan. 8. Metode Deteksi ICQ Net [HKEY_CURRENT_USER\Software\Mirabilis\ICQ\Agent\Apps\]
Kunci dari metode ini adalah semua file akan dieksekusi jika ICQ mendeteksi koneksi Internet. Perlu diketahui, bahwa cara kerja dari ICQ adalah sangat mudah dan sering digunakan pemakai, sehingga ICQ dimanfaatkan oleh penyerang medianya. 9. ActiveX Component [HKEY_LOCAL_MACHINE\Software\Microsoft\ActiveSetup\InstalledComponents\ KeyName] StubPath=C:\directory\Trojan.exe
2.5 Jenis-jenis Trojan Trojan seperti halnya virus, mempunyai jumlah yang cukup banyak dan berkembang seiring dengan berjalannya waktu. Menurut Happy Chandraleka (2004:184) terdapat kurang lebih 650 buah Trojan yang telah beredar saat ini. Pendapat lain mengatakan bahwa di tahun 2002 sudah terdapat sekitar 800 buah Trojan (David Sugianto:2002:18). Jumlah tersebut adalah jumlah yang diketahui atau terdeteksi keberadaannya, sedangkan yang tidak terdeteksi tidak diketahui jumlahnya. Dari berbagai macam Trojan yang telah beredar dan menginfeksi pemakai Internet, dapat diklasifikasikan berdasarkan ciri-cirinya. Menurut David Sugianto (2004:19), Trojan dapat diklasifikasikan menjadi delapan jenis, antara lain sebagai berikut:
26
2.5.1 Trojan Remote Access Trojan Remote Access termasuk Trojan paling populer saat ini. Banyak penyerang menggunakan Trojan ini dengan alasan fungsi yang banyak dan sangat mudah
dalam
penggunaannya.
Prosesnya
adalah
menunggu
seseorang
menjalankan Trojan yang berfungsi sebagai server dan jika penyerang telah memiliki IP address korban, maka penyerang dapat mengendalikan secara penuh komputer korban. Contoh jenis Trojan ini adalah Back Orifice (BO), yang terdiri dari BOSERVE.EXE yang dijalankan dikomputer korban dan BOGUI.EXE yang dijalankan oleh penyerang untuk mengakses komputer korban.
2.5.2 Trojan Pengirim Password Tujuan dari Trojan jenis ini adalah mengirimkan password yang berada di komputer korban atau di Internet ke suatu e-mail khusus yang telah disiapkan. Contoh password yang disadap misalnya untuk ICQ, IRC, FTP, HTTP atau aplikasi lain yang memerlukan seorang pemakai untuk masuk suatu login dan password. Kebanyakan Trojan ini menggunakan port 25 untuk mengirimkan email. Jenis ini sangat berbahaya jika dalam komputer terdapat password yang sangat penting.
2.5.3 Trojan File Transfer Protocol (FTP)
27
Trojan FTP adalah paling sederhana dan dianggap ketinggalan jaman. Satusatunya fungsi yang dijalankan adalah membuka port 21 di komputer korban yang menyebabkan mempermudah seseorang memiliki FTP client untuk memasuki komputer korban tanpa password serta melakukan download atau upload file.
2.5.4 Keyloggers Keyloggers termasuk dalam jenis Trojan yang sederhana, dengan fungsi merekam atau mencatat ketukan tombol saat korban melakukan pengetikan dan menyimpannya dalam logfile. Apabila diantara ketukan tersebut adalah mengisi user name dan password, maka keduanya dapat diperoleh penyerang dengan membaca logfile. Trojan ini dapat dijalankan pada saat komputer online maupun offline. Trojan ini dapat mengetahui korban sedang online dan merekam segala sesuatunya. Pada saat offline proses perekaman dilakukan setelah Windows dijalankan dan disimpan dalam hardisk korban dan menunggu saat online untuk melakukan transfer atau diambil oleh penyerang.
2.5.5 Trojan Penghancur Satu-satunya fungsi dari jenis ini adalah untuk menghancurkan dan menghapus file. Trojan penghancur termasuk jenis yang sederhana dan mudah digunakan, namun sangat berbahaya. Sekali terinfeksi dan tidak dapat melakukan penyelamatan maka sebagian atau bahkan semua file sistem akan hilang. Trojan ini secara otomatis menghapus semua file sistem pada komputer korban (sebagai
28
contoh : *.dll, *.ini atau *.exe). Trojan diaktifkan oleh penyerang atau bekerja seperti sebuah logic bomb dan mulai bekerja dengan waktu yang ditentukan oleh penyerang.
2.5.6 Trojan Denial of Service (DoS) Attack Trojan DoS Attack saat ini termasuk yang sangat populer. Trojan ini mempunyai kemampuan untuk menjalankan Distributed DoS (DDoS) jika mempunyai korban yang cukup. Gagasan utamanya adalah bahwa jika penyerang mempunyai 200 korban pemakai ADSL yang telah terinfeksi, kemudian mulai menyerang korban secara serempak. Hasilnya adalah lalu lintas data yang sangat padat karena permintaan yang bertubi-tubi dan melebihi kapasitas band width korban. Hal tersebut menyebabkan akses Internet menjadi tertutup. Wintrinoo adalah suatu tool DDoS yang populer baru-baru ini, dan jika penyerang telah menginfeksi pemakai ADSL, maka beberapa situs utama Internet akan collaps. Variasi yang lain dari sebuah trojan DoS adalah trojan mail-bomb, tujuan utamanya adalah untuk menginfeksi sebanyak mungkin komputer dan melakukan penyerangan secara serempak ke alamat e-mail yang spesifik maupun alamat lain yang spesifik dengan target yang acak dan muatan/isi yang tidak dapat disaring.
2.5.7 Trojan Proxy/Wingate Bentuk dan corak yang menarik diterapkan oleh pembuat trojan untuk mengelabui korban dengan memanfaatkan suatu Proxy/Wingate server yang disediakan untuk seluruh dunia atau hanya untuk penyerang saja. Trojan
29
Proxy/Wingate digunakan pada Telnet yang tanpa nama, ICQ, IRC, dan untuk mendaftarkan domain dengan nomor kartu kredit yang telah dicuri serta untuk aktivitas lain yang tidak sah. Trojan ini melengkapi penyerang dengan keadaan tanpa nama dan memberikan kesempatan untuk berbuat segalanya terhadap komputer korban dan jejak yang tidak dapat ditelusuri.
2.5.8 Software Detection Killers Beberapa Trojan telah dilengkapi dengan kemampuan melumpuhkan fungsi software pendeteksi, tetapi ada juga program yang berdiri sendiri dengan fungsi yang sama. Contoh software pendeteksi yang dapat dilumpuhkan fungsinya adalah Zone Alarm, Norton Anti-Virus dan program anti-virus/firewall yang lain berfungsi melindungi komputer. Ketika software pendeteksi dilumpuhkan, penyerang akan mempunyai akses penuh ke komputer korban, melaksanakan beberapa aktivitas yang tidak sah, menggunakan komputer korban untuk menyerang komputer yang lain.
2.6 Sumber-sumber Trojan Banyak pemakai komputer/Internet yang mempunyai sedikit pengetahuan tentang asal muasal sebuah Trojan, mereka beranggapan bahwa sumber Trojan hanya dari proses download dan menjalankan server.exe. Menurut David Sugianto (2002:40) sebenarnya banyak jalan atau sumber Trojan untuk menginfeksi komputer seseorang yang berawal dari menggunakan Trojan untuk aktivitas yang tidak sah. Komputer korban dapat disusupi Trojan dengan berbagai macam cara
30
atau berasal dari sumber-sumber tertentu. Sumber-sumber tersebut adalah sebagai berikut.
2.6.1 ICQ ICQ adalah media komunikasi yang populer, namun sebenarnya merupakan media yang sangat mungkin mengakibatkan seseorang terkena Trojan, terutama sewaktu
seseorang
mengirimkan
file.
Terdapat
bug
pada
ICQ
yang
memungkinkan seseorang mengirimkan file *.exe ke orang lain, namun file tersebut akan seperti file *.bmp atau *.jpg atau jenis file lain sesuai keinginan. Hal ini sangat berbahaya, pengirim dapat mengirimkan file *.exe tetapi dengan bentuk *.jpg atau *.bmp dan mengatakan bahwa ini foto si pengirim. Penerima akan menerima file tersebut dan menjalankannya dengan rasa aman, karena file yang diterima berupa file gambar. Jika pengirim adalah seorang penyerang, maka dengan mudah menyusupkan file Trojan ke dalam komputer penerima (korban). Hal inilah yang menyebabkan orang ragu menggunakan ICQ.
2.6.2 IRC Media yang digemari banyak orang adalah chatting menggunakan IRC. Seperti halnya ICQ, IRC media penyebaran Trojan yang efektif. Cara yang digunakan juga hampir sama dengan ICQ, yaitu dengan cara mengirimkan file-file tertentu yang menarik bagi pemakai IRC dan di dalam file tersebut telah disisipkan program Trojan. Tawaran dari pengirim yang sekaligus sebagai penyerang misalnya dengan hal-hal yang bersifat pornografi, software untuk
31
melakukan akses Internet secara bebas, hacking program Hotmail dan sebagainya. Target utama penyerang biasanya adalah pemakai baru Internet (newbies) maupun pemakai lama tetapi belum mengetahui tentang keamanan dalam berinternet.
2.6.3 Attachment Attachment dalam e-mail juga merupakan media penyebaran Trojan. Banyak penyerang menggunakan media attachment, karena media ini adalah salah satu media yang efektif untuk menyerang korban secara massal dengan cara mengirimkan e-mail. Attachment yang dikirimkan berisi hal-hal yang menarik misalnya pornografi, layanan bebas berinternet, password dan sebagainya. Selain dengan cara tersebut, penyerang juga menggunakan cara lain yaitu dengan menyadap e-mail address dan attachment dari seseorang yang sedang mengirimkan e-mail ke temannya. Setelah disadap oleh penyerang, attachment disisipi program Trojan dan kemudian dikirimkan ke target e-mail. Penerima e-mail akan merasakan bahwa e-mail yang dikirimkan berasal dari temannya dan tanpa ragu-ragu membuka attachment yang telah disisipi Trojan.
2.6.4 Physical Access Akses fisik dalam komputer adalah hal yang sangat vital. Media akses fisik adalah dengan disket, Compact Disc (CD) maupun flash ROM. Dengan media tersebut, Trojan dapat menyusup ke dalam komputer dan dapat mengaktifkan dirinya ketika terkoneksi dengan Internet. Caranya adalah dengan menyebar melalui komputer yang telah terinfeksi, kemudian komputer digunakan untuk
32
meng-copy file ke dalam media. Selanjutnya file yang berada dalam media dicopykan lagi ke komputer lain, sehingga komputer tersebut juga terinfeksi. Cara lainnya adalah dengan memanfaatkan fasilitas autorun dalam fungsi pembacaan CD. Saat CD dimasukkan ke CDROM drive, secara otomatis akan membaca fasilitas autorun yang berada dalam Autorun.inf dalam CD, yaitu : [autorun] open=setup.exe icon=setup.exe
Jika sebuah CD dengan fasilitas autorun dan telah disisipi program Trojan, maka sangat mudah bagi penyerang untuk menyusupkan Trojan ke dalam komputer orang lain.
2.6.5 Lubang Software Browser dan E-mail Dalam penggunaan software aplikasi untuk browser dan e-mail, seringkali pemakai tidak memperhatikan masalah update software. Pemakai enggan memperbaharui versi softwarenya padahal mereka seharusnya melakukan update setiap saat. Hal ini membawa keuntungan bagi penyerang karena pemakaian software versi lama lebih mudah untuk disusupi. Software versi lama tentunya mempunyai banyak kelemahan atau bug jika dibandingkan dengan versi barunya. Misalnya kasus pemakaian software versi lama Internet Explorer yang digunakan untuk mengunjungi sebuah situs malicious, kemudian secara otomatis menginfeksi komputer tanpa melakukan proses download atau menjalankan program apapun. Situs malicious tersebut akan memeriksa secara otomatis software yang digunakan dan mencari kelemahannya.
33
Hal yang sama juga terjadi dalam pemakaian software untuk memeriksa email misal pemakaian Outlook Express versi lama. Oleh karena itu, update software atau menggunakan software versi terbaru perlu dilakukan. Hal ini dapat menekan atau meminimalkan kemungkinan terinfeksinya komputer yang melewati software browser dan e-mail.
2.6.6 Netbios (File Sharing) File sharing dapat dilakukan dengan cara membuka port 139 . Jika port tersebut terbuka dan diketahui oleh penyerang, maka dapat digunakan sebagai jalan untuk menyusupkan Trojan. Caranya adalah dengan meng-install trojan.exe dan memodifikasi file sistem di komputer korban. Trojan yang telah disisipkan akan aktif setiap kali komputer dihidupkan. Kadang-kadang penyerang juga melengkapi dengan DoS yang digunakan melumpuhkan kerja komputer. Komputer dipaksa untuk booting ulang, sehingga Trojan dapat mengaktifkan sendiri bersama proses booting.
2.7 Antivirus Menurut Bambang Hariyanto (1999:297) solusi ideal terhadap ancaman virus, worm atau malware lainnya adalah pencegahan. Jangan ijinkan virus masuk ke sistem. Sasaran ini tak mungkin dilaksanakan sepenuhnya. Pencegahan dapat mereduksi sejumlah serangan virus. Setelah pencegahan terhadap masuknya virus, maka pendekatan berikutnya yang dapat dilakukan adalah: 1. Deteksi
34
Begitu infeksi telah terjadi, tentukan apakah infeksi memang telah terjadi dan cari lokasi virus. 2. Identifikasi Begitu virus terdeteksi maka identifikasi virus yang menginfeksi program. 3. Penghilangan Begitu virus dapat diidentifikasi maka hilangkan semua jejak virus dari program yang terinfeksi dan program dikembalikan ke semula (sebelum terinfeksi). Jika deteksi sukses dilakukan, tapi identifikasi atau penghilangan tidak dapat dilakukan maka alternatif yang dilakukan adalah hapus program yang terinfeksi dan kopi kembali (backup) program yang masih bersih. Sebagaimana virus berkembang dari yang sederhana menjadi semakin canggih, begitu juga paket perangkat lunak antivirus. Saat ini program antivirus semakin kompleks dan canggih. Perkembangan program antivirus dapat diperiode menjadi empat generasi, yaitu: 1. Generasi pertama: sekedar scanner sederhana. Antivirus men-scan program untuk menemukan penanda (signature) virus. Walaupun virus mungkin berisi ”karakter-karakter varian” tapi secara esensi mempunyai struktur dan pola bit yang sama di semua kopiannya. Teknik ini terbatas untuk deteksi virus-virus yang sudah dikenal. Tipe lain antivirus generasi pertama adalah mengelola rekaman panjang (ukuran) program dan memeriksa perubahan panjang program. 2. Generasi kedua: scanner yang pintar (heuristic scanner).
35
Antivirus men-scan tidak bergantung pada penanda spesifik. Antivirus menggunakan
aturan-aturan
pintar
(heuristic
rules)
untuk
mencari
kemungkinan infeksi virus. Teknik yang dipakai misalnya mencari fragmenfragmen kode yang sering merupakan bagian virus. Contohnya, antivirus mencari awal loop enkripsi yang digunakan polymorphic virus dan menemukan kunci enkripsi. Begitu kunci ditemukan, antivirus dapat mendekripsi virus untuk identifikasi dan kemudian menghilangkan infeksi virus. Teknik lain adalah pemeriksaan integritas. Checksum dapat ditambahkan di tiap program. Jika virus menginfeksi program tanpa mengubah checksum, maka pemeriksaan integritas akan menemukan perubahan itu. Untuk menanggulangi virus canggih yang mampu mengubah checksum saat menginfeksi program, fungsi hash ter-enkripsi digunakan. Kunci enkripsi disimpan secara terpisah dari program sehingga program tidak dapat menghasilkan kode hash baru dan meng-enkripsinya. Dengan menggunakan fungsi hash bukan checksum sederhana maka mencegah virus menyesuaikan program yang menghasilkan kode hash yang sama seperti sebelumnya. 3. Generasi ketiga: jebakan-jebakan aktifitas (activity trap). Program antivirus merupakan program yang menetap di memori (memory resident program). Program ini mengidentifikasi virus melalui aksi-aksinya bukan dari struktur program yang diinfeksi. Dengan antivirus semacam ini tak perlu mengembangkan penanda-penanda dan aturan-aturan pintar untuk beragam virus yang sangat banyak. Dengan cara ini yang diperlukan adalah mengidentifikasi
kumpulan
instruksi
yang
berjumlah
sedikit
yang
36
mengidentifikasi adanya usaha infeksi. Kalau muncul kejadian ini, program antivirus segera mengintervensi. 4. Generasi keempat: proteksi penuh (full featured protection). Antivirus generasi ini menggunakan beragam teknik antivirus secara bersamaan. Teknik-teknik ini meliputi scanning dan jebakan-jebakan aktifitas. Antivirus juga mempunyai senarai kapabilitas pengaksesan yang membatasi kemampuan virus memasuki sistem dan membatasi kemampuan virus memodifikasi file untuk menginfeksi file.
2.7.1 Program Removal Menurut Achmad Darmal (2006b:2) program removal adalah suatu program yang dirancang untuk membersihkan suatu malcode tertentu dan umumnya juga mengembalikan perubahan yang disebabkan oleh malcode tersebut. Untuk mengetahui ada tidaknya trojan pada suatu sistem komputer adalah dengan menginstal program antivirus dan melakukan full scanning, namun untuk mengetahui keberadaan trojan yang belum terdeteksi oleh program antivirus, maka cara yang termudah adalah mengamati gejala abnormal yang muncul saat mengoperasikan komputer. Adapun gejala abnormal yang terjadi antara lain: 1. Sistem komputer menjadi lambat, karena tingkat penggunaan prosesor dan memori yang besar. Biasanya sistem akan menampilkan sebuah kotak pesan ”Not Enough Memory” atau ”Low Memory”, bahkan sistem bisa secara tibatiba crash atau hang.
37
2. Disk drive terakses secara berkala dalam waktu yang singkat, tanpa adanya instruksi dari pengguna. 3. Konfigurasi berubah tanpa sepengetahuan pengguna, seperti konfigurasi wallpaper, icon, format huruf, waktu, nama pengguna dan konfigurasi lainnya. 4. Pengaksesan ke aplikasi tertentu tidak bisa dilakukan, seperti aplikasi registry editor, sistem konfigurasi utiliti, windows task manager, display propertis dan lainnya. 5. Kapasitas disket, harddisk atau media penyimpanan lainnya tiba-tiba bertambah atau berkurang tanpa sebab yang jelas. Hal ini biasanya selalu digunakan worm untuk membuat salinan dirinya ke disket. Anda cukup memasukkan sebuah disket ke disk drive dan perhatikan perubahan kapasitas disket serta jumlah file yang ada. 6. Perilaku yang tidak lazim pada sistem komputer, seperti hilangnya pointer mouse, hilangnya tombol start menu, restart dengan sendirinya, atau memunculkan text/gambar/suara aneh lainnya. 7. Sistem tiba-tiba mengeksekusi program tertentu, seperti aplikasi internet browser, aplikasi email atau bahkan program uninstal untuk aplikasi tertentu. 8. File tiba-tiba rusak atau hilang, seperti file dokumen microsoft word, file dokumen microsoft excel, file program registry editor dan lain-lain. 9. Sistem operasi tidak dapat dioperasikan. Hal ini biasanya disebabkan karena terhapusnya sebagian file sistem, konfigurasi sistem yang salah, atau saat sistem operasi startup worm kemudian mematikan kembali sistem operasi tersebut.
38
2.7.1.1 Launcher File Removal Menurut Achmad Darmal (2006b:3) tahap pembersihan file launcher adalah tahap pembersihan yang dilakukan terhadap file utama worm serta file pembantu lain yang berada pada sistem dan memori komputer. Pembersihan terhadap file launcher ini harus dilakukan pertama kali, terlebih untuk file launcher yang sedang terproses, karena file ini umumnya menjaga agar worm tetap eksis pada suatu sistem komputer. Untuk mengetahui letak file launcher ini, cara yang paling mudah dilakukan adalah memeriksa metode launcher yang umumnya digunakan worm agar tereksekusi setiap windows startup, adapun metode launcher tersebut antara lain: 1. Konfigurasi registry. Saat windows startup sistem akan mengeksekusi setiap program yang terdaftar pada key run, runonce, runonceex, runservices dan runserviceonce. Key registry ini terdapat pada hive HKCU (Hive Key Current User) dan HKLM (Hive Key Local Machine). 2. Konfigurasi file startup. Saat windows startup sistem juga akan mengeksekusi file tertentu yang ada pada konfigurasi file seperti autoexec.bat, win.ini, sistem.ini dan wininit.ini. 3. Direktori startup. Lokasi default direktori startup berbeda-beda pada sistem
operasi windows, tetapi anda bisa mendapatkan lokasi default direktori tersebut pada data registry:
39
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ UserShellFolder, dengan value ”Startup”.
2.7.1.2 Infector File Removal Menurut Achmad Darmal (2006b:58) tahap pembersihan file infector adalah tahap pembersihan untuk file trojan yang didistribusi dan bertujuan untuk menginfeksi sistem komputer yang belum tertular. Umumnya trojan lokal di Indonesia memanfaatkan media yang dapat dipindahkan (removable disk) untuk mendistribusikan filenya. File trojan yang dikirim lewat fasilitas jaringan dan Internet juga merupakan file infector. Ada banyak trik dalam melakukan pencarian (scanning) file infector untuk known worm (worm yang sudah dikenal/diketahui sebelumnya), antara lain: 1. File name scanning 2. File size scanning 3. File attribute scanning 4. Create date/time scanning 5. CRC scanning 6. File description scanning 7. Product name scanning 8. Company name scanning 9. File version scanning 10. String scanning
40
Data-data yang diperiksa dari trik pencarian (scanning) tersebut disebut dengan istilah penanda (signature). Trik tersebut masing-masing memiliki pendekatan yang berbeda-beda dan tidak semuanya memiliki tingkat akurasi yang tinggi. Pada aplikasi yang penulis buat, trik pencarian yang digunakan adalah CRC scanning. 1. CRC scanning CRC scanning adalah metode pencarian yang dilakukan dengan melakukan pencocokan nilai CRC pada file terperiksa dengan data CRC yang ada pada signature. CRC adalah singkatan dari Cyclic Redundancy Checksum yang merupakan algoritma teroptimasi dan suatu metode yang powerfull guna memeriksa sejumlah byte apakah termodifikasi atau tidak. Algoritma ini melakukan pemeriksaan pada isi file secara keseluruhan dan membuat angka 32 bit yang mewakili isi file tersebut. Perubahan kecil pada isi file mengakibatkan perubahan besar pada hasil pemeriksaan dan sangat kecil kemungkinan terjadinya dua file yang berbeda memiliki hasil pemeriksaan CRC yang sama (kemungkinan terjadi 1 banding 1 billion).
2.7.2 Definition File Definition file adalah suatu file yang memuat kumpulan data signature dari program jahat (malicious code) tertentu. Definition file umumnya digunakan oleh aplikasi-aplikasi antivirus professional, hanya saja karena aplikasi tersebut
41
kebanyakan adalah aplikasi komersial, maka definition file yang digunakan tentunya terlebih dahulu telah terenkripsi dengan sangat baik. Bentuk umum definition file yang akan digunakan pada aplikasi ini adalah: (1) 25-12-2007 (2) DD7A0BA8:E:Trojan Horse(Trojan Horse) (3) #END# Keterangan: 25-12-2007
: Tanggal dirilisnya file database virus
DD7A0BA8
: Menunjukan nilai crc32 dari sebuah aplikasi atau bisa digunakan sebagai penanda virus.
:E:
: Sebagai pemisah antara nilai crc32 dan nama virus.
Trojan Horse
: Nama virus.
(Trojan Horse)
: Jenis virus.
#END#
: Menunjukan akhir dari file database virus.
BAB III ANALISIS, PERANCANGAN dan PEMROGRAMAN
3.1 Analisis Dalam membangun aplikasi antivirus ini, penulis menganalisa akan kebutuhan dasar sistem antara lain: 1. Pengguna dapat menggunakan aplikasi ini untuk melakukan pendeteksian seperti melakukan pencarian file, menghentikan pencarian, menghapus file yang dianggap trojan sesuai dengan data penanda (signature.db), membaca data signature yang ada dan melihat hasil pendeteksian. Pencarian di sini berdasarkan nilai CRC32 dari file. 2. Pengguna dapat menambah data signature.db dan menyimpannya, dimana sistem telah dilengkapi fungsi untuk membaca file berdasarkan nilai crcnya. Aktor dan use case ditentukan atas dasar kebutuhan sistem. Kebutuhan sistem ini diakomodir di use case. Selanjutnya use case menyediakan nilai hasil kepada aktor. Atas dasar spesifikasi di atas ada satu aktor yaitu pengguna aplikasi. Untuk mendeskripsikan use case apa saja dan aktor yang terlibat dalam use case tersebut, dapat dilihat pada Tabel 3.1. Tabel 3.1 Kebutuhan sistem, aktor dan use case pada aplikasi Trojan remover. No 1
Kebutuhan Sistem Aktor Use Case Pengguna dapat menggunakan aplikasi ini Pengguna Melakukan pendeteksian untuk melakukan pendeteksian seperti melakukan pencarian, menghentikan pencarian, menghapus file yang dianggap trojan sesuai dengan data penanda (signature.db), membaca data signature yang ada dan melihat hasil pendeteksian. Pencarian disini berdasarkan nilai CRC32
42
43
Tabel 3.1 (Lanjutan) Kebutuhan sistem,actor, dan use case pada aplikasi Trojan remover. Dari file Pengguna dapat menambah data Pengguna Mengelola data signature.db dan menyimpannya, dimana signature.db sistem dilengkapi fungsi untuk membaca file berdasarkan nilai checksumnya.
2
3.1.1 Diagram Use Case Diagram Use case menjelaskan manfaat sistem jika dilihat menurut sudut pandang orang yang berada di luar sistem (actor), diagram use case juga menunjukan fungsionalitas suatu sistem atau kelas dan bagaimana sistem berinteraksi dengan dunia luar. Berdasarkan Tabel 3.1 di atas secara umum pemodelan use case pada aplikasi ini dapat dilihat pada Gambar 3.1. Aplikasi Antivirus
Melakukan pendeteksian
Pengguna Mengelola data signature
Gambar 3.1 Diagram use case aplikasi Trojan Remover. Penjelasan dari masing-masing use case dari Gambar 3.1 dapat dilihat berikut ini. Use Case
:
Melakukan pendeteksian
Deskripsi Singkat
:
Use case ini memungkinkan pengguna untuk melakukan pencarian dan penghapusan file yang dianggap trojan.
Aktor
:
Pengguna
44
Kondisi Awal
:
Sistem memeriksa keberadaan file frmMain pada path yang sama dengan aplikasi. Jika tidak ditemukan maka sistem
akan
menjalankan
perintah
BuildUI
dan
menampilkan frmUT atau form utama. Aliran Utama
:
1. Pengguna memilih menu deteksi trojan. 2. Sistem menampilkan form deteksi. 3. Pengguna memilih menu cek direktori atau cari dalam file. 4. Sistem menampilkan kotak dialog cari dalam file atau direktori. 5. Sistem melakukan pencarian file, mencatat waktu awal pencarian dan menampilkan proses pencarian tersebut. 6. Pengguna
menekan
tombol
berhenti
untuk
menghentikan pencarian. 7. Sistem
menghentikan
proses
pencarian,
dan
menampilkan pemberitahuan apakah proses ingin dihentikan?. 8. Sistem menghentikan proses pencarian, mencatat waktu
akhir
pencarian
dan
menampilkan
pemberitahuan bahwa pemeriksaan telah selesai. 9. Sistem menghapus setiap file yang terdeteksi sebagai virus
Trojan
sesuai
dengan
data
penanda
45
(signature.db). 10. Pengguna mengklik folder logs lalu mengklik file text untuk menampilkan laporan pendeteksian dan isinya.
Aliran Alternatif
:
1. Pada langkah 4, jika pengguna tidak memilih file atau direktori
yang
akan
dideteksi
maka
sistem
menampilkan pemberitahuan. 2. Pada langkah 6, jika selama proses pencarian sistem menemukan file yang memiliki nilai penanda sama dengan data signature.db maka system melanjutkan ke langkah 11. 3. Pada langkah 8, jika pengguna menekan tombol yes maka sistem melanjutkan ke langkah 9 tapi jika pengguna
menekan
tombol
no
maka
sistem
melanjutkan ke langkah 6. 4. Pada langkah 12, apabila pengguna tidak melakukan langkah 5 atau sistem tidak melakukan langkah 6 maka sistem tidak akan menampilkan laporan. Kondisi Akhir
:
Sistem membuat laporan data hasil penghapusan file virus Trojan berupa data text.
46
Use Case
: Mengelola data signature
Deskripsi Singkat
: Use case ini memungkinkan pengguna untuk menambah dan menyimpan data penanda (signature.db) sendiri, dimana sistem telah menyediakan fungsi untuk membaca nilai CRC32 dari file guna memudahkan pengguna dalam menambah data signature tersebut.
Aktor
: Pengguna
Kondisi Awal
: Kondisi awal use case ini sama seperti kondisi awal pada use case melakukan pendeteksian, yang membedakan pada use case ini menggunakan fungsi update karena file signature.db terpisah dari sistem dan dilakukan secara manual.
Aliran Utama
:
1. Pengguna memilih menu cek dengan CRC. 2. Sistem menampilkan form cek dengan CRC. 3. Pengguna memilih file yang dicurigai sebagai virus dan mengambil data berupa nama file dan nilai cheksum. 4. Sistem menampilkan nama dan nilai checksum. 5. Sistem tidak akan menampilkan nama dan nilai checksum. 6. Pengguna mengklik file signature.db yang ada di direktori dimana aplikasi Trojan remover disimpan. 7. Sistem menampilkan file signature.db 8. Pengguna mengetik nilai checksum dari file yang
47
dicurigai ke file signature.db yang telah dibuka. 9. Pengguna mengklik save. Aliran Alternatif
:
1. Pada langkah 3, jika pengguna tidak memilih file maka sistem melanjutkan ke langkah 5.
Kondisi Akhir
: File frmMain mengalami perubahan apabila terjadi proses penambahan data.
3.1.2 Diagram Aktifitas Diagram aktifitas merupakan pemodelan aliran kerja (workflow) sebuah proses, atau urutan aktifitas dalam suatu proses. Dengan diagram aktifitas ini kita akan lebih dapat memahami alur dari proses-proses tersebut atau dengan kata lain diagram ini akan menggambarkan langkah-langkah dari setiap aplikasi yang disediakan dalam sistem.
3.1.2.1 Diagram Aktifitas Untuk Use Case Melakukan Pendeteksian Tabel 3.2 menunjukkan aktifitas yang ditemukan dari dokumen use case melakukan pendeteksian. Tabel 3.2 Mencari aktifitas di aliran utama dan alternatif pada use case melakukan pendeteksian. No 1 2 3 4
Use case Pengguna memilih menu deteksi trojan.
Activity State Memilih Menu Deteksi Trojan. Menampilkan form Sistem menampilkan form deteksi. deteksi. Pengguna memilih menu cek direktori atau cari dalam Memilih menu cek file. direktori; cari dalam file Sistem menampilkan form cari dalam file atau direktori Menampilkan form cari dalam file; form direktori.
48
Tabel 3.2 (Lanjutan) Mencari aktifitas di aliran utama case melakukan pendeteksian. 5 Sistem melakukan pencarian file, mencatat waktu awal pencarian dan menampilkan proses pencarian tersebut. 6 7
8
9
10
11
12
13
14
dan alternatif pada use
Melakukan pencarian file; mencatat waktu awal; menampilkan proses pencarian. Pengguna menekan tombol berhenti untuk Menekan tombol berhenti. menghentikan pencarian. Sistem menghentikan proses pencarian, dan Menghentikan menampilkan pemberitahuan apakah proses ingin pencarian; menampilkan pemberitahuan. dihentikan?.
Sistem menghentikan proses pencarian, mencatat Menghentikan waktu akhir pencarian dan menampilkan pencarian; mencatat waktu akhir; pemberitahuan bahwa pemeriksaan telah selesai. menampilkan pemberitahuan. Sistem menghapus setiap file yang terdeteksi Menghapus file.
sebagai virus Trojan sesuai dengan data penanda (signature.db). Pengguna mengklik folder logs lalu mengklik file text untuk menampilkan laporan pendeteksian dan isinya. Pada langkah 4, jika pengguna tidak memilih file atau direktori yang akan dideteksi maka sistem menampilkan pemberitahuan. Pada langkah 6, jika selama proses pencarian sistem menemukan file yang memiliki nilai penanda sama dengan data signature.db maka system melanjutkan ke langkah 11. Pada langkah 8, jika pengguna menekan tombol yes maka sistem melanjutkan ke langkah 9 tapi jika pengguna menekan tombol no maka sistem melanjutkan ke langkah 6.
Mengklik folder logs; mengklik file text; menampilkan laporan. Memilih file; memberikan pemberitahuan. Melakukan pencarian file; menghapus file.
Memilih tombol; melakukan pencarian; menghentikan pencarian; menampilkan pemberitahuan. tidak Tampilan laporan.
Pada langkah 12, apabila pengguna melakukan langkah 5 atau sistem tidak melakukan langkah 6 maka sistem tidak akan menampilkan laporan.
Atas dasar aktifitas di atas, selanjutnya dibuat diagram aktifitas di mana diagram ini menunjukkan transisi di antara aktifitas. Lihat pada Gambar 3.2.
49
Gambar 3.2 Diagram aktifitas untuk use case melakukan pendeteksian. Diagram aktifitas untuk use case melakukan pendeteksian, aplikasi ini terdiri dari beberapa menu diantaranya adalah menu deteksi trojan. Pengguna setelah diberikan tampilan awal aplikasi kemudian memilih menu deteksi trojan maka pengguna dapat melakukan aktifitas seperti:
50
1. Melakukan pencarian Berdasarkan Gambar 3.2 di atas pengguna dapat menggunakan fungsi ini dengan memilih menu cari dalam file atau memilih menu cek direktori kemudian pengguna dihadapkan suatu kondisi apakah sudah memilih file jika kondisi benar maka sistem melakukan pencarian, mencatat waktu awal proses pencarian tersebut dan menampilkan proses pencarian seperti menampilkan proses angka ”0 - selesai” selama proses ini berlangsung tapi jika kondisi salah maka sistem akan memberikan pemberitahuan ”Pemeriksaan telah selesai”, ketika pada proses pencarian terjadi pengguna dihadapkan dua kondisi apakah menemukan file yang dicari jika kondisi benar maka sistem menghapus file tersebut tetapi jika kondisi salah maka sistem dihadapkan lagi pada kondisi apakah pencarian tersebut selesai jika kondisi benar maka sistem menghentikan pencarian (merujuk pada proses yang terdapat pada fungsi menghentikan pencarian) tetapi jika kondisi salah maka sistem melakukan pencarian sampai selesai. 2. Menghentikan pencarian Berdasarkan Gambar 3.2 di atas pengguna dapat menggunakan fungsi ini dengan menekan tombol berhenti kemudian sistem menghentikan pencarian, mencatat waktu akhir proses pencarian atau ketika pengguna menekan tombol berhenti pengguna dihadapkan pada suatu kondisi apakah proses ingin dihentikan jika kondisi benar maka sistem menghentikan pencarian, mencatat waktu akhir dan menampilkan pemberitahuan berupa pesan ”pemeriksaan
51
telah selesai” jika kondisi salah maka sistem melakukan pencarian kembali sampai selesai. 3. Menampilkan hasil pendeteksian. Berdasarkan Gambar 3.2 di atas pengguna dapat menggunakan fungsi ini dengan membuka folder logs lalu membuka file text maka sistem akan menampilkan laporan. Apabila pengguna melakukan proses pencarian maka setelah selesai dan menemukan virus Trojan maka laporan tersebut terdapat isinya namun jika pengguna tidak melakukan pencarian maka sistem tidak akan menampilkan laporan.
3.1.2.2 Diagram Aktifitas Untuk Use Case Mengelola Data Signature Tabel 3.3 menunjukkan aktifitas yang ditemukan dari dokumen use case mengelola data signature. Tabel 3.3 Mencari aktifitas di aliran utama dan alternatif pada use case mengelola data signature. No 1 2
3 4
5 6 7 8
Use case Pengguna memilih menu cek dengan CRC.
Activity State Memilih menu cek dengan CRC. Pengguna memilih file yang dicurigai sebagai virus Memilih file; dan mengambil data berupa nama file dan nilai mengambil data. checksum. Menampilkan nama dan nilai checksum. Menampilkan nama; nilai checksum. Tidak akan menampilkan nama dan nilai checksum. Tidak akan menampilkan nama dan nilai checksum. Pengguna membuka file signature.db yang ada di Membuka file direktori dimana aplikasi Trojan remover di simpan. signature.db. Pengguna mengetik nama dan nilai checksum dari file Mengetik nama dan yang dicurigai ke file signature.db yang telah dibuka. nilai checksum. Pengguna mengklik save. Mengklik save. Pengguna keluar dari aplikasi, kemudian masuk lagi Keluar dari aplikasi; dan melakukan pemeriksaan kembali. masuk lagi; melakukan pemeriksaan.
52
9
Pada langkah 2, jika pengguna tidak memilih file maka Memilih file. sistem melanjutkan ke langkah 4.
Atas dasar aktifitas di atas, selanjutnya dibuat diagram aktifitas di mana diagram ini menunjukkan transisi di antara aktifitas. Lihat pada Gambar 3.3.
Gambar 3.3 Diagram aktifitas untuk use case mengelola data signature.
53
Diagram aktifitas untuk use case mengelola data penanda (signature), aplikasi ini terdiri dari beberapa menu diantaranya adalah menu cek dengan CRC. Pengguna setelah diberikan tampilan menu deteksi trojan kemudian memilih menu cek dengan CRC maka pengguna dapat melakukan aktifitas seperti: 1. Menambah data signature Berdasarkan Gambar 3.3 di atas pengguna dapat menggunakan fungsi ini dengan membuka file signature.db, mengetik nama dan nilai checksum, mengklik save, keluar dari aplikasi, masuk lagi ke aplikasi lalu melakukan pemeriksaan lagi dengan data signature.db yang telah diperbaharui. Jika pengguna tidak mengisi data tersebut di atas maka sistem tidak akan ada penambahan data signature.db. 2. Memperoleh nilai crc. Berdasarkan Gambar 3.3 di atas pengguna dapat menggunakan fungsi ini dengan memilih menu cek dengan CRC kemudian pengguna dihadapkan pada suatu kondisi apakah pengguna memilih file, jika kondisi benar maka sistem akan mengambil data berupa nama file, ukuran, dan nilai checksum jika kondisi salah maka sistem tidak akan menampilkan datanya.
3.1.3
Diagram Kelas Seperti yang sudah dijelaskan class diagram adalah diagram yang
menggambarkan hubungan antar kelas yang ada, dalam aplikasi Trojan remover penulis menggambarkan class diagram seperti pada gambar 3.4.
54
Gambar 3.4 Class diagram pada aplikasi trojan remover. Pada class diagram diatas dijelaskan bahwa terdapat empat kelas yang saling berhubungan. Kelas form UT yang termasuk ke dalam boundary mempunyai hubungan aggregation (dimana kelas yang satu merupakan bagian dari kelas yang lain) dengan kelas form main yang juga termasuk ke dalam
55
boundary, disebut kelas boundary karena kelas tersebut berupa tampilan user interface yang merupakan sarana komunikasi antara system dengan user. Form main tidak akan berjalan jika tidak ada proses dari form UT, oleh sebab itu kelas form main merupakan bagian dari kelas form UT. Lalu pada form main mempunyai hubungan generalization (hubungan antara parent dengan child) dimana kelas deteksi yang berupa entity dan kelas open dialog yang juga entity adalah bagian dari form main. Karena pada kelas deteksi dan kelas open dialog akan menampilkan proses-proses pendeteksian yang akan dijalankan. Disebut kelas entity karena memperlihatkan proses apa saja yang akan ditawarkan oleh sistem kepada user.
Diagram Sekuensial Diagram sekuensial menggambarkan interaksi antar objek di dalam dan di sekitar sistem (termasuk pengguna, display, dan sebagainya) berupa pesan (message) yang digambarkan terhadap waktu.
3.1.4.1 Diagram Sekuensial Untuk Use Case Melakukan Pendeteksian Pengguna dapat melakukan pencarian dengan memilih menu deteksi dengan asumsi file yang akan dideteksi telah dipilih maka sistem melakukan proses pencarian tersebut, mencatat waktu awal proses tersebut ketika pengguna memilih file dan menekan tombol ok atau open dan menampilkan proses pencarian tersebut seperti menampilkan angka ”0 sampai selesai” selama proses pencarian tersebut berlangsung, sebaliknya jika file tidak dipilih maka sistem akan
56
menampilkan pemberitahuan ”Pemeriksaan telah selesai”. Jika selama proses tersebut sistem menemukan file yang memiliki penanda yang sama dengan data signature maka sistem akan langsung menghapusnya. Sedangkan jika selama proses sistem tidak menemukan dan jika proses pencarian sudah selesai maka sistem menghentikan proses pencarian tersebut tetapi jika proses belum selesai maka sistem melakukan pencarian kembali. Pengguna dapat menghentikan proses pencarian dengan menekan tombol berhenti kemudian sistem menampilkan pemberitahuan ”Apakah proses ingin dihentikan?” jika pengguna menekan tombol yes maka sistem akan menghentikan pencarian, mencatat waktu akhir proses pencarian ketika pengguna menekan tombol stop dan menampilkan pemberitahuan tapi jika pengguna menekan tombol no maka sistem akan melanjutkan pencarian sampai selesai. Pengguna dapat melihat hasil pendeteksian dengan membuka folder logs yang berada di direktori dimana aplikasi Trojan di simpan dan membuka file text maka sistem akan menampilkan laporan. Apabila pengguna melakukan proses pencarian maka setelah selesai dan menemukan virus Trojan maka laporan tersebut terdapat isinya namun jika pengguna tidak melakukan pencarian maka sistem tidak akan menampilkan laporan. Untuk lebih jelasnya dapat dilihat pada halaman 54 Gambar 3.5.
57
58
3.1.4.2 Diagram Sekuensial Untuk Use Case Mengelola Data Signature Pengguna dapat menambah data signature dengan membuka file signature.db lalu pengguna mengetik nilai checksum dan nama file virus yang baru, lalu mengklik save. Pengguna dapat memperoleh nilai CRC dari suatu file dengan memilih menu cek dengan CRC kemudian sistem menampilkan form CRC tersebut. Kemudian jika pengguna memilih file pada form CRC maka sistem langsung menampilkan nama, ukuran, dan nilai checksum dari file tersebut sebaliknya jika pengguna tidak memilih maka sistem tidak menampilkan nama, ukuran, dan nilai checksum tersebut. Untuk lebih jelasnya dapat dilihat pada halaman 56 Gambar 3.6.
59
60
3.2 Perancangan Tampilan Pada aplikasi Trojan remover ini memiliki 4 buah form, yaitu satu form sebagai menu utama dan tiga buah form sebagai sub menu, dimana dari menumenu tersebut memiliki fungsi yang berbeda-beda.
3.2.1 Rancangan Menu Utama Pada rancangan aplikasi ini terdapat 4 menu antara lain Home, Deteksi Trojan, Hubungi Saya, dan Keluar. Rancangan pertama pada aplikasi ini adalah rancangan menu utama seperti terlihat pada Gambar 3.7.
Menu Utama
X
Home
Deteksi Trojan
IMAGE
Hubungi Saya
Keluar Gambar 3.7 Rancangan menu utama dari aplikasi. Dari Gambar 3.7 dapat dilihat rancangan menu utama ini terdiri dari empat sub menu yaitu Home, Deteksi Trojan, Hubungi Saya, dan Keluar. Home berguna untuk menampilkan judul dari aplikasi tersebut, deteksi trojan berguna untuk
61
memulai pendeteksian virus, hubungi saya berguna untuk menampilkan profil dari pembuat aplikasi, dan keluar berguna untuk mematikan aplikasi.
3.2.2 Rancangan Sub Menu Deteksi
Definisi
Deteksi Cari dalam file
Jumlah virus yang bias dilacak
Cari direktori
Cari dengan CRC
Tray Windows
ON/OFF
Run on Startup
ON/OFF
Lokasi File
Gambar 3.8 Rancangan tampilan sub menu deteksi. Dari Gambar 3.8 dapat dilihat pada tampilan sub menu deteksi trojan terdiri dari beberapa modul deteksi, yaitu modul cari dalam file yang berguna untuk mencari kode virus didalam file, cari direktori yang berguna untuk mencari virus secara otomatis didalam suatu direktori, cari dengan CRC berguna untuk mencocokan file yang dianggap virus menggunakan metode CRC32. kemudian ada modul Definisi yang mendefinisikan tanggal dari virus-list dalam file signature.db. Pada modul tersebut juga diperlihatkan jumlah virus yang dapat dilacak. Jika tanggal pada virus-list telah out-of-date dan harus di-update dengan virus-list yang lebih baru.
62
Pada modul setting ada tray windowyang berfungsi untuk menampilkan program pada tray windows. Sedangkan Run on Startup berguna untuk menjalankan aplikasi trojan remover pada waktu sistem operasi windows berjalan pertama kali. Kemudian dibawahnya ada modul lokasi file yang berguna untuk menampilkan lokasi dari file yang sedang dideteksi.
3.2.3 Rancangan Sub Menu Cari Dalam File
Judul Menu
Image
Kumpulan File
Nama File
Open
Type
Cancel
Gambar 3.9 Rancangan Sub Menu Cari dalam File. Dari Gambar 3.9 dapat dilihat bahwa tampilan sub menu cari dalam file terdiri dari Common Dialog yang diakses dari dll visual basic. Kumpulan file menampilkan file-file yang akan diperiksa, sedangkan nama file dan type berisi file dan ekstensi file yang terpilih untuk dideteksi dari kode-kode virus.
63
3.2.4 Rancangan Sub Menu Cari Direktori
Judul Menu
Folder
Open
Cancel
Gambar 3.10 Rancangan tampilan Sub Menu Cari Direktori. Dari Gambar 3.10 dapat dilihat bahwa tampilan sub menu cari direktori hanya terdiri dari beberapa bagian. Pada bagian folder menampilkan seluruh folder yang ada di hardisk, baik yang tersembunyi maupun yang terlihat.
3.2.5 Rancangan Tampilan Sub Menu Cari Dengan CRC Judul Menu Nama File:
Ukuran File:
Image
Kumpulan File
Checksum:
Nama File
Open
Type
Cancel
Gambar 3.11 Rancangan tampilan sub menu cari dengan CRC.
64
Dari Gambar 3.11 dapat dilihat bahwa tampilan sub menu cari dengan CRC sama dengan sub menu cari dalam file, diambil juga dari Common Dialog windows, tetapi ada tambahan dalam form tersebut. Dapat dilihat pada textbox yang ada di kanan form terdiri dari keterangan Nama file, Ukuran file, dan Checksum.
3.3 Pemrograman atau Pengkodean Pada pemrograman ini akan dibahas tentang beberapa penggalan program yang berada pada aplikasi trojan remover ini. Pengkodean diperlukan agar rancangan dapat diterjemahkan ke dalam bentuk mesin dan dapat dijalankan. Pada sub bab ini penulis akan memberikan penggalan baris program untuk setiap menu, diantaranya: 1. Menu Pendeteksian Pada menu ini pengguna bisa melakukan pencarian dalam file, pencarian direktori, menghentikan pencarian sementara.
a. Melakukan pencarian dalam file Proses pencarian akan berjalan apabila pengguna memilih file yang akan dideteksi dan menekan open pada aplikasi. Adapun baris program pada pencarian dalam file adalah sebagai berikut. Public Function ShowOpenDlg(ByVal Owner As Form,_Optional ByVal InitialDir As String, _ Optional ByVal strFilter As String, _ Optional ByVal DefaultExtension As String, _ Optional ByVal DlgTitle As String) As String Dim sBuf As String InitialDir=IIf(IsMissing(InitialDir), vbNullString, InitialDir)
65
strFilter=IIf(IsMissing(strFilter),"SeluruhData|*.*", Replace(strFilter, "|", vbNullChar)) & vbNullChar DefaultExtension=IIf(IsMissing(DefaultExtension),vbNullString, DefaultExtension) sBuf = Space$(256) If IsWinNT Then CallGetFileNameFromBrowseW(Owner.hwnd, StrPtr(sBuf), Len(sBuf), StrPtr(InitialDir), StrPtr(DefaultExtension), StrPtr(strFilter), StrPtr(DlgTitle)) Else 'ISWINNT = FALSE/0 CallGetFileNameFromBrowseA(Owner.hwnd, sBuf, Len(sBuf), InitialDir, DefaultExtension, strFilter, DlgTitle) End If ShowOpenDlg = Trim$(sBuf) End Function
Public Function ShowOpenDlg(ByVal Owner As Form,_Optional ByVal InitialDir As String,_Optional ByVal strFilter As String,_Optional ByVal DefaultExtension As String,_Optional ByVal DlgTitle As String) As String adalah awal dari fungsi show open dialog yang berguna untuk menampilkan box berisi pilihan file. Dim sBuf As String berguna untuk mendefinisikan variable sBuf dengan tipe string. InitialDir=IIf(IsMissing(InitialDir), vbNullString, InitialDir) berguna untuk memberi nilai variable InitialDir dengan keterangan direktori yang di
dapat
yang
berhubungan
dengan
dimana
file
tersebut
terletak.
strFilter=IIf(IsMissing(strFilter),"SeluruhData|*.*",Replace(strFilter,"|",vbNullC har))& vbNullChar berguna memberi filter data atau file ekstensi apa ynag harus ditampilkan, apakah hanya doc dengan tanda *.doc, atau xls dengan tanda *.xls atau seluruh data dengan *.*.
Default Extension = IIf (Is Missing (Default
Extension), vbNullString, DefaultExtension) berguna untuk mendefinisikan ekstensi defaultnya atau ekstensi yang pertama kali muncul. sBuf = Space$(256) berguna untuk memberi space pertama variable sBuf dengan array 256.
66
b. Melakukan pencarian dalam direktori Proses pencarian akan berjalan apabila pengguna memilih direktori yang akan dideteksi dan menekan ok pada aplikasi. Adapun baris program pada pencarian dalam file adalah sebagai berikut. Public Sub Checkfolder(Optional ByVal StrFolder As String) Dim Result As Variant Dim c As Collection On Error Resume Next If StrFolder = vbNullString Then Set Result = SH.BrowseForFolder(frmMain.hWnd, "Pilih Folder yang akan di scan", 1) End If With Result.Items.Item FullPathSearch .Path, c, , , , True End With 'RESULT.ITEMS.ITEM On Error GoTo 0 End Sub Dim Result As Variant mendefinisikan variabel result dengan tipe varian. Dim c As Collection mendefinisikan variabel c denagan tipe collection lalu
kode On Error Resume Next merupakan kode yang berguna jika ada eror dari program maka akan langsung keluar dari program secara otomatis. If StrFolder = vbNullString Then kode ini menjelas kan jika isi dari variabel strfolder sama
dengan
0
maka
kerjakan
perintah
di
bawah
ini.
Set
Result
=
SH.BrowseForFolder(frmMain.hWnd, "Pilih Folder yang akan di scan", 1) jika kode berikut berguna untuk memunculkan kotak dialog browse folder. With Result.Items.Item FullPathSearch .Path, c, , , , True End With 'RESULT.ITEMS.ITEM kode berikut ini berguna untuk memilih folder yang
akan di scan.
67
c. Menghentikan proses pencarian sementara Kode ini berguna untuk menghentikan proses pendeteksian sementara, misalnya pengguna sedang mendeteksi virus trojan tetapi pada pertengahan pencarian pengguna ingin menghentikan proses pencarian dengan mengklik tombol berhenti, maka akan timbul pesan ”Apakah proses ingin dihentikan?” jika mengklik yes maka proses akan berhenti. Berikut adalah kode programnya. Private Sub txtstop_Click() Dim tanya Running = False tanya = MsgBox("Apakah proses "Perhatian") If tanya = vbNo Then Running = True Else Running = False Exit Sub End If End Sub
ingin
dihentikan?",
vbYesNo,
Dim tanya berguna mendefinisikan variabel tanya sedangkan Running = False
berguna menset variabel running sama dengan false. tanya
=
MsgBox("Apakah proses ingin dihentikan?", vbYesNo, "Perhatian")
kode tersebut akan berfungsi untuk memunculkan pesan ”Apakah proses ingin dihentikan?”, If tanya = vbNo Then jika pengguna mengklik tombol no maka kerjakan perintah dibawahnya yaitu melanjutkan proses pencarian, tapi jika pengguna mengklik tombol yes maka proses pencarian akan berhenti.
2. Membuat file Signature.db Pada aplikasi ini pengguna bisa menambah data penanda (signature) secara manual, menyimpan data signature dan memperoleh nilai CRC32. Tetapi sebelum pengguna menambah data signature.db, pengguna harus mencari file yang dicurigai sebagai virus Trojan dan mengambil data berupa nilai checksum dari
68
suatu file lalu membuka file signature.db dan mengetik data sesuai aturan yang ada pada file signature.db.
a. Membuat data signature.db Dalam pembahasan ini penulis menjelaskan cara membuat file signature.db atau sebagai penanda virus. Berikut adalah kode programnya. Option Explicit Private Sign(4096) As String Private SignVirusType(4096) As String * 1 Private SignVirusName(4096) As String Public Sub BuildSigns() Dim sIn As String Dim swords() As String Dim X As Long Dim Data() As String sIn = FileText(AV.Signature.SignatureFilename) swords = Split(sIn, vbCrLf) ReDim Preserve swords(UBound(swords) - 1) sIn = "" For X = LBound(swords) To UBound(swords) Data = Split(swords(X) & ":" & ":", ":") Sign(X) = Data(0) SignVirusType(X) = Data(1) SignVirusName(X) = Data(2) Next X Sign(X + 1) = "#END#" AV.Signature.SignatureDate = Sign(0) AV.Signature.SignatureCount = UBound(swords) - 1 Exit Sub err: MsgBox "error ketika mengakses file signature!" & vbCrLf & "dimungkinkan karena file rusak atau kosong" & vbCrLf & vbCrLf & "The error message was: " & err.Description, vbCritical + vbOKOnly, "Error" End Sub Private Sign(4096)As String berguna untuk mendefinisikan variabel sign
yang akan digunakan sebagai penanda file virus atau database virus dengan tipe
string.
Private
SignVirusType(4096)AsString*1
berguna
mendefinisikan variabel signvirustype dengan type string sebagai keterangan penanda type virus, misalnya trojan. Private SignVirusName(4096)As
69
String berguna mendefinisikan variabel signvirusname bertype string untuk
keterangan nama virus, misalnya trojan horse. PublicSub BuildSigns() yaitu
berfungsi
untuk
(AV.Signature.Signature
membuat Filename)
penanda.
sIn
=
FileText
menyetting nilai sIn = filetext
(AV.Signature.SignatureFilename), yang berguna untuk menandai signature dari program antivirus. swords= Split(sIn,vbCrLf) menyeting nilai sword dari pemisahan nilai sIn yang berguna untuk memisahkan syntax file signature.db. ReDimPreserve swords(UBound(swords)-1) mendefinisikan kembali variabel swords. sIn="" menyetting nilai sIn = ”” atau nilai kosong. For X = LBound(swords) To UBound(swords)Data = Split(swords(X) & ":" & ":", ":") menyetting nilai data = pemisahan dari nilai swords,
dengan pemisahnya ”:”. SignVirusType(X)=Data(1) menyetting nilai tipe virus dengan nilai data (1), SignVirusName(X)=Data(2) menyetting nilai nama virus dengan nilai data (2). Next X akhir dari fungsi FOR.....NEXT untuk variabel X, Sign(X+1)="#END#" menunjukan jika sampai menemukan karakter #END# berarti berhenti.
b. Memperoleh nilai CRC Pengguna dapat memperoleh nilai CRC dari suatu file dengan mengklik cek dengan CRC pada aplikasi dan pengguna dapat melihat nilai CRC dari file tersebut. Adapun baris program untuk mencari nilai CRC adalah sebagai berikut. Public Function GetFileCrc32(ByRef stream As cBinaryFileStream) As Long
70
Dim buffer(0 To BUFFER_SIZE - 1) As Byte Dim readSize As Long Dim count As Long Dim i As Long Dim iLookup As Long Dim crc32Result As Long crc32Result = &HFFFFFFFF 'FFFFFFFF = 4294967295 readSize = BUFFER_SIZE count = stream.Read(buffer, readSize) 'count = ukuran file Do While (count > 0) For i = 0 To count - 1 iLookup = (crc32Result And &HFF) Xor buffer(i) 'FF = 255 crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And 16777215 ' nasty shr 8 with vb :/ crc32Result = crc32Result Xor crc32Table(iLookup) Next i count = stream.Read(buffer, readSize) Loop GetFileCrc32 = Not (crc32Result) End Function
crc32Result=&HFFFFFFFF'FFFFFFFF
=
4294967295
berguna
menentukan nilai pertama crc32Result atau hasil dari perhitungan crc32 adalah hexa FFFFFFFF, kenapa harus FFFFFFFF, karena segmen terakhir dari file adalah 256 atau hexanya adalah FF. count
=
stream.Read(buffer,
readSize) 'count = ukuran file menentukan variabel count adalah ukuran
atau besar file yang akan diperiksa. Do While (count > 0) ketika count atau besar file yang akan diperiksa sebagai virus tidak sama dengan 0 (nol) maka kerjakan perintah dibawahnya. For i = 0 To count – 1 untuk I sama dengan 0 (nol) sampai besar file dikurangi 1 kerjakan perintah dibawah ini. Kita harus membuat kondisi ukuran file akan dikurangi 1 sampai ukuran file sama dengan 0 agar kita dapat menuju sampai segmen terakhir file. iLookup = (crc32Result And &HFF) Xor buffer(i) 'FF = 255 menentukan nilai ilookup sama dengan
perbandingan nilai variabel crc32result atau hasil dari perhitungan crc32 dan hexa FF atau jika didesimalkan 255 dengan variabel buffer atau besar file.
71
crc32Result
=
((crc32Result
And
&HFFFFFF00)
\
&H100)
And
16777215 ' nasty shr 8 with vb :/ hasil dari nilai crc32 yang disimpan di
variabel crc32result akan dibandingkan dengan hexa FFFFFF00, gunanya untuk menggeser ke bagian atas dari file, jadi pertama kali file akan dibandingkan di bagian 256, kemudian digeser 1 kali ke atas ke 255, kemudian 254, 253, 252 dan seterusnya sampai bagian menunjukan nilai 0. count = stream.Read(buffer, readSize) menentukan nilai count sama dengan besar file yang ingin diperiksa. GetFileCrc32 = Not (crc32Result) ini adalah penentuan sidik jari dari suatu
file, jadi nilai sidik jari suatu file diambil dari yang bukan nilai dari variabel crc32result, atau hasil perhitungan dari nilai crc32 itu sendiri.
BAB IV IMPLEMENTASI DAN PENGUJIAN
4.1 Implementasi Pada sub bab ini penulis akan membahas tentang skenario dan pengujian yang dilakukan pengguna pada aplikasi trojan remover ini.
4.1.1 Skenario Sistem Trojan remover ini terdiri dari satu program utama. Cara kerja aplikasi ini adalah ketika pertama kali menjalankan program, akan muncul menu utama yang terdiri dari 4 sub menu yaitu: 1. Home (Sub menu untuk menampilkan halaman utama dari program) 2. Deteksi Trojan (Sub menu untuk mendeteksi virus trojan) 3. Hubungi Saya (Sub menu untuk menampilkan dimana programer dapat ditemui) 4. Keluar (Untuk keluar dari program trojan remover)
4.1.1.1 Form Utama Pada saat program dijalankan maka akan muncul tampilan menu utama. Menu ini berisi 4 sub menu yaitu home, deteksi trojan, hubungi saya, dan keluar. Menu utama ini langsung menampilkan sub menu home yaitu berupa pesan selamat datang.
72
73
4.1.1.2 Form Deteksi Trojan Untuk mendeteksi virus trojan, maka pengguna harus menampilkan sub menu deteksi trojan yaitu dengan mengklik sub menu deteksi trojan pada menu utama. Maka akan muncul form deteksi trojan. Pada sub menu proses ini, ketika pertama kali aktif akan ada penjelasan tentang definisi antivirus yang diambil dari file signature.db. Jika tanggal pada header file signature.db tidak sama dengan tanggal terakhir pada saat pengguna menambah database virus, maka tulisannya akan berwarna merah dan program perlu melakukan penambahan virus list. Menu dibawahnya juga menunjukan apakah program trojan remover akan menjadi tray windaows (tray windows) atau berjalan ketika windows mulai (run on startup). Kemudian menu yang terletak dibawahnya menunjukan jumlah file dan virus yang dideteksi.
4.1.1.3 Mendeteksi Virus Untuk mendeteksi, ada beberapa cara. Cara pertama yaitu dengan memeriksa apakah ada virus trojan didalam file yaitu dengan mengklik ”cek dalam file” Maka akan muncul form deteksi file. Pengguna bisa memilih file mana yang akan dideteksi lalu mengklik tombol open maka aplikasi akan melakukan pencarian berdasarkan file. Jika pada proses pendeteksian menemukan data yang sama pada signature.db maka aplikasi akan langsung menghapusnya, dan aplikasi juga akan memberikan laporan file apa yang dihapus tapi jika tidak terdapat virus maka aplikasi tidak akan memberikan laportan. Ketika pendeteksian selesai maka aplikasi akan menampilkan pesan bahwa pemeriksaan telah selesai.
74
Cara kedua adalah memeriksa virus trojan yang berada di direktori yaitu dengan cara mengklik ”cek direktori” maka akan muncul form deteksi direktori. Jika pada pertengahan pendeteksian pengguna ingin berhenti, pengguna bisa mengklik tombol berhenti maka aplikasi akan menghentikan pencarian sementara dan menampilkan pesan ”apakah proses ingin dihentikan” jika pengguna mengklik yes maka proses pendeteksian akan berhenti, dan menampilkan pesan ”pemeriksaan telah selesai” jika pengguna mengklik no maka pemeriksaan akan dilanjutkan kembali hingga selesai. Yang ketiga adalah memeriksa file dengan crc (cyclic redundancy check) yaitu mendeteksi virus sesuai dengan checksumnya, yaitu dengan cara mengklik ”cek dengan crc” maka akan muncul form cek dengan crc.
4.1.1.4 Form Hubungi Saya Form ini berguna untuk menghubungi
programer, pada menu utama
pengguna mengklik menu hubungi saya, maka akan muncul image yang berisi semua tentang programer. Dan untuk keluar dari program pengguna bisa mengklik menu keluar pada menu utama.
4.1.1.5 penambahan virus list di file signature.db Untuk menambahkan data virus pada file signature.db, dapat dilakukan dengan cara sebagai berikut: 1. Pengguna mengklik menu cek dengan crc, maka akan muncul form cek dengan crc.
75
2. Kemudian pilih file yang dicurigai sebagai virus trojan, maka aplikasi akan menampilkan data berupa nilai checksum dari file tersebut. 3. pengguna mengkilk file signature.db yang ada di direktori dimana aplikasi trojan remover disimpan. Maka akan muncul di notepad isi dari file signature.db 4. Kemudian ketik nilai checksum dari file yang dicurigai ke file signature.db yang telah dibuka dengan aturan penulisan nilai checksum baru yang diselipkan terletak sebelum karakter #END#. 5. Kemudian pengguna mengklik file lalu mengklik save. 6. Kemudian pengguana harus keluar dulu dari aplikasi trojan remover, kemudian masuk lagi dan melakukan langkah pemeriksaan.
4.2 Pengujian (testing) Pengujian program aplikasi trojan remover ini dilakukan untuk menguji dan memastikan bahwa program yang telah dirancang dan dibuat ini dapat berfungsi dengan baik dan sesuai dengan rumusan rancangan yang telah ditetapkan sebelumnya. Tanpa adanya pengujian, maka tidak dapat diketahui apakah program yang telah dibuat sesuai dengan spesifikasi rancangan program aplikasi. Kebenaran dari menu pendeteksian cari dalam file pada aplikasi adalah : 1. Kemampuan untuk menampilkan open dialog scan file. 2. Kemampuan untuk melakukan pendeteksian berdasarkan file jika pengguna memilih file dan mengklik tombol open pada aplikasi.
76
3. Kemampuan untuk keluar dari menu cari dalam file dan kembali ke menu pendeteksian jika pengguna mengklik tombol cancel pada aplikasi. 4. Kemampuan untuk melakukan penghapusan file jika terdapat persamaan data pada file signature.db. 5. Kemampuan untuk mengklik folder log dan mengklik file text untuk menampilkan laporan hasil pendeteksian. Kebenaran dari menu pendeteksian cek direktori pada aplikasi adalah: 1. Kemampuan untuk menampilkan open dialog browse for folder. 2. Kemampuan untuk melakukan pendeteksian berdasarkan folder atau direktori jika pengguna memilih folder atau direktori dan mengklik tombol ok pada aplikasi. 3. Kemampuan untuk keluar dari menu cek direktori dan kembali ke menu pendeteksian jika pengguna mengklik tombol cancel pada aplikasi dan menampilkan massage atau pesan bahwa pameriksaan telah selesai. 4. Kemampuan untuk melakukan penghapusan file jika terdapat persamaan data pada file signature.db. 5. Kemampuan untuk mengklik folder log dan mengklik file text untuk menampilkan laporan hasil pendeteksian Kebenaran dari menu cek dengan crc pada aplikasi adalah: 1. Kemampuan untuk menampilkan open dialog. 2. Kemampuan untuk menampilkan informasi berupa nama, ukuran, dan nilai checksum dari suatu file jika pengguna memilih file yang dicurigai sebagai virus trojan.
77
3. Kemampuan untuk keluar dari menu cek dengan crc dan kembali ke menu pendeteksian jika pengguna mengklik tombol cancel pada aplikasi. 4. Kemampuan untuk mengklik tombol scan file yang dipilih untuk melakukan pendeteksian. 5. Kemampuan untuk mengklik tombol open untuk menampilkan apakah file apakah file tersebut berupa file virus atau bukan. Kebenaran dari menu run on startup pada aplikasi adalah: 1. Kemampuan untuk menampilkan gambar tray pada saat komputer diaktifkan. 2. Kemampuan untuk langsung menuju ke menu deteksi trojan tanpa harus melalui menu utama. Kebenaran dari tombol berhenti pada aplikasi adalah: 1. Kemampuan untuk menghentikan proses pencarian sementara. 2. Kemampuan untuk menampilkan pesan apakah proses ingin dihentikan? Yes atau No. 3. Kemampuan untuk menghentikan proses pencarian dan menampilkan pesan bahwa pencarian telah selesai apabila pengguna mengklik tombol Yes. 4. Kemampuan untuk melanjutkan pencarian apabila pengguna mengklik tombol No.
4.2.1 Metode Pengujian Pengujian program aplikasi ini dilakukan dengan menggunakan metode Black Box Testing. Metode Black Box Testing ini merupakan pengujian program
78
berdasarkan fungsi dari program. Tujuan dari metode Black Box Testing ini adalah untuk menemukan kesalahan fungsi pada program. Pengujian dengan metode Black Box Testing dilakukan dengan cara memberikan sejumlah masukkan (input) pada program aplikasi yang kemudian diproses sesuai dengan kebutuhan fungsionalnya untuk melihat apakah program aplikasi menghasilkan keluaran (output) yang diinginkan dan sesuai dengan fungsi dari program aplikasi tersebut. Bila dari input yang diberikan proses menghasilkan output yang sesuai dengan kebutuhan fungsionalnya, maka program aplikasi yang bersangkutan telah benar, tetapi bila output yang dihasilkan tidak sesuai dengan kebutuhan fungsionalnya, maka masih terdapat kesalahan pada program aplikasi tersebut. Pengujian dilakukan dengan mencoba semua kemungkinan yang terjadi dan dilakukan secara berulang-ulang. Jika dalam pengujian ditemukan kesalahan, maka akan dilakukan penelusuran dan perbaikan (debugging) untuk memperbaiki kesalahan yang terjadi. Jika telah selesai melakukan perbaikan maka akan dilakukan pengujian kembali. Pengujian dan perbaikan dilakukan secara terus menerus hingga diperoleh hasil yang terbaik.
4.2.2 Skenario Pengujian Skenario pengujian diperlukan untuk mengetahui apakah menu-menu yang ada dapat berfungsi dengan baik atau tidak. Skenario pengujian dilakukan dengan memilih dari setiap pilihan yang ada pada menu aplikasi Trojan remover ini dan tentunya trojan telah menginfeksi komputer, di mana trojan yang digunakan
79
adalah trojan horse. Skenario dilakukan satu persatu dalam semua kondisi yang mungkin terjadi. Skenario tersebut dirangkum dalam Tabel 4.1 di bawah ini. Table 4.1 Tabel skenario pengujian No
Menu yang diuji Menu cari dalam file
Bagian menu yang diuji Tombol open
Input/ kondisi skenario pengujian Mengklik tombol open pada menu cari dalam file.
2
Menu cari dalam file
Tombol cancel
Mengklik tombol cancel pada menu cari dalam file.
3
Menu cek direktori
Tombol ok
Mengklik tombol ok pada menu cek direktori
4
Menu cek direktori
Tombol Cancel
Mengklik tombol cancel pada menu cek direktori
5
Menu cek dengan crc
Tombol Scan file yang dipilih
Mengklik tombol scan file yang dipilih
6
Menu cek dengan crc
Tombol Cancel
Mengklik tombol Cancel
7
Menu cek dengan crc
Pemilihan File
Memilih file yang dicurigai sebagai virus trojan.
8
Menu Deteksi Trojan
Tombol Berhenti
Mengklik tombol Berhenti pada menu deteksi trojan
9
Menu Deteksi Trojan
Menu Run on startup
Mengklik menu Run on Startup
10
Menu Tray windows Menu Signature.db
Form Tray
Menu Signature.db
Menu save
Mengklik gambar tray pada windows Mengklik File signature.db yang terdapat di direktori dimana aplikasi trojan remover disimpan. Mengetik data berupa nilai checksum, nama dan jenis virus tersebut. Lalu mengklik save dan keluar
1
11
12
File Signature.db
Output/ hasil yang akan dicapai Menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Keluar dari menu cari dalam file dan kembali ke menu pendeteksian Menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Keluar dari menu cek direktori dan kembali ke menu pendeteksian. Menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Keluar dari menu cek direktori dan kembali ke menu pendeteksian. Menampilkan data berupa nama, ukuran dan nilai checksum dari file tersebut Menghentikan sementara proses pencarian, dan menampilkan pesan. Menampilkan form tray pada saat computer baru dinyalakan. Menampilkan Form Deteksi trojan. Menampilkan notepad isi file signature.db
Aplikasi akan secara otomatis mengupdate data signature.db
80
13
Menu laporan
Folder logs
dari file signature.db Mengklik folder logs, dan mengklik file notepad yang ad adidalam folder logs.
Menampilkan laporan hasil penghapusan file virus trojan berdasarkan tanggal pendeteksian.
4.2.3 Hasil Pengujian Dari hasil skenario pengujian terakhir yang dilakukan dapat diperoleh hasil pengujian. Dari hasil skenario pengujian pada setiap pilihan yang ada pada aplikasi ini yaitu menu cari dalam file, menu cek direktori, menu cek dengan crc, menu deteksi trojan, menu tray windows, menu signature.db, dan menu laporan pada aplikasi trojan remover ini, maka diperoleh hasil pengujian tersebut sesuai dengan rumusan rancangan aplikasi program ini dan terangkum dalam tabel hasil pengujian. Lihat Tabel 4.2. Table 4.2 Tabel hasil pengujian No
Menu yang diuji Menu cari dalam file
Bagian menu yang diuji Tombol open
2
Menu cari dalam file
Tombol cancel
3
Menu cek direktori
Tombol ok
4
Menu cek direktori
Tombol Cancel
5
Menu cek dengan crc
Tombol Scan file yang dipilih
6
Menu cek dengan crc
Tombol Cancel
7
Menu cek
Pemilihan File
1
Output/ hasil yang dicapai Dapat menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Dapat keluar dari menu cari dalam file dan kembali ke menu pendeteksian Dapat menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Dapat keluar dari menu cek direktori dan kembali ke menu pendeteksian Dapat menampilkan proses pencarian dan menghapus file trojan dengan asumsi file tersebut memiliki nilai penanda yang sama dengan data signature.db. Dapat keluar dari menu cek direktori dan kembali ke menu pendeteksian. Dapat menampilkan data berupa
81
dengan crc 8
Menu Deteksi Trojan
Tombol Berhenti
9
Menu Deteksi Trojan Menu Tray windows Menu Signature.db Menu Signature.db Menu laporan
Menu Run on startup
10 11 12 13
Form Tray File Signature.db Menu save Folder logs
nama, ukuran dan nilai checksum dari file tersebut Dapat menghentikan sementara proses pencarian, dan menampilkan pesan. Dapat menampilkan form tray pada saat computer baru dinyalakan. Dapat menampilkan Form Deteksi trojan. Dapat menampilkan notepad isi file signature.db Aplikasi dapat secara otomatis mengupdate data signature.db Dapat menampilkan laporan hasil penghapusan file virus trojan berdasarkan tanggal pendeteksian.
4.2.4 Analisis Hasil Pengujian Berikut adalah hasil pengujian dari aplikasi trojan remover ini, antara lain: a. Ketika pertama aplikasi menjalankan program, maka akan muncul menu utama dan menu utama ini langsung menampilkan sub menu home, yaitu berupa pesan selamat datang seperti terlihat pada gambar 4.1. Pengguna dapat melakukan pendeteksian dengan dengan mengklik sub menu deteksi trojan maka aplikasi akan memunculkan form deteksi trojan seperti terlihat pada gambar 4.2. Pada form deteksi terdapat tiga cara pendeteksian yang pertama adalah melakukan pencarian berdasarkan file. Ketika pengguna melakukan pencarian berdasarkan file, pengguna mengklik cari dalam file pada form deteksi trojan maka aplikasi akan menampilkan kotak dialog scan file seperti gambar 4.3. Pengguna memilih file yang akan diperiksa lalu mengklik open, maka aplikasi akan melakukan pemeriksaan pada file yang dipilih seperti terlihat pada gambar 4.4 dan 4.5.
82
Gambar 4.1 Tampilan ketika program baru dijalankan
Gambar 4.2 Tampilan ketika pengguna mengklik sub menu deteksi trojan
83
Gambar 4.3 Tampilan ketika pengguna mengklik cari dalam file
Gambar 4.4 Tampilan ketika pengguna memilih file
84
Gambar 4.5 Tampilan ketika pengguna memilih file
b. Cara kedua adalah pencarian berdasarkan direktori. Pengguna dapat mengklik cek direktori pada form deteksi trojan, maka aplikasi akan menampilkan kotak dialog browse folder seperti terlihat pada gambar 4.6. Pengguna harus memilih direktori
mana yang akan diperiksa dan
mengklik ok, maka aplikasi akan melakukan pencarian berdasarkan direktori yang dipilih seperti terlihat pada gambar 4.7 dan 4.8.
85
Gambar 4.6 Tampilan ketika pengguna mengklik cek direktori
Gambar 4.7 Tampilan ketika pengguna mengklik memilih direktori mana yg akan di periksa
86
Gambar 4.8 Tampilan ketika pengguna mengklik ok pada cek direktori
c. Cara ketiga adalah melakukan pendeteksian berdasarkan nilai checksum dari suatu file, dengan cara pengguna mengklik cek dengan crc maka akan muncul kotak dialog seperti gambar 4.9. Cara pendeteksian dengan crc hampir sama dengan cara pendeteksian berdasarkan file. Yang membedakan adalah jika pengguna memilih file maka pada sebelah kanan akan muncul informasi berupa nilai checksum seperti terlihat pada gambar 4.10.
87
Gambar 4.9 Tampilan ketika pengguna mengklik cek dengan crc
Gambar 4.10 Tampilan ketika pengguna memilih file
d. Apabila pada pendeteksian ditemukan data yang sama pada data sama pada signature.db, maka aplikasi akan langsung menghapusnya. Seperti terlihat pada gambar 4.11
88
Gambar 4.11 Tampilan ketika aplikasi menemukan virus trojan e. Apabila pada pertengahan pendeteksian pengguna ingin menghentikan pencarian. Pengguna bisa mengklik tombol berhenti pada sub menu deteksi trojan, lalu aplikasi akan menghentikan pencarian sementara dan menampilkan pesan seperti terlihat pada gambar 4.12. Jika pengguna mengklik yes maka aplikasi akan menghentikan pencarian dan menampilkan pesan bahwa pencarian telah selesai seperti terlihat pada gambar 4.13. Ketika pengguna mengklik no aplikasi akan melanjutkan kembali pendeteksian sampai selesai.
89
Gambar 4.12 Tampilan ketika pengguna mengklik tombol berhenti
Gambar 4.13 Tampilan ketika pengguna mengklik tombol yes
f. Ketika pengguna ingin menambahkan database virus, pengguna harus mendapatkan nilai checksum dari file tersebut. Dengan cara mengklik cek dengan crc pada sub menu deteksi trojan dan memilih file yang dicurigai
90
sebagai virus. Maka aplikasi akan menampilkan informasi nilai checksum dari file tersebut seperti terlihat pada gambar 4.10. g. Ketika pengguna sudah mendapatkan nilai checksum dari file tersebut, pengguna membuka file signature.db yang ad adi direktori dimana aplikasi trojan remover disimpan, lalu akan muncul file signature.db seperti terlihat pada gambar 4.14. Kemudian pengguna mengetik data virus baru ke dalam file signature.db seperti terlihat pada gambar 4.15, kemudian klik file dan klik save seperti gambar 4.16. Kemudian keluar dari aplikasi trojan remover dan masuk kembali kedalam aplikasi maka database virus pada aplikasi akan bertambah seperti terlihat pada gambar 4.17.
Gambar 4.14 Tampilan ketika pengguna mengklik file signature.db
91
Gambar 4.15 Tampilan ketika pengguna menambahkan data virus baru
92
Gambar 4.16 Tampilan ketika pengguna menyimpan data signature.db
Gambar 4.17 Tampilan ketika pengguna sudah menambah file signature.db
93
h. Pengguna dapat melihat hasil dari pendeteksian dengan cara mengklik folder log dan mengklik file notepad berdasarkan tanggal pendeteksian maka akan tampil isi dari laporan seperti terlihat pada gambar 4.18 sampai 4.20.
Gambar 4.18 Tampilan ketika pengguna mengklik folder log
94
Gambar 4.19 Tampilan ketika pengguna mengklik file notepad
Gambar 4.20 Tampilan laporan virus yang sudah dihapus
95
Setelah melakukan pengujian terhadap semua menu aplikasi ini, maka dapat disimpulkan bahwa pengujian telah menunjukkan hasil keluaran (output) dan proses yang sesuai dengan rumusan rancangan aplikasi program ini. Dari hasil pengujian tersebut dapat dikatakan bahwa program ini telah berjalan sesuai dengan skenario pengujian. Namun, berdasarkan hasil pengujian secara keseluruhan didapatkan beberapa keterbatasan dari program aplikasi antivirus ini, antara lain : 1. Cara penambahan database virus atau data signature.db dilakukan secara manual, jadi diperlukan interaksi dari pengguna untuk menambahkan data signature.db. 2. Aplikasi ini akan langsung menghapus jika terdapat kesamaan dengan nilai cheksum yang terdapat pada data signature.db.
BAB V PENUTUP
5.1 Kesimpulan Beberapa kesimpulan yang dapat diambil selama melakukan pengerjaan aplikasi antivirus ini adalah sebagai berikut: 1. Berdasarkan hasil pengujian pada bab 4 dapat diketahui bahwa secara umum aplikasi ini dapat berjalan, antara lain: a. Aplikasi trojan remover yang penulis buat ini dapat melakukan pencarian (scanning) berdasarkan nilai checksum dari suatu file dan dapat melakukan penghapusan jika terdapat kesamaan pada database signature.db. b. Aplikasi dapat melakukan penambahan dan penyimpanan data penanda (signature.db).
Adapun
keluarannya
berupa
file
notepad
bernama
signature.db. c. Aplikasi dapat menampilkan file laporan hasil dari pendeteksian jika terdapat file yang dihapus. 2. Selama pembuatan aplikasi ini, penulis menemui beberapa kekurangan di antaranya: a. Pada saat penambahan data signature.db harus dilakukan secara manual, dan perlu interaksi dari pengguna untuk menambahkannya. Kondisi ini memberikan ketidaknyamanan pengguna atau user dalam memanfaatkan aplikasi ini.
96
97
b. Aplikasi ini tidak bisa melihat nilai checksum dari file yang yang berada didalam folder, jadi pengguna harus membuka folder tersebut lalu baru dipilh lagi file yang akan diketahui nilai checksumnya..
5.2 Saran Beberapa saran penulis dalam pengembangan aplikasi antivirus selanjutnya, adalah sebagai berikut: 1. Berdasarkan kesimpulan di atas maka sangat disarankan dalam pengelolaan data signature dapat menggunakan basis data dalam penyimpanannya sehingga lebih terjaga data signature tersebut. Untuk updating data signature perlu dibuat program kecil yang mempunyai mekanisme untuk menambahkan data signature secara otomatis. Dengan kata lain program ini akan membuka file database yang diikuti dengan penambahan data signature yang baru, dan kemudian menutup aplikasi tersebut. 2. Sangat disarankan agar aplikasi langsung melakukan pemeriksaan secara otomatis ketika komputer dalam keadaan aktif. Dengan cara program ini diinstalasi supaya terdaftar dalam program booting dari computer itu. 3. Harus dibuat satu mekanisme dari program ini untuk bisa mendeteksi dan membuka folder sehingga file yang berada didalam folder bisa diketahui nilai checksumnya.
DAFTAR PUSTAKA
Darmal, Achmad. 2006a. Computer Worm 1. Jakarta : Jasakom. ----------. 2006b. Computer Worm 2. Jakarta : Jasakom. Grady Booch, James Rumbaugh, dan Ivar Jacobson. 1998. The Unified Modeling Language User Guide. Canada: Addison-Wesley Publishing Company. Hariyanto, Bambang. 1999. Sistem Operasi. Edisi Kedua. Bandung : Penerbit INFORMATIKA Bandung. Munawar. 2005. Pemodelan Visual dengan UML. Yogyakarta: Penerbit Graha Ilmu. Pressman, Roger S. 2002. Rekayasa Perangkat Lunak Buku 1. Yogyakarta: Penerbit Andi. _________(2006), PC Viruses in-the-wild 2005-2006, Wildlist Organization Internationa, http://www.wildlist.org/ _________(2006), PT Vaksincom, http://vaksin.com/
96
Kode Program
Frm Main Option Explicit
'------Buat Kill Process------Dim hProcess As Long Dim Split_Process() As String
Private WithEvents X As cCommonDialog Private CurrentFile As String Dim sPicScan, SpicOther, sHelpAbout As pStatus
Split_Process = Split(ListView1.SelectedItem.SubIt ems(4), "\")
Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * 260 End Type
For i = 1 To ListView1.ListItems.count
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private sDrives() As String Dim AppActive(100) As String Dim RemoveApp(16) As String Dim NumberOfProg As String Dim counter As Integer Dim BlinkThread(16) As Boolean Dim KEY_ALL_ACCESS As Long Private Sub stopprocess()
Dim i As Integer
If UCase(ListView1.ListItems.Item(i)) = "LSASS.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "EKSPLORASI.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "SMSS.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0
End If If UCase(ListView1.ListItems.Item(i)) = "CSRSS.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "BRONSTAB.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "SERVICES.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If
If UCase(ListView1.ListItems.Item(i)) = "EMPTY.PIF" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "XPSHARE.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If If UCase(ListView1.ListItems.Item(i)) = "SYSSRV.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If Next i
If UCase(ListView1.ListItems.Item(i)) = "WINLOGON.EXE" And ListView1.ListItems.Item(i).SubIte ms(2) = 8 And ListView1.ListItems.Item(i).SubIte ms(3) = 1 Then hProcess = OpenProcess(&H1F0FFF, 1, Val("&H" + ListView1.ListItems.Item(i).SubIte ms(1))) TerminateProcess hProcess, 0 End If
Dim loop_Process As Long For loop_Process = 1 To 1000 DoEvents Next Call Update Err_Terminate: Exit Sub
'---------Akhir Kill Process-------End Sub
Private Function Update() Dim count, i As Integer Dim hSnapShot As Long, nProcess As Long Dim nPid As Long Dim uProcess As PROCESSENTRY32 Dim ExeFile() As String Dim Item As Object
hSnapShot = CreateToolhelpSnapshot(2, 0) uProcess.dwSize = LenB(uProcess) nProcess = Process32First(hSnapShot, uProcess) With ListView1 .ListItems.Clear Do While nProcess ExeFile = Split(uProcess.szExeFile, "\") Set Item = .ListItems.Add(, , ExeFile(UBound(Split(uProcess.szEx eFile, "\")))) Item.SubItems(1) = Hex(uProcess.th32ProcessID) Item.SubItems(2) = uProcess.pcPriClassBase Item.SubItems(3) = uProcess.cntThreads Item.SubItems(4) = uProcess.th32ParentProcessID AppActive(count) = UCase(uProcess.szExeFile) nProcess = Process32Next(hSnapShot, uProcess) For i = 1 To Val(NumberOfProg) If UCase(AppActive(count)) = UCase(RemoveApp(i)) Then BlinkThread(i) = True End If Next i count = count + 1 Loop End With counter = count CloseHandle hSnapShot End Function
End Sub Private Sub Form_Load() Set X = New cCommonDialog Set ccClass = X frmMain.Cls BuildUI sPicScan = Min SpicOther = Min sHelpAbout = Max FormCenter Me End Sub Private Sub Form_Unload(Cancel As Integer) If GetSetting(AV.AVname, "settings", "countvirus", 0) > 0 Then DeleteSetting AV.AVname, "Settings", "countVirus" End If If GetSetting(AV.AVname, "settings", "countFiles", 0) > 0 Then DeleteSetting AV.AVname, "Settings", "countFiles" End If End Sub Private Sub lblAbuthelp_Click() Dim temp, temp2 As Integer
If sHelpAbout = Max Then For temp = 1 To 1695 - 255 picHelpAbout.Height = picHelpAbout.Height - 1 DoEvents Next sHelpAbout = Min ElseIf sHelpAbout = Min Then If sPicScan = Max Then lblFileScan_Click If SpicOther = Max Then lblOther_Click For temp = 1 To 1695 - 255 picHelpAbout.Height = picHelpAbout.Height + 1 DoEvents Next sHelpAbout = Max End If End Sub Private Sub lblFileScan_Click() Dim temp, temp2 As Integer
Private Sub cmdScan_Click() CheckFile (CurrentFile)
If sPicScan = Max Then For temp = 1 To 2415 - 255 picScan.Height = picScan.Height - 1
picOther.Top = picScan.Top + picScan.Height + 20 picHelpAbout.Top = picOther.Top + picOther.Height + 20 DoEvents Next sPicScan = Min ElseIf sPicScan = Min Then If sHelpAbout = Max Then lblAbuthelp_Click If SpicOther = Max Then lblOther_Click For temp = 1 To 2415 - 255 picScan.Height = picScan.Height + 1 picOther.Top = picScan.Top + picScan.Height + 20 picHelpAbout.Top = picOther.Top + picOther.Height + 20 DoEvents Next sPicScan = Max End If End Sub Private Sub lblOther_Click() Dim temp, temp2 As Integer If SpicOther = Max Then For temp = 1 To 1815 - 255 picOther.Height = picOther.Height - 1 picHelpAbout.Top = picOther.Top + picOther.Height + 20 DoEvents Next SpicOther = Min ElseIf SpicOther = Min Then If sHelpAbout = Max Then lblAbuthelp_Click If sPicScan = Max Then lblFileScan_Click
If lblText(7).Caption = "OFF" Then frmTray.Show , Me Else 'NOT LBLTEXT(7).CAPTION... Unload frmTray End If ElseIf Index = 9 Then 'NOT INDEX... If lblText(8).Caption = "OFF" Then SetKeyValue HKEY_CURRENT_USER, "SOFTWARE\Microsoft\Windows\Curren tVersion\Run", AV.AVname, App.Path & "\" & App.EXEName & ".exe /T", 1 lblText(8).Caption = "ON" SaveSetting AV.AVname, "Settings", "Startup", "ON" Else 'NOT LBLTEXT(8).CAPTION... DeleteValue HKEY_CURRENT_USER, "SOFTWARE\Microsoft\Windows\Curren tVersion\Run", AV.AVname lblText(8).Caption = "OFF" SaveSetting AV.AVname, "Settings", "Startup", "OFF" End If End If On Error GoTo 0 End Sub
Private Sub picFastsearch_Click() X.ControlToSetNewParent = Picture1 Debug.Print X.ShowOpen(Me.hwnd)
End Sub For temp = 1 To 1815 - 255 picOther.Height = picOther.Height + 1 picHelpAbout.Top = picOther.Top + picOther.Height + 20 DoEvents Next SpicOther = Max End If End Sub Private Sub lblText_Click(Index As Integer)
Private Sub picFastSearchx_Click(Index As Integer) X.ControlToSetNewParent = Picture1 Debug.Print X.ShowOpen(Me.hwnd) End Sub Private Sub picFileSearch_Click() Call ShowFileSearch
On Error Resume Next If Index = 6 Then
End Sub
Private Sub picPathsearch_Click() Call Update Call stopprocess Call Update Call stopprocess Call Update Call stopprocess '/////////////Registry w32.rontokbro@mm////////////////// /// CreateIntegerKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Explorer\Advanced\Hi deFileExt", 0 CreateIntegerKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Explorer\Advanced\Hi dden", 1 CreateIntegerKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Explorer\Advanced\Sh owSuperHidden", 1 DeleteKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Policies\Explorer\No FolderOptions" DeleteKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Policies\System\Disa bleRegistryTools" DeleteKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Policies\System\Disa bleRegedit" DeleteKey "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell" DeleteKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Policies\System\Disa bleCMD" DeleteKey "HKCU\Software\Microsoft\Windows\C urrentVersion\Run\Tok-Cirrhatus" DeleteKey "HKLM\SOFTWARE\Microsoft\Windows\C urrentVersion\Run\Bron-Spizaetus" DeleteKey "HKCU\software\microsoft\windows\s hellnoroam\MUICache\bronstab" DeleteKey "HKCU\software\microsoft\windows\s hellnoroam\MUICache\eksplorasi" '///////////////////////////////// ///////////////////////// Checkfolder
Private Sub Picture2_Click() CheckfolderSystem End Sub
Public Sub ShowFileSearch() Dim strfilename As String On Error Resume Next strfilename = (ShowOpenDlg(Me, , "Seluruh Data|*.*", , "Scan File")) If FileLen(strfilename) <> 0 Then CheckFile (strfilename) End If On Error GoTo 0 End Sub Private Sub txtstop_Click() Dim tanya Running = False tanya = MsgBox("Apakah proses ingin dihentikan?", vbYesNo, "Perhatian") If tanya = vbNo Then Running = True Else Running = False Exit Sub End If End Sub Private Sub X_FileChanged(ByVal FileName As String) lblFileName.Caption = Mid$(FileName, InStrRev(FileName, "\") + 1) lblText(12).Caption = FileLen(FileName) & " Bytes" lblText(14).Caption = CalcCRC(FileName) CurrentFile = FileName End Sub
Frm Tray Option Explicit Private Sub Basket_DblClick()
MsgBox "Pemeriksaan telah selesai!!", 0, "Trojan Remover" End Sub
AV.Runmode = Normal frmMain.Show Unload Me End Sub
Private Sub Form_Load()
Private Sub Basket_OLEDragDrop(Data As DataObject, _
Image1.Visible = True Image3.Visible = False
Effect As Long, _ Button As Integer, _ Shift As Integer, _ X As Single, _ Y As Single) Dim file As Variant Dim k As Long On Error GoTo droperror k = 0 For Each file In Data.Files If LenB(Dir(file)) > 0 And Not vbDirectory Then CheckFile (file) k = k + 1 End If Next ' FILE ' FILE MsgBox k & " files checked!" Exit Sub droperror: End Sub Private Sub Form_Load() KeepOnTop Me frmMain.lblText(7).Caption = "ON" Me.Left = GetSetting(AV.AVname, "Settings", "TrayLeft", 0) Me.Top = GetSetting(AV.AVname, "Settings", "TrayTop", 0) End Sub Private Sub Form_Unload(Cancel As Integer) frmMain.lblText(7).Caption = "OFF" SaveSetting AV.AVname, "Settings", "TrayLeft", Me.Left SaveSetting AV.AVname, "Settings", "TrayTop", Me.Top If AV.Runmode = TrayOnly Then End End If End Sub
Frm Utama
idet.Visible = True idetb.Visible = False ihome.Visible = True ihomeb.Visible = False ihub.Visible = True ihubb.Visible = False iexit.Visible = True iexitb.Visible = False Image1.Height = 3000 Image1.Width = 6015 FormCenter Me End Sub Private Sub Form_Unload(Cancel As Integer) End End Sub Private Sub idet_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) idet.Visible = False idetb.Visible = True lbldet.ForeColor = vbBlue End Sub Private Sub idetb_Click() frmMain.Show End Sub Private Sub ihomeb_Click() Image1.Visible = True Image3.Visible = False End Sub Private Sub ihome_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ihome.Visible = False ihomeb.Visible = True lblhome.ForeColor = vbBlue End Sub Private Sub ilap_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ilap.Visible = False ilapb.Visible = True lbllap.ForeColor = vbBlue End Sub Private Sub ihubb_Click() Image1.Visible = False Image3.Visible = True End Sub Private Sub ihub_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ihub.Visible = False ihubb.Visible = True
lblcon.ForeColor = vbBlue End Sub Private Sub iexit_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) iexit.Visible = False iexitb.Visible = True lblexit.ForeColor = vbBlue End Sub Private Sub iexitb_Click() End End Sub Private Sub ilapb_Click() frmSecFiles.Show End Sub Private Sub image2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) lbldet.ForeColor = &H808080 lblhome.ForeColor = &H808080 lblcon.ForeColor = &H808080 lblexit.ForeColor = &H808080 idet.Visible = True idetb.Visible = False ihome.Visible = True ihomeb.Visible = False ihub.Visible = True ihubb.Visible = False iexit.Visible = True iexitb.Visible = False End Sub Private Sub lbldet_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) lbldet.ForeColor = vbWhite idet.Visible = False idetb.Visible = True End Sub Private Sub lbldet_Click() frmMain.Show End Sub
Integer, Shift As Integer, X Single, Y As Single) lbllap.ForeColor = vbWhite ilap.Visible = False ilapb.Visible = True End Sub Private Sub lblcon_MouseMove(Button As Integer, Shift As Integer, X Single, Y As Single) lblcon.ForeColor = vbWhite ihub.Visible = False ihubb.Visible = True End Sub Private Sub lblexit_MouseMove(Button As Integer, Shift As Integer, X Single, Y As Single) lblexit.ForeColor = vbWhite iexit.Visible = False iexitb.Visible = True End Sub Private Sub lblhome_MouseMove(Button As Integer, Shift As Integer, X Single, Y As Single) lblhome.ForeColor = vbWhite ihome.Visible = False ihomeb.Visible = True End Sub
As
As
As
As
Bas Common Dialog Option Explicit Public ccClass cCommonDialog
As
Public Function ComDlgCallback(ByVal hWndDlg As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long
Private Sub lblhome_Click() Image1.Visible = True Image3.Visible = False End Sub Private Sub lbllap_Click() frmSecFiles.Show End Sub Private Sub lblcon_Click() Image1.Visible = False Image3.Visible = True End Sub Private Sub lblexit_Click() End End Sub Private Sub lbllap_MouseMove(Button As
If Not ccClass Is Nothing Then ccClass.pIncomingMessage hWndDlg, Msg, wParam, lParam End If End Function
Mdl Registry Option Explicit Private Const REG_SZ As Long = 1 Private Const REG_DWORD As Long = 4 Public Const HKEY_CURRENT_USER As Long = &H80000001
Private Const KEY_ALL_ACCESS As Long = &H3F Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Private Declare Function RegSetValueExString Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As String, ByVal cbData As Long) As Long Private Declare Function RegSetValueExLong Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey) lRetVal = RegDeleteValue(hKey, sValueName) RegCloseKey (hKey)
Public Sub CreateNewKey(lPredefinedKey As Long, sNewKeyName As String)
Private Function SetValueEx(ByVal hKey As Long, _
End Sub Public Sub SetKeyValue(lPredefinedKey As Long, _ sKeyName As String, _ sValueName As String, _ vValueSetting As Variant, _ lValueType As Long) Dim lRetVal As Long Dim hKey As Long 'handle of open key lRetVal = RegOpenKeyEx(lPredefinedKey, sKeyName, 0, KEY_ALL_ACCESS, hKey) lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting) RegCloseKey (hKey) End Sub
sValueName As String, _ lType
Dim lRetVal As Long, _ Dim hNewKey As Long 'handle to the new key 'lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0&, hNewKey, lRetVal) RegCloseKey (hNewKey) End Sub Public Sub DeleteValue(lPredefinedKey As Long, sKeyName As String, sValueName As String)
Dim lRetVal As Long Dim hKey As Long 'handle of open key 'open the specified key
vValue As Variant) As Long Dim lValue As Long Dim sValue As String Select Case lType Case REG_SZ sValue = vValue SetValueEx = RegSetValueExString(hKey, sValueName, 0&, lType, sValue, Len(sValue)) Case REG_DWORD lValue = vValue SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, lType, lValue, 4) End Select End Function
Mod Antivir
Option Explicit
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
.lblText(3).ForeColor = vbRed .lblText(3).ToolTipText = "Perlu mengupdate virus list, karena sudah out of date!" End If .lblText(5).Caption = AV.Signature.SignatureCount .lblText(8).Caption = GetSetting(AV.AVname, "Settings", "Startup", "OFF") End With 'FRMMAIN End If
Public Sub BuildUI()
End Sub
If AV.Runmode <> TrayOnly Then 'jika runmodenya <> trayonly kerjakan perintah dibawahnya With frmMain .lblText(1).Caption = GetSetting(AV.AVname, "Settings", "countFiles", 0) & ", Trojan Ditemukan: " & GetSetting(AV.AVname, "Settings", "countVirus", 0) .lblText(3).Caption = AV.Signature.SignatureDate If CDate(AV.Signature.SignatureDate) < Date Then
Public Function CheckFile(ByVal strfilename As String) As Boolean
.lblText(3).ForeColor = vbRed
If strResult <> "NOTHING" Then 'jika strresult tidak sama dengan "NOTHING" maka lakukan kode dibwh ini Virus.FileName = strfilename 'Nama file yang terinfeksi disimpan pada Virus.Filename Virus.Reason = strResult 'virus tersebut adalah type yang didefinisikan di modDeclarations temp = Split(Virus.FileName, "\") 'dimasukkan variabel temp dan dipisah jika ada tanda \ Virus.FileNameShort = temp(UBound(temp)) 'nama file yang pendek SaveSetting AV.AVname, "Settings", "countVirus", GetSetting(AV.AVname, "Settings", "countVirus", 0) + 1 'masukkan ke file setting jumlah virus yang ditangkap Log "Virus " & Virus.FileName & " Dihapus!"
.lblText(3).ToolTipText = "Perlu mengupdate virus list, karena sudah out of date!" End If .lblText(5).Caption = AV.Signature.SignatureCount .lblText(8).Caption = GetSetting(AV.AVname, "Settings", "Startup", "OFF") End With 'FRMMAIN End If End Sub Public Sub Kosong() If AV.Runmode <> TrayOnly Then 'jika runmodenya <> trayonly kerjakan perintah dibawahnya With frmMain '.lblText(1).Caption = GetSetting(AV.AVname, "Settings", "countFiles", 0) & ", Virus Ditemukan: " & GetSetting(AV.AVname, "Settings", "countVirus", 0) .lblText(3).Caption = AV.Signature.SignatureDate If CDate(AV.Signature.SignatureDate) < Date Then
Dim strResult As String 'Definisi variabel Dim temp() As String 'definisi temp CheckFile = False 'memberi nilai checkfile = false strResult = Search(strfilename) 'beri nilai strResult = pencarian dari strfilename
RemoveFile (Virus.FileName) GoTo lolos End If 'akhir if
If UCase(Mid(strfilename, Len(strfilename) - 8, 10)) = "EMPTY.PIF" Then MsgBox " Ada virus baru di direktory : " & Left(strfilename, Len(strfilename) - 9) & _ vbCrLf & " Nama File : " & Mid(strfilename, Len(strfilename) - 8, 10) & vbCrLf & "COBA CHECK DENGAN CRC!!!", _ vbCritical, "INDIKASI VIRUS VARIAN BARU" Exit Function End If lolos: SaveSetting AV.AVname, "Settings", "countFiles", GetSetting(AV.AVname, "Settings", "countFiles", 0) + 1 'masukkan ke file setting jumlah file yg diperiksa BuildUI 'Nama SUB DoEvents End Function Public Function FileText(ByVal strfilename As String) As String Dim handle As Long handle = FreeFile Open strfilename For Binary As #handle FileText = Space$(LOF(handle)) Get #handle, , FileText Close #handle End Function Private Function IsWinNT() As Boolean
SetWindowPos F.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE End Sub Public Function LoadIcon(size As Long, _ ByVal FileName As String) As IPictureDisp
Dim Result As Long Dim file As String Dim Unkown As IUnknown Dim Icon As IconType Dim CLSID As CLSIdType Dim ShellInfo As ShellFileInfoType file = FileName Call SHGetFileInfo(file, 0, ShellInfo, Len(ShellInfo), size) With Icon .cbSize = Len(Icon) 'memasukkan ikon .picType = vbPicTypeIcon .hIcon = ShellInfo.hIcon End With 'Icon CLSID.Id(8) = &HC0 CLSID.Id(15) = &H46 Result = OleCreatePictureIndirect(Icon, CLSID, 1, Unkown) Set LoadIcon = Unkown End Function Public Sub Main() ' With AV .AVname = "Wedash Antivirus 2005" ' set nama AV
Dim myOS As OSVERSIONINFO myOS.dwOSVersionInfoSize = Len(myOS) 'MENCARI versi Operating System GetVersionEx myOS IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) End Function Public Sub KeepOnTop(F As Form) Const SWP_NOMOVE As Long = 2 'menjaga agar form tetap keep on top Const SWP_NOSIZE As Long = 1 Const HWND_TOPMOST As Long = -1
.Signature.SignatureFilename = App.Path & "\signatures.db" 'ambil file signature.db .Signature.SignatureOnlineFilename = "http://www.virologi.info/download /signatures.db" 'ambil signatureonline pada website yg tertulis End With 'AV BuildSigns 'CheckExe RegisterFile ".secure", "File ini diamankan oleh" & AV.AVname, " ", App.Path & "\" & App.EXEName & ".exe /R %1", App.Path & "\secicon.ico" Select Case UCase$(Left$(Command, 2))
Case "/S" CheckFile (Mid$(Command, 3, Len(Command) - 3)) Case vbNullString BuildUI frmUt.Show Case "/G" BuildUI frmUt.Show Case "/U" frmUt.Show Case "/C" BuildUI frmUt.Show AV.Runmode = Normal Call frmMain.ShowFileSearch Case "/T" frmTray.Show AV.Runmode = TrayOnly Case "/F" AV.Runmode = ScanFile Checkfolder (Mid$(Command, 3, Len(Command) - 3)) Case "/R" MsgBox "File ini telah diamankan! jika ingin mengembalikan file, ke: Main/Extras/Secured Files" End Case Else MsgBox "Invalid Parameter!" End Select 'frmMain.Hide End Sub
Optional ByVal DlgTitle As String) As String Dim sBuf As String InitialDir = IIf(IsMissing(InitialDir), vbNullString, InitialDir) strFilter = IIf(IsMissing(strFilter), "Seluruh Data|*.*", Replace(strFilter, "|", vbNullChar)) & vbNullChar DefaultExtension = IIf(IsMissing(DefaultExtension), vbNullString, DefaultExtension) DlgTitle = IIf(IsMissing(DlgTitle), "Data tidak ada", DlgTitle) sBuf = Space$(256) If IsWinNT Then Call GetFileNameFromBrowseW(Owner.hwnd, StrPtr(sBuf), Len(sBuf), StrPtr(InitialDir), StrPtr(DefaultExtension), StrPtr(strFilter), StrPtr(DlgTitle)) Else 'ISWINNT = FALSE/0 Call GetFileNameFromBrowseA(Owner.hwnd, sBuf, Len(sBuf), InitialDir, DefaultExtension, strFilter, DlgTitle) End If ShowOpenDlg = Trim$(sBuf) End Function
Public Sub RemoveFile(ByVal strfilename As String) Dim Files As String Dim SFO As SHFILEOPSTRUCT DoEvents Files = strfilename & Chr$(0) Files = Files & Chr$(0) DeleteFile (Virus.FileName) End Sub Public Function ShowOpenDlg(ByVal Owner As Form, _ Optional ByVal InitialDir As String, _ Optional ByVal strFilter As String, _ Optional ByVal DefaultExtension As String, _
Public Function FileExist(strfilename As String) As Boolean On Error Resume Next FileExist = True If FileLen(strfilename) = 0 Then FileExist = False End If End Function
Mod Antivir2 Option Explicit Private Const FILE_ATTRIBUTE_READONLY = &H1 Private Const FILE_ATTRIBUTE_HIDDEN = &H2 Private Const FILE_ATTRIBUTE_SYSTEM = &H4 Private Const FILE_ATTRIBUTE_DIRECTORY = &H10 Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_NORMAL = &H80 Private Const FILE_ATTRIBUTE_TEMPORARY = &H100 Private Const FILE_ATTRIBUTE_COMPRESSED = &H800 Private Const MAX_PATH = 260 Private Const INVALID_HANDLE_VALUE = -1 Private Const &H80000000 Private Const &H40000000 Private Const &H1 Private Const &H2 Private Const Private Const
If lResult = ERROR_SUCCESS Then CreateKey = True RegCloseKey (lhKeyNew) Else CreateKey = False End If RegCloseKey (lhKeyOpen) End Function
GENERIC_READ = GENERIC_WRITE = FILE_SHARE_READ = FILE_SHARE_WRITE = CREATE_NEW = 1 OPEN_EXISTING = 3
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Function OpenKey(lhKey As Long, SubKey As String, ulOptions As Long) As Long Dim lhKeyOpen As Long Dim lResult As Long lhKeyOpen = 0 lResult = RegOpenKeyEx(lhKey, SubKey, 0, ulOptions, lhKeyOpen) If lResult <> ERROR_SUCCESS Then OpenKey = 0 Else OpenKey = lhKeyOpen End If End Function Private Function CreateKey(lhKey As Long, SubKey As String, NewSubKey As String) As Boolean Dim lhKeyOpen As Long Dim lhKeyNew As Long Dim lDisposition As Long Dim lResult As Long Dim Security As SECURITY_ATTRIBUTES lhKeyOpen = OpenKey(lhKey, SubKey, KEY_CREATE_SUB_KEY) lResult = RegCreateKeyEx(lhKeyOpen, NewSubKey, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, Security, lhKeyNew, lDisposition)
Private Function SetValue(lhKey As Long, SubKey As String, sValue As String) As Boolean Dim lhKeyOpen As Long Dim lResult As Long Dim lTyp As Long Dim lByte As Long lByte = Len(sValue) lTyp = REG_SZ lhKeyOpen = OpenKey(lhKey, SubKey, KEY_SET_VALUE) lResult = RegSetValue(lhKey, SubKey, lTyp, sValue, lByte) If lResult <> ERROR_SUCCESS Then SetValue = False Else SetValue = True RegCloseKey (lhKeyOpen) End If End Function Public Function RegisterFile(sFileExt As String, sFileDescr As String, sAppID As String, sOpenCmd As String, sIconFile As String) As Boolean Dim hKey As Long Dim bSuccess As Boolean Dim bSuccess2 As Boolean bSuccess = False hKey = HKEY_LOCAL_MACHINE If CreateKey(hKey, REG_PRIMARY_KEY, sFileExt) Then If SetValue(hKey, REG_PRIMARY_KEY & sFileExt, sAppID) Then If CreateKey(hKey, REG_PRIMARY_KEY, sAppID) Then If SetValue(hKey, REG_PRIMARY_KEY & sAppID, sFileDescr) Then If CreateKey(hKey, REG_PRIMARY_KEY & sAppID, _ REG_SHELL_KEY & REG_SHELL_OPEN_KEY & _ REG_SHELL_OPEN_COMMAND_KEY) Then bSuccess = SetValue(hKey, REG_PRIMARY_KEY & _ sAppID & "\" & REG_SHELL_KEY & _
REG_SHELL_OPEN_KEY & _ REG_SHELL_OPEN_COMMAND_KEY, sOpenCmd) If CreateKey(hKey, REG_PRIMARY_KEY & sAppID, _ REG_ICON_KEY) Then bSuccess2 = SetValue(hKey, REG_PRIMARY_KEY & _ sAppID & "\" & REG_ICON_KEY, sIconFile) End If End If End If End If End If End If RegisterFile = (bSuccess = bSuccess2) End Function Public Function CalcCRC(strfilename As String) As String Dim cCRC32 As New cCRC32 'definisi var cCRC32 sebagai var yang baru Dim lCRC32 As Long 'definisi var ICRC32 sebagai Long Integer Dim cStream As New cBinaryFileStream 'definisi cStream sebagai cBinaryFileStream cStream.file = strfilename 'cStream.file di dimasukkan file yang sedang dicari lCRC32 = cCRC32.GetFileCrc32(cStream) 'lCRC32 diberi nilai dari pengambilan class cCRC32.GetFileCrc32 dengan nilai cStream CalcCRC = Hex$(lCRC32) 'memberi nilai CalcCRC dari nilai hexa lCRC32 End Function Public Function LongFilename( _ ByRef FilePath As String) As String Const INVALID_VALUE = -1 Dim hFind As Long Dim WFD As WIN32_FIND_DATA hFind = FindFirstFileA(FilePath, WFD) If hFind <> INVALID_VALUE Then LongFilename = LeftB$(WFD.cFileName, _ InStrB(WFD.cFileName, vbNullChar)) FindClose hFind
End If End Function Public Sub CheckExe() On Error GoTo Ignore If GetSetting(AV.AVname, "Settings", "WAV 2005", CalcCRC(App.Path & "\" & App.EXEName & ".exe")) <> CalcCRC(App.Path & "\" & App.EXEName & ".exe") Then MsgBox "Program mungkin rusak,install ulang!!!", vbCritical + vbOKOnly, "Error" End End If SaveSetting AV.AVname, "Settings", "WAV 2005", CalcCRC(App.Path & "\" & App.EXEName & ".exe") Ignore: End Sub Public Sub Checkfolder(Optional ByVal StrFolder As String) Dim Result As Variant Dim c As Collection On Error Resume Next If StrFolder = vbNullString Then Set Result = SH.BrowseForFolder(frmMain.hwnd, "Pilih Folder yang akan di scan", 1) End If With Result.Items.Item FullPathSearch .Path, c, , , , True End With 'RESULT.ITEMS.ITEM On Error GoTo 0 End Sub Public Sub CheckfolderSystem(Optional ByVal StrFolder As String) Dim Result As Variant Dim c As Collection On Error Resume Next 'If StrFolder = vbNullString Then Set Result = SH.BrowseForFolder(frmMain.hwnd, "Pilih Folder yang akan di scan", 1) MsgBox SH.BrowseForFolder(frmMain.hwnd,
"Pilih Folder yang akan di scan", 1) 'Set Result = "C:\" 'End If 'With Result.Items.Item ' FullPathSearch .Path, c, , , , True 'MsgBox Result 'frmMain.List1.AddItem .Path 'End With 'RESULT.ITEMS.ITEM 'On Error GoTo 0 End Sub Private Function FindFiles(ByVal Path As String, _ ByRef Files As Collection, _ Optional ByVal Pattern As String = "*.*", _ Optional ByVal Attributes As VbFileAttribute = vbNormal, _ Optional ByVal Recursive As Boolean = True) As Long Const vbErr_PathNotFound = 76 Const INVALID_VALUE = -1 Dim FileAttr Dim FileName String Dim hFind Dim WFD WIN32_FIND_DATA Dim X
As Long As Long As Long As As Long As As Long
'For ictr = 65 To 90 ' sDrive = Chr(ictr) & ":\" 'Next If Mid$(Path, Len(Path) - 1, 1) <> "\" Then Path = Path & "\" If Mid(Path, 4, 1) = "\" Then Path = Left(Path, 3) & Mid(Path, 5, Len(Path)) End If End If If Files Is Nothing Then Set Files = New Collection End If Pattern = LCase$(Pattern) hFind = FindFirstFileA(Path & "*", WFD) If hFind = INVALID_VALUE Then err.Raise vbErr_PathNotFound End If Do
FileName = LeftB$(WFD.cFileName, InStrB(WFD.cFileName, vbNullChar)) FileAttr = GetFileAttributesA(Path & FileName) If FileName = "eksplorasi.exe" Or FileName = "bronstab.exe" Then X = SetFileAttributes(Path & FileName, &H80) End If If FileAttr And vbDirectory Then If Recursive Then If FileAttr <> INVALID_VALUE Then If FileName <> "." Then If FileName <> ".." Then FindFiles = FindFiles + FindFiles(Path & FileName, Files, Pattern, Attributes) End If End If End If End If Else 'NOT FILEATTR... If (FileAttr And Attributes) = Attributes Then If LCase$(FileName) Like Pattern Then FindFiles = FindFiles + 1 Files.Add Path & FileName End If End If End If Loop While FindNextFileA(hFind, WFD) FindClose hFind End Function Public Sub FullPathSearch(ByRef Path As String, _ ByRef Files As Collection, _ Optional ByVal Compare As VbCompareMethod = vbBinaryCompare, _ Optional ByVal Pattern As String = "*.*", _ Optional ByVal Attributes As VbFileAttribute = vbNormal, _ Optional ByVal Recursive As Boolean = False)
Dim Candidates As Collection Dim file As Variant Running = True If Files Is Nothing Then Set Files = New Collection End If FindFiles Path, Candidates, Pattern, Attributes, Recursive For Each file In Candidates If CheckFile(file) Then Exit Sub End If If Running = False Then Exit Sub Else End If Next file End Sub Public Sub Log(strLog As String) Dim ff As Integer ff = FreeFile On Error Resume Next MkDir App.Path & "\Logs" Open App.Path & "\Logs\" & Replace(Date, "/", "_") & ".txt" For Append As #ff Print #ff, "[" & Time & "] " & strLog Close #ff End Sub
Mod Center Option Explicit Private Const FILE_ATTRIBUTE_READONLY = &H1 Private Const FILE_ATTRIBUTE_HIDDEN = &H2 Private Const FILE_ATTRIBUTE_SYSTEM = &H4 Private Const FILE_ATTRIBUTE_DIRECTORY = &H10 Private Const FILE_ATTRIBUTE_ARCHIVE = &H20 Private Const FILE_ATTRIBUTE_NORMAL = &H80 Private Const FILE_ATTRIBUTE_TEMPORARY = &H100 Private Const FILE_ATTRIBUTE_COMPRESSED = &H800 Private Const MAX_PATH = 260 Private Const INVALID_HANDLE_VALUE = -1 Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2 Private Const CREATE_NEW = 1 Private Const OPEN_EXISTING = 3
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Function OpenKey(lhKey As Long, SubKey As String, ulOptions As Long) As Long Dim lhKeyOpen As Long Dim lResult As Long lhKeyOpen = 0 lResult = RegOpenKeyEx(lhKey, SubKey, 0, ulOptions, lhKeyOpen) If lResult <> ERROR_SUCCESS Then OpenKey = 0 Else OpenKey = lhKeyOpen End If End Function Private Function CreateKey(lhKey As Long, SubKey As String, NewSubKey As String) As Boolean Dim lhKeyOpen As Long Dim lhKeyNew As Long Dim lDisposition As Long Dim lResult As Long Dim Security As SECURITY_ATTRIBUTES lhKeyOpen = OpenKey(lhKey, SubKey, KEY_CREATE_SUB_KEY) lResult = RegCreateKeyEx(lhKeyOpen, NewSubKey, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, Security, lhKeyNew, lDisposition) If lResult = ERROR_SUCCESS Then CreateKey = True RegCloseKey (lhKeyNew) Else CreateKey = False End If RegCloseKey (lhKeyOpen) End Function Private Function SetValue(lhKey As Long, SubKey As String, sValue As String) As Boolean Dim lhKeyOpen As Long Dim lResult As Long
Dim lTyp As Long Dim lByte As Long lByte = Len(sValue) lTyp = REG_SZ lhKeyOpen = OpenKey(lhKey, SubKey, KEY_SET_VALUE) lResult = RegSetValue(lhKey, SubKey, lTyp, sValue, lByte) If lResult <> ERROR_SUCCESS Then SetValue = False Else SetValue = True RegCloseKey (lhKeyOpen) End If End Function Public Function RegisterFile(sFileExt As String, sFileDescr As String, sAppID As String, sOpenCmd As String, sIconFile As String) As Boolean Dim hKey As Long Dim bSuccess As Boolean Dim bSuccess2 As Boolean bSuccess = False hKey = HKEY_LOCAL_MACHINE If CreateKey(hKey, REG_PRIMARY_KEY, sFileExt) Then If SetValue(hKey, REG_PRIMARY_KEY & sFileExt, sAppID) Then If CreateKey(hKey, REG_PRIMARY_KEY, sAppID) Then If SetValue(hKey, REG_PRIMARY_KEY & sAppID, sFileDescr) Then If CreateKey(hKey, REG_PRIMARY_KEY & sAppID, _ REG_SHELL_KEY & REG_SHELL_OPEN_KEY & _ REG_SHELL_OPEN_COMMAND_KEY) Then bSuccess = SetValue(hKey, REG_PRIMARY_KEY & _ sAppID & "\" & REG_SHELL_KEY & _ REG_SHELL_OPEN_KEY & _ REG_SHELL_OPEN_COMMAND_KEY, sOpenCmd) If CreateKey(hKey, REG_PRIMARY_KEY & sAppID, _ REG_ICON_KEY) Then bSuccess2 = SetValue(hKey, REG_PRIMARY_KEY & _ sAppID & "\" & REG_ICON_KEY, sIconFile) End If End If End If End If End If
End If RegisterFile = (bSuccess = bSuccess2) End Function Public Function CalcCRC(strfilename As String) As String Dim cCRC32 As New cCRC32 'definisi var cCRC32 sebagai var yang baru Dim lCRC32 As Long 'definisi var ICRC32 sebagai Long Integer Dim cStream As New cBinaryFileStream 'definisi cStream sebagai cBinaryFileStream cStream.file = strfilename 'cStream.file di dimasukkan file yang sedang dicari lCRC32 = cCRC32.GetFileCrc32(cStream) 'lCRC32 diberi nilai dari pengambilan class cCRC32.GetFileCrc32 dengan nilai cStream CalcCRC = Hex$(lCRC32) 'memberi nilai CalcCRC dari nilai hexa lCRC32 End Function Public Function LongFilename( _ ByRef FilePath As String) As String Const INVALID_VALUE = -1 Dim hFind As Long Dim WFD As WIN32_FIND_DATA hFind = FindFirstFileA(FilePath, WFD) If hFind <> INVALID_VALUE Then LongFilename = LeftB$(WFD.cFileName, _ InStrB(WFD.cFileName, vbNullChar)) FindClose hFind End If End Function Public Sub CheckExe() On Error GoTo Ignore If GetSetting(AV.AVname, "Settings", "WAV 2005", CalcCRC(App.Path & "\" & App.EXEName & ".exe")) <> CalcCRC(App.Path & "\" & App.EXEName & ".exe") Then MsgBox "Program mungkin rusak,install ulang!!!", vbCritical + vbOKOnly, "Error" End
End If SaveSetting AV.AVname, "Settings", "WAV 2005", CalcCRC(App.Path & "\" & App.EXEName & ".exe") Ignore:
ByRef Files As Collection, _ Optional ByVal Pattern As String = "*.*", _
End Sub
Optional ByVal Attributes As VbFileAttribute = vbNormal, _
Public Sub Checkfolder(Optional ByVal StrFolder As String)
Optional ByVal Recursive As Boolean = True) As Long
Dim Result As Variant Dim c As Collection On Error Resume Next If StrFolder = vbNullString Then Set Result = SH.BrowseForFolder(frmMain.hwnd, "Pilih Folder yang akan di scan", 1) End If With Result.Items.Item FullPathSearch .Path, c, , , , True End With 'RESULT.ITEMS.ITEM On Error GoTo 0 End Sub Public Sub CheckfolderSystem(Optional ByVal StrFolder As String) Dim Result As Variant Dim c As Collection On Error Resume Next 'If StrFolder = vbNullString Then Set Result = SH.BrowseForFolder(frmMain.hwnd, "Pilih Folder yang akan di scan", 1) MsgBox SH.BrowseForFolder(frmMain.hwnd, "Pilih Folder yang akan di scan", 1) 'Set Result = "C:\" 'End If 'With Result.Items.Item ' FullPathSearch .Path, c, , , , True 'MsgBox Result 'frmMain.List1.AddItem .Path 'End With 'RESULT.ITEMS.ITEM 'On Error GoTo 0 End Sub Private Function FindFiles(ByVal Path As String, _
Const vbErr_PathNotFound = 76 Const INVALID_VALUE = -1 Dim FileAttr Dim FileName String Dim hFind Dim WFD WIN32_FIND_DATA Dim X
As Long As Long As Long As As Long As As Long
'For ictr = 65 To 90 ' sDrive = Chr(ictr) & ":\" 'Next If Mid$(Path, Len(Path) - 1, 1) <> "\" Then Path = Path & "\" If Mid(Path, 4, 1) = "\" Then Path = Left(Path, 3) & Mid(Path, 5, Len(Path)) End If End If If Files Is Nothing Then Set Files = New Collection End If Pattern = LCase$(Pattern) hFind = FindFirstFileA(Path & "*", WFD) If hFind = INVALID_VALUE Then err.Raise vbErr_PathNotFound End If Do FileName = LeftB$(WFD.cFileName, InStrB(WFD.cFileName, vbNullChar)) FileAttr = GetFileAttributesA(Path & FileName) If FileName = "eksplorasi.exe" Or FileName = "bronstab.exe" Then X = SetFileAttributes(Path & FileName, &H80) End If
If FileAttr And vbDirectory Then If Recursive Then If FileAttr <> INVALID_VALUE Then If FileName <> "." Then If FileName <> ".." Then FindFiles = FindFiles + FindFiles(Path & FileName, Files, Pattern, Attributes) End If End If End If End If Else 'NOT FILEATTR... If (FileAttr And Attributes) = Attributes Then If LCase$(FileName) Like Pattern Then FindFiles = FindFiles + 1 Files.Add Path & FileName End If End If End If Loop While FindNextFileA(hFind, WFD) FindClose hFind End Function Public Sub FullPathSearch(ByRef Path As String, _ ByRef Files As Collection, _ Optional ByVal Compare As VbCompareMethod = vbBinaryCompare, _ Optional ByVal Pattern As String = "*.*", _ Optional ByVal Attributes As VbFileAttribute = vbNormal, _ Optional ByVal Recursive As Boolean = False)
Dim Candidates As Collection Dim file As Variant Running = True If Files Is Nothing Then Set Files = New Collection End If FindFiles Path, Candidates, Pattern, Attributes, Recursive For Each file In Candidates If CheckFile(file) Then Exit Sub End If
If Running = False Then Exit Sub Else End If Next file End Sub Public Sub Log(strLog As String) Dim ff As Integer ff = FreeFile On Error Resume Next MkDir App.Path & "\Logs" Open App.Path & "\Logs\" & Replace(Date, "/", "_") & ".txt" For Append As #ff Print #ff, "[" & Time & "] " & strLog Close #ff End Sub
Mod Declarations Option Explicit Public Running As Boolean Public Type SHFILEOPSTRUCT hwnd As Long wFunc As Long pFrom As String pTo As String fFlags As Integer fAnyOperationsAborted As Boolean hNameMappings As Long lpszProgressTitle As String End Type Public Const FO_DELETE As Long = &H3 Public Type IconType cbSize As Long picType As PictureTypeConstants hIcon As Long End Type Public Type CLSIdType Id(16) As Byte End Type Public Type ShellFileInfoType hIcon As Long iIcon As Long dwAttributes As Long
szDisplayName As String * 260 szTypeName As String * 80 End Type Public Const Large As Long = &H100 Public Const VER_PLATFORM_WIN32_NT As Integer = 2 Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Private Type TypeSignature SignatureFilename As String SignatureDate As String SignatureOnlineFilename As String SignatureCount As Integer End Type Public Enum RM Normal = 0 TrayOnly = 1 ScanFile = 3 SecureFile = 4 End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private Normal, TrayOnly, ScanFile #End If #If False Then Private Normal, TrayOnly, ScanFile #End If
'//////////////Type SHItemID////////////////////////// ////////////// Private Type SHItemID cb As Long abID As Byte End Type '///////////////////////////////// /////////////////////////////
'///////////////Type Anti virus///////////////////////////// //// Private Type AntiVirus AVname As String Runmode As RM Signature As TypeSignature End Type '///////////////////////////////// /////////////////////////////
Public Enum VirusT Executable = 0 Script = 1 End Enum Public Enum pStatus Max = 1 Min = 0 End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private Executable, Script #End If '///////////////////////////////// ////////////////////////////////// ///////////
Public AV As AntiVirus
'//////////////Type ItemIDList//////////////////////// //////////////// Public Type ItemIDList mkid As SHItemID End Type '///////////////////////////////// ///////////////////////////// '//////////////Type BROWSEINFO//////////////////////// //////////////// Public Type BROWSEINFO hOwner As Long pidlRoot As Long pszDisplayName As String lpszTitle As String ulFlags As Long lpCallbackProc As Long lParam As Long iImage As Long End Type '//////////////Type BROWSEINFO//////////////////////// ////////////////
'///////////////////////////////TY PEVIRUS
////////////////////////////////// //// Private Type TypeVirus FileNameShort As String Reason As String FileName As String Type As VirusT End Type '///////////////////////////////// ////////////////////////////////// /////////// '//////////////////////////////VIR US//////////////////////////////// ////////// Public Virus As TypeVirus #If Win16 Then Public Declare Sub SetWindowPos Lib "User" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) #Else Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long #End If '///////////////////////////////// ////////////////////////////////// /////////// Public Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long
dwReserved1 As Long cFileName As String * 260 cAlternate As String * 14 End Type Public Const KEY_ALL_ACCESS = &H3F Public Const KEY_SET_VALUE = &H2 Public Const KEY_CREATE_SUB_KEY = &H4 Public Const REG_PRIMARY_KEY = "Software\Classes\" Public Const REG_SHELL_KEY = "Shell\" Public Const REG_SHELL_OPEN_KEY = "Open\" Public Const REG_SHELL_OPEN_COMMAND_KEY = "Command" Public Const REG_ICON_KEY = "DefaultIcon" Public Const REG_SZ = 1 Public Const REG_OPTION_NON_VOLATILE = 0 Public Const ERROR_SUCCESS = 0& Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long Public Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As Any, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Public Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Boolean End Type Public SH As New Shell 'reference to shell32.dll class
Public Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" (pDicDesc As IconType, riid As CLSIdType, ByVal fown As Long, lpUnk As Object) As Long Public Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" (ByVal pszPath As String, ByVal dwFileAttributes As Long, psfi As ShellFileInfoType, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long Public Declare Function GetFileNameFromBrowseW Lib "Shell32" Alias "#63" (ByVal hwndOwner As Long, ByVal lpstrFile As Long, ByVal nMaxFile As Long, ByVal lpstrInitialDir As Long, ByVal lpstrDefExt As Long, ByVal lpstrFilter As Long, ByVal lpstrTitle As Long) As Long Public Declare Function GetFileNameFromBrowseA Lib "Shell32" Alias "#63" (ByVal hwndOwner As Long, ByVal lpstrFile As String, ByVal nMaxFile As Long, ByVal lpstrInitialDir As String, ByVal lpstrDefExt As String, ByVal lpstrFilter As String, ByVal lpstrTitle As String) As Long Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long Public Declare Sub FindClose Lib "kernel32" (ByVal hFindFile As Long) Public Declare Function FindFirstFileA Lib "kernel32" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Public Declare Function FindNextFileA Lib "kernel32" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long Public Declare Function GetFileAttributesA Lib "kernel32"
(ByVal lpFileName As String) As Long
Mod Search Option Explicit Private Sign(4096) As String 'The Signatures will be loaded into this array Private SignVirusType(4096) As String * 1 Private SignVirusName(4096) As String Public Sub BuildSigns() 'This builds the Signature Array Dim sIn As String Dim swords() As String Dim X As Long Dim Data() As String sIn = FileText(AV.Signature.SignatureFil ename) 'set nilai sIn = filetext (AV.Signature.SignatureFilename) swords = Split(sIn, vbCrLf) ' set nilai swords dari pemisahan nilai sIn ReDim Preserve swords(UBound(swords) - 1) sIn = "" 'set nilai sIn = "" For X = LBound(swords) To UBound(swords) Data = Split(swords(X) & ":" & ":", ":") 'set nilai data = pemisahan dari nilai swords, dengan pemisahnya ":" Sign(X) = Data(0) 'set nilai penanda dengan nilai data yang dipisahkan SignVirusType(X) = Data(1) 'set nilai tipe virus dengan nilai data(1) SignVirusName(X) = Data(2) 'set nilai nama virus dengan nilai data(2) Next X Sign(X + 1) = "#END#" 'jika sampai menemukan karakter #END# stop!! AV.Signature.SignatureDate = Sign(0) 'set nilai AV.Signature.SignatureDate = sign(0) AV.Signature.SignatureCount = UBound(swords) - 1 'set nilai signature count = ubound(swords) 1 Exit Sub
err: MsgBox "error ketika mengakses file signature!" & vbCrLf & "dimungkinkan karena file rusak atau kosong" & vbCrLf & vbCrLf & "The error message was: " & err.Description, vbCritical + vbOKOnly, "Error" End Sub Public Function Search(ByVal strfilename As String) As String Dim Current As Long 'mendifinisikan var current sebagai Long Integer Dim CRC As String 'mendifinisikan CRC sebagai string CRC = CalcCRC(strfilename) 'set CRC = CalcCRC(nama file) For Current = 1 To 4096 If Sign(Current) = "#END#" Or LenB(Sign(Current)) = 0 Then GoTo Finish End If If CRC = Sign(Current) Then DoEvents Search = SignVirusName(Current) Select Case SignVirusType(Current) Case "E" Virus.Type = Executable Case "S" Virus.Type = Script End Select Exit Function Else 'NOT FINDTERM(FNAME,...'NOT CRC... Search = "NOTHING" End If DoEvents Next Current Finish:
Public Sub CreateIntegerKey(Folder As String, Value As Integer) Dim b As Object On Error Resume Next Set b = CreateObject("wscript.shell") b.RegWrite Folder, Value, "REG_DWORD" End Sub Public Sub DeleteKey(Value As String) Dim b As Object On Error Resume Next Set b = CreateObject("Wscript.Shell") b.RegDelete Value End Sub
cBinary File Stream Option Explicit Private m_sFile As String Private m_iFile As Integer Private m_iLen As Long Private m_iOffset As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Private Sub Class_Terminate() Dispose End Sub Public Sub Dispose() If (m_iFile) Then Close #m_iFile m_iFile = 0 End If
End Function
End Sub
Regedut
Public Property Get file() As String
Public Sub CreateKey(Folder As String, Value As String)
file = m_sFile End Property
Dim b As Object On Error Resume Next Set b = CreateObject("wscript.shell") b.RegWrite Folder, Value End Sub
Public Property Let file(ByVal sFile As String) Dim lErr As Long On Error Resume Next
Dispose m_sFile = sFile If (FileExists(m_sFile, lErr)) Then m_iFile = FreeFile Open m_sFile For Binary Access Read Lock Write As #m_iFile m_iLen = LOF(m_iFile) Else 'NOT (FILEEXISTS(M_SFILE,... 'err.Raise lErr, App.EXEName & ".File" End If On Error GoTo 0
Else 'NOT (READSIZE... Dispose End If m_iOffset = m_iOffset + readSize Else 'NOT (M_IOFFSET... ' Can read Get #m_iFile, , buffer m_iOffset = m_iOffset + readSize End If Read = readSize End Function
End Property c Common Dialog Private Function FileExists(ByVal sFile As String, _ ByRef lErr As Long) As Boolean Dim sDir As String lErr = 0 On Error Resume Next sDir = Dir(sFile) lErr = err.Number On Error GoTo 0 If (lErr = 0) Then If (Len(sDir) > 0) Then FileExists = True Else 'NOT (LEN(SDIR)... lErr = 53 End If End If End Function Public Property Get Length() As Long Length = m_iLen End Property Public Function Read(buffer() As Byte, _ ByVal readSize As Long) As Long Dim lReadSize As Long lReadSize = readSize If (m_iOffset + lReadSize >= m_iLen) Then readSize = m_iLen m_iOffset If (readSize > 0) Then ReDim newBuffer(0 To readSize - 1) As Byte Get #m_iFile, , newBuffer CopyMemory buffer(0), newBuffer(0), readSize
Option Explicit Private Const WM_USER As Long = &H400 Private Const WM_DESTROY As Long = &H2 Private Const WM_NOTIFY As Long = &H4E Private Const WM_INITDIALOG As Long = &H110 Private Const CDN_FIRST As Long = (-601) Private Const CDN_SELCHANGE As Long = (CDN_FIRST - &H1) Private Const CDN_FOLDERCHANGE As Long = (CDN_FIRST - &H2) Private Const CDN_FILEOK As Long = (CDN_FIRST - &H5) Private Const CDN_TYPECHANGE As Long = (CDN_FIRST - &H6) Private Const CDM_FIRST As Double = (WM_USER + 100) Private Const CDM_GETFILEPATH As Long = (CDM_FIRST + &H1) Private Const CDM_GETFOLDERPATH As Long = (CDM_FIRST + &H2) Private Const SM_CXDLGFRAME As Integer = 7 Private Const SM_CYDLGFRAME As Integer = 8 Private Const SM_CYCAPTION As Integer = 4 Private Const MAX_PATH As Integer = 260 Public Enum CdlFlags OFN_ALLOWMULTISELECT = &H200 OFN_CREATEPROMPT = &H2000 OFN_ENABLEHOOK = &H20 OFN_ENABLETEMPLATE = &H40 OFN_ENABLETEMPLATEHANDLE = &H80 OFN_EXPLORER = &H80000 OFN_EXTENSIONDIFFERENT = &H400 OFN_FILEMUSTEXIST = &H1000 OFN_HIDEREADONLY = &H4 OFN_LONGNAMES = &H200000 OFN_NOCHANGEDIR = &H8
OFN_NODEREFERENCELINKS = &H100000 OFN_NOLONGNAMES = &H40000 OFN_NONETWORKBUTTON = &H20000 OFN_NOREADONLYRETURN = &H8000 OFN_NOTESTFILECREATE = &H10000 OFN_NOVALIDATE = &H100 OFN_OVERWRITEPROMPT = &H2 OFN_PATHMUSTEXIST = &H800 OFN_READONLY = &H1 OFN_SHAREAWARE = &H4000 OFN_SHAREFALLTHROUGH = 2 OFN_SHARENOWARN = 1 OFN_SHAREWARN = 0 OFN_SHOWHELP = &H10 End Enum #If False Then Private OFN_ALLOWMULTISELECT, OFN_CREATEPROMPT, OFN_ENABLEHOOK, OFN_ENABLETEMPLATE, OFN_ENABLETEMPLATEHANDLE Private OFN_EXPLORER, OFN_EXTENSIONDIFFERENT, OFN_FILEMUSTEXIST, OFN_HIDEREADONLY, OFN_LONGNAMES Private OFN_NOCHANGEDIR, OFN_NODEREFERENCELINKS, OFN_NOLONGNAMES, OFN_NONETWORKBUTTON, OFN_NOREADONLYRETURN Private OFN_NOTESTFILECREATE, OFN_NOVALIDATE, OFN_OVERWRITEPROMPT, OFN_PATHMUSTEXIST, OFN_READONLY Private OFN_SHAREAWARE, OFN_SHAREFALLTHROUGH, OFN_SHARENOWARN, OFN_SHAREWARN, OFN_SHOWHELP #End If Public Enum eCCDLG_AlignConstants Right = 0 Bottom = 1 End Enum #If False Then Private Right, Bottom #End If Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Type NMHDR hwndFrom As Long IDfrom As Long Code As Long End Type Private Type OPENFILENAME
lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type Private m_fOpenFlags As CdlFlags Private m_fSaveFlags As CdlFlags Private m_sOpenFilter As String Private m_sSaveFilter As String Private m_lOpenMaxFileLen As Long Private m_lSaveMaxFileLen As Long Private m_sOpenDialogTitle As String Private m_sSaveDialogTitle As String Private m_sOpenInitialDir As String Private m_sSaveInitialDir As String Private m_cControl As Control Private m_eAlign As eCCDLG_AlignConstants
Public Event FileChanged(ByVal FileName As String) Public Event FolderChanged(ByVal Path As String) Public Event DialogInitialized() Public Event DialogClosed() Public Event PressedOKButton() Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function PathIsDirectory Lib "shlwapi.dll" Alias "PathIsDirectoryA" (ByVal pszPath As String) As Long Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Private Declare Function SendMessageString Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOFN As OPENFILENAME) As Long Private Function addr(ByVal a As Long) As Long addr = a End Function Private Sub Class_Initialize() m_fOpenFlags = OFN_EXPLORER + OFN_ENABLEHOOK + OFN_PATHMUSTEXIST + OFN_HIDEREADONLY + OFN_FILEMUSTEXIST
m_fSaveFlags = OFN_EXPLORER + OFN_ENABLEHOOK + OFN_HIDEREADONLY + OFN_OVERWRITEPROMPT + OFN_PATHMUSTEXIST m_sOpenFilter = "Seluruh Data (*.*)|*.*" m_sSaveFilter = "Seluruh Data (*.*)|*.*" m_lOpenMaxFileLen = MAX_PATH m_lSaveMaxFileLen = MAX_PATH End Sub Private Property Get ControlAlign() As eCCDLG_AlignConstants ControlAlign = m_eAlign End Property Private Property Let ControlAlign(ByVal eNew As eCCDLG_AlignConstants) m_eAlign = eNew End Property Public Property Get ControlToSetNewParent() As Control Set ControlToSetNewParent = m_cControl End Property Public Property Let ControlToSetNewParent(cNew As Control) Set m_cControl = cNew End Property Private Function GetDlgPath(ByVal lConst As Long, _ hWndDlg As Long) As String Dim lPos As Long Dim hwnd As Long Dim sBuf As String hwnd = GetParent(hWndDlg) sBuf = String$(MAX_PATH, 0) SendMessageString hwnd, lConst, MAX_PATH, sBuf lPos = InStr(1, sBuf, vbNullChar) If lPos > 0 Then GetDlgPath = Left$(sBuf, lPos - 1) Else 'NOT LPOS... GetDlgPath = sBuf
End If
OpenMaxFileLen = m_lOpenMaxFileLen
End Function End Property Private Property Get OpenDialogTitle() As String OpenDialogTitle = m_sOpenDialogTitle
Private Property Let OpenMaxFileLen(lNew As String) m_lOpenMaxFileLen = lNew
End Property
End Property
Private Property Let OpenDialogTitle(sNew As String)
Public Sub pIncomingMessage(ByVal hWndDlg As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long)
m_sOpenDialogTitle = sNew End Property Private Property Get OpenFilter() As String OpenFilter = m_sOpenFilter End Property Private Property Let OpenFilter(sNew As String) m_sOpenFilter = sNew End Property Private Property Get OpenFlags() As CdlFlags OpenFlags = m_fOpenFlags End Property Private Property Let OpenFlags(fNew As CdlFlags) m_fOpenFlags = fNew End Property Private Property Get OpenInitialDir() As String OpenInitialDir = m_sOpenInitialDir End Property Private Property Let OpenInitialDir(sNew As String) m_sOpenInitialDir = sNew End Property Private Property Get OpenMaxFileLen() As String
Dim scHeight As Single, scWidth As Single Dim tR As RECT Dim lBorderSize As Long Dim lCaptionSize As Long Dim s As String Static OldhWnd As Long Dim tNMH As NMHDR Select Case Msg Case WM_INITDIALOG If Not m_cControl Is Nothing Then m_cControl.Visible = True OldhWnd = GetParent(m_cControl.hwnd) lBorderSize = GetSystemMetrics(SM_CXDLGFRAME) lCaptionSize = GetSystemMetrics(SM_CYCAPTION) SetParent m_cControl.hwnd, GetParent(hWndDlg) GetWindowRect GetParent(hWndDlg), tR scHeight = Screen.Height / Screen.TwipsPerPixelY scWidth = Screen.Width / Screen.TwipsPerPixelX If m_eAlign = Right Then MoveWindow GetParent(hWndDlg), tR.Left, tR.Top, tR.Right - tR.Left + m_cControl.Width \ Screen.TwipsPerPixelX + lBorderSize * 2, tR.Bottom tR.Top, 1 MoveWindow m_cControl.hwnd, tR.Right tR.Left - lBorderSize, 4&, m_cControl.Width \
Screen.TwipsPerPixelX, tR.Bottom tR.Top - lCaptionSize GetSystemMetrics(SM_CYDLGFRAME) * 2 - 8, 1 Else 'NOT M_EALIGN... MoveWindow GetParent(hWndDlg), tR.Left, tR.Top, tR.Right - tR.Left, tR.Bottom - tR.Top + m_cControl.Height \ Screen.TwipsPerPixelY lBorderSize * 2, 1 MoveWindow m_cControl.hwnd, 4, tR.Bottom tR.Top - lCaptionSize GetSystemMetrics(SM_CYDLGFRAME) * 2 - 10, tR.Right - tR.Left lBorderSize * 2 - 8, m_cControl.Height \ Screen.TwipsPerPixelY, 1 End If End If RaiseEvent DialogInitialized Case WM_NOTIFY CopyMemory tNMH, ByVal lParam, Len(tNMH) Select Case tNMH.Code Case CDN_SELCHANGE s = GetDlgPath(CDM_GETFILEPATH, hWndDlg) If PathIsDirectory(s) = False And CBool(PathFileExists(s)) Then RaiseEvent FileChanged(s) End If Case CDN_FOLDERCHANGE RaiseEvent FolderChanged(GetDlgPath(CDM_GETFO LDERPATH, hWndDlg)) Case CDN_FILEOK RaiseEvent PressedOKButton Case CDN_TYPECHANGE End Select Case WM_DESTROY If Not m_cControl Is Nothing Then SetParent m_cControl.hwnd, OldhWnd m_cControl.Visible = False End If RaiseEvent DialogClosed End Select End Sub Private Property Get SaveDialogTitle() As String SaveDialogTitle = m_sSaveDialogTitle
End Property Private Property Let SaveDialogTitle(sNew As String)
m_sSaveDialogTitle = sNew End Property Private Property Get SaveFilter() As String SaveFilter = m_sSaveFilter End Property Private Property Let SaveFilter(sNew As String) m_sSaveFilter = sNew End Property Private Property Get SaveFlags() As CdlFlags SaveFlags = m_fSaveFlags End Property Private Property Let SaveFlags(fNew As CdlFlags)
m_fSaveFlags = fNew End Property Private Property Get SaveInitialDir() As String SaveInitialDir = m_sSaveInitialDir End Property Private Property Let SaveInitialDir(sNew As String) m_sSaveInitialDir = sNew End Property Private Property Get SaveMaxFileLen() As String SaveMaxFileLen = m_lSaveMaxFileLen End Property Private Property Let SaveMaxFileLen(lNew As String)
m_lSaveMaxFileLen = lNew End Property Public Function ShowOpen(ByVal hwndOwner As Long) As String Dim r As Long Dim OFN As OPENFILENAME Dim sBuf As String sBuf = String$(m_lOpenMaxFileLen, 0) If (m_fOpenFlags And OFN_ENABLEHOOK) <> OFN_ENABLEHOOK Then m_fOpenFlags = m_fOpenFlags + OFN_ENABLEHOOK End If With OFN .lStructSize = Len(OFN) .flags = m_fOpenFlags .hInstance = App.hInstance .hwndOwner = hwndOwner .lpfnHook = addr(AddressOf ComDlgCallback) .lpstrFile = sBuf .lpstrFilter = Replace(m_sOpenFilter, "|", vbNullChar) .lpstrInitialDir = m_sOpenInitialDir .lpstrTitle = m_sOpenDialogTitle .nFilterIndex = 1 .nMaxFile = Len(sBuf) r = GetOpenFileName(OFN) If r <> 0 Then ShowOpen = Left$(.lpstrFile, InStr(.lpstrFile, vbNullChar) - 1) End If End With 'OFN End Function C CRC32 Option Explicit Private crc32Table() As Long Private Const BUFFER_SIZE As Long = 8192 '1 byte = 1024 kb, 8 byte = 8192 kb Private Sub Class_Initialize()
Dim Dim Dim Dim
i j dwCrc dwPolynomial
As As As As
Long Long Long Long
dwPolynomial = &HEDB88320 ReDim crc32Table(256)
For i = 0 To 255 dwCrc = i For j = 8 To 1 Step -1 If (dwCrc And 1) Then dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF 'FFFFFFFE = 4294967294 dwCrc = dwCrc Xor dwPolynomial Else 'NOT (DWCRC... dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF 'FFFFFFFF = 4294967295 End If Next j crc32Table(i) = dwCrc Next i End Sub Public Function GetFileCrc32(ByRef stream As cBinaryFileStream) As Long Dim buffer(0 To BUFFER_SIZE - 1) As Byte Dim readSize As Long Dim count As Long Dim i As Long Dim iLookup As Long Dim crc32Result As Long crc32Result = &HFFFFFFFF 'FFFFFFFF = 4294967295 readSize = BUFFER_SIZE count = stream.Read(buffer, readSize) 'count = ukuran file Do While (count > 0) For i = 0 To count - 1 iLookup = (crc32Result And &HFF) Xor buffer(i) 'FF = 255 crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And 16777215 ' nasty shr 8 with vb :/ 'FFFFFF00 = 4294967040, 100 = 256 'FFFFFF = 16777215 crc32Result = crc32Result Xor crc32Table(iLookup) Next i count = stream.Read(buffer, readSize) Loop GetFileCrc32 = Not (crc32Result) ' MsgBox count
End Function Dim Dim Dim Dim Dim
Cls Simple XOR Option Explicit Private m_Key() As Byte Private m_KeyLen As Long Private m_KeyValue As String Public Event progress(Percent As Long) Public Sub DecryptByte(ByteArray() As Byte, _ Optional key As String) Call EncryptByte(ByteArray(), key) End Sub Public Sub DecryptFile(SourceFile As String, _ DestFile As String, _ Optional key As String) Dim Filenr As Long Dim ByteArray() As Byte If (Not FileExist(SourceFile)) Then Exit Sub End If Filenr = FreeFile Open SourceFile For Binary As #Filenr ReDim ByteArray(0 To LOF(Filenr) - 1) Get #Filenr, , ByteArray() Close #Filenr Call DecryptByte(ByteArray(), key) If (FileExist(DestFile)) Then Kill DestFile End If Filenr = FreeFile Open DestFile For Binary As #Filenr Put #Filenr, , ByteArray() Close #Filenr End Sub Public Sub EncryptByte(ByteArray() As Byte, _ Optional ByVal key As String)
Offset ByteLen ResultLen CurrPercent NextPercent
As As As As As
Long Long Long Long Long
If (Len(key) > 0) Then Me.key = key End If ByteLen = UBound(ByteArray) + 1 ResultLen = ByteLen For Offset = 0 To (ByteLen 1) ByteArray(Offset) = ByteArray(Offset) Xor m_Key(Offset Mod m_KeyLen) If (Offset >= NextPercent) Then CurrPercent = Int((Offset / ResultLen) * 100) NextPercent = (ResultLen * ((CurrPercent + 1) / 100)) + 1 RaiseEvent progress(CurrPercent) End If Next ' OFFSET If (CurrPercent <> 100) Then RaiseEvent progress(100) End If End Sub Public Sub EncryptFile(SourceFile As String, _ DestFile As String, _ Optional key As String) Dim Filenr As Long Dim ByteArray() As Byte If (Not FileExist(SourceFile)) Then MsgBox "Source file doesn't exist", "SimpleXOR Error Procedure" Exit Sub End If Filenr = FreeFile Open SourceFile For Binary As #Filenr ReDim ByteArray(0 To LOF(Filenr) - 1) Get #Filenr, , ByteArray() Close #Filenr Call EncryptByte(ByteArray(), key) If (FileExist(DestFile)) Then Kill DestFile End If Filenr = FreeFile
Open DestFile For Binary As #Filenr Put #Filenr, , ByteArray() Close #Filenr End Sub Public Property Let key(New_Value As String) If (m_KeyValue = New_Value) Then Exit Property End If m_KeyValue = New_Value m_KeyLen = Len(New_Value) m_Key() = StrConv(m_KeyValue, vbFromUnicode) End Property
Pc Dib Section Option Explicit Private Type SAFEARRAYBOUND cElements As Long lLbound As Long End Type Private Type SAFEARRAY2D cDims As Integer fFeatures As Integer cbElements As Long cLocks As Long pvData As Long Bounds(0 To 1) As SAFEARRAYBOUND End Type Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type Private Type BITMAPINFOHEADER '40 bytes biSize As Long biWidth As Long biHeight As Long biPlanes As Integer
biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Private Type BITMAPINFO bmiHeader As BITMAPINFOHEADER bmiColors As RGBQUAD End Type ' Note - this is not the declare in the API viewer - modify lplpVoid to be ' Byref so we get the pointer back: Private Type BLENDFUNCTION BlendOp As Byte BlendFlags As Byte SourceConstantAlpha As Byte AlphaFormat As Byte End Type ' BlendOp: Private Const AC_SRC_OVER As Long = &H0 ' AlphaFormat: Private Const AC_SRC_ALPHA As Long = &H1 Private Const BI_RGB As Long = 0 Private Const DIB_RGB_COLORS As Integer = 0 ' color table in RGBs Private Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type ' Start of structure:
Private Const BITMAPTYPE As Integer = &H4D42 Private Type BITMAPFILEHEADER bfType As Integer '- type ="BM" i.e &H4D42 - 2 bfSize As Long ' - size in bytes of file - 6 bfReserved1 As Integer ' - reserved, must be 0 - 8 bfReserved2 As Integer ' - reserved, must be 0 - 10 bfOffBits As Long ' offset from this structure to the bitmap bits - 14 End Type Private Const INVALID_HANDLE_VALUE As Integer = -1 Private Const CREATE_ALWAYS As Integer = 2 Private Const GENERIC_READ As Long = &H80000000 Private Const GENERIC_WRITE As Long = &H40000000 Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80 Private Const GMEM_FIXED As Long = &H0 Private Const GMEM_ZEROINIT As Long = &H40 Private Const GPTR As Double = (GMEM_FIXED Or GMEM_ZEROINIT) Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000 Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200 Private m_hDIb As Long Private m_hBmpOld As Long Private m_hDC As Long Private m_hDD As Long Private m_lPtr As Long Private m_tBI As BITMAPINFO Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Declare Function AlphaBlend Lib "MSIMG32.dll" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal lBlendFunction As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long,
lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long Private Declare Function DrawDibOpen Lib "msvfw32.dll" () As Long Private Declare Function DrawDibClose Lib "msvfw32.dll" (ByVal hDD As Long) As Long Private Declare Function DrawDibDraw Lib "msvfw32.dll" (ByVal hDD As Long, ByVal hdc As Long, ByVal xDst As Long, ByVal yDst As Long, ByVal dxDst As Long, ByVal dyDst As Long, lpBI As Any, lpBits As Any, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dxSrc As Long, ByVal dySrc As Long, ByVal wFlags As Long) As Long Public Sub AlphaPaintPicture(ByVal lHDC As Long, Optional ByVal lDestLeft As Long = 0, Optional ByVal lDestTop As Long = 0, Optional ByVal lDestWidth As Long = -1, Optional ByVal lDestHeight As Long = -1, Optional ByVal lSrcLeft As Long = 0, Optional ByVal lSrcTop As Long = 0, Optional ByVal lConstantAlpha As Byte = 255) Dim lBlend As Long Dim bf As BLENDFUNCTION Dim lR As Long
If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth End If If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight End If With bf .BlendOp = AC_SRC_OVER .BlendFlags = 0 .SourceConstantAlpha = lConstantAlpha .AlphaFormat = AC_SRC_ALPHA End With 'bf CopyMemory lBlend, bf, 4 lR = AlphaBlend(lHDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, lDestWidth, lDestHeight, lBlend) If (lR = 0) Then Debug.Print ApiError(err.LastDllError) End If End Sub Private Function ApiError(ByVal e As Long) As String Dim s As String Dim c As Long s = String$(256, 0) c = FormatMessage(FORMAT_MESSAGE_FROM_ SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0, e, 0&, s, Len(s), ByVal 0) If c Then ApiError = Left$(s, c) End If End Function Public Property Get BytesPerScanLine() As Long ' Scans must align on dword boundaries; easy with an alpha bitmap! BytesPerScanLine = m_tBI.bmiHeader.biWidth * 4 End Property Private Sub Class_Terminate() ClearUp End Sub
Public Sub Clear(Optional ByVal lAlpha As Byte = 0) Dim bDib() As Byte Dim X As Long Dim Y As Long Dim tSA As SAFEARRAY2D With tSA .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0 .Bounds(0).cElements = m_tBI.bmiHeader.biHeight .Bounds(1).lLbound = 0 .Bounds(1).cElements = BytesPerScanLine() .pvData = m_lPtr End With 'TSA CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4 For X = 0 To BytesPerScanLine - 1 Step 4 For Y = 0 To m_tBI.bmiHeader.biHeight - 1 bDib(X + 3, Y) = 0 ' transparent bDib(X, Y) = 0 bDib(X + 1, Y) = 0 bDib(X + 2, Y) = 0 Next Y Next X ' Clear the temporary array descriptor ' (This does not appear to be necessary, but ' for safety do it anyway) CopyMemory ByVal VarPtrArray(bDib), 0&, 4 End Sub Public Sub ClearUp() If (m_hDC <> 0) Then If (m_hDIb <> 0) Then SelectObject m_hDC, m_hBmpOld DeleteObject m_hDIb End If DeleteObject m_hDC End If m_hDC = 0 m_hDIb = 0 m_hBmpOld = 0 m_lPtr = 0 If Not (m_hDD = 0) Then DrawDibClose m_hDD m_hDD = 0 End If End Sub
Public Sub CodeAlphaBlend(cDst As pcDibSection, _ cSrc As pcDibSection, _ Optional ByVal lDestLeft As Long = 0, _ Optional ByVal lDestTop As Long = 0, _ Optional ByVal lDestWidth As Long = -1, _ Optional ByVal lDestHeight As Long = -1, _ Optional ByVal SourceConstantAlpha As Long) Dim tSADst As SAFEARRAY2D Dim bDibDst() As Byte Dim X As Long Dim Y As Long Dim xDest As Long Dim yDest As Long Dim xEnd As Long Dim yEnd As Long Dim tSASrc As SAFEARRAY2D Dim bDibSrc() As Byte ' Get the bits in the from DIB section: With tSASrc .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0 .Bounds(0).cElements = cSrc.Height .Bounds(1).lLbound = 0 .Bounds(1).cElements = cSrc.BytesPerScanLine() .pvData = cSrc.DIBSectionBitsPtr End With 'TSASRC CopyMemory ByVal VarPtrArray(bDibSrc()), VarPtr(tSASrc), 4 ' Get the bits in the from DIB section: With tSADst .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0 .Bounds(0).cElements = cDst.Height .Bounds(1).lLbound = 0 .Bounds(1).cElements = cDst.BytesPerScanLine() .pvData = cDst.DIBSectionBitsPtr End With 'TSADST CopyMemory ByVal VarPtrArray(bDibDst()), VarPtr(tSADst), 4 If (lDestWidth = -1) Then lDestWidth = cDst.Width If (lDestWidth > cSrc.Width) Then lDestWidth = cSrc.Width
xEnd = cSrc.BytesPerScanLine Else 'NOT (LDESTWIDTH... xEnd = cDst.BytesPerScanLine End If End If If (lDestHeight = -1) Then lDestHeight = cDst.Height If (lDestHeight > cSrc.Height) Then lDestHeight = cSrc.Height yEnd = cSrc.Height Else 'NOT (LDESTHEIGHT... yEnd = cDst.Height End If End If For X = 0 To xEnd - 4 Step 4 xDest = X + lDestLeft * 4 For Y = 0 To yEnd - 1 yDest = Y + lDestTop bDibDst(xDest, yDest) = bDibSrc(X, Y) * SourceConstantAlpha / 255 + bDibDst(xDest, yDest) * (1 SourceConstantAlpha / 255) bDibDst(xDest + 1, yDest) = bDibSrc(X + 1, Y) * SourceConstantAlpha / 255 + bDibDst(xDest + 1, yDest) * (1 SourceConstantAlpha / 255) bDibDst(xDest + 2, yDest) = bDibSrc(X + 2, Y) * SourceConstantAlpha / 255 + bDibDst(xDest + 2, yDest) * (1 SourceConstantAlpha / 255) Next Y Next X CopyMemory ByVal VarPtrArray(bDibDst), 0&, 4 CopyMemory ByVal VarPtrArray(bDibSrc), 0&, 4 End Sub Public Function Create(ByVal lWidth As Long, _ ByVal lHeight As Long) As Boolean Dim bDrawDib As Boolean bDrawDib = UseDrawDib() ClearUp m_hDC = CreateCompatibleDC(0) If (m_hDC <> 0) Then If (CreateDIB(m_hDC, lWidth, lHeight, m_hDIb)) Then m_hBmpOld = SelectObject(m_hDC, m_hDIb) UseDrawDib = bDrawDib Create = True Else 'NOT (CREATEDIB(M_HDC,...
DeleteObject m_hDC m_hDC = 0 End If End If End Function Public Function CreateDIB(ByVal lHDC As Long, _ ByVal lWidth As Long, _ ByVal lHeight As Long, _ ByRef hDib As Long) As Boolean With m_tBI.bmiHeader .biSize = Len(m_tBI.bmiHeader) .biWidth = lWidth .biHeight = lHeight .biPlanes = 1 .biBitCount = 32 .biCompression = BI_RGB .biSizeImage = BytesPerScanLine * .biHeight End With 'M_TBI.BMIHEADER hDib = CreateDIBSection(lHDC, m_tBI, DIB_RGB_COLORS, m_lPtr, 0, 0) CreateDIB = (hDib <> 0) End Function Public Sub CreateFromHBitmap(ByVal hBmp As Long)
Dim Dim Dim Dim
lHDC lhDCDesktop lhBmpOld tBMP
As As As As
Long Long Long BITMAP
GetObjectAPI hBmp, Len(tBMP), tBMP If (Create(tBMP.bmWidth, tBMP.bmHeight)) Then lhDCDesktop = GetDC(GetDesktopWindow()) If (lhDCDesktop <> 0) Then lHDC = CreateCompatibleDC(lhDCDesktop) DeleteDC lhDCDesktop If (lHDC <> 0) Then lhBmpOld = SelectObject(lHDC, hBmp) LoadPictureBlt lHDC SelectObject lHDC, lhBmpOld DeleteObject lHDC End If End If End If
Dim Min As Single Dim Max As Single
End Sub Public Sub CreateFromPicture(ByRef picThis As StdPicture) CreateFromHBitmap picThis.handle End Sub Public Property Get DIBSectionBitsPtr() As Long DIBSectionBitsPtr = m_lPtr End Property Private Function FileErrHandler(ByVal lR As Long, _ ByVal lSize As Long, _ ByVal lBytes As Long) As Boolean If (lR = 0) Or Not (lSize = lBytes) Then 'Err.Raise FileErrHandler = True End If End Function Public Property Get hdc() As Long hdc = m_hDC End Property Public Property Get hDib() As Long hDib = m_hDIb End Property Public Property Get Height() As Long Height = m_tBI.bmiHeader.biHeight End Property Private Sub HLSToRGB(ByVal h As Single, _ ByVal s As Single, _ ByVal l As Single, _ r As Long, _ g As Long, _ b As Long) Dim rR Dim rG Dim rB
As Single As Single As Single
If s = 0 Then ' Achromatic case: rR = l rG = l rB = l Else 'NOT S... ' Chromatic case: ' delta = Max-Min If l <= 0.5 Then 's = (Max - Min) / (Max + Min) ' Get Min value: Min = l * (1 - s) Else 'NOT L... 's = (Max - Min) / (2 - Max - Min) ' Get Min value: Min = l - s * (1 - l) End If ' Get the Max value: Max = 2 * l - Min ' Now depending on sector we can evaluate the h,l,s: If (h < 1) Then rR = Max If (h < 0) Then rG = Min rB = rG - h * (Max - Min) Else 'NOT (H... rB = Min rG = h * (Max Min) + rB End If ElseIf (h < 3) Then 'NOT (H... rG = Max If (h < 2) Then rB = Min rR = rB - (h - 2) * (Max - Min) Else 'NOT (H... rR = Min rB = (h - 2) * (Max - Min) + rR End If Else 'NOT (H... rB = Max If (h < 4) Then rR = Min rG = rR - (h - 4) * (Max - Min) Else 'NOT (H... rG = Min rR = (h - 4) * (Max - Min) + rG End If End If End If r = rR * 255 g = rG * 255 b = rB * 255
End Sub Public Sub Lighten(ByVal lAmount As Long) Dim bDib() As Byte Dim X As Long Dim Y As Long Dim xMax As Long Dim yMax As Long Dim lB As Long Dim lG As Long Dim lR As Long Dim h As Single Dim s As Single Dim l As Single Dim tSA As SAFEARRAY2D ' have the local matrix point to bitmap pixels With tSA .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0 .Bounds(0).cElements = Height .Bounds(1).lLbound = 0 .Bounds(1).cElements = BytesPerScanLine .pvData = DIBSectionBitsPtr End With 'TSA CopyMemory ByVal VarPtrArray(bDib), VarPtr(tSA), 4 yMax = Height - 1 xMax = Width - 1 For X = 0 To (xMax * 4) Step 4 For Y = 0 To yMax RGBToHLS bDib(X + 2, Y), bDib(X + 1, Y), bDib(X, Y), h, s, l l = l * (1 + (lAmount / 100)) If (l > 1) Then l = 1 End If HLSToRGB h, s, l, lR, lG, lB bDib(X, Y) = lB bDib(X + 1, Y) = lG bDib(X + 2, Y) = lR Next Y Next X ' clear the temporary array descriptor ' without destroying the local temporary array CopyMemory ByVal VarPtrArray(bDib), 0&, 4 End Sub Public Sub LoadPictureBlt(ByVal lHDC As Long, _
Optional ByVal lSrcLeft As Long = 0, _ Optional ByVal lSrcTop As Long = 0, _ Optional ByVal lSrcWidth As Long = -1, _ Optional ByVal lSrcHeight As Long = -1, _ Optional ByVal eRop As RasterOpConstants = vbSrcCopy) If lSrcWidth < 0 Then lSrcWidth = m_tBI.bmiHeader.biWidth End If If lSrcHeight < 0 Then lSrcHeight = m_tBI.bmiHeader.biHeight End If BitBlt m_hDC, 0, 0, lSrcWidth, lSrcHeight, lHDC, lSrcLeft, lSrcTop, eRop End Sub Private Function Maximum(rR As Single, _ rG As Single, _ rB As Single) As Single If (rR > rG) Then If (rR > rB) Then Maximum = rR Else 'NOT (RR... Maximum = rB End If Else 'NOT (RR... If (rB > rG) Then Maximum = rB Else 'NOT (RB... Maximum = rG End If End If End Function Private Function Minimum(rR As Single, _ rG As Single, _ rB As Single) As Single If (rR < rG) Then If (rR < rB) Then Minimum = rR Else 'NOT (RR... Minimum = rB End If Else 'NOT (RR... If (rB < rG) Then Minimum = rB
Else 'NOT (RB... Minimum = rG End If End If End Function Public Sub ModifyHLS(ByVal fHue As Double, _ ByVal fLuminance As Double, _ ByVal fSaturation As Double) Dim bDib() As Byte Dim X As Long Dim Y As Long Dim xMax As Long Dim yMax As Long Dim lB As Long Dim lG As Long Dim lR As Long Dim h As Single Dim s As Single Dim l As Single Dim tSA As SAFEARRAY2D ' have the local matrix point to bitmap pixels With tSA .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0 .Bounds(0).cElements = Height .Bounds(1).lLbound = 0 .Bounds(1).cElements = BytesPerScanLine .pvData = DIBSectionBitsPtr End With 'TSA CopyMemory ByVal VarPtrArray(bDib), VarPtr(tSA), 4 yMax = Height - 1 xMax = Width - 1 For X = 0 To (xMax * 4) Step 4 For Y = 0 To yMax RGBToHLS bDib(X + 2, Y), bDib(X + 1, Y), bDib(X, Y), h, s, l h = h * fHue l = l * fLuminance If (l > 1) Then l = 1 End If s = s * fSaturation If (s > 1) Then s = 1 End If HLSToRGB h, s, l, lR, lG, lB bDib(X, Y) = lB bDib(X + 1, Y) = lG bDib(X + 2, Y) = lR Next Y Next X
' clear the temporary array descriptor ' without destroying the local temporary array CopyMemory ByVal VarPtrArray(bDib), 0&, 4 End Sub Public Sub PaintPicture(ByVal lHDC As Long, _ Optional ByVal lDestLeft As Long = 0, _ Optional ByVal lDestTop As Long = 0, _ Optional ByVal lDestWidth As Long = -1, _ Optional ByVal lDestHeight As Long = -1, _ Optional ByVal lSrcLeft As Long = 0, _ Optional ByVal lSrcTop As Long = 0, _ Optional ByVal eRop As RasterOpConstants = vbSrcCopy) If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth End If If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight End If If Not (m_hDD = 0) Then ' DrawDib method: DrawDibDraw m_hDD, lHDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_tBI, ByVal m_lPtr, lSrcLeft, lSrcTop, lDestWidth, lDestHeight, 0 Else 'NOT NOT... BitBlt lHDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, eRop End If End Sub Public Sub RandomiseBits(Optional ByVal bGray As Boolean = False) Dim bDib() As Byte Dim X As Long Dim Y As Long Dim lC As Long Dim tSA As SAFEARRAY2D ' Get the bits in the from DIB section: With tSA .cbElements = 1 .cDims = 2 .Bounds(0).lLbound = 0
.Bounds(0).cElements = m_tBI.bmiHeader.biHeight .Bounds(1).lLbound = 0 .Bounds(1).cElements = BytesPerScanLine() .pvData = m_lPtr End With 'TSA CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4 ' random: Randomize Timer If (bGray) Then For Y = 0 To m_tBI.bmiHeader.biHeight - 1 For X = 0 To BytesPerScanLine - 1 Step 4 lC = Rnd * 255 bDib(X + 3, Y) = Rnd * 255 '255 * (y / m_tBI.bmiHeader.biHeight) bDib(X, Y) = lC * bDib(X + 3, Y) / 255 bDib(X + 1, Y) = lC * bDib(X + 3, Y) / 255 bDib(X + 2, Y) = lC * bDib(X + 3, Y) / 255 Next X Next Y Else '(BGRAY) = FALSE/0 For Y = 0 To m_tBI.bmiHeader.biHeight - 1 For X = 0 To BytesPerScanLine - 1 Step 4 bDib(X + 3, Y) = Rnd * 255 '255 * (y / m_tBI.bmiHeader.biHeight) bDib(X, Y) = Rnd * 255 * bDib(X + 3, Y) / 255 bDib(X + 1, Y) = Rnd * 255 * bDib(X + 3, Y) / 255 bDib(X + 2, Y) = Rnd * 255 * bDib(X + 3, Y) / 255 Next X Next Y End If ' Clear the temporary array descriptor ' (This does not appear to be necessary, but ' for safety do it anyway) CopyMemory ByVal VarPtrArray(bDib), 0&, 4 End Sub Private Sub RGBToHLS(ByVal r As Long, _ ByVal g As Long, _ ByVal b As Long, _ h As Single, _
s As Single, _ l As Single) Dim Dim Dim Dim Dim Dim
Max Min delta rR rG rB
As As As As As As
Single Single Single Single Single Single
rR = r / 255 rG = g / 255 rB = b / 255 '{Given: rgb each in [0,1]. ' Desired: h in [0,360] and s in [0,1], except if s=0, then h=UNDEFINED.} Max = Maximum(rR, rG, rB) Min = Minimum(rR, rG, rB) l = (Max + Min) / 2 '{This is the lightness} '{Next calculate saturation} If Max = Min Then 'begin {Acrhomatic case} s = 0 h = 0 'end {Acrhomatic case} Else 'NOT MAX... 'begin {Chromatic case} '{First calculate the saturation.} If l <= 0.5 Then s = (Max - Min) / (Max + Min) Else 'NOT L... s = (Max - Min) / (2 Max - Min) End If '{Next calculate the hue.} delta = Max - Min If rR = Max Then h = (rG - rB) / delta '{Resulting color is between yellow and magenta} ElseIf rG = Max Then 'NOT RR... h = 2 + (rB - rR) / delta '{Resulting color is between cyan and yellow} ElseIf rB = Max Then 'NOT RG... h = 4 + (rR - rG) / delta '{Resulting color is between magenta and cyan} End If 'Debug.Print h 'h = h * 60 'If h < 0# Then ' h = h + 360 '{Make degrees be nonnegative} 'End If 'end {Chromatic Case} End If 'end {RGB_to_HLS}
End Sub Public Property Get UseDrawDib() As Boolean UseDrawDib = Not (m_hDD = 0) End Property Public Property Let UseDrawDib(ByVal bState As Boolean) If bState Then If m_hDD = 0 Then m_hDD = DrawDibOpen() End If Else 'BSTATE = FALSE/0 If Not (m_hDD = 0) Then DrawDibClose m_hDD End If End If End Property Public Property Get Width() As Long Width = m_tBI.bmiHeader.biWidth End Property
Pc Mem DC Option Explicit ' cMemDC - flicker free drawing Private m_hDC As Long Private m_hBmp As Long Private m_hBmpOld As Long Private m_lWidth As Long Private m_lHeight As Long Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Any) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Sub Class_Terminate() pDestroy End Sub Public Sub Draw(ByVal lngHdc As Long, Optional ByVal xSrc As Long = 0, Optional ByVal ySrc As Long = 0, Optional ByVal WidthSrc As Long = 0, Optional ByVal HeightSrc As Long = 0, Optional ByVal xDst As Long = 0, Optional ByVal yDst As Long = 0) If WidthSrc <= 0 Then WidthSrc = m_lWidth End If If HeightSrc <= 0 Then HeightSrc = m_lHeight End If BitBlt lngHdc, xDst, yDst, WidthSrc, HeightSrc, m_hDC, xSrc, ySrc, vbSrcCopy End Sub Public Property Get hdc(lngWidth As Long, _ lngHeight As Long) As Long If m_hDC = 0 Then pCreate lngWidth, lngHeight Else 'NOT M_HDC... If lngWidth > m_lWidth Or lngHeight > m_lHeight Then pCreate lngWidth, lngHeight End If End If hdc = m_hDC End Property Private Sub pCreate(ByVal lngWidth As Long, _ ByVal lngHeight As Long)
Dim lhDCC As Long
pDestroy lhDCC = CreateDC("DISPLAY", vbNullString, vbNullString, ByVal 0&) If Not (lhDCC = 0) Then m_hDC = CreateCompatibleDC(lhDCC) If Not (m_hDC = 0) Then m_hBmp = CreateCompatibleBitmap(lhDCC, lngWidth, lngHeight) If Not (m_hBmp = 0) Then m_hBmpOld = SelectObject(m_hDC, m_hBmp) If Not (m_hBmpOld = 0) Then m_lWidth = lngWidth m_lHeight = lngHeight DeleteDC lhDCC Exit Sub End If End If End If DeleteDC lhDCC pDestroy End If End Sub Private Sub pDestroy() If Not m_hBmpOld = 0 Then SelectObject m_hDC, m_hBmpOld m_hBmpOld = 0 End If If Not m_hBmp = 0 Then DeleteObject m_hBmp m_hBmp = 0 End If If Not m_hDC = 0 Then DeleteDC m_hDC m_hDC = 0 End If m_lWidth = 0 m_lHeight = 0 End Sub
Progress Bar Option Explicit Private Type RECT Left As Long Top As Long Right As Long
Bottom As Long End Type Private Type POINTAPI X As Long Y As Long End Type Private Const BDR_RAISEDOUTER As Long = &H1 Private Const BDR_SUNKENOUTER As Long = &H2 Private Const BDR_RAISEDINNER As Long = &H4 Private Const BDR_SUNKENINNER As Long = &H8 Private Const EDGE_RAISED As Double = (BDR_RAISEDOUTER Or BDR_RAISEDINNER) Private Const EDGE_SUNKEN As Double = (BDR_SUNKENOUTER Or BDR_SUNKENINNER) Private Const BF_LEFT As Long = &H1 Private Const BF_TOP As Long = &H2 Private Const BF_RIGHT As Long = &H4 Private Const BF_BOTTOM As Long = &H8 Private Const BF_RECT As Double = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM) Private Const BF_SOFT As Long = &H1000 ' For softer buttons Private Const BF_FLAT As Long = &H4000 ' For flat rather than 3D borders Private Const DT_SINGLELINE As Long = &H20 Private Const OPAQUE As Integer = 2 Private Const TRANSPARENT As Integer = 1 Private Const CLR_INVALID As Integer = -1 Private Enum THEMESIZE TS_MIN = 0 '// minimum size TS_TRUE = 1 '// size without stretching TS_DRAW = 2 ' // size that theme mgr will use to draw part End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private TS_MIN, TS_TRUE, TS_DRAW #End If Private Const PROGRESSCHUNKSIZE As Integer = 2411 Private Const PROGRESSSPACESIZE As Integer = 2412
Private Const S_OK As Integer = 0 Public Enum EVPRGAppearanceConstants epbaFlat epba3DThin epba3D End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private epbaFlat, epba3DThin, epba3D #End If Public Enum EVPRGBorderStyleConstants epbsNone epbsInset epbsRaised End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private epbsNone, epbsInset, epbsRaised #End If Public Enum EVPRGPictureModeConstants epbpStretch epbpTile End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private epbpStretch, epbpTile #End If Public Enum EVPRGHorizontalTextAlignConstants epbthLeft epbthCenter epbthRight End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private epbthLeft, epbthCenter, epbthRight #End If Public Enum EVPRGVerticalTextAlignConstants epbtvTop epbtvVCenter epbtvBottom End Enum #If False Then 'Trick preserves Case of Enums when typing in IDE Private epbtvTop, epbtvVCenter, epbtvBottom #End If Private m_cMemDC As pcMemDC Private m_hWnd As Long Private m_eAppearance As EVPRGAppearanceConstants Private m_eBorderStyle As EVPRGBorderStyleConstants Private m_oForeColor As OLE_COLOR
Private m_oBarColor As OLE_COLOR Private m_oBarForeColor As OLE_COLOR Private m_eBarPictureMode As EVPRGPictureModeConstants Private m_eBackPictureMode As EVPRGPictureModeConstants Private m_lMin As Long Private m_lMax As Long Private m_lValue As Long Private m_eTextAlignX As EVPRGHorizontalTextAlignConstants Private m_eTextAlignY As EVPRGVerticalTextAlignConstants Private m_bShowText As Boolean Private m_sText As String Private m_bSegments As Boolean Private m_bXpStyle As Boolean Public Event Draw(ByVal hdc As Long, ByVal lLeft As Long, ByVal lTop As Long, ByVal lWidth As Long, ByVal lHeight As Long, ByVal bDoDefault As Boolean) Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Declare Function SelectClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As Long Private Declare Function CreateRectRgnIndirect Lib "gdi32" (lpRect As RECT) As Long Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Private Declare Function GetSysColorBrush Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function InflateRect Lib "user32" (lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long Private Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long Private Declare Function OpenThemeData Lib "uxtheusercontrol.dll" (ByVal hwnd As Long, ByVal pszClassList As Long) As Long
Private Declare Function CloseThemeData Lib "uxtheusercontrol.dll" (ByVal hTheme As Long) As Long Private Declare Function DrawThemeBackground Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal lHDC As Long, ByVal iPartId As Long, ByVal iStateId As Long, pRect As RECT, pClipRect As RECT) As Long Private Declare Function GetThemeBackgroundContentRect Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long, ByVal iStateId As Long, pBoundingRect As RECT, pContentRect As RECT) As Long Private Declare Function DrawThemeText Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long, ByVal iStateId As Long, ByVal pszText As Long, ByVal iCharCount As Long, ByVal dwTextFlag As Long, ByVal dwTextFlags2 As Long, pRect As RECT) As Long Private Declare Function DrawThemeIcon Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long, ByVal iStateId As Long, pRect As RECT, ByVal himl As Long, ByVal iImageIndex As Long) As Long Private Declare Function DrawThemeEdge Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal hdc As Long, ByVal iPartId As Long, ByVal iStateId As Long, pDestRect As RECT, ByVal uEdge As Long, ByVal uFlags As Long, pContentRect As RECT) As Long Private Declare Function GetThemeInt Lib "uxtheusercontrol.dll" (ByVal hTheme As Long, ByVal iPartId As Long, ByVal iStateId As Long, ByVal iPropId As Long, piVal As Long) As Long Public Property Get Appearance() As EVPRGAppearanceConstants Appearance = m_eAppearance End Property Public Property Let Appearance(ByVal eAppearance As EVPRGAppearanceConstants)
m_eAppearance = eAppearance pDraw PropertyChanged "Appearance" End Property Public Property Get BackColor() As OLE_COLOR
Public Property Let BarForeColor(oColor As OLE_COLOR) m_oBarForeColor = oColor pDraw PropertyChanged "BarForeColor" End Property
BackColor = UserControl.BackColor
Public Property Get BarPicture() As IPicture
End Property Public Property Let BackColor(oColor As OLE_COLOR)
Set BarPicture = picBar.Picture End Property
UserControl.BackColor = oColor pDraw PropertyChanged "BackColor" End Property Public Property Get BackPictureMode() As EVPRGPictureModeConstants BackPictureMode = m_eBackPictureMode
Public Property Let BarPicture(pic As IPicture) pPicture pic, picBar End Property Public Property Set BarPicture(pic As IPicture) pPicture pic, picBar
End Property
End Property
Public Property Let BackPictureMode(ByVal eMode As EVPRGPictureModeConstants)
Public Property Get BarPictureMode() As EVPRGPictureModeConstants
m_eBackPictureMode = eMode pDraw PropertyChanged "BackPictureMode"
BarPictureMode = m_eBarPictureMode
End Property
Public Property Let BarPictureMode(ByVal eMode As EVPRGPictureModeConstants)
Public Property Get BarColor() As OLE_COLOR BarColor = m_oBarColor End Property Public Property Let BarColor(oColor As OLE_COLOR) m_oBarColor = oColor pDraw PropertyChanged "BarColor" End Property Public Property Get BarForeColor() As OLE_COLOR BarForeColor = m_oBarForeColor End Property
End Property
m_eBarPictureMode = eMode pDraw PropertyChanged "BarPictureMode" End Property Private Sub Border(ByVal Long, _ ByVal Long, _ ByRef RECT, _ ByVal As Boolean)
Dim hPenDark As Long Dim hPenLight As Long Dim hPenBlack As Long
lHDC As lStyle As tR As bRaised
Dim hPenOld Dim tJunk
As Long As POINTAPI
Select Case lStyle Case 0 hPenBlack = CreatePen(0, 1, 0) hPenOld = SelectObject(lHDC, hPenBlack) With tR MoveToEx lHDC, .Left, .Top, tJunk LineTo lHDC, .Right 1, .Top LineTo lHDC, .Right 1, .Bottom - 1 LineTo lHDC, .Left, .Bottom - 1 LineTo lHDC, .Left, .Top End With 'tR SelectObject lHDC, hPenOld DeleteObject hPenBlack Case 1 hPenDark = CreatePen(0, 1, GetSysColor(vbButtonShadow And &H1F&)) hPenLight = CreatePen(0, 1, GetSysColor(vb3DHighlight And &H1F&)) If bRaised Then MoveToEx lHDC, tR.Left, tR.Bottom - 2, tJunk hPenOld = SelectObject(lHDC, hPenLight) LineTo lHDC, tR.Left, tR.Top LineTo lHDC, tR.Right - 1, tR.Top SelectObject lHDC, hPenOld MoveToEx lHDC, tR.Right - 1, tR.Top, tJunk hPenOld = SelectObject(lHDC, hPenDark) LineTo lHDC, tR.Right - 1, tR.Bottom - 1 LineTo lHDC, tR.Left 1, tR.Bottom - 1 SelectObject lHDC, hPenOld Else 'BRAISED = FALSE/0 MoveToEx lHDC, tR.Left, tR.Bottom - 1, tJunk hPenOld = SelectObject(lHDC, hPenDark) LineTo lHDC, tR.Left, tR.Top LineTo lHDC, tR.Right, tR.Top SelectObject lHDC, hPenOld MoveToEx lHDC, tR.Right - 1, tR.Top + 1, tJunk
hPenOld = SelectObject(lHDC, hPenLight) LineTo lHDC, tR.Right - 1, tR.Bottom - 1 LineTo lHDC, tR.Left, tR.Bottom - 1 SelectObject lHDC, hPenOld End If DeleteObject hPenDark DeleteObject hPenLight Case 2 If bRaised Then DrawEdge lHDC, tR, EDGE_RAISED, BF_RECT Or BF_SOFT Else 'BRAISED = FALSE/0 DrawEdge lHDC, tR, EDGE_SUNKEN, BF_RECT Or BF_SOFT End If End Select End Sub Public Property Get BorderStyle() As EVPRGBorderStyleConstants BorderStyle = m_eBorderStyle End Property Public Property Let BorderStyle(ByVal eStyle As EVPRGBorderStyleConstants) m_eBorderStyle = eStyle pDraw PropertyChanged "BorderStyle" End Property Public Property Get Font() As IFont Set Font = UserControl.Font End Property Public Property Let Font(ByRef fnt As IFont) Set UserControl.Font = fnt pDraw PropertyChanged "Font" End Property Public Property Set Font(ByRef fnt As IFont) Set UserControl.Font = fnt pDraw PropertyChanged "Font" End Property
Public Property Get ForeColor() As OLE_COLOR ForeColor = m_oForeColor End Property Public Property Let ForeColor(oColor As OLE_COLOR) m_oForeColor = oColor pDraw PropertyChanged "ForeColor" End Property Public Property Get Max() As Long Max = m_lMax
End Sub Public Sub ModifyPicture(Optional ByVal fLuminance As Double = 1, _ Optional ByVal fSaturation As Double = 1) Dim cDib As New pcDibSection If (pbPic(picBack)) Then With cDib .CreateFromPicture picBack .ModifyHLS 1, fLuminance, fSaturation .PaintPicture picBack.hdc End With 'cDib End If
End Property End Sub Public Property Let Max(ByVal lMax As Long) m_lMax = lMax pDraw PropertyChanged "Max" End Property Public Property Get Min() As Long
Private Function pbPic(ByVal picThis As PictureBox) As Boolean If Not (picThis.Picture Is Nothing) Then If Not picThis.Picture.handle = 0 Then pbPic = True End If End If
Min = m_lMin End Function End Property Private Sub pDraw() Public Property Let Min(ByVal lMin As Long) m_lMin = lMin pDraw PropertyChanged "Min" End Property Public Sub ModifyBarPicture(Optional ByVal fLuminance As Double = 1, _ Optional ByVal fSaturation As Double = 1) Dim cDib As New pcDibSection If (pbPic(picBar)) Then With cDib .CreateFromPicture picBar .ModifyHLS 1, fLuminance, fSaturation .PaintPicture picBar.hdc End With 'cDib End If
Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim
rcContent lHDC lhDCU bMem tR tBR tSR tWR tXPR lWidth lHeight lColor hBr hRgn fPercent bDrawText hFntOld iFnt i lSegmentWidth lSegmentSpacing hTheme hR bDrawn bDoDefault
As As As As As As As As As As As As As As As As As As As As As As As As As
RECT Long Long Boolean RECT RECT RECT RECT RECT Long Long Long Long Long Double Boolean Long IFont Long Long Long Long Long Boolean Boolean
GetClientRect m_hWnd, tR
lWidth = Abs(tR.Right tR.Left) lHeight = Abs(tR.Bottom tR.Top) lhDCU = UserControl.hdc lHDC = m_cMemDC.hdc(lWidth, lHeight) If lHDC = 0 Then lHDC = lhDCU Else 'NOT LHDC... bMem = True End If bDoDefault = True RaiseEvent Draw(lHDC, tR.Left, tR.Top, lWidth, lHeight, bDoDefault) If bDoDefault Then ' Draw background: If pbPic(picBack) Then If m_eBackPictureMode = epbpTile Then TileArea lHDC, 0, 0, lWidth, lHeight, picBack.hdc, picBack.ScaleWidth \ Screen.TwipsPerPixelX, picBack.ScaleHeight \ Screen.TwipsPerPixelY, 0, 0 Else 'NOT M_EBACKPICTUREMODE... StretchBlt lHDC, 0, 0, lWidth, lHeight, picBack.hdc, 0, 0, picBack.ScaleWidth \ Screen.TwipsPerPixelX, picBack.ScaleHeight \ Screen.TwipsPerPixelY, vbSrcCopy End If Else 'PBPIC(PICBACK) = FALSE/0 If (m_bXpStyle) Then On Error Resume Next hTheme = OpenThemeData(hwnd, StrPtr("Progress")) On Error GoTo 0 If (hTheme <> 0) Then hR = GetThemeInt(hTheme, 0, 0, PROGRESSCHUNKSIZE, lSegmentWidth) If (hR = S_OK) Then hR = GetThemeInt(hTheme, 0, 0, PROGRESSSPACESIZE, lSegmentSpacing) If (hR = S_OK) Then lSegmentWidth = lSegmentWidth + lSegmentSpacing ' If (Width > usercontrol.Height) Then
' hR = DrawThemeBackground(hTheme, lHDC, 1, 0, tR, tR) ' Else 'NOT (WIDTH... ' hR = DrawThemeBackground(hTheme, lHDC, 2, 0, tR, tR) ' End If If (hR = S_OK) Then bDrawn = True End If End If End If End If End If If Not (bDrawn) Then lColor = UserControl.BackColor If lColor And &H80000000 Then hBr = GetSysColorBrush(lColor And &H1F&) Else 'NOT LCOLOR... hBr = CreateSolidBrush(lColor) End If FillRect lHDC, tR, hBr DeleteObject hBr End If End If If (m_bSegments) And Not (bDrawn) Then lSegmentWidth = 8 lSegmentSpacing = 2 End If LSet tWR = tR If m_eBorderStyle > epbsNone Then If bDrawn Then InflateRect tR, 1, -1 Else 'BDRAWN = FALSE/0 If m_eAppearance = epba3D Then InflateRect tR, -2, -2 Else 'NOT M_EAPPEARANCE... InflateRect tR, -1, -1 End If End If End If If (m_bShowText) And Len(m_sText) > 0 Then bDrawText = True End If
If (bDrawText) And Not (bDrawn) Then Set iFnt = UserControl.Font hFntOld = SelectObject(lHDC, iFnt.hFont) SetBkMode lHDC, TRANSPARENT SetTextColor lHDC, TranslateColor(m_oForeColor) DrawText lHDC, " " & m_sText & " ", -1, tR, DT_SINGLELINE Or m_eTextAlignX Or m_eTextAlignY * 4 SelectObject lHDC, hFntOld End If ' Draw bar: ' Get the bar rectangle: LSet tBR = tR fPercent = (m_lValue m_lMin) / (m_lMax - m_lMin) If fPercent > 1# Then fPercent = 1# End If If fPercent < 0# Then fPercent = 0# End If If UserControl.Width > UserControl.Height Then tBR.Right = tR.Left + (tR.Right - tR.Left) * fPercent If (m_bSegments Or bDrawn) Then ' Quantise bar: With tBR .Right = .Right - ((.Right - .Left) Mod (lSegmentWidth + lSegmentSpacing)) 'Debug.Assert ((tBR.Right - tBR.Left) Mod (lSegmentWidth + lSegmentSpacing) = 0) If .Right < tR.Left Then .Right = tR.Left End If End With 'tBR End If Else 'NOT usercontrol.WIDTH... fPercent = 1# fPercent tBR.Top = tR.Top + (tR.Bottom - tR.Top) * fPercent If (m_bSegments Or bDrawn) Then ' Quantise bar: With tBR .Top = .Top ((.Top - .Bottom) Mod (lSegmentWidth + lSegmentSpacing)) If .Top > tR.Bottom Then
.Top = tR.Bottom End If End With 'tBR End If End If If Not bDrawn Then hRgn = CreateRectRgnIndirect(tBR) SelectClipRgn lHDC, hRgn End If If pbPic(picBar) Then If m_eBarPictureMode = epbpTile Then TileArea lHDC, 0, tBR.Top, tBR.Right - tBR.Left, tBR.Bottom - tBR.Top, picBar.hdc, picBar.ScaleWidth \ Screen.TwipsPerPixelX, picBar.ScaleHeight \ Screen.TwipsPerPixelY, 0, 0 Else 'NOT M_EBARPICTUREMODE... StretchBlt lHDC, 0, 0, lWidth, lHeight, picBar.hdc, 0, 0, picBar.ScaleWidth \ Screen.TwipsPerPixelX, picBar.ScaleHeight \ Screen.TwipsPerPixelY, vbSrcCopy End If Else 'PBPIC(PICBAR) = FALSE/0 If bDrawn Then LSet tXPR = tBR InflateRect tXPR, -2, -2 tXPR.Right = tXPR.Right + 1 tXPR.Bottom = tXPR.Bottom + 1 If (Width > UserControl.Height) Then hR = DrawThemeBackground(hTheme, lHDC, 3, 0, tXPR, tXPR) Else 'NOT (WIDTH... hR = DrawThemeBackground(hTheme, lHDC, 4, 0, tXPR, tXPR) End If Else 'BDRAWN = FALSE/0 lColor = m_oBarColor If lColor And &H80000000 Then hBr = GetSysColorBrush(lColor And &H1F&) Else 'NOT LCOLOR... hBr = CreateSolidBrush(lColor) End If
FillRect lHDC, tBR, hBr DeleteObject hBr End If End If If m_bSegments And Not bDrawn Then lColor = UserControl.BackColor If lColor And &H80000000 Then hBr = GetSysColorBrush(lColor And &H1F&) Else 'NOT LCOLOR... hBr = CreateSolidBrush(lColor) End If LSet tSR = tR If UserControl.Width > UserControl.Height Then For i = tBR.Left + lSegmentWidth To tBR.Right Step lSegmentWidth + lSegmentSpacing tSR.Left = i tSR.Right = i + lSegmentSpacing FillRect lHDC, tSR, hBr Next i Else 'NOT usercontrol.WIDTH... For i = tBR.Bottom To tBR.Top + lSegmentWidth Step (lSegmentWidth + lSegmentSpacing) tSR.Top = i tSR.Bottom = i + lSegmentSpacing FillRect lHDC, tSR, hBr Next i End If DeleteObject hBr End If If bDrawText Then Set iFnt = UserControl.Font hFntOld = SelectObject(lHDC, iFnt.hFont) If (bDrawn) Then hR = GetThemeBackgroundContentRect(hThe me, lHDC, 0, 0, tR, rcContent) hR = DrawThemeText(hTheme, lHDC, 0, 0, StrPtr(m_sText), -1, DT_SINGLELINE Or m_eTextAlignX Or m_eTextAlignY * 4, 0, rcContent) Else '(BDRAWN) = FALSE/0 SetBkMode lHDC, TRANSPARENT SetTextColor lHDC, TranslateColor(m_oBarForeColor) DrawText lHDC, " " & m_sText & " ", -1, tR,
DT_SINGLELINE Or m_eTextAlignX Or m_eTextAlignY * 4 End If SelectObject lHDC, hFntOld End If If Not bDrawn Then SelectClipRgn lHDC, 0 DeleteObject hRgn ' Draw border: Select Case m_eBorderStyle Case epbsRaised Select Case m_eAppearance Case epbaFlat Border lHDC, epbaFlat, tWR, True Case epba3DThin Border lHDC, epba3DThin, tR, True Case epba3D Border lHDC, epba3D, tWR, True End Select Case epbsInset Select Case m_eAppearance Case epbaFlat Border lHDC, epbaFlat, tWR, False Case epba3DThin Border lHDC, epba3DThin, tWR, False Case epba3D Border lHDC, epba3D, tWR, False End Select End Select End If End If ' Swap memdc<->Screen If bMem Then m_cMemDC.Draw lhDCU, 0, 0, lWidth, lHeight End If If (hTheme) Then CloseThemeData hTheme End If End Sub Public Property Get Percent() As Double Dim fPercent As Double fPercent = (m_lValue - m_lMin) / (m_lMax - m_lMin) If fPercent > 1# Then fPercent = 1# End If If fPercent < 0# Then fPercent = 0# End If
Percent = fPercent * 100#
PropertyChanged "ShowText"
End Property
End Property
Public Property Get Picture() As IPicture
Public Property Get Text() As String
Set Picture = picBack.Picture
Text = m_sText
End Property
End Property
Public Property Let Picture(pic As IPicture)
Public Property Let Text(ByVal sText As String)
pPicture pic, picBack End Property Public Property Set Picture(pic As IPicture) pPicture pic, picBack
m_sText = sText pDraw PropertyChanged "Text" End Property Public Property Get TextAlignX() As EVPRGHorizontalTextAlignConstants
End Property TextAlignX = m_eTextAlignX Private Sub pPicture(pic As IPicture, _ picStore As PictureBox) Set picStore.Picture = pic pDraw PropertyChanged "Picture" PropertyChanged "BarPicture"
End Property Public Property Let TextAlignX(ByVal eAlign As EVPRGHorizontalTextAlignConstants) m_eTextAlignX = eAlign pDraw PropertyChanged "TextAlignX"
End Sub End Property Public Property Get Segments() As Boolean
Public Property Get TextAlignY() As EVPRGVerticalTextAlignConstants
Segments = m_bSegments TextAlignY = m_eTextAlignY End Property End Property Public Property Let Segments(ByVal bState As Boolean) m_bSegments = bState pDraw PropertyChanged "Segments" End Property Public Property Get ShowText() As Boolean ShowText = m_bShowText End Property Public Property Let ShowText(ByVal bState As Boolean) m_bShowText = bState pDraw
Public Property Let TextAlignY(ByVal eAlign As EVPRGVerticalTextAlignConstants) m_eTextAlignY = eAlign pDraw PropertyChanged "TextAlignY" End Property Private Sub TileArea(ByVal lngHdc As Long, _ ByVal lngX As Long, _ ByVal Y As Long, _ ByVal lngWidth As Long, _ ByVal lngHeight As Long, _
ByVal lSrcDC As Long, _ ByVal lBitmapW As Long, _ ByVal lBitmapH As Long, _ ByVal lSrcOffsetX As Long, _ ByVal lSrcOffsetY As Long)
Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim
lSrcX lSrcY lSrcStartX lSrcStartY lSrcStartWidth lSrcStartHeight lDstX lDstY lDstWidth lDstHeight
As As As As As As As As As As
Long Long Long Long Long Long Long Long Long Long
lSrcStartX = ((lngX + lSrcOffsetX) Mod lBitmapW) lSrcStartY = ((Y + lSrcOffsetY) Mod lBitmapH) lSrcStartWidth = (lBitmapW lSrcStartX) lSrcStartHeight = (lBitmapH lSrcStartY) lSrcX = lSrcStartX lSrcY = lSrcStartY lDstY = Y lDstHeight = lSrcStartHeight Do While lDstY < (Y + lngHeight) If (lDstY + lDstHeight) > (Y + lngHeight) Then lDstHeight = Y + lngHeight - lDstY End If lDstWidth = lSrcStartWidth lDstX = lngX lSrcX = lSrcStartX Do While lDstX < (lngX + lngWidth) If (lDstX + lDstWidth) > (lngX + lngWidth) Then lDstWidth = lngX + lngWidth - lDstX If (lDstWidth = 0) Then lDstWidth = 4 End If End If 'If (lDstWidth > Width) Then lDstWidth = Width 'If (lDstHeight > Height) Then lDstHeight = Height BitBlt lngHdc, lDstX, lDstY, lDstWidth, lDstHeight, lSrcDC, lSrcX, lSrcY, vbSrcCopy lDstX = lDstX + lDstWidth
lSrcX = 0 lDstWidth = lBitmapW Loop lDstY = lDstY + lDstHeight lSrcY = 0 lDstHeight = lBitmapH Loop End Sub Private Function TranslateColor(ByVal oClr As OLE_COLOR, _ Optional hPal As Long = 0) As Long ' Convert Automation color to Windows color If OleTranslateColor(oClr, hPal, TranslateColor) Then TranslateColor = CLR_INVALID End If End Function Private Sub UserControl_Initialize() Set m_cMemDC = New pcMemDC m_eAppearance = epba3DThin m_eBorderStyle = epbsInset m_oBarColor = &H800000 m_oBarForeColor = &HFFFFFF m_eBarPictureMode = epbpTile m_eBackPictureMode = epbpTile m_lMax = 100 m_eTextAlignX = epbthCenter m_eTextAlignY = epbtvVCenter End Sub Private Sub UserControl_InitProperties() m_hWnd = UserControl.hwnd End Sub Private Sub UserControl_Paint() pDraw End Sub Private Sub UserControl_ReadProperties(PropBag As PropertyBag) m_hWnd = UserControl.hwnd With PropBag Picture = .ReadProperty("Picture", Nothing)
BackColor = .ReadProperty("BackColor", vbButtonFace) ForeColor = .ReadProperty("ForeColor", vbWindowText) Appearance = .ReadProperty("Appearance", epba3DThin) BorderStyle = .ReadProperty("BorderStyle", epbsInset) BarColor = .ReadProperty("BarColor", &H800000) BarForeColor = .ReadProperty("BarForeColor", &HFFFFFF) BarPicture = .ReadProperty("BarPicture", Nothing) BarPictureMode = .ReadProperty("BarPictureMode", epbpTile) BackPictureMode = .ReadProperty("BackPictureMode", epbpTile) Min = .ReadProperty("Min", 0) Max = .ReadProperty("Max", 100) Value = .ReadProperty("Value", 0) ShowText = .ReadProperty("ShowText", False) TextAlignX = .ReadProperty("TextAlignX", epbthCenter) TextAlignY = .ReadProperty("TextAlignY", epbtvVCenter) Text = .ReadProperty("Text", vbNullString) Font = .ReadProperty("Font", UserControl.Font) Segments = .ReadProperty("Segments", False) XpStyle = .ReadProperty("XpStyle", False) End With 'PropBag End Sub Private Sub UserControl_Resize() pDraw End Sub Private Sub UserControl_Terminate() Set m_cMemDC = Nothing
End Sub Private Sub UserControl_WriteProperties(PropBa g As PropertyBag)
With PropBag .WriteProperty "Picture", UserControl.Picture, Nothing .WriteProperty "BackColor", UserControl.BackColor, vbButtonFace .WriteProperty "ForeColor", UserControl.ForeColor, vbWindowText .WriteProperty "Appearance", UserControl.Appearance, epba3DThin .WriteProperty "BorderStyle", UserControl.BorderStyle, epbsInset .WriteProperty "BarColor", BarColor, &H800000 .WriteProperty "BarForeColor", BarForeColor, &HFFFFFF .WriteProperty "BarPicture", BarPicture, Nothing .WriteProperty "BarPictureMode", BarPictureMode, epbpTile .WriteProperty "BackPictureMode", BackPictureMode, epbpTile .WriteProperty "Min", Min, 0 .WriteProperty "Max", Max, 100 .WriteProperty "Value", Value, 0 .WriteProperty "ShowText", ShowText, False .WriteProperty "TextAlignX", TextAlignX, epbthCenter .WriteProperty "TextAlignY", TextAlignY, epbtvVCenter .WriteProperty "Text", Text, vbNullString .WriteProperty "Font", UserControl.Font .WriteProperty "Segments", Segments, False .WriteProperty "XpStyle", XpStyle, False End With 'PropBag End Sub
Public Property Get Value() As Long Value = m_lValue End Property Public Property Let Value(ByVal lValue As Long) m_lValue = lValue pDraw PropertyChanged "Value" End Property Public Property Get XpStyle() As Boolean XpStyle = m_bXpStyle End Property Public Property Let XpStyle(ByVal bState As Boolean) m_bXpStyle = bState pDraw PropertyChanged "XpStyle" End Property
DAFTAR RIWAYAT HIDUP
Nama
: Kurniadi Septianto
Tempat/ Tanggal Lahir : Cimanggis, 09 September 1984 Jenis Kelamin
: Laki-laki
Agama
: Islam
Alamat
: Jl. Tuntang VI No.6 Perumnas II Tangerang 15811
Telepon/HP
: 021-5911564/02194577874
Riwayat Pendidikan
:
•
Tahun 1990 – Tahun 1996, SDN Karawaci 18 Tangerang
•
Tahun 1996 – Tahun 1999, SLTP Negeri 9 Tangerang
•
Tahun 1999 – Tahun 2002, SMK Yuppentek I Tangerang
•
Tahun 2002 – Tahun 2008, Universitas Mercu Buana Jakarta