SpammySMS : envoyer des spams SMS via Android

Neamar

SpammySMS est une application ProofOfConcept pour m'entraîner au développement sur Android. Il est fort probable que l'application contiennent des memory leaks ou autres, et je m'en excuse.

Présentation

L'application pour téléphones Android SpammySMS permet d'envoyer en boucle des SMS à un destinataire.
Elle se veut drôle et n'est pas destinée à une attaque par DoS sur un mobile ;)

L'utilisateur configure la victime, le message spam, et le nombre de répétitions, puis clique sur OK... et vole, petit spam ! Bienvenue dans le monde merveilleux des spammeurs, même s'il ne tient qu'à vous de ne pas vendre de v1agrA ou de ne pas proposer "un changmeent dans l'expériance PayPale". Innovez, amusez-vous... mais restez raisonnable : souvenez-vous que ce n'est qu'un jeu, et que l'humour est un plat qui se sert froid... et peu souvent !

Téléchargement

Pour télécharger l'application, cliquez sur ce lien.

L'installation hors market Android nécessite de modifer les paramètres du téléphone pour l'installation d'applications de sources inconnues : dans Paramètres, cliquez sur Paramètres des applications puis cochez Sources inconnues.

Astuce

Dans le champ message, vous pouvez utiliser les valeurs joker %i et %l qui seront respectivement remplacés par le nombre de SMS envoyés / le nombre de SMS restants.

Captures d'écran

Ces captures d'écran proviennent de l'émulateur Android sur PC.
L'application a été testée sur un téléphone Samsung Galaxy, Android 1.5.

Lancement de l'application SpammySMS

Lancement de l'application SpammySMS

Écran d'accueil

Écran d'accueil

Choix de la victime qui recevra le spam SMS Android

Choix de la victime qui recevra le spam SMS Android

Entrée du message spam

Entrée du message spam

Choix du nombre de SMS à envoyer

Choix du nombre de SMS à envoyer

Envoi des SMS

Envoi des SMS

De l'autre côté du miroir : réception des SMS

De l'autre côté du miroir : réception des SMS

Codes sources

Manifest

Déclare l'icone et les permissions nécessaires à l'éxécution de SpammySMS.

Code source : AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.neamar.sms"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainScreen"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
</manifest>

MainScreen

L'interface de l'application, gestion des clics et autres.

Code source : MainScreen.java
package com.neamar.sms;

import java.util.ArrayList;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.telephony.gsm.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.Toast;

public class MainScreen extends Activity
{
private ArrayList<String> Contacts;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
//Créer l'interface globale
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//Masquer la barre de progression et afficher des scrollbars pour l'application
findViewById(R.id.Progress_PB).setVisibility(View.INVISIBLE);


//Remplir le spinner avec les possibilités pour le nombre de messages
ArrayAdapter<CharSequence> adapter;
final Spinner s = (Spinner) findViewById(R.id.Repetitions_S);

adapter = ArrayAdapter.createFromResource(
this, R.array.RepetitionsPossibilites, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
s.setAdapter(adapter);

//Préparer l'auto complétion des contacts
ListContact();
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.Destinataire_ET);
adapter = new ArrayAdapter(this,
android.R.layout.simple_dropdown_item_1line,Contacts);
textView.setAdapter(adapter);

final ImageButton button = (ImageButton) findViewById(R.id.Go_B);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
sendSMS();
}
});

Tip(getString(R.string.disclamer),Toast.LENGTH_LONG);

}

public void Tip(String Tip, int Duree)
{
Toast.makeText(MainScreen.this, Tip, Duree).show();
}

protected void Tip(String Tip)
{
Tip(Tip,Toast.LENGTH_SHORT);
}
protected void EnableApplication(Boolean Enable)
{
findViewById(R.id.Destinataire_ET).setEnabled(Enable);
findViewById(R.id.Message_ET).setEnabled(Enable);
findViewById(R.id.Repetitions_S).setEnabled(Enable);
findViewById(R.id.Message_ET).setEnabled(Enable);
findViewById(R.id.Go_B).setEnabled(Enable);
}

protected void sendSMS()
{

Spinner cRepetitions = (Spinner) findViewById(R.id.Repetitions_S);
EditText cDestinataire = (EditText) findViewById(R.id.Destinataire_ET);
EditText cMessage = (EditText) findViewById(R.id.Message_ET);
ProgressBar cProgression = (ProgressBar) findViewById(R.id.Progress_PB);

int NbRepetitions = Integer.parseInt(cRepetitions.getSelectedItem().toString());
String Destinataire = cDestinataire.getText().toString();
String Message = cMessage.getText().toString();
String Contact;
String Phone;

if(Destinataire.length()==0)
{
Tip(getString(R.string.NoNumero));
cDestinataire.requestFocus();
return;
}
if(Message.length()==0)
{
Tip(getString(R.string.NoMsg));
cMessage.requestFocus();
return;
}



int ChevronOuvrant=Destinataire.lastIndexOf("<");
int ChevronFermant=Destinataire.lastIndexOf(">");
if(ChevronOuvrant!=-1 && ChevronFermant!=-1 && ChevronFermant - ChevronOuvrant > 0)
{
Contact = Destinataire.substring(0,ChevronOuvrant);
Phone = Destinataire.substring(ChevronOuvrant+1, ChevronFermant);
}
else
{
Contact="Ano Nymous";
Phone=Destinataire;
}

/*try
{
Integer.parseInt(Phone);
}
catch(NumberFormatException e)
{
Tip(getString(R.string.InvNumero));
cDestinataire.requestFocus();
return;
}*/


//Préparer l'interface graphique

//Empêcher de renvoyer les données
EnableApplication(false);

Tip(getString(R.string.Info).replaceAll("%N",String.valueOf(NbRepetitions)).replaceAll("%C",Contact));

SMSHandler Sender=new SMSHandler(this);

Sender.send(Phone, Message, NbRepetitions);

Tip(getString(R.string.MefaitAccompli).replaceAll("%C",Contact));
EnableApplication(true);
}

private void ListContact()
{
Contacts = new ArrayList<String>();
// instance qui permet d'acceder au contenu d'autre application
ContentResolver ConnectApp = this.getContentResolver();
Uri uri = android.provider.Contacts.People.CONTENT_URI;
String[] projection = new String[] {People.NAME, People.NUMBER};
//Récupérer les contacts dans un curseur
Cursor cur = ConnectApp.query(uri, projection, null, null, null);
this.startManagingCursor(cur);

if (cur.moveToFirst())
{
do
{
String Nom = cur.getString(cur.getColumnIndex(People.NAME));
String Numero = cur.getString(cur.getColumnIndex(People.NUMBER));
if(Numero!=null)
Contacts.add(Nom+"<"+Numero+">");
}
while (cur.moveToNext());
}
}
}

SMSHandler

Gestion de l'envoi des SMS.

Code source : SMSHandler.java
package com.neamar.sms;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.gsm.SmsManager;
import android.view.View;
import android.widget.ProgressBar;

public class SMSHandler
{
protected MainScreen Parent;
ProgressBar Progression;


public SMSHandler( MainScreen Parent)
{
this.Parent=Parent;
Progression = (ProgressBar) Parent.findViewById(R.id.Progress_PB);
}

public void send(String Phone,String Message,int NbRepetitions)
{
String SENT = "SMS_SENT";

PendingIntent sentPI = PendingIntent.getBroadcast(Parent, 0, new Intent(SENT), 0);

//---when the SMS has been sent---
Parent.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1)
{
if(getResultCode()==Activity.RESULT_OK)
Progression.setProgress(Progression.getProgress()+1);
else
Parent.Tip(Parent.getString(R.string.FailSend));
}
}, new IntentFilter(SENT));

Progression.setVisibility(View.VISIBLE);
Progression.setMax(NbRepetitions);

SmsManager sm = SmsManager.getDefault();

for(int i=1; i<=NbRepetitions; i++)
{
sm.sendTextMessage(Phone, null, Message.replace("%i",String.valueOf(i)).replace("%l",String.valueOf(NbRepetitions-i)), sentPI, null);
}
}


}

Layout

Déclare la structure de l'interface.

Code source : main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/GlobalLayout">

<!-- Disclamer -->
<!--<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/disclamer"/>-->

<!-- Destinataire -->
<TextView android:id="@+id/Destinataire_TV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/DestinataireCaption"></TextView>
<AutoCompleteTextView android:id="@+id/Destinataire_ET" android:hint="@string/DestinataireDefaut" android:layout_width="fill_parent" android:layout_height="wrap_content"></AutoCompleteTextView>


<!-- Message -->
<TextView android:id="@+id/Message_TV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/MessageCaption"></TextView>
<EditText android:id="@+id/Message_ET" android:layout_height="wrap_content" android:hint="@string/MessageDefaut" android:layout_width="fill_parent" android:maxLength="160"></EditText>

<!-- Répétitions -->
<TextView android:id="@+id/Repetitions_TV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/RepetitionsCaption"></TextView>
<Spinner android:id="@+id/Repetitions_S" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="true" android:prompt="@string/RepetitionsCaption" />


<!-- Go ! -->
<LinearLayout android:layout_height="wrap_content" android:id="@+id/CenterStart" android:orientation="horizontal" android:layout_width="fill_parent" android:gravity="center">
<ImageButton android:id="@+id/Go_B" android:layout_height="wrap_content" android:src="@android:drawable/ic_media_play" android:layout_width="wrap_content" android:layout_gravity="center"></ImageButton>
</LinearLayout>
<ProgressBar android:id="@+id/Progress_PB" android:layout_width="fill_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal"></ProgressBar>

</LinearLayout>
Auteur
Neamar
Date
Nov. 2009
Menu
Index des ressources

Chargement du sommaire...