>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Программы и ОС http://forum.mozilla-russia.org/viewforum.php?id=31 >BitTorrent или Как качать? http://forum.mozilla-russia.org/viewtopic.php?id=50071 |
Keepun > 03-06-2011 18:55:23 |
Ну, раз тут собралось много BitTorrent - открытый протокол типа P2P. Для учета статистики к адресу трекера добавляется набор уникальных символов для идентификации (в народе прозван "passkey"). Запрос на tracker такой: "Дай мне список сидов и пиров. Я скачал Х байт, отдал Х байт." То есть, если удалить tracker с passkey сразу после получения от него списка сидов и пиров, то статистика НЕ будет передаваться Я вообще программно добавляю список анонимных трекеров еще при добавлении торрента в uTorrent Trackers Ретрекер вашего провайдера http://retracker.local/announce Анонимные трекеры. uTorrent принимает список разделенный пустой строкой. http://tracker.bittorrent.am/announce http://tracker.mightynova.com/announce http://tracker.mightynova.com:4315/announce http://tracker.openbittorrent.com/announce http://tracker.openbittorrent.com/announce http://tracker.prq.to/announce http://tracker.publicbt.com/announce http://tracker.thepiratebay.org/announce http://tracker.torrentalk.com:2710/announce udp://tracker.openbittorrent.com:80/announce udp://tracker.publicbt.com/announce udp://tracker.thepiratebay.org:80/announce А чтобы использовать DHT на полную катушку, нужно пропатчить клиент, чтобы он не отключал эту сеть на приватных торрентах. DHT опрашивает всех известных пиров и сидов на предмет содержимого. Чем больше у вас закачек с уже известными пирами и сидами, тем быстрее будет получен список пиров и сидов для новой закачки. Патченный uTorrent можно скачать с левых сайтов или пропатчить самому (не каждый сможет) - разница в одном байте. uTorrent DHT Patcher uTorrent DHT Patcher 2.0.3 (упакован UPX): 00408E1B |. 57 PUSH EDI 00408E1C |. 68 600E4700 PUSH utorrent.00470E60 ; ASCII "private" 00408E21 |. 8BCE MOV ECX,ESI 00408E23 |. 8943 08 MOV DWORD PTR DS:[EBX+8],EAX 00408E26 |. E8 EE8DFFFF CALL utorrent.00401C19 00408E2B |. 85C0 TEST EAX,EAX 00408E2D |. 74 04 JE SHORT utorrent.00408E33 00408E2F |. 804B 46 02 OR BYTE PTR DS:[EBX+46],2 00408E33 |> 57 PUSH EDI 00408E2D EB 04 JMP SHORT utorrent.00408E33 ============== krigstask пишет
Читай про DHT - из "редкого" превращает в "популярное" Raf-9600 пишет
Если прочтешь устройство BitTorrent, то поймешь (наверно), что нелегальный чит только один: отправка на трекер ложной статистики. Это делается с помощью левых программ и только твоя жадность (множитель завысил на отдачу) и криворукость программиста выдадут тебя трекеру. Я этим не пользуюсь, а все, что описано выше, информацию на трекер вообще не передает! |
Raf-9600 > 03-06-2011 19:10:05 |
Keepun пишет
Это раздел "юмор"? Keepun пишет
И много таких как ты? Keepun пишет
Сразу вспоминается бородатая шутка Задорнова: Если по новостям говорят что задержали того, кто распространял наркотики нелегально, значит есть те, кто распространяют их легально? Keepun пишет
Ну насколько я знаю, когда ты в клиенте нажимаешь на паузу, или стопаешь скачивание, на трекер об этом сообщается. Когда ты просто удаляешь трекер после получения сидов, то как ты подметил, на трекер ничего не отсылается. Иными словами, спалить можно |
Keepun > 03-06-2011 19:15:48 |
Raf-9600 пишет
Старт, стоп, пауза - это вообще дополнительные данные и полагаться на них вообще нельзя, так что мимо. |
AC/PC > 03-06-2011 19:25:18 |
Keepun |
Sid > 03-06-2011 19:46:10 |
Keepun пишет
Каким образом? |
Keepun > 03-06-2011 20:02:28 |
Sid пишет
Патчер можно и самому написать. Или найти. Я, например, свой написал на C# Делюсь кодом, но он на каждом 5 торренте дает сбой (писал для себя). скрытый текст Выделить код Код:using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Text; using System.Diagnostics; namespace TorrentPatcher { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { if (args.Length > 0) { foreach (String arg in args) { new Torrent(arg); } return; } } } public struct BenCode { public bool is_num; public long num; public bool is_list; public bool is_dict; public Byte[] bytes; public int grp; public int grp_index; } public class Torrent { public Torrent(string torrent) { try { if (!File.Exists(torrent)) return; BinaryReader bin = new BinaryReader(File.OpenRead(torrent)); //if (bin.ReadChar() != 'd') return; BenCode[] bcode = new BenCode[0]; this.Decode(ref bin, ref bcode, 0); int x = 0; List<string> urls = new List<string>(); int ann = 0; for (x = 0; x < bcode.Length; x++ ) { if (bcode[x].bytes != null && Encoding.ASCII.GetString(bcode[x].bytes) == "announce" && x + 1 < bcode.Length) { ann = x + 1; urls.Add(Encoding.ASCII.GetString(bcode[ann].bytes)); break; } } int annlist = 0; for (x = 0; x < bcode.Length; x++) { if (bcode[x].bytes != null && Encoding.ASCII.GetString(bcode[x].bytes) == "announce-list" && x + 1 < bcode.Length) { annlist = x + 1; this.AnnList(ref urls, bcode, bcode[annlist].grp); break; } } urls.RemoveAll(DelTracker); urls.Add("http://retracker.local/announce"); urls.Add("http://harryy.us:8080/announce"); urls.Add("http://tracker.mightynova.com/announce"); urls.Add("http://tracker.mightynova.com:4315/announce"); urls.Add("http://tracker.bittorrent.am/announce"); urls.Add("http://tracker.openbittorrent.com/announce"); urls.Add("http://tracker.openbittorrent.com:80/announce"); urls.Add("http://tracker.prq.to/announce"); urls.Add("http://tracker.thepiratebay.org/announce"); urls.Add("http://tracker.torrentalk.com:2710/announce"); urls.Add("http://tracker.publicbt.com/announce"); urls.Add("udp://tracker.openbittorrent.com:80/announce"); urls.Add("udp://tracker.thepiratebay.org:80/announce"); urls.Add("udp://tracker.publicbt.com/announce"); urls.Sort(); urls.Insert(0, ""); Uri url; if (annlist > 0) bcode[annlist].grp = bcode.Length - 1; for (x = 1; x < urls.Count; x++ ) { if (urls[x] == urls[x - 1]) continue; if (Uri.TryCreate(urls[x], UriKind.Absolute, out url)) { if (ann > 0) { bcode[ann].grp_index = 1; bcode[ann].grp = 0; Array.Resize(ref bcode[ann].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri)); bcode[ann].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri); ann = -1; x--; continue; } else if (ann == 0) { Array.Resize(ref bcode, bcode.Length + 2); bcode[bcode.Length - 2].grp_index = 1; Array.Resize(ref bcode[bcode.Length - 2].bytes, Encoding.ASCII.GetByteCount("announce")); bcode[bcode.Length - 2].bytes = Encoding.ASCII.GetBytes("announce"); ann = bcode.Length - 1; bcode[ann].grp_index = 1; bcode[ann].grp = 0; Array.Resize(ref bcode[ann].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri)); bcode[ann].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri); ann = -1; x--; continue; } if (annlist == 0) { Array.Resize(ref bcode, bcode.Length + 2); bcode[bcode.Length - 2].grp_index = 1; Array.Resize(ref bcode[bcode.Length - 2].bytes, Encoding.ASCII.GetByteCount("announce-list")); bcode[bcode.Length - 2].bytes = Encoding.ASCII.GetBytes("announce-list"); annlist = bcode.Length - 1; bcode[annlist].is_list = true; bcode[annlist].grp_index = 1; bcode[annlist].grp = annlist; } if (annlist > 0) { Array.Resize(ref bcode, bcode.Length + 2); bcode[bcode.Length - 2].is_list = true; bcode[bcode.Length - 2].grp_index = bcode[annlist].grp; bcode[bcode.Length - 2].grp = bcode.Length - 1; bcode[bcode.Length - 1].grp_index = bcode.Length - 1; Array.Resize(ref bcode[bcode.Length - 1].bytes, Encoding.ASCII.GetByteCount(url.AbsoluteUri)); bcode[bcode.Length - 1].bytes = Encoding.ASCII.GetBytes(url.AbsoluteUri); } } } int ext = torrent.LastIndexOf(".torrent"); if (ext > 0) { torrent = torrent.Insert(ext, "_" + DateTime.Now.Millisecond.ToString()); } else { torrent += ".torrent"; } #if DEBUG torrent = "test.torrent"; #endif BinaryWriter binwr = new BinaryWriter(File.Create(torrent)); this.Encode(ref binwr, bcode, 0); bin.Close(); binwr.Close(); #if !DEBUG Process.Start(torrent); #endif } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } private long Num(ref BinaryReader bin)//, ref Byte[] bytes, int index) { Char numb = bin.ReadChar(); String res = ""; while ((numb >= '0' && numb <= '9') || numb == '-') { res += numb.ToString(); numb = bin.ReadChar(); } if (numb != ':' && numb != 'e') return 0; return long.Parse(res); } private void AnnList(ref List<string> url, BenCode[] bcode, int index) { var ind = from i in bcode where i.grp_index == index select i; foreach (BenCode bc in ind) { if (bc.bytes != null && bc.bytes.Length > 0) { String y = Encoding.ASCII.GetString(bc.bytes); url.Add(Encoding.ASCII.GetString(bc.bytes)); } if (bc.is_list || bc.is_dict) { this.AnnList(ref url, bcode, bc.grp); } } } private bool Decode(ref BinaryReader bin, ref BenCode[] bcode, int index) { while (bin.BaseStream.Position < bin.BaseStream.Length) { switch (bin.ReadChar()) { case 'd': // Dictionary { Array.Resize(ref bcode, bcode.Length + 1); bcode[bcode.Length - 1].is_dict = true; bcode[bcode.Length - 1].grp_index = index; bcode[bcode.Length - 1].grp = bcode.Length; this.Decode(ref bin, ref bcode, bcode.Length); } break; case 'i': // Number { Array.Resize(ref bcode, bcode.Length + 1); bcode[bcode.Length - 1].is_num = true; bcode[bcode.Length - 1].num = this.Num(ref bin); bcode[bcode.Length - 1].grp_index = index; } break; case 'l': // List { Array.Resize(ref bcode, bcode.Length + 1); bcode[bcode.Length - 1].is_list = true; bcode[bcode.Length - 1].grp_index = index; bcode[bcode.Length - 1].grp = bcode.Length; this.Decode(ref bin, ref bcode, bcode.Length); } break; case 'e': // End return true; default: { bin.BaseStream.Position -= 1; int count = (int)this.Num(ref bin); if (count > 0) { Array.Resize(ref bcode, bcode.Length + 1); Array.Resize(ref bcode[bcode.Length - 1].bytes, count); bcode[bcode.Length - 1].grp_index = index; bin.Read(bcode[bcode.Length - 1].bytes, 0, count); } } break; } } return true; } private void Encode(ref BinaryWriter bin, BenCode[] bcode, int index) { var ind = from i in bcode where i.grp_index == index select i; foreach (BenCode bc in ind) { if (bc.bytes != null && bc.bytes.Length > 0) { bin.Write(String.Format("{0}:", bc.bytes.Length).ToCharArray()); bin.Write(bc.bytes); } else if (bc.is_num) { bin.Write(String.Format("i{0}e", bc.num).ToCharArray()); } if (bc.is_dict) { bin.Write('d'); this.Encode(ref bin, bcode, bc.grp); bin.Write('e'); } else if (bc.is_list) { bin.Write('l'); this.Encode(ref bin, bcode, bc.grp); bin.Write('e'); } } } private static bool DelTracker(String s) { // Сразу вырезает известные трекеры if (s.IndexOf("rutracker.") > 0) return true; if (s.IndexOf("free-torrents.") > 0) return true; return false; } } } |
Sid > 03-06-2011 20:13:48 |
Keepun пишет
Ой нет, это слишком сильное колдунство для меня. |
=Agasfer= > 03-06-2011 20:47:59 |
Всё это весьма интересно, но как объяснить следущee: |