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对象 特点:通常组件化的处理机制,不加任何修饰及处理: 优点:代码精减.易于处理,小数据量处理较快: ...
随机推荐
- shell脚本实现查找文件夹下重复的文件,并提供删除功能
Windows下有软件FindDupFile,可以搜索指定目录及其下子目录,列出所有内容完全相同的文件(文件名可能不同),然后由用户选择删除重复的文件. 然而shell脚本却可以使用几行的命令完成与此 ...
- 自律训练法 John Sehorz
自律训练法,系1932年由德国精神医学医师John Sehorz所创立.他研究人们在催眠催眠状态下,所呈现的生理状态,如:沉重与温暖感.. ,因而,John Sehorz改以「逆向操作」之方式,由自我 ...
- openpyxl
openpyxl库的使用,这个处理xlsx还是挺有用的 ref:传送门 from openpyxl import Workbook from openpyxl import load_workbook ...
- 布局共享(列如所有activity拥有相同的布局部分,比如actionbar,在BaseActivity中写入布局)
有时候界面上会用到统一的布局,比如toolbar,你可能会想到在用到的地方都去加上toobar这样对于程序的开发与维护来说都显得特别麻烦,我们可以将他写在父类中. 首先创建一个BaseActivity ...
- GCD 深入理解
GCD 深入理解(一) 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Object ...
- 使用CPU的AVX指令
arch:AVX 很抱歉GCC还不行……有……倒是 但是不是这么写的 我忘记了……官网上有 http://www.oschina.net/news/66980/kreogist-0-9
- rnqoj-30- [stupid]愚蠢的矿工-树形DP
把树转化为二叉树,然后再左右DP: #include<stdio.h> #include<string.h> #include<iostream> #include ...
- SVN 一次性提交多个目录中文件
情况一:将项目中未加入版本控制的文件提交到版本库. 在使用WINDOW下的SVN客户端工具时,在提交一个项目的文件时,如果有未加入版本库的文件,这时可以先将未加入的文件选中,然后一起提交. 但在LIN ...
- 禁用menu键
发现很多应用中基本不再使用menu键来显示菜单了,而在android studio中创建一个activity时,默认使用了actionBar,就是在右上角会显示三个点的内容,点击会出现Settings ...
- class 类(3) 继承
继承(Inheritance)是面向对象软 件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”,也可以称“B是A的超类”. 继承可以使得 ...