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
Écran d'accueil
Choix de la victime qui recevra le spam SMS Android
Entrée du message spam
Choix du nombre de SMS à envoyer
Envoi 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
Langage : xml Taille : 815 caract�res <?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
Langage : java Taille : 5579 caract�res 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
Langage : java Taille : 1483 caract�res 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
Langage : xml Taille : 2146 caract�res <?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>