一个获取flv文件的另类方法
某日在坛子上闲逛,发现一petzl的短片[Ref3],拍的相当精彩,就想把它搞下来慢慢的回味下。
首先搜了下临时文件夹,local settings\temp,果然新产生了一个硕大的tmp文件。(关闭浏览器后该临时文件随即会被删除)
可惜,拷贝的时候可爱的
windows告诉俺“无法复制fla3:共享冲突,源文件或目标文件可能正在使用。”
还是
google下吧,结果伟大的
google告诉俺,用个***嗅探
软件或***flv
下载软件来搞定flv,用现成的
软件可是件很无聊的事儿,
没有困难,创造困难也要上!所以问题回到了最开始,既然俺要的flv文件已经在俺的硬盘上了,无非就是怎么把它拷贝出来的问题。
虽然一般来说我们都是以administrator来登录
系统,但administrator也就是个权限有点高的user而已,遇到本例中的复制fla3.tmp的问题
也是无能为力,因为在用户这一级别上,我们是不能直接操作文件的,而是必须通过它的句柄,一个打开的文件的访问权限就保存在描述句柄的
结构体里,而我们要做的就是修改这个访问权限,HANDLE_TABLE_ENTRY结构体中的GrantedAccess域。
但修改这个GrantedAccess域也不是啥简单的事儿,因为windows并没有提供给我们修改句柄访问权限的API,这就需要我们自己手动编写驱动程序来完成。
(如果你有办法进入ring0,hohoho也是可以滴~,如何编写驱动程序这部分可以看[Ref1])
把reader.sys复制到%systemroot%\system32\drivers\下面 [Ref2]
导入注册表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\reader]
"ErrorControl"=dword:00000000
"ImagePath"=hex(2):5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,72,\
00,69,00,76,00,65,00,72,00,73,00,5c,00,72,00,65,00,61,00,64,00,65,00,72,00,\
2e,00,73,00,79,00,73,00,00,00
"Start"=dword:00000001
"Tag"=dword:00000001
"Type"=dword:00000001
重启后,驱动程序就加载完毕了。
最后就是写个拷贝文件的小程序,代码如下:
flvcopy.c:
#include <windows.h>
#include "hchange.h"
BOOLEAN SetHandleAccess(
HANDLE Handle,
ACCESS_MASK GrantedAccess
)
{
HANDLE hDriver;
ULONG Bytes;
ULONG Buff[2];
BOOLEAN Result = FALSE;
hDriver = CreateFile("\\\\.\\haccess", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
if (hDriver != INVALID_HANDLE_VALUE)
{
Buff[0] = (ULONG)Handle;
Buff[1] = GrantedAccess;
Result = DeviceIoControl(hDriver, IOCTL1, Buff, sizeof(Buff), NULL, 0, &Bytes, NULL);
CloseHandle(hDriver);
}
return Result;
}
void main()
{
HANDLE hFile, hDest;
ULONG Size, Bytes;
PVOID Data;
CHAR Name[MAX_PATH];
lstrcpy(Name, "C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\fla3.tmp");
hFile = CreateFile(Name, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
if (SetHandleAccess(hFile, AC_GENERIC_READ))
{
Size = GetFileSize(hFile, NULL);
Data = VirtualAlloc(NULL, Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (Data)
{
ReadFile(hFile, Data, Size, &Bytes, NULL);
hDest = CreateFile("e:\\fla3.tmp", GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
if (hDest != INVALID_HANDLE_VALUE)
{
WriteFile(hDest, Data, Size, &Bytes, NULL);
CloseHandle(hDest);
}
VirtualFree(Data, 0, MEM_RELEASE);
}
}
CloseHandle(hFile);
}
}
hchange.h
#include <winioctl.h>
#define BASE_IOCTL (FILE_DEVICE_UNKNOWN << 16) | (FILE_READ_ACCESS << 14) | METHOD_BUFFERED
#define IOCTL1 BASE_IOCTL | (1 << 2)
#define AC_GENERIC_READ 0x120089
#define AC_GENERIC_WRITE 0x120196
#define AC_DELETE 0x110080
#define AC_READ_CONTROL 0x120080
#define AC_WRITE_DAC 0x140080
#define AC_WRITE_OWNER 0x180080
#define AC_GENERIC_ALL 0x1f01ff
#define AC_STANDARD_RIGHTS_ALL 0x1f0080
成功的编译运行后,fla3.tmp就已经在e盘的根目录里了,把后缀改为.flv,用flvplayer就可以播放了。
Ref1:
http://greatdong.blog.edu.cn 《被占用文件操作三法》
Ref2:
http://wasm.ru/pub/21/files/lockfileswork/samcopy.rar reader.sys
Ref3:
http://you.video.sina.com.cn/b/vblog_player.swf?vid=714666 petzl的宣传片