打印

[分享] 一个获取flv文件的加类方法

一个获取flv文件的加类方法

一个获取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的宣传片

TOP

好办法。

TOP