- Регистрация
- Ноя 17, 2022
- Сообщения
- 11
- Реакции
- 8
Доброго, всем!
Недавно я написал небольшой скрипт, чтобы извлечь средства из ловушки-кошелька.
Вот предыстория:
На один из моих TON кошельков пришла транзакция с 0.001 TON и MEMO, содержащим MEMO с сид-фразой (мнемоникой) и сообщением о том, что это ваш новый кошелек. Эту сид-фразу распространяют под разными предлогами в мошеннических чатах и т.д.
Суть в том, что когда вы импортируете эту мнемонику, на счету уже лежат 180 USDT TRC-20 (так в моем случае, сумма обычно в пределах $100-$200), но при этом количество TRX составляет меньше 10, что специально делается для того, чтобы комиссия для перевода на другой кошелек была недостаточной. Как только вы пополните количество TRX на таком кошельке, сразу же сработает бот и отправит средства на адрес злоумышленника.
Однако, можно обойти этот механизм, если выполнены два условия:
package.json:
В моем случае, я отправил 120TRX, чтобы успеть вывести USDT пока бот отрабатывает вывод TRX.
Условный флаг забрал, награду отправил на blackhole адрес.
P.S Чтобы ускорить обработку можно использовать подпись на события через web-socket, но в таком случае придется поднимать свою ноду TRON, а это ни к чему, с учетом что все работает и так.
Успешной охоты.
Недавно я написал небольшой скрипт, чтобы извлечь средства из ловушки-кошелька.
Вот предыстория:
На один из моих TON кошельков пришла транзакция с 0.001 TON и MEMO, содержащим MEMO с сид-фразой (мнемоникой) и сообщением о том, что это ваш новый кошелек. Эту сид-фразу распространяют под разными предлогами в мошеннических чатах и т.д.
Суть в том, что когда вы импортируете эту мнемонику, на счету уже лежат 180 USDT TRC-20 (так в моем случае, сумма обычно в пределах $100-$200), но при этом количество TRX составляет меньше 10, что специально делается для того, чтобы комиссия для перевода на другой кошелек была недостаточной. Как только вы пополните количество TRX на таком кошельке, сразу же сработает бот и отправит средства на адрес злоумышленника.
Однако, можно обойти этот механизм, если выполнены два условия:
- Перевод, который уводит TRX, должен выполняться вручную ботом, а не через контракт.
- Владелец закрытого ключа (privkey), который вам "подарили" должен обладать правами на трату средств (spend). Существуют кошельки, которые специально лишают закрытый ключ этих прав, чтобы средства можно было потратить только с помощью другого закрытого ключа. В таком случае, вы увидите уведомление в Tronscan о том, что владелец данного аккаунта - другой пользователь.
JavaScript:
const axios = require('axios');
const TronWeb = require('tronweb');
const yourPrivateKey = 'сюда впишите ключ кошелька-ловушки';
const yourAddress = 'сюда впишите публичный ключ кошелька-ловушки';
const destinationAddress = 'куда отправить токены';
const fullNode = 'https://api.trongrid.io';
const solidityNode = 'https://api.trongrid.io';
const eventServer = 'https://api.trongrid.io';
const tronWeb = new TronWeb(fullNode, solidityNode, eventServer, yourPrivateKey);
const usdtContractAddress = 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'; // Адрес контракта токена, который хотите отправить, в данном случае USDT
const transferAbi = [ // Если другой токен, то вам нужен ABI контракта этого токена
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
];
async function sendUSDT(to, amount) {
try {
const contract = await tronWeb.contract(transferAbi).at(usdtContractAddress);
const options = {
feeLimit: 100_000_000, // Установите лимит комиссии в сун (1 TRX = 1000000 сун), в данном случае не более 100trx
callValue: 0, // Не отправляйте TRX вместе с вызовом контракта
};
const result = await contract.transfer(to, amount).send(options);
if (result) {
console.log('Транзакция USDT отправлена успешно:', result);
} else {
console.log('Не удалось отправить транзакцию USDT:', result);
}
} catch (error) {
console.log('Ошибка при отправке транзакции USDT:', error);
}
}
async function fetchLatestBlock() {
try {
const response = await axios.get('https://api.trongrid.io/wallet/getnowblock');
const latestBlock = response.data;
const transactions = latestBlock.transactions || [];
if (Array.isArray(transactions)) {
transactions.forEach((transaction) => {
const toAddress = tronWeb.address.fromHex(transaction.raw_data.contract[0].parameter.value.to_address);
const fromAddress = tronWeb.address.fromHex(transaction.raw_data.contract[0].parameter.value.owner_address);
if (toAddress === yourAddress) {
console.log('Обнаружена новая входящая транзакция:', transaction);
// Отправка USDT на другой адрес
const amountToSend = 187900000; // В данном случае отправляет 187.9USDT
sendUSDT(destinationAddress, amountToSend);
}
});
} else {
console.log('Ошибка: получены некорректные данные транзакций:', transactions);
}
} catch (error) {
console.log('Ошибка при получении последнего блока:', error);
}
}
async function startMonitoring() {
console.log('Начало мониторинга транзакций...');
setInterval(fetchLatestBlock, 500); // В данном случае каждые 0.05 сек идет обращение, будьте осторожны, не получите бан на ip
}
startMonitoring();
JSON:
{
"name": "anti-trx-wallet",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.ts"
},
"keywords": [],
"author": "eax",
"license": "GPL-2",
"dependencies": {
"axios": "^1.3.5",
"tronweb": "^5.1.0"
}
}
В моем случае, я отправил 120TRX, чтобы успеть вывести USDT пока бот отрабатывает вывод TRX.
Условный флаг забрал, награду отправил на blackhole адрес.
P.S Чтобы ускорить обработку можно использовать подпись на события через web-socket, но в таком случае придется поднимать свою ноду TRON, а это ни к чему, с учетом что все работает и так.
Успешной охоты.

