Issue‎ > ‎Issue 24‎ > ‎

003.txt

                                                
              .;               .-.              
  .-.  .-.    ;;-. .-..-.      `-' . ,';.  .-.  
.;.-' ;      ;;  ;;   ;' ;.   ;'   ;;  ;;.;.-'  
 `:::'`;;;;'.;`  ``;;'(   ;_.;:._.';  ;;  `:::' 
                       `-'        ;    `.       
ECHO MAGAZINE VOLUME IX, ISSUE XXIV, PHILE 0x03.TXT

Developing BlackBerry Anti Spyware Application - y3dips
y3dips/at/echo/dot/or/dot/id



-----[ Pendahuluan

Kurang lebih 2 tahun yang lalu, saya dan @chopstick_ sempat melakukan
kegiatan untuk men"develop" sebuah aplikasi security untuk mobile
device, yang dalam hal ini BlackBerry[1]. Aplikasi security ini kurang
lebih akan menjadi satu set tool security untuk blackberry, berisi
beberapa modul-modul security lainnya, lengkap dengan fitur UI-nya.

Mengapa kami pilih BlackBerry, karena saat itu Blackberry security
sedang menjadi topik yang hangat dan di perbincangkan di dunia keamanan
internasional, dimulai dengan Aplikasi spyware yang di bungkus update
oleh "Etisalat"[2], sampai kepada bermunculannya banyak sekali aplikasi
sejenis. Bahkan @chopstick_ merupakan salah seorang yang membuat
aplikasi sejenis[3] sekaligus membuatkan removal untuk spyware miliknya
dan aplikasi sejenis lainnya.

Proses Pengembangannya sendiri mungkin baru memakan waktu kurang lebih
1 minggu efektif, sampai akhirnya mulai tersendat-sendat dikarenakan 
beberapa hal non-teknis, sampai akhirnya kami sendiri lupa bahwa 
aplikasi ini pernah kami develop. 

Berikut adalah modul "SMS spyware detection" yang merupakan bagian
saya, yang waktu itu saya rencanakan untuk ditampilkan pada
idsecconf2011, tetapi karena satu dan lain hal akhirnya tidak jadi. 
Dan sebelum saya lupa dan kode-kode tersebut menjadi tidak berguna 
(dan juga karena akhir-akhir ini malah lebih sering berintraksi dengan
python) maka saya merilis sebagian kode untuk modul yang sudah saya
kembangkan, dengan harapan ada yang berminat dan ingin melanjutkannya.  

-----[ BlackBerry Spyware Application

Sangat banyak sekali aplikasi Blackberry spyware, baik yang berbayar
ataupun yang gratis, tetapi terdapat beberapa yang cukup terkenal, dan
harganya relatif mahal :)

1. FlexiSpy (flexyspy.com) dengan harga licensi pertahun US $149 -$349 :)
2. Mobile Spy (mobile-spy.com) dengan harga licensi 3 bulan US $50

atau yang tidak terkenal, tetapi di list pada Blackberry App World,
seperti:

3. Teen text Spy seharga US $7.50

Adapun fitur-fitur yang ditawarkan, pada versi yang paling lengkap
adalah:

- Baca SMS
- Baca Call logs
- Baca Email
- Mengetahui Lokasi GPS (location tracking)
- Email relay
- Notifikasi perubahan SIMCARD
- Remote Listening
- Mobile Call Tapping

-----[ Developing BlackBerry Anti Malware

Sebenarnya banyak juga aplikasi security untuk blackberry, baik dari
sejenis firewall, anti virus sampai anti malware itu sendiri, bahkan
chopstick_ sendiri selain merilis spyware, juga merilis anti
spyware[3]. Aplikasi removal spyware milik @chopstick_ salah satu cara
kerjanya adalah dengan memanfaatkan database signature dari seluruh
aplikasi spyware yang ada, sehingga apabila di deteksi, aplikasi
tersebut akan melaporkan dan apabila memungkinkan akan menghapus
aplikasi spyware yang terinstall dan bahkan diset tersembunyi tersebut. 

Tetapi tentu saja aplikasi ini sangat bergantung pada Database
Signature, sehingga selalu terlambat 1 langkah dari pembuat spyware.

Oleh karena itu kami berusaha membuat aplikasi yang akan mendeteksi
prilaku dari spyware/malware baru yang bahkan belum memiliki atau
sempat di"signature", dan user diharapkan nantinya akan dapat
berinteraksi dengan aplikasi, mendapatkan laporan rutin, mendeteksi
kejanggalan dari berbagai kegiatan ber-sms, email, telpon, video,
photo, dsb

-------[ How SMS Spyware Work

Seperti telah kita ketahui dari fitur-fitur yang umumnya ditawarkan
oleh aplikasi spyware, membaca pesan SMS merupakan salah satu fitur
yang di tawarkan dari tiap-tiap aplikasi tersebut.

Aplikasi spyware umumnya melakukan "penyadapan" terhadap setiap SMS
yang masuk dan kemudian mengirimkan/memforward setiap SMS yang diterima
ke nomor yang di tentukan oleh pemilik spyware.

Kurang lebih seperti ini bagan untuk membaca SMS yang terkirim

[SMS sent] ----->------ [ Recepient ]
                |
                |[Spyware agent]
                |
                |______ [ Spyware owner ] 

Spyware SMS agent akan melakukan listening dan men"triger" aplikasi
untuk mengirimkan sms ke pemilik, dan melakukan pembersihan, seperti
penghapusan SMS log (atau bahkan memaksa device untuk tidak me-log dari
awal)

-------[ How Our SMS Spyware Detection Works

Seperti yang telah di singgung diatas, bahwa salah satu modul untuk
aplikasi yang kami kembangkan adalah SMS Spyware detection (khususnya
yang saya kembangkan), yang diperuntukkan untuk mendeteksi apabila
terjadi aktifitas "spying" pada layanan text messaging/sms di
blackberry.

Modul deteksi SMS spyware ini memiliki cara kerja yang sederhana,
setiap SMS yang masuk akan di tandai, yang dalam hal ini setiap SMS
yang keluar akan di hash lalu kemudian disimpan ke dalam sebuah file
dengan format nama bbsexurity-smslog-"TANGGAL".txt

----------[ Bagan SMS Spyware Detection

       1. Send Normal SMS 
[SMS] ------ > [Hash[x]] -----> [File log] 

       2. Malware/Spyware send SMS
[SMS] -------> [Hash[y]] -----> [File log] <--- Check Procedure [Hash[x] == Hash[y]]
                                                                          |
                                                    [Store/Alert] <-------|

---------[ Penjelasan Aplikasi dalam Kode

Bagi anda yang sudah sering mengembangkan aplikasi untuk blackberry
atau java developer, mungkin sudah tidak bingung lagi untuk langsung
mengintegrasikan dan memahami kode-kode yang kami pergunakan.  Tetapi,
bagi yang ingin mencobanya, saya mengembangkannya menggunakan Eclipse
dengan Blackberry SDK.

Berikut adalah beberapa bagian penting yang perlu kita bahas:
1. Berinteraksi dengan SMS system milik BlackBerry

Untuk melakukan interaksi dengan SMS Messaging system milik Blackberry,
kita mempergunakan SMS API dari RIM yaitu
net.rim.blackberry.api.sms.SMS

------- SMSHook.java -----------
15         public void HookSMS()
16         {
17             smsoutListener = new SMSOUTListener();
18             SMS.addSendListener(smsoutListener);
19             hooked = true;
20         }
21         
------- SMSHook.java -----------

2. Melakukan Hash terhadap SMS yang dikirim

Hal ini dilakukan dengan modul ShaMethod.java, yang menggunakan SHA untuk
hasing.  Saat SMS dikirimkan, maka pada saat yang sama SMS tersebut akan di
Hash (dalam hal ini dengan SHA)

----- SMSOUTListener.java -------
 22         if (message instanceof TextMessage)
 23         {
 24             UiApplication.getUiApplication().invokeLater( new Runnable()
 25             {
 26                 public void run() 
 27                 {   
 28                     //sha the message
 29                     String raw = (String) ShaMethod.sha(msg);
----- SMSOUTListener.java -------

3. Apa yang dilakukan dengan Signature SMS

Hasil dari hash dalam hal ini akan di tuliskan perbaris dalam satu file
dengan format nama bbsexurity-smslog-"TANGGAL".txt

untuk membuat file tersebut unik dan sekaligus membatasi jumlah maksimal
SMS, maka ditambahkan tanggal, bulan dan Tahun

----- SMSOUTListener.java -------
 30                     
 31                     try //save to file
 32                     {             
 33                     String data= (raw+"\r\n");
 34                     
 35                     //name the file as a date
 36                     Date dt = new Date();
 37                     SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yy");
 38                     String filename = sfd.formatLocal(dt.getTime());
 39                     
 40                     FileConnection conn = (FileConnection)Connector.open("file:///store/home/user/bbsexurity-smslog-"+filename+".txt",Connector.READ_WRITE);                   
 41                     long x =0;
----- SMSOUTListener.java -------

yang hasilnya akan kurnag lebih sbb:

----- bbsexurity-smslog-07-11-11.txt -------------

80e2389e820031c04a4d162b2158aa4b27bd4e4f
80e2389e820031c04a4d162b2158aa4b27bd4e4f
80e2389e820031c04a4d162b2158aa4b27bd4e4f
11d51fad4a279e3ca4e06f4a4c02d64076b2b317
6f0eb460fc95f26f96af1c253111b1c876439cee
b4170fb861398271396d335a352e85bc1364d43e
6f0eb460fc95f26f96af1c253111b1c876439cee

----- bbsexurity-smslog-07-11-11.txt -------------

4. Bagamana proses pendeteksiannya

Dan akan langsung di periksa dan dibandingkan, apabila Hash SMS yang
baru dikirim ternyata telah ada di file log tersebut

----- SMSOUTListener.java -------
 49                                 //read file
 50                                 try {
 51                                      InputStream stream = conn.openInputStream();
 52                                      LineReader lineReader = new LineReader(stream);
 53                                      String line = new String(lineReader.readLine());
 54                                      while(!line.equals("EOF"))
 55                                      {
----- SMSOUTListener.java -------

5. Proses Alert/Result

Pada saat ditemukan 2 hash yang sama dari SMS untuk nomer yang berbeda maka
bisa dimunculkan Alert (//Helpers.alertMsg("SMS sent twice!");) atau di log ke
file lainnya (dalam hal ini saya sengaja hanya melakukan log ke file lain untuk
keperluan selanjutnya)

----- SMSOUTListener.java -------
 57                                          if(line.equals(raw))
 58                                             {
 59                                              //Helpers.alertMsg("SMS sent twice!");
 60                                              SMSLogResult.logSMS("Double SMS Detected", num);
 61                                              break;
 62                                             }       
----- SMSOUTListener.java -------

Dan apabila ternyata Hash dari sms yang baru dikirim belum ada, maka
akan di tambahkan ke log file/database dalam hal ini file
bbsexurity-result-"TANGGAL".txt

----- SMSOUTListener.java -------
 73                             OutputStream out = conn.openOutputStream(x);
 74                             byte[] b = data.getBytes();
 75                        
 76                             if(conn.canWrite())         
 77                                 {                                             
 78                                 out.write(b);
 79                                 }
----- SMSOUTListener.java -------

Berikut adalah contoh file Log result:

------ bbsexurity-result-07-11-11.txt --------

Double SMS Detected, sms://31337
Double SMS Detected, sms://666
Double SMS Detected, sms://9191

------ bbsexurity-result-07-11-11.txt --------

Nah, akan ada 1 modul lagi untuk melakukan pemrosesan file log, dan
skripnya belum disempurnakan karena akan berhubungan dengan modul
lainnya, terkait model "centralize yang rencananya akan dibuat"

draftnya terdapat di modul FileProcessing.java

Catatan: Untuk Hash, menggunakan SHA1Digest dari library Crypto
(ShaMethod.java) Untuk proses hooking ke sms memanfaatkan API
"sms.SendListener", yang juga kemungkinan dipergunakan oleh aplikasi
spyware/malware.

-------[ Kesimpulan

Aplikasi ini masih jauh dari sempurna, apalagi modul SMS, tetapi
mudah-mudahan memberikan pemahaman yang bermanfaat buat semua, logika
ini berguna juga untuk deteksi email dsb, karena umumnya aplikasi
spyware menggunakan teknik yang sama.

Oh iya, ini aplikasi java pertama yang saya develop dan juga pertama 
kalinya saya koding dengan java (otodadak :D); ternyata merupakan
yang terakhir sampai saat ini (karena setelahnya saya belum punya 
kesempatan untuk menyentuh java lagi), jadi harap dimaklumi apabila 
kode-kode dari aplikasi terlihat amburadul, yang terpenting adalah
ide-ide yang ingin saya bagi mudah-mudahan bermanfaat.

------[ Kode

Kode lengkapnya bisa didownload di
http://code.google.com/p/bb-smspyware-detect/ beserta User
Interface-nya.

Beberapa potongan modul yang mungkin dapat dilihat dan dipelajari
langsung dibagian akhir artikel ini.

-----[ Reference

[1] http://blackberry.com
[2] http://www.theregister.co.uk/2009/07/14/blackberry_snooping/
[3] http://chirashi.zenconsult.net/2009/10/kiss-your-blackberry-spyware-goodbye/


-----[ Lampiran Kode]

------- SMSHook.java -----------
 1 package com.killmalware.bbsec;
 2 
 3 import net.rim.blackberry.api.sms.SMS;
 4     
 5     public class SMSHook 
 6     {
 7         private boolean hooked;
 8         private SMSOUTListener smsoutListener;
 9         
10         public SMSHook()
11         {
12             hooked = false;
13         }
14         
15         public void HookSMS()
16         {
17             smsoutListener = new SMSOUTListener();
18             SMS.addSendListener(smsoutListener);
19             hooked = true;
20         }
21         
22         public void unHookSMS()
23         {
24             SMS.removeSendListener(smsoutListener);
25             hooked = false;
26         }
27         
28         public boolean isHooked()
29         {
30             return hooked;
31         }
32     }
------- SMSHook.java -----------

------- ShaMethod.java -----------
  1 package com.killmalware.bbsec;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import net.rim.device.api.crypto.SHA1Digest;
  5 
  6 public class ShaMethod {
  7     public static String sha(final String msg)
  8     
  9     {
 10         SHA1Digest sha1Digest = new SHA1Digest();
 11         String sha = msg;
 12 
 13         byte[] inpData = null;
 14         try {
 15             inpData = sha.getBytes("UTF-8");
 16         } catch (UnsupportedEncodingException e) {
 17             e.printStackTrace();
 18         }
 19         sha1Digest.update(inpData, 0, inpData.length);
 20         byte[] digest = sha1Digest.getDigest();
 21         StringBuffer shaRes = new StringBuffer(40); //40 hex char is size of 160-bit SHA-1 result
 22         for (int a = 0; a < digest.length; a++)
 23         {
 24             String tmp = Integer.toHexString(0xff & digest[a]);
 25             if(tmp.length() == 1) //If hex value is "0X" then tmp is just one digit "X"
 26             {
 27                 shaRes.append('0');
 28             }
 29             shaRes.append(tmp);
 30         }
 31         return shaRes.toString();
 32     }
 33 }
------- ShaMethod.java -----------

------- SMSOUTListener.java ------
  1 package com.killmalware.bbsec;
  2 
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.io.OutputStream;
  6 import java.util.Date;
  7 import javax.microedition.io.Connector;
  8 import javax.microedition.io.file.FileConnection;
  9 import javax.wireless.messaging.TextMessage;
 10 import net.rim.blackberry.api.sms.SendListener;
 11 import net.rim.device.api.i18n.SimpleDateFormat;
 12 import net.rim.device.api.io.LineReader;
 13 import net.rim.device.api.ui.UiApplication;
 14 
 15 public class SMSOUTListener implements SendListener
 16 {
 17 
 18     public boolean sendMessage(javax.wireless.messaging.Message message)
 19     {
 20         final String num = message.getAddress();
 21         final String msg = ((TextMessage) message).getPayloadText();
 22         if (message instanceof TextMessage)
 23         {
 24             UiApplication.getUiApplication().invokeLater( new Runnable()
 25             {
 26                 public void run() 
 27                 {   
 28                     //sha the message
 29                     String raw = (String) ShaMethod.sha(msg);
 30                     
 31                     try //save to file
 32                     {             
 33                     String data= (raw+"\r\n");
 34                     
 35                     //name the file as a date
 36                     Date dt = new Date();
 37                     SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yy");
 38                     String filename = sfd.formatLocal(dt.getTime());
 39                     
 40                     FileConnection conn = (FileConnection)Connector.open("file:///store/home/user/bbsexurity-smslog-"+filename+".txt",Connector.READ_WRITE);                   
 41                     long x =0;
 42                         if (!conn.exists())
 43                             {                              
 44                                 conn.create();        
 45                             } 
 46                         else
 47                             {
 48                                 x = conn.fileSize();
 49                                 //read file
 50                                 try {
 51                                      InputStream stream = conn.openInputStream();
 52                                      LineReader lineReader = new LineReader(stream);
 53                                      String line = new String(lineReader.readLine());
 54                                      while(!line.equals("EOF"))
 55                                      {
 56                                         //compare
 57                                          if(line.equals(raw))
 58                                             {
 59                                              //Helpers.alertMsg("SMS sent twice!");
 60                                              SMSLogResult.logSMS("Double SMS Detected", num);
 61                                              break;
 62                                             }       
 63                                          else 
 64                                             { 
 65                                              line = new String(lineReader.readLine());
 66                                             }
 67                                      }
 68                                      stream.close();
 69                                      stream = null;
 70                                      } 
 71                                 catch(IOException e) {}
 72                             }
 73                             OutputStream out = conn.openOutputStream(x);
 74                             byte[] b = data.getBytes();
 75                        
 76                             if(conn.canWrite())         
 77                                 {                                             
 78                                 out.write(b);
 79                                 }
 80                             else
 81                                 System.out.println("Cannot write to this file");
 82                                 out.close();     
 83                                 }
 84                         catch(Exception io)
 85                         {
 86                             System.out.println("exception" +io);
 87                         }
 88                     }
 89                 }
 90             );
 91         } else
 92         {  
 93             System.out.println("No Idea" );
 94         }
 95         return true;
 96     }
 97 }
------- SMSOUTListener.java ------

------- SMSLogResult.java --------
 1 package com.killmalware.bbsec;
 2 
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5 import java.util.Date;
 6 import javax.microedition.io.Connector;
 7 import javax.microedition.io.file.FileConnection;
 8 import net.rim.device.api.i18n.SimpleDateFormat;
 9 
10 public class SMSLogResult {
11     
12     private static String logFileName()
13     {
14         Date dt = new Date();
15         SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yy");
16         return "file:///store/home/user/bbsexurity-result-"+sfd.formatLocal(dt.getTime())+".txt";
17     }
18     
19     public static void logSMS(String alert, String num)
20     {
21         String line = alert+ ", "+num+"\r\n";
22         try 
23         {
24             FileConnection conn = (FileConnection)Connector.open(logFileName(), Connector.READ_WRITE);
25             long x = 0;
26             if(!conn.exists())
27             {
28                 conn.create();
29             } else
30             {
31                 x = conn.fileSize();
32             }
33             OutputStream ostream = conn.openOutputStream(x);
34             ostream.write(line.getBytes());
35             ostream.close();
36             conn.close();
37         } 
38         catch (IOException e) 
39         {
40             Helpers.alertMsg("Error writing to log file");
41         }
42     
43     }
44 }
------- SMSLogResult.java --------
Comments