Issue‎ > ‎Issue 17‎ > ‎

004.txt

.::. .:, ..::.   :. .::. .,::   ,:. ..:,. ., .:. .:::. .::.  ,::.   :  .::. .,, 
.::...., .::     .. .::. ..::  .::    ::. ., .  .,::..  ::.  .,::.  :  .::... , 
.::.... .,::        .::. ..::  ::.    ,::..,    .::.    ::.  ...::, :  .::...   
.::.:.. .:::        .::....::  ::.    ,::..,  ..::.     ::.  .  .::.:  .::.:.   
.::....  ,::        .::. ..::  ::,    :::..,  .::,    . ::.  .   .:::  .::...   
.::. .,M8.:M...M8..,M:~MD .MM  .M7..MM::M..Z .MM: .M8:.MM8..D..,M,.:M  .::. . , 
.::,.,~M8.?,::MM:. .N:~M8 :MM..MM::.~MD.M..,.MM8...M8:.MMMM.D:.,M,..I ..::,.,:: 
      ,MMM? .7MM.     ,MMMMMM..MM.  .MM.M..,NM8.  .M8. M.NMM8 .,MMM.            
      ,M8.?...MM.     ,M8  MM..MM   .MM.M..:MM  ...M8. M  OMM .,M,....          
      ,M8...,.MM.  .D ,M8  MM  ?M. .NM..M..MM.  8..M8. M  .OM .,M,..,,.         
     ,88D8D8....NMM..,D888D8D8...8MM:. .M.DD888D8,D88888D. .$.88D88D8..         
                                       .M.                                      
                                       .Z.  



echo|zine, volume 5 issue 17         
How to make Your own AV [part2]
Brougt To you By : PusHm0v (pushm0v/at/echo/or/id)




[ Main ]

	Pada artikel terdahulu[1] 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, untuk itu 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|
                                 |
                                 |
                    <Periksa apakah PE yang valid>
                                 |y
                                 |
                      |Mapping tabel section|
                                 |
                                 |
           <Apakah section urutan ke 2 atau bernama .data>
                                 |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 sensitifitasnya, 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. 

[ 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.


[ Referensi ]

 [1] http://echo.or.id/forum/viewtopic.php?t=5903
 [2] Pietrek,Matt; Peering Inside the PE: A Tour of the Win32 Portable Executable File Format; MSDN; 1994
 [3] www.allapi.net
 [4] www.google.co.id
 [5] www.planet-source-code.com

[ Links ]
	
	Projek lengkap dapat didownload di : http://www.geocities.com/emomelodicfreak/ProjekAV2.zip

[ 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


*- $04dottxt - echo|zine - issue#17 - 070707 -*
Comments