Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2932353
  • 博文数量: 486
  • 博客积分: 10129
  • 博客等级: 上将
  • 技术积分: 6227
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-13 14:14
个人简介

人生有起有落,奋斗吧 官方网站:www.flameschen.com

文章分类

全部博文(486)

文章存档

2021年(1)

2020年(1)

2017年(17)

2016年(21)

2015年(3)

2014年(1)

2012年(1)

2011年(1)

2010年(5)

2009年(30)

2008年(31)

2007年(75)

2006年(299)

分类: WINDOWS

2007-09-25 00:18:42

嘿嘿在论坛上闲逛,发现一大的短片[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就可以播放了
阅读(1457) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~