所以,我是node.js的新手,我選擇了它的必要性來使用bittorrent-dht,這似乎有我需要的所有想法。bittorrent-dht bruteforce散列發現問題
我的想法基本上是生成隨機的十六進制字符串,並在DHT上進行查找,保留足夠的同行,以便後來在適當的torrent客戶端(在我的情況下,我使用Tixati)進行檢查。
爲此目的我寫了下面的代碼位,這是不優雅,我是新來的node.js,記住這一點......
const crypto = require('crypto');
function rand_string(n) {
if (n <= 0) {
return '';
}
var rs = '';
try {
rs = crypto.randomBytes(n);
rs = rs.toString('hex').slice(0,n);
/* note: could do this non-blocking, but still might fail */
}
catch(ex) {
console.log("cannot genhash");
}
return rs;
}
const min_peers = 100;
var DHT = require('bittorrent-dht');
var dht = new DHT();
var hash = [];
var abort_lookup_0;
var abort_lookup_1;
var abort_lookup_2;
var abort_lookup_3;
var peers = [];
dht.listen(63112, function() {
console.log('DHT started');
//
hash[0] = rand_string(40);
peers[0] = 0;
abort_lookup_0 = dht.lookup(hash[0]);
//
hash[1] = rand_string(40);
peers[1] = 0;
abort_lookup_1 = dht.lookup(hash[1]);
//
hash[2] = rand_string(40);
peers[2] = 0;
abort_lookup_2 = dht.lookup(hash[2]);
//
hash[3] = rand_string(40);
peers[3] = 0;
abort_lookup_3 = dht.lookup(hash[3]);
});
// this is horrible but it will probably save headaches with loops
dht.on('peer', function (peer, infoHash, from) {
if (infoHash.toString('hex') == hash[0]) peers[0]++;
if (infoHash.toString('hex') == hash[1]) peers[1]++;
if (infoHash.toString('hex') == hash[2]) peers[2]++;
if (infoHash.toString('hex') == hash[3]) peers[3]++;
//
if (peers[0] > min_peers) {
abort_lookup_0();
console.log(hash[0]);
peers[0] = 0;
hash[0] = rand_string(40);
abort_lookup_0 = dht.lookup(hash[0]);
}
//
if (peers[1] > min_peers) {
abort_lookup_1();
console.log(hash[1]);
peers[1] = 0;
hash[1] = rand_string(40);
abort_lookup_1 = dht.lookup(hash[1]);
}
//
if (peers[2] > min_peers) {
abort_lookup_2();
console.log(hash[2]);
peers[2] = 0;
hash[2] = rand_string(40);
abort_lookup_2 = dht.lookup(hash[2]);
}
//
if (peers[3] > min_peers) {
abort_lookup_3();
console.log(hash[3]);
peers[3] = 0;
hash[3] = rand_string(40);
abort_lookup_3 = dht.lookup(hash[3]);
}
})
function failedHash() {
abort_lookup_0();
hash[0] = rand_string(40);
peers[0] = 0;
abort_lookup_0 = dht.lookup(hash[0]);
//
abort_lookup_1();
hash[1] = rand_string(40);
peers[1] = 0;
abort_lookup_1 = dht.lookup(hash[1]);
//
abort_lookup_2();
hash[2] = rand_string(40);
peers[2] = 0;
abort_lookup_2 = dht.lookup(hash[2]);
//
abort_lookup_3();
hash[3] = rand_string(40);
peers[3] = 0;
abort_lookup_3 = dht.lookup(hash[3]);
}
setInterval(failedHash, 15000);
所以,我跑4個不同的查找並保持與> 100個同行。顯然這很少發生什麼,現在...如果我降低我的期望,說50個同行或更低,我顯然會得到更多的點擊,但喂哈希到Tixati導致要麼找不到同齡人或找到同齡人,但未能連接給他們(超時)。
我的問題如下:
- 這段代碼理智?我並不是說它是優雅的,但是有真正明顯的錯誤或者我忽略的東西嗎?
- 爲什麼我的torrent客戶端無法連接到似乎有對等設備的哈希對等體? (注意:我的torrent客戶端功能非常完善等)。我是否碰到一些奇怪的私人/阻止同伴?
- 什麼是最低數量的同齡人尋找?
我現在就離開這個跑在我的樹莓上,但我不期待太多;或者至少不是很長一段時間之前...
您的方法有缺陷。生成一個真正的info_hash的160位隨機數的機會是非常微小的,這是不可能的。你看到的命中是來自惡意節點,給你假同伴。 – Encombe
我知道這個可能性並不大,但是這就是爲什麼我通過設置最小數量的同伴過濾「噪音」。 –