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

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

  1. if ()//这段代码可以枚举所有缓存资源,然后对应做处理
  2. {
  3. LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
  4. HANDLE hCacheDir = NULL;
  5. DWORD dwTrySize, dwEntrySize = ;
  6. DWORD dwError = ERROR_INSUFFICIENT_BUFFER;
  7. BOOL bSuccess, bDone = FALSE; //是否已经处理完,初始设为false
  8. while(!bDone){
  9. switch(dwError){
  10. case ERROR_INSUFFICIENT_BUFFER:
  11. if(lpCacheEntry)
  12. {
  13. delete [] lpCacheEntry;
  14. }
  15. lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
  16. lpCacheEntry->dwStructSize = dwEntrySize;
  17. dwTrySize = dwEntrySize;
  18. if(!hCacheDir)
  19. {//为空,说明第一次执行,需要找第一个
  20. hCacheDir = FindFirstUrlCacheEntry(NULL,lpCacheEntry,&dwTrySize);
  21. bSuccess = (hCacheDir != NULL);
  22. }
  23. else
  24. {
  25. bSuccess = FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize);
  26. }
  27. if(!bSuccess){
  28. dwError = GetLastError();
  29. dwEntrySize = dwTrySize; //使用得到的新长度
  30. }
  31. else
  32. {
  33. dwError = ERROR_SUCCESS;
  34. }
  35. break;
  36. //we are done
  37. case ERROR_NO_MORE_ITEMS:
  38. bDone = TRUE;
  39. break;
  40. //we have got an entry
  41. case ERROR_SUCCESS:
  42. if(bSuccess && (NORMAL_CACHE_ENTRY & lpCacheEntry->CacheEntryType))
  43. { //
  44. CString sUrl1 = lpCacheEntry->lpszSourceUrlName;
  45. if (sUrl1.Compare(s) == )
  46. {
  47. //处理
  48. }
  49. // CTime lastModified(lpCacheEntry->LastModifiedTime);
  50. // CTime lastAccessed(lpCacheEntry->LastAccessTime);
  51. //a changed cookie - delete it!
  52. // if(lastModified >= m_time || lastAccessed >= m_time){
  53. //const CString name = lpCacheEntry->lpszSourceUrlName;
  54. //const CString result = lastModified.Format("%I:%M:%S%p %d %b %Y");
  55. //MessageBox (NULL, name + " last modified " + result, "Deleting cookie", MB_OK);
  56. //DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
  57. }
  58. //get ready for next entry
  59. dwTrySize = dwEntrySize;
  60. if(!FindNextUrlCacheEntry(hCacheDir,lpCacheEntry,&dwTrySize))
  61. {
  62. dwError = GetLastError();
  63. dwEntrySize = dwTrySize; //使用得到的新长度
  64. }
  65. else
  66. {
  67. dwError = ERROR_SUCCESS;
  68. }
  69. break;
  70. //unknown error
  71. default:
  72. CString strError; strError.Format(_T("There is an error (%d) when trying deleting temporary internet files.\r\n"), dwError);
  73. TRACE(strError);
  74. bDone = TRUE;
  75. break;
  76. if(bDone)
  77. break;
  78. Sleep(); if(lpCacheEntry){ delete [] lpCacheEntry; lpCacheEntry = NULL;}
  79. if(hCacheDir){ FindCloseUrlCache(hCacheDir); hCacheDir = NULL;}
  80. break;
  81. }
  82. }
  83. }

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

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

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

  1. if ()//这段代码只能在IE9以上运行,可以将图片绘到canvas上,再取出png格式经base64编码后的数据
  2. //然后解码,存到文件中,就得到一个png图片
  3. //HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
  4. //设置对应程序的dword值为10001为强制ie10,9999为强制ie9,8888为强制ie8
  5. {
  6. CDispatch dispCanvas = disp.InvokePtr(L"createElement", L"canvas");
  7. dispCanvas.Put(L"width", dispImg.Get(L"naturalWidth"));
  8. dispCanvas.Put(L"height", dispImg.Get(L"naturalHeight"));
  9. CDispatch dispCtx = dispCanvas.InvokePtr(L"getContext", L"2d");
  10. dispCtx.Invoke(L"drawImage", dispImg.p, , );
  11. CString sData = dispCanvas.Invoke(L"toDataURL", L"image/png");
  12. sData = sData.Right(sData.GetLength() - );
  13.  
  14. int nBuffer = sData.GetLength() + ;
  15. byte* buffer = new byte[nBuffer];
  16. memset(buffer, , nBuffer);
  17. Base64Decode(sData, sData.GetLength(), buffer, &nBuffer);
  18.  
  19. CFile f("1.png", CFile::modeCreate|CFile::modeWrite);
  20. f.Write(buffer, nBuffer);
  21. delete[] buffer;
  22. }

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

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

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  2. linux内核中预留4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  3. 【转】Linux内核中分配4M以上大内存的方法

    在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order & ...

  4. shell中取字符串子串的几种方式 截取substr

    shell中取字符串子串的几种方式 echo "123456789" | awk '{print substr($0,5,2)}' 截取 1)awk中函数substrsubstr( ...

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

    先给大家分享页头添加背景图片的两种方法:1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<h ...

  6. 前端下载图片的N种方法

    前几天一个简单的下载图片的需求折腾了我后端大佬好几天,最终还是需要前端来搞,开始说不行的笔者最后又行了,所以趁着这个机会来总结一下下载图片到底有多少种方法. 先起个服务 使用expressjs起个简单 ...

  7. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  8. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  9. Web Service 中返回DataSet结果的几种方法

    Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快: ...

随机推荐

  1. arm+linux 裸机环境搭建之初试minicom+dnw烧写uboot

    下面的步骤将会实现在linux下面使用dnw+minicom来烧写uboot 一.安装minicom 下载地址:http://download.csdn.net/detail/king_bingge/ ...

  2. (转载)lib 和 dll 的区别、生成以及使用详解

    简单地讲: 第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, ...

  3. Spring MVC URL传参

    Spring MVC 学习 之 - URL参数传递   在学习 Spring Mvc 过程中,有必要来先了解几个关键参数:    @Controller: 在类上注解,则此类将编程一个控制器,在项目启 ...

  4. Okhttp3日志采集功能

    原文地址以示尊重:http://www.jianshu.com/p/d836271b1ae4 日志采集是一个APP必备的功能,可以方便开发人员快速定位问题,解决问题,那么我们在使用okhttp的时候应 ...

  5. 一个关于poi导出的API

    先准备需要的参数 参数1:String title=“用户信息” 参数2:String[] headers String[] headers = { "用户名", "昵称 ...

  6. E​F​I​主​板​和​G​P​T​分​区​表​安​装​系​统以及转换GPT分区表的方法

    现在硬盘越来越大,而原来的MBR分区方式,超过2T的硬盘就会识别不全,只有使用GPT的方式才可以,但是GPT如果用原来的BIOS是无法引导装系统了,不过如果你的主板支持EFI,那么可以用GPT+EFI ...

  7. Go语言中的管道(Channel)总结

    管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用.今天尝试对Go语言的管道来做以下总结.总结的形式采用问答式的方法,让答案更有目的性. Q1.管道是什么? 管道是Go语言在语 ...

  8. HDU4893--Wow! Such Sequence! (线段树 延迟标记)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  9. hdu3308--LCIS 最大连续递增序列长度

    这个是动态的,所以要用线段树维护.代码里有注释因为ls敲成lsum,rs敲成rsum查错查了好久.. #include <set> #include <map> #includ ...

  10. HDU 3586 : Information Disturbing

    Problem Description In the battlefield , an effective way to defeat enemies is to break their commun ...