迅雷/旋风地址转换原理分析(转)
Base64编码是一种加密/解密字符串的算法 他可以把一段字符串A通过特定的加密算法变成字符串B 并且单凭你的肉眼是无法通过B来反推出A来 但通过逆推算法便能很迅速的将字符串B转换为字符串A 这就是加密/解密字符串的算法。 简单的来说,Base64编码的特点就是 加密解密速度快,并且须通过特定算法解密。 下面这段代码就是一段通过Base64加密后的字符串 5qyi6L+O5p2l5Yiw5LuY552/55qE6YOo6JC95qC844CC 通过肉眼你根本无法知道这段代码的意义,以下则是解密后的字符串 欢迎来到付睿的部落格。 下面开始说说实质性的东西。 Base64是较为常见的一种用于传输8Bit字节代码的编码方式之一,他要求把3个8Bit的字节转换为4个6Bit的字节,既3×8=4×6=24,然后把6Bit高位用0补成8Bit,使得3个8bit原文变成4个8Bit字节的代码,所以说转换后的字符串会比原字符串长。 举个例子(仅仅是个例子e113) 原文为 qweqweqw asdasdas zxczxczx 转换后 00qweqwe 00qwasda 00sdaszx 00czxczx 转换后的字符串对应一个编码表,即Base64编码的码表(摘自RFC2045) Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y 如此一来便能使4个8Bit的译文有对应的字符代表。 那么再来看一个实际的例子(2进制表示) 转换前 10101101 10111010 01110110 转换后 00101011 00011011 00101001 00110110 十进制 43 27 41 54 对应值 r b p 2 所以说编码后字符串为 rbp2 如此也可以逆向推算出原文。 但是,我们也可能遇到一个问题 就是如果原文字节数是10,11或者13该怎么办?(非3整数倍) Base64编码是这样来解决的: 原文字节不够的地方全部用0来补足,转换时用=代替。 但是编码后的字符串不会含有2个以上的=,因为等号个数=原文字节数 mod 3 ok,这就是简单的Base64编码的介绍。 当然,我是看了老罗的文章后才了解到的。 接下来,说说专用链和Base64的关系。 其实呢,说白了专用链就是使用了Base64编码,因为我之前提到的Base64的特点,他的高速的加密以及解密。 接下来我将是用一个软件的下载地址来做示范,讲解3种程序的专用链。 例子的下载地址是(此链接不存在,仅作为演示) http://www.free-z.net/1.rar 迅雷专用链 迅雷的专用链是在原地址的前面加“AA”,最后加“ZZ”后再是用Base64加密 即使用Base64编码如下字符串 AAhttp://www.free-z.net/1.rarZZ 编码后字符串为 QUFodHRwOi8vd3d3LmZyZWUtei5uZXQvMS5yYXJaWg== 迅雷专用链即在此字符串前加thunder://,即 thunder://QUFodHRwOi8vd3d3LmZyZWUtei5uZXQvMS5yYXJaWg== 快车专用链 快车的专用链是在原地址的前面和后面都加上“[FLASHGET]”后再是用Base64加密 即使用Base64编码如下字符串 http://www.free-z.net/1.rar 编码后字符串为 W0ZMQVNIR0VUXWh0dHA6Ly93d3cuZnJlZS16Lm5ldC8xLnJhcltGTEFTSEdFVF0= 快车专用链即在此字符串前加Flashget://,尾部加&freeznet,即 Flashget://W0ZMQVNIR0VUXWh0dHA6Ly93d3cuZnJlZS16Lm5ldC8xLnJhcltGTEFTSEdFVF0=&freeznet 腾讯旋风专用链 腾讯旋风专用链是最为简单的,直接将原地址Base64编码即可,即 对字符串http://www.free-z.net/1.rar直接编码,可获得 aHR0cDovL3d3dy5mcmVlLXoubmV0LzEucmFy 然后在此字符串之前加qqdl://即可,即 qqdl://aHR0cDovL3d3dy5mcmVlLXoubmV0LzEucmFy 阅读全文 类别:Notes 查看评论 [阅读全文] ·[ZZ]使用未公开函数编写磁盘格式化应用程序 vc++ 2010/06/02 00:00 如果想在自己的应用程序中加入操作系统的Format(格式化)功能,就象系统的那个formatutility,应该怎么做呢?用Google搜索的话,中文资料最多的一篇是《磁盘格式化的编程实现》,讲的是借用SHFormatDrive函数来调用系统的格式化工具完成格式化功能。有没有办法使用自己的代码实现呢?参考sysinternals里的一篇文章,尝试用FMIFS.dll里的一个未公开函数实现了Format功能,所有的参数都由自己给定,比如每簇大小、文件系统等待。这里我只演示了最基本的功能,如果要想程序更健壮些,则还需要做更多的工作。 FormatEx函数原型: VOID FormatEx ( PWCHAR DriveRoot, DWORD MediaFlag , PWCHAR Format, PWCHAR Label, BOOL QuickFormat, DWORD ClusterSize, PFMIFSCALLBACK Callback); 其中FMIFSCALLBACK是: typedef BOOLEAN (__stdcall *PFMIFSCALLBACK)( CALLBACKCOMMAND Command, DWORD SubAction, PVOID ActionInfo ); 下面是具体工作: 先定义一个头文件Fmifs.h: //====================================================================== // // Fmifs.h // //====================================================================== // // Output command // typedef struct { DWORD Lines; PCHAR Output; } TEXTOUTPUT, *PTEXTOUTPUT; // // Callback command types // typedef enum { PROGRESS, DONEWITHSTRUCTURE, UNKNOWN2, UNKNOWN3, UNKNOWN4, UNKNOWN5, INSUFFICIENTRIGHTS, UNKNOWN7, UNKNOWN8, UNKNOWN9, UNKNOWNA, DONE, UNKNOWNC, UNKNOWND, OUTPUT, STRUCTUREPROGRESS } CALLBACKCOMMAND; // // FMIFS callback definition // typedef BOOLEAN (__stdcall *PFMIFSCALLBACK)( CALLBACKCOMMAND Command, DWORD SubAction, PVOID ActionInfo ); // // Chkdsk command in FMIFS // typedef VOID (__stdcall *PCHKDSK)( PWCHAR DriveRoot, PWCHAR Format, BOOL CorrectErrors, BOOL Verbose, BOOL CheckOnlyIfDirty, BOOL ScanDrive, PVOID Unused2, PVOID Unused3, PFMIFSCALLBACK Callback ); // // Format command in FMIFS // // media flags #define FMIFS_HARDDISK 0xC #define FMIFS_FLOPPY 0x8 typedef VOID (__stdcall *PFORMATEX)( PWCHAR DriveRoot, DWORD MediaFlag, PWCHAR Format, PWCHAR Label, BOOL QuickFormat, DWORD ClusterSize, PFMIFSCALLBACK Callback ); // // Enable/Disable volume compression // typedef BOOLEAN (__stdcall *PENABLEVOLUMECOMPRESSION)(PWCHAR DriveRoot, BOOL Enable ); ////////////////////////////////////////////////////////////////////////// 下面是主文件: #include "stdafx.h" #include <windows.h> #include <stdio.h> #include "fmifs.h" #define _UNICODE 1 #include "tchar.h" BOOL Error = FALSE; BOOL QuickFormat = FALSE; DWORD ClusterSize = 0; BOOL CompressDrive = FALSE; BOOL GotALabel = FALSE; PWCHAR Label = L""; PWCHAR Drive = NULL; PWCHAR Format = L"FAT32"; WCHAR RootDirectory[MAX_PATH]; WCHAR LabelString[12]; PFORMATEX FormatEx; PENABLEVOLUMECOMPRESSION EnableVolumeCompression; typedef struct { WCHAR SizeString[16]; DWORD ClusterSize; } SIZEDEFINITION, *PSIZEDEFINITION; SIZEDEFINITION LegalSizes[] = { { L"512", 512 }, { L"1024", 1024 }, { L"2048", 2048 }, { L"4096", 4096 }, { L"8192", 8192 }, { L"16K", 16384 }, { L"32K", 32768 }, { L"64K", 65536 }, { L"128K", 65536 * 2 }, { L"256K", 65536 * 4 }, { L"", 0 }, }; //---------------------------------------------------------------------- // // FormatExCallback // // The file system library will call us back with commands that we // can interpret. If we wanted to halt the chkdsk we could return FALSE. // //---------------------------------------------------------------------- BOOLEAN __stdcall FormatExCallback( CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument ) { PDWORD percent; PTEXTOUTPUT output; PBOOLEAN status; static createStructures = FALSE; // // We get other types of commands, but we don't have to pay attention to them // switch( Command ) { case PROGRESS: percent = (PDWORD) Argument; _tprintf(L"%d percent completed.\r", *percent); break; case OUTPUT: output = (PTEXTOUTPUT) Argument; fprintf(stdout, "%s", output->Output); break; case DONE: status = (PBOOLEAN) Argument; if( *status == FALSE ) { _tprintf(L"FormatEx was unable to complete successfully.\n\n"); Error = TRUE; } break; } return TRUE; } //---------------------------------------------------------------------- // // LoadFMIFSEntryPoints // // Loads FMIFS.DLL and locates the entry point(s) we are going to use // //---------------------------------------------------------------------- BOOLEAN LoadFMIFSEntryPoints() { LoadLibrary( "fmifs.dll" ); if( !(FormatEx = (PFORMATEX) GetProcAddress( GetModuleHandle( "fmifs.dll"), "FormatEx" )) ) { return FALSE; } if( !(EnableVolumeCompression = (PENABLEVOLUMECOMPRESSION) GetProcAddress( GetModuleHandle( "fmifs.dll"), "EnableVolumeCompression" )) ) { return FALSE; } return TRUE; } int main( int argc, WCHAR *argv[] ) { if( argv[1][1] != L':' ) return 0; Drive = argv[1]; wcscpy( RootDirectory, Drive ); RootDirectory[2] = L'\\'; RootDirectory[3] = (WCHAR) 0; DWORD media; DWORD driveType; driveType = GetDriveTypeW( RootDirectory ); if( driveType != DRIVE_FIXED ) media = FMIFS_FLOPPY; if( driveType == DRIVE_FIXED ) media = FMIFS_HARDDISK; // // Get function pointers // if( !LoadFMIFSEntryPoints()) { _tprintf(L"Could not located FMIFS entry points.\n\n"); return -1; } FormatEx( RootDirectory, media, Format, Label, QuickFormat, ClusterSize, FormatExCallback ); return 0; } |
posted on 2010-10-26 16:32 Cheney Shen 阅读(2294) 评论(0) 编辑 收藏 举报