Minggu, 26 Agustus 2007

Struktur Program COM



#####################################
Dokumentasi asli ada di www.SROeR.org
"Chapter 1 : Struktur Program COM"
#####################################

Mengapa menggunakan bahasa Assembly?

1. Cepat, Lebih cepat dari compiler lainnya.
2. Lebih dekat dengan bahasa mesin, disebabkan bahasa Assembly dialamatkan
1:1 dengan bahasa mesin.
3. Kode yang dihasilkan lebih kecil dari compiler lainnya.
4. Dapat mengakses hardware lebih luas.

Compiler Assembly sudah banyak tersedia di internet, contohnya TASM (Turbo
Assembler), MASM (Microsoft Assembler), NASM (Netwide Assembler), dan lainlain.
Salah satu bentuk program yang dapat dihasilkan oleh compiler Assembly
adalah file COM. File COM adalah struktur program paling sederhana. Ada
beberapa syarat dalam pembuatan atau penggunaan file COM :

1. Kode dan data program harus tidak lebih besar dari 64 KB.
2. Tidak dapat memesan alamat memori melalui sistem operasi.

Contoh bentuk kode program COM, ketiklah di teks editor yang dapat
menghasilkan file ASCII murni seperti Notepad, vi, atau lainnya. Simpan
dengan nama COBAASM.ASM.
Versi TASM :
----------------------------------
ideal
p386n
model tiny
codeseg
org 100h
jmp start
;tempat data dan subrutin
start:
mov ax, 4c00h
int 21h
end
----------------------------------
Versi MASM :
----------------------------------
.386
.model tiny
.code
org 100h
entry:
jmp start
;tempat data dan subrutin
start:
mov ax, 4c00h
int 21h
end entry
----------------------------------

Compilelah dengan perintah TASM.EXE COBAASM.ASM lalu dikuti dengan perintah
TLINK.EXE /T COBAASM.OBJ jika menggunakan compiler TASM. Untuk compiler MASM
gunakan perintah ML COBAASM.ASM. Jika tak ada error maka akan terlihat
output seperti ini :

E:\PUSHM0~1\TASM3>tasm.exe cobaasm.asm
Turbo Assembler Version 3.0 Copyright (c) 1988, 1991 Borland
International
Assembling file: cobaasm.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 460k

File yang dihasilkan dari proses kompilasi adalah file OBJ. Untuk merubah
file OBJ ini menjadi sebuah file EXE atau COM kita perlu melakukan "linking"
dengan program linker. Disini kita menggunakan TLINK.exe.

E:\PUSHM0~1\TASM3>tlink.exe /t cobaasm.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International

Argumen /t pada tlink.exe berarti kita ingin membuat file COM dari file .obj
yang dihasilkan oleh compiler. Sedangkan untuk membuat file EXE tidak perlu
mengikutkan argumen /t.
Jalankan program COM tersebut :

E:\PUSHM0~1\TASM3>cobaasm.com

Apa yang terjadi? Tentunya tidak terjadi apa-apa karena kita belum
menuliskan perintah untuk program tersebut. Jadi program cobaasm.com
tersebut hanya diload ke memory lalu terminate dengan sendirinya.
Apa sih arti dari kode-kode diatas? lalu apa perbedaan antara kode yang
ditulis untuk compiler TASM dengan MASM?
berikut adalah penjelasan lengkapnya...

1. Perintah "ideal" berarti kita menggunakan syntax ideal dalam compiler
TASM.
2. Perintah "p386n" atau ".386" berarti kita menggunakan intruksi prosesor
80386.
3. Perintah "model tiny" atau ".tiny" berarti kita ingin menggunakan
format file COM.
4. Perintah "codeseg" atau ".code" adalah awal dari kode program kita.
5. Perintah "org 100h" berarti program kita akan dimulai dari offset 100h.
6. Dalam compiler MASM kita perlu mendeklarasikan entry point untuk
program, disini kita gunakan label "entry:".
Perlu diketahui kalau deklarasi sebuah label : "nama_label:".
7. Program COM selalu diawali dengan "peloncatan" atau "jump" ke awal kode
program. Perintah yang digunakan adalah “jmp" diikuti dengan nama
label, misalnya "start". Bila diperhatikan, diantara perintah "jmp
start" dan label "start" adalah tempat dimana kita bisa deklarasikan
variabel-variabel ataupun data-data yang digunakan dalam program kita.
8. Untuk mengakhiri jalannya program, kita perlu membuat suatu perintah.
Perintah "end" atau "end entry" disini hanya menunjukkan akhir dari
kode program, bukan untuk MENGAKHIRI proses. 2 perintah yang digunakan
adalah :

MOV AX, 4c00h
int 21h

Perintah MOV adalah perintah untuk menyalin isi data atau register ke
suatu register lain. Bentuk umum perintah MOV :

MOV tujuan_salin, asal_salin

Pada perintah diatas kita akan menyalin atau lebih tepatnya "mengisi"
register AX (lebih dikenal dengan register akumulator 16 bit) dengan
bilangan heksa 4c00.
Sedangkan perintah INT 21h berarti kita menjalankan interrupt sistem
dengan fungsi 21h.

ActiveX-DLL with ASP



Shoutz : All echo|staff, yogyafree|staff, The Killer Team
Myztx, vaganci, ^family_code^, TOMMY, adhietslank, ^rumput_kering^, Hartono, etc.
#e-c-h-o, #yogyafree, #javahack, #koncek, #canda, #canda-ops @DAL.NET
newbie_hacker@yahoogroups.com, yogyafree@yahoogroups.com
IT_CENTER@yahoogroups.com, ProgrammerVB@yahoogroups.com
virus_baru@yahoogroups.com
VB-bego.com, Virology.info, Vbtn.com
IA01 dan 1IA07, Lab MaDas angk. 19/2004 @ Gunadarma University
Dan teman2 serta kerabat2 lain yang tidak bisa disebutkan satu-persatu

Notes : - Penulis TIDAK bertanggung jawab atas penggunaan maupun penyalahgunaan dari artikel ini.
- Tujuan dibuat artikel HANYA untuk BAHAN PEMBELAJARAN saja.
- Penggunaan nama, merek, atau logo hanya sebagai CONTOH dan REFERENSI saja, TIDAK ada maksud
mempromosikan pihak tertentu.
- Penulis mohon maaf apabila seluruh/sebagian dari isi artikel ini sudah tersirat dalam
artikel sejenis lainnya.

Main#
ASP atau Active Server Pages adalah produk server-side scripting yang dikeluarkan oleh Microsoft Corporation.
Terdapat beberapa perbedaan antara ASP dengan server-side scripting lainnya, diantaranya :

- Lisensi, seperti yang diketahui ASP adalah bersifat proprietary.
- Distribusi, ASP hanya dapat dijalankan di sistem operasi windows dengan IIS yang terinstall didalamnya.
Walaupun dapat dijalankan di linux/unix dengan Chilisoft ASP, tidak dapat selancar bila di windows.
- Penggunaan COM object yang kental, salah satu keunggulan ASP adalah kekayaannya dalam integrasi dengan COM
Object dalam kinerjanya.
- Dapat berkolaborasi dengan script lainnya, seperti VBScript, JScript, PerlScript, PyhonScript, dan lainnya.
- Dominan memakai ADO dalam konektivitas databasenya.

Dalam perkembangannya, saat ini ASP sudah mengimplementasikan konsep .NET didalamnya. Berikut adalah sejarah singkat
dari perkembangan ASP :

- ASP version 1.0 (distributed with IIS 3.0) , Desember 1996,
- ASP version 2.0 (distributed with IIS 4.0) , September 1997,
- ASP version 3.0 (distributed with IIS 5.0) , November 2000,
- ASP.NET version 1.0 (part of the Microsoft .NET platform) , Januari 2002
- ASP.NET version 1.1 , April 2003
- ASP.NET version 2.0 , November 7 2005)

Pada artikel ini akan dijelaskan bagaimana membuat dan mengimplementasikan ActiveX DLL di halaman ASP. Mengapa menggunakan
ActiveX DLL? Karena komponen tersebut dapat diubah dan dibuat dengan mudah, tentunya jika diimbangi dengan pengetahuan pemograman
yang baik. Secara umumnya, pengaksesan komponen ActiveX DLL dari script ASP adalah :

set obj = Server.createobject(object/file_name.classname)

Objectname adalah nama object/file yang sudah teregistrasi di windows sebelumnya, dan classname adalah nama class dari object
tersebut. Sedangkan untuk pengaksesan fungsi atau method yang ada di object tersebut adalah :

obj.methodname(param)

Param adalah parameter masukan untuk fungsi.

How to build#
Dalam membuat komponen ActiveX untuk ASP perlu diperhatikan hal-hal sebagai berikut :

- Privilege atau hak akses. Jika komponen ActiveX perlu menjalankan suatu program, menghapus/membuat file dan kegiatan akses sistem
lainnya, perlu konfigurasi privilege yang baik. Karena jika tidak maka akan terjadi penolakan hak akses dari sistem operasi.
- Run-time, pada saat eksekusi komponen ActiveX maka komponen tersebut akan diload oleh IIS Worker Process atau w3wp.exe. Maka bila
terjadi kesalahan atau kondisi dimana komponen tidak respon, diperlukan penanganan seperti merestart service IIS guna membuka
handle ke file ActiveX DLL tsb.
- Registrasi komponen, registrasi komponen dengan menggunakan tools regsvr32.exe diperlukan agar IIS dapat mengetahui komponen yang
akan dijalankannya. Registrasi dapat dilakukan dengan cara mengetikkan : regsvr32.exe [path/nama DLL] pada kotak Run dan untuk unregister
komponen dengan cara : regsvr32.exe /u [path/nama DLL].

Selanjutnya kita akan membuat contoh komponen ActiveX yang sederhana dengan bahasa pemograman Visual Basic 6.0. Untuk memilih pembuatan ActiveX,
dapat dilakukan dengan cara memilih jenis projek pada jendela pilihan projek. Pilihlah projek New ActiveX DLL. Maka akan tersaji 1 buah class kosong
yang siap digunakan. Perlu diketahui bahwa pengaturan properties class Instancing harus diset ke nilai 5 atau MultiUse. Berikut adalah contoh fungsi
yang akan mengembalikan nilai perhitungan aritmatika :

------------------ START COPy FROM HERE ------------------

Public Function hitung(ByRef x As Integer, ByRef y As Integer) As Integer
hitung = (x + y) * 2
End Function

------------------ STOP COPy FROM HERE ------------------

Lalu simpanlah projek dengan nama coba.vbp dan nama class dengan nama hitung1.cls. Lalu buatlah komponen ActiveX dari projek tersebut dengan memilih
menu File -> Make Coba.dll dari toolbar. Registrasi komponen tersebut dengan command dari kotak Run : Regsvr32.exe coba.dll. Buatlah file ASP berikut
ini :


------------------ START COPy FROM HERE ------------------

<%
dim hasil
set obj = Server.createobject("coba.hitung1")
hasil = obj.hitung(1,2)
Response.Write hasil
%>

------------------ STOP COPy FROM HERE ------------------

Lalu jalankanlah dari browser anda, maka akan terlihat bahwa tercetak angka "6" dari hasil perhitungan fungsi hitung. Memang terlihat masih sangat sederhana,
tetapi komponen ActiveX dapat dibuat dan digunakan untuk keperluan yang sangat banyak, Seperti perhitungan matematis yang rumit, prosedur Pengecekan Anti-Virus,
mengirimkan email secara otomatis, dan lain sebagainya.
Disamping kemudahan menggunakan komponen ActiveX dalam ASP, juga terdapat kekurangannya yaitu pemanggilan fungsi/method dari object diperlukan waktu yang lama.
Bahkan untuk membuat object itu sendiri juga diperlukan waktu yang lama. Berikut adalah tabel perbandingan antara waktu eksekusi VBS, JS dan VB :

Time taken by same code in VB/VBS/JS [misc].

VB Code VBS JS VB5
Application("A2"), 0items 35 54 7
Application("A4"), 1000items 42 65 15
request.querystring 124 8
request.querystring("A") 176 161 47
request.querystring.Item("A") 210 205 47
request.servervariables("HTTP_REFERER")177 175 55
request.ServerVariables("REMOTE_ADDR") 205 175 74
request.servervariables("X") 224 226 95
request.servervariables("HTTP_COOKIE") 318 109
request.cookies("AAA") 165 160 47
request.totalbytes 61 61 3
A = X & "AAAA" 4.6 1.7
A = "" & Now() 40.7 29.3
D = Now 10.8 9.8
A = FormatNumber(5.5,2) 17.6
A = Format(5.5, "0.00") 52.4
A = Left(X,2) 5.8 1.7
D = InStr(X, "bb") 4.4 1.4
Call sub 7.4 1.4
CreateObject("ADODB.Connection") 1110 471
CreateObject("ADODB.Recordset") 751 83
CreateObject("Scripting.Dictionary") 590 257
CreateObject("Scripting.FSO") 350 27

Penggunaan memory juga mempengaruhi kinerja dari ASP. ASP mempunyai karakteristik menyimpan file include di dalam memory setiap dipanggil. Jadi bila
Terdapat banyak file include, maka akan membebani sistem itu sendiri. Contohnya bila terdapat 100 kB file include dan tiap byte dari file tersbut memakan
3 byte di memory dan file tersbut di include ke dalam 100 file ASP, maka 100 * 3 * 100 = 30 MB jumlah memory yang digunakan.
Sedangkan pada penggunaan komponen ActiveX pada ASP akan sedikit menguntungkan, karena komponen akan terus di memory begitu ia diload atau di eksekusi
hingga di bebaskan kembali oleh IIS.

Penutup#
Penggunaan komponen ActiveX di halaman ASP sangat mudah dibuat dan diimpelemntasikan. Komponen ActiveX dapat mmebaut konten web lebih dinamis dan membantu
perhitungan matematis bila diperlukan. Penggunaan komponen ActiveX juga terdapat kelemahannya, seperti pembuatan dan pemanggilan object yang cukup memakan waktu.

Referensi#
http://en.wikipedia.org/wiki/Active_Server_Pages
http://www.motobit.com/tips/detpg_DLLinclude/
http://www.planet-source-code.com/
http://support.microsoft.com/kb/249873
http://www.google.co.id/

How To Make Your Own Anti Virus - Part 2



Shoutz : All echo|staff, yogyafree|staff, The Killer Team
Myztx, vaganci, ^family_code^, TOMMY, adhietslank, ^rumput_kering^, Hartono, etc.
#e-c-h-o, #yogyafree, #javahack, #koncek, #canda, #canda-ops @DAL.NET
newbie_hacker@yahoogroups.com, yogyafree@yahoogroups.com
IT_CENTER@yahoogroups.com, ProgrammerVB@yahoogroups.com
virus_baru@yahoogroups.com
VB-bego.com, Virology.info, Vbtn.com
IA01 dan 1IA07, Lab MaDas angk. 19/2004 @ Gunadarma University
Dan teman2 serta kerabat2 lain yang tidak bisa disebutkan satu-persatu

Notes : - Penulis TIDAK bertanggung jawab atas penggunaan maupun penyalahgunaan dari artikel ini.
- Tujuan dibuat artikel HANYA untuk BAHAN PEMBELAJARAN saja.
- Penggunaan nama, merek, atau logo hanya sebagai CONTOH dan REFERENSI saja, TIDAK ada maksud
mempromosikan pihak tertentu.
- Penulis mohon maaf apabila seluruh/sebagian dari isi artikel ini sudah tersirat dalam
artikel sejenis lainnya.

Main#
Pada artikel terdahulu penulis sudah membahas tentang bagaimana engine scanner statis bekerja secara umum. Seperti yang
diketahui, scanner statis akan mendeteksi sebuah malware atau thread berdasarkan hasil checksum dari file tersebut. Tetapi
teknik ini tidak akan efesien apabila diterapkan pada malware yang sudah mengimplementasikan teknik polymorph. teknik Polymorph
secara umum adalah teknik mereplikasi diri dan tiap signature replikanya berbeda satu sama lain.
Dalam beberapa kasus virus lokal sudah ditemukan penggunaan teknik polymorph. Baik itu secara sederhana maupun kompleks. Cara
yang biasa digunakan yaitu :

- Merubah atau mengenkripsi nama variabel dan string
- Menambah atau mengurangi byte-byte tertentu dalam diri virus
- Menggunakan engine polymorph tertentu

Untuk kasus yang menggunakan teknik enkripsi, tidak semua jenis enkripsi dapat didekripsi oleh engine Antivirus. Perlu analisa
dengan menggunakan reverse-engineering yang mendalam guna memahami teknik enkripsi yang dipakai.
Pada penulisan berikut akan dijelaskan bagaimana membuat scanner statis yg bisa mengenali thread secara lebih baik dari yang terdahulu
Ada baiknya kita mengenal terlebih dahulu format file PE (Portable Executable) pada Windows.
Format File PE mulai dikenalkan pada Windows NT 3.1, dimana format file ini masih menyimpan header MZ dari MS-DOS. Berikut skema dasar
format file PE :

|----------------------------|
| CodeView Debug Information |
|----------------------------|
| COFF Symbols |
|----------------------------|
| COFF Line Numbers |
|----------------------------|
| Section - n |
| . |
| . |
| Section - 2 |
|----------------------------|
| Section - 1 |
|----------------------------|
| Section - 0 |
|----------------------------|
| Array Section table |
| . |
| . |
| Array Section table |
|----------------------------|
| Data Directory |
|----------------------------|
| |
|----------------------------|
| Image File Header |
|----------------------------|
| "PE\0\0" |
|----------------------------|
| "MZ" |
|----------------------------|

$PE Header
PE Header merupakan salah satu struktur dari IMAGE_NT_HEADER (dideklarasikan dalam WINNT.H). Header ini mengandung berbagai macam jenis
informasi seperti lokasi dan ukuran dari area kode dan data, system operasi yang dipakai, ukuran stack, dan lain-lain.
Header ini juga mengandung MS-DOS stub, yaitu program kecil yang akan menampilkan teks "This program cannot be run in MS-DOS mode." bila
file PE dijalankan di lingkungan yang tidak mendukung Win32. PE Header Terdiri dari struktur :

DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;

Dimana Signature adalah teks "PE\0\0". Sedangkan IMAGE_FILE_HEADER berisi struktur :

WORD Machine //Berisi nilai untuk jenis CPU yang dipakai, ex : 0x14d untuk Intel i860
WORD NumberOfSections //Berisi jumlah section yang ada di file PE
DWORD TimeDateStamp //Berisi tanggal kapan linker (atau compiler untuk File OBJ) memproduksi file PE
DWORD PointerToSymbolTable //Offset untuk tabel symbol COFF
DWORD NumberOfSymbols //Berisi jumlah symbol COFF di tabel
WORD SizeOfOptionalHeader //Berisi ukuran dari optional header
WORD Characteristics //Berisi informasi tentang file PE

Untuk IMAGE_OPTIONAL_HEADER berisi :

WORD Magic //Selalu bernilai 0x010B
BYTE MajorLinkerVersion //Versi linker yang dipakai
BYTE MinorLinkerVersion //Versi linker yang dipakai
DWORD SizeOfCode //Ukuran dari section code
DWORD SizeOfInitializedData //Ukuran dari semua data section yang terinisialisasi
DWORD SizeOfUninitializedData //Ukuran dari semua data section yang tidak terinisialisasi
DWORD AddressOfEntryPoint //Alamat dimana loader akan memulai eksekusi file PE, alamat ini adalah RVA (Relative Virtual Address)
DWORD BaseOfCode //Alamat RVA dimana section code dimulai
DWORD BaseOfData //Alamat RVA dimana section data dimulai
DWORD ImageBase //Alamat dimana file PE akan dimapping di memory
DWORD SectionAlignment //Nilai penggandaan untuk mapping tiap section di memory
DWORD FileAlignment //Nilai penggandaan untuk mapping tiap section di disk
WORD MajorOperatingSystemVersion //Versi OS yang dipakai
WORD MinorOperatingSystemVersion //Versi OS yang dipakai
WORD MajorSubsystemVersion //Versi minimum OS yang dipakai
WORD MinorSubsystemVersion //Versi minimum OS yang dipakai
DWORD Reserved1 //Selalu bernilai 0
DWORD SizeOfImage //Ukuran dari image yang akan diload oleh loader
DWORD SizeOfHeaders //Ukuran dari PE Header dan tabel section
DWORD CheckSum //Nilai checksum CRC dari file PE
WORD Subsystem //Tipe subsistem yang diperlukan untuk keperluan GUI
WORD DllCharacteristics //Tanda atau flag untuk inisialisasi DLL (Dynamic Link Library)
DWORD SizeOfStackReserve //Ukuran dari virtual memory yang akan digunakan untuk inisialisasi stack
DWORD SizeOfStackCommit //Ukuran dari memory yang akan digunakan untuk inisialisasi stack
DWORD SizeOfHeapReserve //Ukuran dari virtual memory yang akan digunakan untuk inisialisasi heap proses
DWORD SizeOfHeapCommit //Ukuran dari memory yang akan digunakan untuk inisialisasi heap proses
DWORD LoaderFlags //Digunakan untuk keperluan debugging
DWORD NumberOfRvaAndSizes //Jumlah dari array DataDirectory

$Tabel Section
Secara umum Tabel Section dapat dianalogikan sebagai "daftar" untuk tiap section yang ada di file PE. Tabel ini mencakup informasi
tentang section-section file PE. berikut contoh layout dari tabel section file PE yang sudah di dump :

01 .text VirtSize: 00005AFA VirtAddr: 00001000
raw data offs: 00000400 raw data size: 00005C00
relocation offs: 00000000 relocations: 00000000
line # offs: 00009220 line #'s: 0000020C
characteristics: 60000020
CODE MEM_EXECUTE MEM_READ

02 .bss VirtSize: 00001438 VirtAddr: 00007000
raw data offs: 00000000 raw data size: 00001600
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000080
UNINITIALIZED_DATA MEM_READ MEM_WRITE

03 .rdata VirtSize: 0000015C VirtAddr: 00009000
raw data offs: 00006000 raw data size: 00000200
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: 40000040
INITIALIZED_DATA MEM_READ

04 .data VirtSize: 0000239C VirtAddr: 0000A000
raw data offs: 00006200 raw data size: 00002400
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000040
INITIALIZED_DATA MEM_READ MEM_WRITE

05 .idata VirtSize: 0000033E VirtAddr: 0000D000
raw data offs: 00008600 raw data size: 00000400
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000040
INITIALIZED_DATA MEM_READ MEM_WRITE

06 .reloc VirtSize: 000006CE VirtAddr: 0000E000
raw data offs: 00008A00 raw data size: 00000800
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: 42000040
INITIALIZED_DATA MEM_DISCARDABLE MEM_READ

Layout diatas adalah format dari IMAGE_SECTION_HEADER, Berikut keterangan tentang IMAGE_SECTION_HEADER :

BYTE Name[IMAGE_SIZEOF_SHORT_NAME] //Nama section, biasanya diawali dengan tanda titik/dot
union { //Nilai sesungguhnya dari ukuran kode atau data
DWORD PhysicalAddress
DWORD VirtualSize
} Misc;
DWORD VirtualAddress //Alamat RVA untuk keperluan mapping oleh loader
DWORD SizeOfRawData //Ukuran dari section setelah dibulatkan ke ukuran file alignment
DWORD PointerToRawData //Offset dari section
DWORD PointerToRelocations //Offset untuk informasi relokasi section
DWORD PointerToLinenumbers //Offset untuk nomor baris (line number)
WORD NumberOfRelocations //Jumlah dari relokasi yang ada di tabel relokasi
WORD NumberOfLinenumbers //Jumlah dari nomor baris yang ada di tabel nomor baris
DWORD Characteristics //Berisi angka tertentu yang menunjukkan atribut dari suatu section (data, kode, dll)

How to build#
Untuk membangun suatu scanner statis yang dapat memetakan (mapping) dan mengambil sebagian sectionnya utnuk dianalisa
, perlu diketahui terlebih dahulu hal-hal berikut :

- What's section? Berhubung section yang dimiliki oleh suatu file PE beragam jumlah dan isinya, kita perlu mengetahui section
keberapa dan apa isinya sebelum di analisa atau di dump. Pengidentifikasian tiap section dapat dilakukan dengan cara menganalisis
karakteristik file PE tersebut.
- Is it packed/compressed or not? Kadang para pembuat aplikasi perlu memproteksi atau mengecilkan ukuran file PE mereka
dengan cara menggunakan packer/compressor. Hal ini sangat berpengaruh dalam pengidentifikasian section, karena seringkali packer
/compressor membuat section dummy dalam file PE yang dihasilkan.

Bahasa pemograman yang digunakan adalah Visual Basic 6.0. sedangkan Projek yang akan dibuat adalah ActiveX DLL (Dynamic Link Library),
sehingga dapat digunakan oleh aplikasi lain. Referensi tentang File DLL dapat dilihat dibagian akhir artikel ini.
Section yang akan diambil adalah data atau code section, dengan mengasumsikan section tersebut berada di urutan kedua maka Section tersebut
seharusnya memiliki nama ".data". Berikut adalah flowchart sederhana dari DLL yang akan dibuat :

|Start|
|
|
|Input File|
|
|

|y
|
|Mapping tabel section|
|
|

|y
|
|Dapatkan size dan offsetnya|
|
|
|ambil checksum dari byte section tsb|
|
|
|End|

Untuk fungsi pengambilan checksum dapat menggunakan teknik CRC ataupun MD5. Khusus utnuk teknik CRC dapat ditemui pada artikel sebelumnya.
Sedangkan untuk teknik MD5 dapat menggunakan file aamd532.dll yang ada di file projek artikel ini.
Berikut ini adalah contoh sederhana Activex DLLnya :

------------------ START COPy FROM HERE ------------------
'Jenis Projek : Activex DLL
'Nama file Class : Class1.cls

Private Type IMAGEDOSHEADER
e_magic As String * 2
e_cblp As Integer
e_cp As Integer
e_crlc As Integer
e_cparhdr As Integer
e_minalloc As Integer
e_maxalloc As Integer
e_ss As Integer
e_sp As Integer
e_csum As Integer
e_ip As Integer
e_cs As Integer
e_lfarlc As Integer
e_ovno As Integer
e_res(1 To 4) As Integer
e_oemid As Integer
e_oeminfo As Integer
e_res2(1 To 10) As Integer
e_lfanew As Long
End Type

Private Type IMAGE_SECTION_HEADER
nameSec As String * 6
PhisicalAddress As Integer
VirtualSize As Long
VirtualAddress As Long
SizeOfRawData As Long
PointerToRawData As Long
PointerToRelocations As Long
PointerToLinenumbers As Long
NumberOfRelocations As Integer
NumberOfLinenumbers As Integer
Characteristics As Long

End Type

Private Type IMAGE_FILE_HEADER
Machine As Integer
NumberOfSections As Integer
TimeDateStamp As Long
PointerToSymbolTable As Long
NumberOfSymbols As Long
SizeOfOptionalHeader As Integer
Characteristics As Integer
End Type

Private Type IMAGE_DATA_DIRECTORY
VirtualAddress As Long
size As Long
End Type


Private Type IMAGE_OPTIONAL_HEADER
Magic As Integer
MajorLinkerVersion As Byte
MinorLinkerVersion As Byte
SizeOfCode As Long
SizeOfInitializedData As Long
SizeOfUninitializedData As Long
AddressOfEntryPoint As Long
BaseOfCode As Long
BaseOfData As Long
ImageBase As Long
SectionAlignment As Long
FileAlignment As Long
MajorOperatingSystemVersion As Integer
MinorOperatingSystemVersion As Integer
MajorImageVersion As Integer
MinorImageVersion As Integer
MajorSubsystemVersion As Integer
MinorSubsystemVersion As Integer
Win32VersionValue As Long
SizeOfImage As Long
SizeOfHeaders As Long
CheckSum As Long
Subsystem As Integer
DllCharacteristics As Integer
SizeOfStackReserve As Long
SizeOfStackCommit As Long
SizeOfHeapReserve As Long
SizeOfHeapCommit As Long
LoaderFlags As Long
NumberOfRvaAndSizes As Long
DataDirectory(0 To 15) As IMAGE_DATA_DIRECTORY
End Type

Private Type IMAGE_NT_HEADERS
Signature As String * 4
FileHeader As IMAGE_FILE_HEADER
OptionalHeader As IMAGE_OPTIONAL_HEADER
End Type

Private DOSHEADER As IMAGEDOSHEADER
Private NTHEADER As IMAGE_NT_HEADERS
Private SECTIONSHEADER() As IMAGE_SECTION_HEADER
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Function ReadPE(ByRef DATA() As Byte) As String
On Error GoTo ErrX
Dim CNT As Long
Dim u As Long
Dim dumpSec() As Byte

CopyMemory DOSHEADER, DATA(CNT), Len(DOSHEADER) 'Memulai mapping
If DOSHEADER.e_magic <> "MZ" Then Exit Function 'Periksa apakah DOS Header adalah valid
CopyMemory NTHEADER, DATA(DOSHEADER.e_lfanew), Len(NTHEADER)
CNT = CNT + DOSHEADER.e_lfanew + Len(NTHEADER) 'Offset section pertama
If NTHEADER.Signature <> "PE" & Chr(0) & Chr(0) Then Exit Function 'Periksa apakah file PE adalah valid
ReDim SECTIONSHEADER(NTHEADER.FileHeader.NumberOfSections - 1) 'Array tabel section
For u = 0 To UBound(SECTIONSHEADER) 'Enumerasi tiap section
CopyMemory SECTIONSHEADER(u), DATA(CNT), Len(SECTIONSHEADER(0))
CNT = CNT + Len(SECTIONSHEADER(0)) 'Offset section berikutnya
If SECTIONSHEADER(u).nameSec = ".data" Or u = 1 Then 'Periksa apakah section ke 2 atau bernama .data
POINTERTORAW = SECTIONSHEADER(u).PointerToRawData 'Dapatkan offset section
SIZEOFRAW = SECTIONSHEADER(u).SizeOfRawData 'Dapatkan ukurannya
ReDim dumpSec(SIZEOFRAW - 1)
For i = 0 To SIZEOFRAW - 1
dumpSec(i) = DATA(i) 'Salin array yang mengandung section code
Next
ReadPE = Hex(CRC32(dumpSec(), SIZEOFRAW - 1)) 'Teknik CRC32
GoTo udah
End If
Next u
udah:
Exit Function
ErrX:
On Error GoTo 0
End Function

------------------ STOP COPy FROM HERE ------------------

Dimana DATA() adalah array byte dari file PE yang dibuka. Engine scanner ini perlu ditingkatkan sensitifitas
nya, karena bila terdapat section dummy pada urutan section kedua atau tidak ada section yang bernama .data
maka hasil yang diperoleh akan salah.

Penutup#
Engine scanner statis pada AntiVirus dapat ditingkatkan kinerjanya dengan menambahkan algoritma, fungsi ataupun
prosedur tertentu dalam menganalisa setiap file suspect. Salah satu yang bisa ditambahkan adalah fungsi pengecekan
per section pada file PE. Fungsi ini juga masih rawan dari kesalahan analisa. Diharapkan dengan adanya artikel ini
dapat mengembangkan ataupun memajukan kualitas aplikasi Anti Virus lokal.

Referensi#
Pietrek,Matt; Peering Inside the PE: A Tour of the Win32 Portable Executable File Format; MSDN; 1994
www.allapi.net
www.google.co.id
www.planet-source-code.com

Links#
Projek lengkap dapat didownload di : Projek AV 2, Mirror

Jumat, 17 Agustus 2007

NIDS di Linux dengan Snort



IDS atau Intrusion Detection System itu paan ya? Menurut sejumlah referensi, IDS adalah suatu sistem yang memonitor perubahan-perubahan yang terjadi di sebuah sistem komputer, baik itu perubahan dalam sebuah jaringan maupun dari penggunaan komputer itu sendiri. IDS banyak macamna, antara lain :

1. HIDS, Host based Intrusion Detection System. IDS jenis ini akan memonitor dan menganalisa segala aktifitas yang terjadi dalam satu host tertentu.
2. NIDS, Network Intrusion Detection System. IDS yang ini akan memonitor dan menganalisa semua lalu-lintas paket yang ada di jaringan.
3. PIDS, Protocol-based Untrusion Detection System, nah kalo yang ini biasana ditempatkan di front-end sebuah server. Akan memonitor dan menganalisa semua komunikasi yang terjadi di suatu protokol, misal HTTPS.
4. APIDS, Application Protocol-based Intrusion Detection System. Hampir sama dengan PIDS, hanya saja agak berbeda tempat "nangkringna". Dia akan memonitor dan menganalisa status, perubahan dari suatu aplikasi protokol.
4. Hybrid Intrusion Detection System. Dari namana ajah dah diketahui "gabungan", berarti jenis yang ini adalah gabungan dari jenis2 yang sudah ada.

Yuk kita coba mengimplementasikan NIDS di linux. Disini aq pake box Linux debian etch 2.6.18-4-alpha-generic. Snort adalah salah satu aplikasi NIDS yang ada, Snort yang akan diinstal adalah versi 2.3.3. Oh iya, si Snort ini mempunyai kemampuan untuk mengexport log ke bentuk database, ada beberapa database yang dapat digunakan, kayak MySQL, PostgreSQL, oracle, MSSQL dan odbc. Kali ini kita tidak menggunakan fitur ini :).

Pertama tentuna kita install si Snort, pake perintah apt-get :

debian:~# apt-get install snort

buzz..buzz.. si apt bakal nyari dependencies dari si snort sekalian :). Kalo udah diinstall, nanti akan muncul menu yang menanyakan alamat IP yang akan di monitor ma si Snort. Aq masukin 192.168.1.0/24, buat monitor LAN aq :)

Setelah itu, akan dijalankan si Snort secara otomatis. Buat ngecek dah jalan pa lom, kita cari prosesna :

debian:~# ps -ax | grep snort

2082 ? Ss 0:02 /usr/sbin/snort -m 027 -D -d -l /var/log/snort -u snort -g snort -c /etc/snort/snort.conf -S HOME_NET=[192.168.1.0/24] -i eth3
2321 pts/0 S+ 0:00 grep snort

Yups, si Snort telah berhasil diluncurkan :P hehehhe, secara default si Snort nyimpen logna di /var/log/snort dalam bentuk log tcpdump. Ya kalo pgn dibaca harus pake aplikasi log analisis, ato pake tcpdump juga bisa :)

Apaan sih arti dari argumen2 -D -d -l n dll? -m deklarasi umask, -D berarti Snort berjalan pada mode Daemon, -d berarti Snort akan men-dump layer aplikasi, -l berarti Snort akan menyimpan file log ke lokasi yang ditentukan, -u berarti Snort dijalankan sebagai userid yang ditentukan, -g berarti Snort dijalankan sebagai groupid yang ditentukan, -c berarti si Snort akan menggunakan file konfigurasi yang ditentukan, -S akan mendeklarasikan nilai ke variabel yang ditentukan (n=v), dan -i adalah interface yang akan di"tangkringin" :P

Dalam beberapa kasus si Snort agak bermasalah. Versi yang terbaru saat ini dari www.snort.org adalah versi Snort 2.7.0.1. Aq install di box Debian n Slackware masih ada masalah. Masalahna yaitu si Snort gagal untuk berjalan dgn sukses, hal ini dapat dilihat pada /var/log/syslog :

debian kernel: device eth3 entered promiscuous mode
debian kernel: device eth3 left promiscuous mode

Beberapa thread di forum Snort.org juga menunjukkan hal ini. Tapi sampai saat ini aq juga lom tau kenapa :(.