Trident内核中取验证码图片的几种方法
程序中用了IE的内核,想取出网站中的验证码图片,单独显示出来,调研了以下几路方法
1、枚举所有缓存文件,进行处理,找到想要的,核心代码
- if ()//这段代码可以枚举所有缓存资源,然后对应做处理
- {
- LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
- HANDLE hCacheDir = NULL;
- DWORD dwTrySize, dwEntrySize = ;
- 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) == )
- {
- //处理
- }
- // 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(); if(lpCacheEntry){ delete [] lpCacheEntry; lpCacheEntry = NULL;}
- if(hCacheDir){ FindCloseUrlCache(hCacheDir); hCacheDir = NULL;}
- break;
- }
- }
- }
2、直接取某个URL对应的缓存资源
- if ()//这段代码可以直接从缓存找到对应URL的图片资源的路径
- {
- CString s = dispImg.Get(L"src");
- if ()
- {
- LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
- DWORD dwEntrySize = ;
- 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 ()//这段代码只能在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, , );
- CString sData = dispCanvas.Invoke(L"toDataURL", L"image/png");
- sData = sData.Right(sData.GetLength() - );
- int nBuffer = sData.GetLength() + ;
- byte* buffer = new byte[nBuffer];
- memset(buffer, , nBuffer);
- Base64Decode(sData, sData.GetLength(), buffer, &nBuffer);
- CFile f("1.png", CFile::modeCreate|CFile::modeWrite);
- f.Write(buffer, nBuffer);
- delete[] buffer;
- }
Trident内核中取验证码图片的几种方法的更多相关文章
- linux内核中分配4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- linux内核中预留4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- 【转】Linux内核中分配4M以上大内存的方法
在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order & ...
- shell中取字符串子串的几种方式 截取substr
shell中取字符串子串的几种方式 echo "123456789" | awk '{print substr($0,5,2)}' 截取 1)awk中函数substrsubstr( ...
- DISCUZ论坛添加页头及页尾背景图片的几种方法
先给大家分享页头添加背景图片的两种方法:1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<h ...
- 前端下载图片的N种方法
前几天一个简单的下载图片的需求折腾了我后端大佬好几天,最终还是需要前端来搞,开始说不行的笔者最后又行了,所以趁着这个机会来总结一下下载图片到底有多少种方法. 先起个服务 使用expressjs起个简单 ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...
- Web Service 中返回DataSet结果的几种方法
Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象 特点:通常组件化的处理机制,不加任何修饰及处理: 优点:代码精减.易于处理,小数据量处理较快: ...
随机推荐
- arm+linux 裸机环境搭建之初试minicom+dnw烧写uboot
下面的步骤将会实现在linux下面使用dnw+minicom来烧写uboot 一.安装minicom 下载地址:http://download.csdn.net/detail/king_bingge/ ...
- (转载)lib 和 dll 的区别、生成以及使用详解
简单地讲: 第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, ...
- Spring MVC URL传参
Spring MVC 学习 之 - URL参数传递 在学习 Spring Mvc 过程中,有必要来先了解几个关键参数: @Controller: 在类上注解,则此类将编程一个控制器,在项目启 ...
- Okhttp3日志采集功能
原文地址以示尊重:http://www.jianshu.com/p/d836271b1ae4 日志采集是一个APP必备的功能,可以方便开发人员快速定位问题,解决问题,那么我们在使用okhttp的时候应 ...
- 一个关于poi导出的API
先准备需要的参数 参数1:String title=“用户信息” 参数2:String[] headers String[] headers = { "用户名", "昵称 ...
- EFI主板和GPT分区表安装系统以及转换GPT分区表的方法
现在硬盘越来越大,而原来的MBR分区方式,超过2T的硬盘就会识别不全,只有使用GPT的方式才可以,但是GPT如果用原来的BIOS是无法引导装系统了,不过如果你的主板支持EFI,那么可以用GPT+EFI ...
- Go语言中的管道(Channel)总结
管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用.今天尝试对Go语言的管道来做以下总结.总结的形式采用问答式的方法,让答案更有目的性. Q1.管道是什么? 管道是Go语言在语 ...
- HDU4893--Wow! Such Sequence! (线段树 延迟标记)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu3308--LCIS 最大连续递增序列长度
这个是动态的,所以要用线段树维护.代码里有注释因为ls敲成lsum,rs敲成rsum查错查了好久.. #include <set> #include <map> #includ ...
- HDU 3586 : Information Disturbing
Problem Description In the battlefield , an effective way to defeat enemies is to break their commun ...