zoukankan      html  css  js  c++  java
  • 迅雷/旋风地址转换原理分析(转)

    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编码如下字符串 
    AA
    http://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;
    }
  • 相关阅读:
    c语言产生随机数的方法
    二叉树递归建立
    二叉树的非递归建立
    建立链表并逆序打印该链表
    C语言中最常用标准库函数
    九个uname命令获取Linux系统详情的实例
    Ubuntu12.04安装Chrome浏览器,并添加到左侧的启动栏
    编程判断大端字节序和小端字节序
    将十进制转换成二进制输出,递归写法
    Lucene介绍及简单入门案例(集成ik分词器)
  • 原文地址:https://www.cnblogs.com/shenfei2031/p/1861628.html
Copyright © 2011-2022 走看看