之前在做自动登录时,想着能不能通过获取动态javascript代码来获取DIV里的内容,从而获取文件列表和相关的信息,但是一番查阅资料后无果,大家如果有办法请不吝赐教,^_^。
后来在CSDN上看到了通过hook API来监听webbrowser的通信,觉得此法可行,于是在一番尝试之后终于成功了。
链接是Hook浏览器控件WebBrowser对WININET.dll的调用
首先通过httpwatch知道webbrowser获取文件列表的GET 是
/files?aid=0&cid=0&o=user_ptime&asc=0
&offset=0&show_dir=1&limit=24&code=&scid=&snap=0
&natsort=1&source=&format=json HTTP/1.1
有些参数的值可能每次不一样,但是每次前面都是
/files?aid=
所以从这里下手。通过多次调试,我最终留下了两个API:HttpOpenRequestW,InternetReadFile
原来的作者HOOK了很多API,但是对于获取文件列表来说,其它没有作用,我全删了,大家可以酌情增删。
流程大概是:
- 在HttpOpenRequestW里判断请求的URL,是不是”/files?aid=”,是的话就设置一个标志flag=1
- 在InternetReadFile里,直接判断标志flag是不是等于1,是的话把传进来的指针里的内容全部copy出来,存到一个file.txt中
BOOL WINAPI CWininetHook::_InternetReadFile(HINTERNET hFile,LPVOID lpBuffer,DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead)
{
//Access violation
BOOL result=s_pfnInternetReadFile(hFile,
lpBuffer,dwNumberOfBytesToRead,lpdwNumberOfBytesRead);
if (flag==1)
{
char tempBuffer[10000]={0};
int coun2=dwNumberOfBytesToRead;
memcpy_s(tempBuffer,coun2,lpBuffer,coun2);
//打开一个文件,文本格式,如果存在不删为0,只写,文件打开后禁止其他进程对文件的读写操作,
CStdioFile myFile("file.txt", CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::shareExclusive);
//追写,因为这个函数对同一个URL可能要执行很多次
myFile.SeekToEnd();
myFile.WriteString(tempBuffer);
myFile.Close();
}
return result;
}
- 在MFC界面上添加list control控件,具体设置这里就不说了,可以参考这里点我
- 添加按钮,增加按钮事件,在这里做的事情是,
- 把file.txt中的内容copy到一个1w字节的char数组里(大小可以适当调整)。
- 建一个结构体,保存文件的相关信息。
typedef struct _FileContent
{
char fid[100]; //fid
char name[100]; //名字
int fSize; //文件大小
int sta; //大小的单位
char time[100]; //时间
}fileContent;
fileContent FileName[100];
- 循环找到”fid”,把fid后面的内容存到filename[0].fid中,这个值在删除文件时要用到,这里的下标0只是举例说明,需要循环的。
- 把”n”后面的值存到filename[0].name中,这就是文件名了,
- 把”s”后面的值存到filename[0].size中,这就是size了(不是大小哦)。
- .把”sta”后面的值存到filename[0].sta中,这是size的单位,所以说大小是由size和sta一起得出的。sta有两个值,2表示B(字节),1表示KB,等于1时,size可能非常大,需要除以1024往大的单位换算,MB,GB,TB,PB.
把”t”后面的值存到filename[0].time中,这就是上传时间了.
接下来就是循环在list控件上显示内容了
效果:
我把修改后的.h和.cpp打包上传了
这个HOOK.zip的使用也非常简单,在你的cXXdlg.cpp中包含hook.h,工程目录视图里把.h和.cpp都添加进去就可以了。