zoukankan      html  css  js  c++  java
  • Trident内核中取验证码图片的几种方法

    程序中用了IE的内核,想取出网站中的验证码图片,单独显示出来,调研了以下几路方法

    1、枚举所有缓存文件,进行处理,找到想要的,核心代码

    if (0)//这段代码可以枚举所有缓存资源,然后对应做处理
    {
        LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
        HANDLE hCacheDir = NULL;
        DWORD dwTrySize, dwEntrySize = 4096;
        DWORD dwError = ERROR_INSUFFICIENT_BUFFER;
        BOOL bSuccess, bDone = FALSE; //是否已经处理完,初始设为false
        while(!bDone){
            switch(dwError){
            case ERROR_INSUFFICIENT_BUFFER:     
                if(lpCacheEntry) 
                {
                    delete [] lpCacheEntry;
                }
                lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
                lpCacheEntry->dwStructSize = dwEntrySize;
                dwTrySize = dwEntrySize;
                if(!hCacheDir)
                {//为空,说明第一次执行,需要找第一个
                    hCacheDir = FindFirstUrlCacheEntry(NULL,lpCacheEntry,&dwTrySize);
                    bSuccess = (hCacheDir != NULL);
                }
                else 
                {
                    bSuccess = FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize);
                }
                if(!bSuccess){
                    dwError = GetLastError();
                    dwEntrySize = dwTrySize; //使用得到的新长度 
                }
                else 
                {
                    dwError = ERROR_SUCCESS;
                }
                break; 
                //we are done
            case ERROR_NO_MORE_ITEMS:
                bDone = TRUE;
                break;
                //we have got an entry
            case ERROR_SUCCESS:
                if(bSuccess && (NORMAL_CACHE_ENTRY & lpCacheEntry->CacheEntryType))
                { //
                    CString sUrl1 = lpCacheEntry->lpszSourceUrlName;
                    if (sUrl1.Compare(s) == 0)
                    {
                        //处理
                    }
                    //     CTime lastModified(lpCacheEntry->LastModifiedTime);
                    //     CTime lastAccessed(lpCacheEntry->LastAccessTime);
                    //a changed cookie - delete it!
                    //     if(lastModified >= m_time || lastAccessed >= m_time){
                    //const   CString   name   =   lpCacheEntry->lpszSourceUrlName;  
                    //const   CString   result   =   lastModified.Format("%I:%M:%S%p   %d   %b   %Y");  
                    //MessageBox   (NULL,   name   +   "   last   modified   "   +   result,   "Deleting cookie",   MB_OK);  
                    //DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
                }
                //get ready for next entry
                dwTrySize = dwEntrySize;
                if(!FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize))
                {
                    dwError = GetLastError();
                    dwEntrySize = dwTrySize;   //使用得到的新长度
                }
                else 
                {
                    dwError = ERROR_SUCCESS;
                }
                break;
                //unknown error
            default:
                CString strError; strError.Format(_T("There is an error (%d) when trying deleting temporary internet files.
    "),   dwError);  
                TRACE(strError);
                bDone = TRUE;
                break;   
                if(bDone) 
                    break;
                Sleep(10);  if(lpCacheEntry){ delete [] lpCacheEntry; lpCacheEntry = NULL;}
                if(hCacheDir){ FindCloseUrlCache(hCacheDir); hCacheDir = NULL;}
                break;
            }
        }
    }

    2、直接取某个URL对应的缓存资源

    if (1)//这段代码可以直接从缓存找到对应URL的图片资源的路径
    {
        CString s = dispImg.Get(L"src");
        if (1)
        {
            LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
            DWORD dwEntrySize = 4096;
            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
            lpCacheEntry->dwStructSize = dwEntrySize;
            BOOL b = GetUrlCacheEntryInfo(s, lpCacheEntry, &dwEntrySize);
            CString sPath = lpCacheEntry->lpszLocalFileName;
        }
    }

    3、在网页新建一canvas,将图片绘上,然后toDataURL,这样可以得到png格式的,经过base64编码后的字符串,该方法只能在ie9以上使用

    if (0)//这段代码只能在IE9以上运行,可以将图片绘到canvas上,再取出png格式经base64编码后的数据
        //然后解码,存到文件中,就得到一个png图片
        //HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainFeatureControlFEATURE_BROWSER_EMULATION
        //设置对应程序的dword值为10001为强制ie10,9999为强制ie9,8888为强制ie8
    {
        CDispatch dispCanvas = disp.InvokePtr(L"createElement", L"canvas");
        dispCanvas.Put(L"width", dispImg.Get(L"naturalWidth"));
        dispCanvas.Put(L"height", dispImg.Get(L"naturalHeight"));
        CDispatch dispCtx = dispCanvas.InvokePtr(L"getContext", L"2d");
        dispCtx.Invoke(L"drawImage", dispImg.p, 0, 0);
        CString sData = dispCanvas.Invoke(L"toDataURL", L"image/png");
        sData = sData.Right(sData.GetLength() - 22);
    
        int nBuffer = sData.GetLength() + 1;
        byte* buffer = new byte[nBuffer];
        memset(buffer, 0, nBuffer);
        Base64Decode(sData, sData.GetLength(), buffer, &nBuffer);
    
        CFile f("1.png", CFile::modeCreate|CFile::modeWrite);
        f.Write(buffer, nBuffer);
        delete[] buffer;
    }
  • 相关阅读:
    下载安装安卓开发工具
    斐波那契数列
    各位相加
    求连续最大子序列和
    反转字符串中的单词
    统计位数为偶数的数字
    Express框架的整体感知
    node.js当中的http模块与url模块的简单介绍
    formidable处理提交的表单或文件的简单介绍
    30分钟,学会经典小游戏编程!
  • 原文地址:https://www.cnblogs.com/fatterbetter/p/4157866.html
Copyright © 2011-2022 走看看