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.\r\n"),   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_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_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;
}
时间: 2024-10-04 19:15:53

Trident内核中取验证码图片的几种方法的相关文章

linux内核中分配4M以上大内存的方法

在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= MAX_ORDER))        return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续内存一般是4M bytes. 内核中获取4M以上大内存的方法有三种: 1.修改MAX_ORDER,

PHP网站验证码图片不显示解决方法

找到php.ini配置文件之后,双击打开,hp_gd2.dll,找到如下图1-2所示.查看extension=php_gd2.dll前面是否有;号,如果有的话,去除,保存.编者注:如果php.ini是在系统目录下的话,保存之后重起电脑才生效,如果是系统变量里直接指定的话,重起IIS服务器或者重起apache服务器即可生效(不用重起服务器电脑). 如果找不到php.ini文件,在别的电脑拷贝一个即可. PHP网站验证码图片不显示解决方法

Html5 页面中 JavaScript 启动调用的三种方法比较

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 首先,来看一下 Html5 页面引用 JavaScript 代码的几种方式: 1.Html5 页面中使用 <script>  标签容纳

Android TextView里直接显示图片的三种方法

方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般如果字体是在图片上重叠的推荐这样写.时间关系,这个不付源码了. 方法二:利用TextView支持部分Html的特性,直接用api赋图片.代码如下: //第一种方法在TextView中显示图片 String html = "<img src='" + R.drawable.circle + "'/>"; ImageGetter imgGett

在JavaScript中判断整型的N种方法

整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中,他们只存在于概念中: 所有的数字都是浮点数,并且整数只是没有一组没有小数的数字. 在这篇博客中,我会解释如何去检查某个值是否为整型. ECMAScript 5 在ES5中有很多方法你可以使用.有时侯,你可能想用自己的方法:一个isInteger(x)的函数,如果是整型返回true,否则返回false. 让我们看看一些例子. 通过余数检查 你可以使用余数运算(%),将一个数字按1求余,看看余数

拉取种子用户的4种方法

本文和大家分享的主要是网络运营中拉取种子用户的几种方法,一起来看看吧,希望对运营新人有所帮助吧. 比较新的产品,我觉得没有用户来,这种情况怎么处理? 第一步要先了解你的目标用户是谁?很多同学并没有想清楚自己真正想要拉哪些人,他们是谁?到底在哪里?所以我列了三个问题,希望大家真正做用户运营工作之前,先考虑好这三个问题,该怎么去回答. 第1个问题,他们到底是谁? · 第2个问题,谁对这些人有影响力? · 第3个问题,有影响力的这些人又在哪里? 第一个问题:他们是谁,指的是你要先思考你的目标用户是谁?

DISCUZ论坛添加页头及页尾背景图片的几种方法

先给大家分享页头添加背景图片的两种方法: 1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<head></head>部分添加以下代码: <style>body { background-image:url(你的背景图片地址,如http://abc.com/imgs/bg.jpg); background-repeat:no-repeat; background-posi

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

【转】Java中字符串中子串的查找共有四种方法(indexof())

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st