win7磁盘读写操作


layout: post
title: win7磁盘读写操作
categories: C/C++
description: win7磁盘读写操作
keywords:
url: https://lichao890427.github.io/ https://github.com/lichao890427/


直接放代码

  正常情况下,Win7系统16扇区以后写操作是无效的,如果要破解这个通常会在驱动级实现,然而这里提供一种应用层实现方式:

HANDLE handle=CreateFile("\\\\.\\c:",GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//GENERIC_ALL有时不好使,不过权限最大,如果用GENERIC_ALL返回INVALID_HANDLE则改成GENERIC_READ|GENERIC_WRITE
BOOL ret;
ret=SetFilePointer(handle,0x0000CC00,NULL,FILE_BEGIN);
BYTE buffer[512];
memset(buffer,1,512);
DWORD num;
ret=DeviceIoControl(handle,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&num,NULL);//注意FSCTL_LOCK_VOLUME无效
//下面要写数据了,注意别把自己的数据写了,自己修改上面的偏移
ret=WriteFile(handle,buffer,512,&num,NULL);//必须是扇区大小的倍数,否则报参数错
CloseHandle(handle);

  当非Administrator和Administrators组的用户访问CreateFile时会失败,这时需要用到提权函数,下面是逆向出的unlocker的一部分代码用于提权

```C++
bool SetACL(LPWSTR OjbectName)
{
    PSID pEveryoneSID=NULL,pAdminSID=NULL;
    SID_IDENTIFIER_AUTHORITY SIDAuthWorld=SECURITY_WORLD_SID_AUTHORITY;
    if(!AllocateAndInitializeSid(&SIDAuthWorld,1,SECURITY_WORLD_RID,0,0,0,0,0,0,0,&pEveryoneSID))
    {//ERROR
        if(pEveryoneSID) FreeSid(pEveryoneSID);
        return FALSE;
    }
    SID_IDENTIFIER_AUTHORITY SIDAuthNT=SECURITY_NT_AUTHORITY;
    if(!AllocateAndInitializeSid(&SIDAuthNT,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,
        0,0,0,0,0,0,&pAdminSID))
    {
        if(pAdminSID) FreeSid(pAdminSID);
        if(pEveryoneSID) FreeSid(pEveryoneSID);
        return FALSE;
    }
    
    EXPLICIT_ACCESS ea[2];
    ZeroMemory(ea,2*sizeof(EXPLICIT_ACCESS));
    ea[0].grfAccessPermissions=GENERIC_ALL;
    ea[0].grfAccessMode=SET_ACCESS;
    ea[0].grfInheritance=NO_INHERITANCE;
    ea[0].Trustee.TrusteeForm=TRUSTEE_IS_SID;
    ea[0].Trustee.TrusteeType=TRUSTEE_IS_WELL_KNOWN_GROUP;
    ea[0].Trustee.ptstrName=(LPSTR)pEveryoneSID;
    ea[1].grfAccessPermissions=GENERIC_ALL;
    ea[1].grfAccessMode=SET_ACCESS;
    ea[1].grfInheritance=NO_INHERITANCE;
    ea[1].Trustee.TrusteeForm=TRUSTEE_IS_SID;
    ea[1].Trustee.TrusteeType=TRUSTEE_IS_GROUP;
    ea[1].Trustee.ptstrName=(LPSTR)pAdminSID;
    
    PACL pACL=NULL;
    if(!SetEntriesInAcl(2,ea,NULL,&pACL))
    {
        DWORD nRet=SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL);
        if(nRet == ERROR_ACCESS_DENIED)
        {
            SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,pAdminSID,NULL,NULL,NULL);
            SetNamedSecurityInfoW(OjbectName,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL);
        }
    }
    if(pACL) LocalFree(pACL);
    if(pAdminSID) FreeSid(pAdminSID);
    if(pEveryoneSID) FreeSid(pEveryoneSID);
    return 0;
}

注意事项

  read和write的时候一般是512的倍数,读写大小不能超过系统最大粒度,通常是64M,MSDN上未提示这个

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载声明:本文虽然不是本人100%原创,但也是辛辛苦苦整理的,可以转载,但请注明出处 这篇文章是关于折腾Windo...
    SOMCENT阅读 8,124评论 3 37
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,569评论 2 45
  • 在生活中很多人说世界是公平的,其实我认为世界根本没有什么公平可言。 从我们的出生开始,有的人口含金钥匙,而有的人则...
    培根在找蛋阅读 220评论 0 1
  • 1. giraffe 长颈鹿 拆分:gir--gril是女孩;a--一;ff--发疯;e--鹅。女孩骑着一只长颈鹿...
    世话实说阅读 703评论 0 0
  • 震惊 这个看似不可思议的标题,指的正是当前沸沸扬扬的华为清理老员工的传闻。这个最早从知乎传出的消息,说: 华为中国...
    失落的地平线阅读 827评论 0 0