首页
社区
课程
招聘
[分享]很有时间系列:BadApple BSOD
发表于: 2018-1-8 04:49 7868

[分享]很有时间系列:BadApple BSOD

2018-1-8 04:49
7868

源自某大佬的inbv函数调用的课后习题:

“在驱动中做BadApple动画”
然后看了B站的BadApple蓝屏:
https://www.bilibili.com/video/av1187209
然后就动手怼怼怼怼....资料全都来自互联网
由于InbvBitBlt没有导出,所以只能靠输出字符来了。
各种东西都扯淡,日更新999+的qq群:48715131 

InbvAcquireDisplayOwnership后,怎么把监视器弄回来,需要用exe来call一个Api:
	::ChangeDisplaySettingsEx(nullptr, nullptr, nullptr, CDS_RESET, nullptr);

各种东西都扯淡,日更新999+的qq群:48715131 

核心代码:
#define BLACK   '*'
#define WHITE   ' '
#define FRAME_SIZE (80*25)

unsigned frame_count = 0;
unsigned frame_point = 0;
unsigned char frame[FRAME_SIZE * 2];

int getframe()
{
	if (data_point == data_size) {
		return 0;
	}

	if (frame_point >= FRAME_SIZE) {
		memcpy(frame, frame + FRAME_SIZE, FRAME_SIZE);
		frame_point = frame_point - FRAME_SIZE;
	}

	do {
		auto ch = data[data_point++];
		for (auto i = 0; i < (ch & 0x7F); i++) {
			frame[frame_point++] = (ch & 0x80) ? BLACK : WHITE;
		}
	} while (frame_point < FRAME_SIZE);

	frame_count++;
	return 1;
}

void printframe() {
	char process[64] = {};
	RtlStringCchPrintfA(process,ARRAYSIZE(process), "%04d/5260 ", frame_count);
	memcpy(frame, process, strlen(process));
	ULONG x1 = 0, y1 = 0, x2 = 639, y2 = 399;
	InbvSolidColorFill(x1, y1, x2, y2, 4);//刷新
	InbvSetScrollRegion(x1, y1, x2, y2);//设置光标
	InbvDisplayString(frame);
}

void testBadApple()
{
	ULONG x1 = 0, y1 = 0, x2 = 639, y2 = 399;
	UCHAR SpareColor = 4;	// blue,1 red 颜色很多,需要猜测!
	UCHAR BackColor = 3;	// green
	UCHAR TextColor = 15;	// white
	//接管系统显示
	InbvAcquireDisplayOwnership();
	//恢复屏幕
	//重设屏幕会让屏幕运行在黑色的世界里
	InbvResetDisplay();
	//画个屏幕区域
	InbvSolidColorFill(0, 0, 639, 479, 4);		// blue, 640x480
	//InbvSolidColorFill(x1, y1, x2, y2, SpareColor);		// green, (x1,y1)x(x2,y1)
	InbvSetTextColor(TextColor);					// white
													//设置文字显示模式
	InbvInstallDisplayStringFilter((INBV_DISPLAY_STRING_FILTER)NULL);
	InbvEnableDisplayString(TRUE);
	//设置文字光标位置
	InbvSetScrollRegion(x1, y1, x2, y2);
	//下面动画开始
	while (getframe())
	{
		printframe();
		ddk::util::sleep(ddk::util::milli_seconds(24));
	}
	//表演结束直接KeBugCheck重启
	//KeBugCheck(POWER_FAILURE_SIMULATE);
	//TODO:恢复屏幕
	//这个需要调用Win32k!NtUserChangeDisplaySettings(NULL, NULL, 0x40000000, NULL);
	return;
}

BadApple的字符数据——很久很久之前从某个喜闻乐见的工程里复制的数组我的badapple都用这个——不记得是谁的了,谁记起来是自己的可以联系,我给你加上版权,具体见附件代码:cpp那个
其他代码比如sleep啊,毫秒的定义啊,我不知道啊,我不知道啊,我不知道啊,百度啊,google啊,gayhub啊

完整编译好的有点诡异的驱动,请qq群找我啦,qq群:48715131
放个图片:

至于声音啊,用exe用ioctrl等等方式通信去配合,反正最后还要调用ChangeDisplaySettingsEx重设喽,exe怎么放音乐?mciSendCommand啊,当然是mciSendCommand啦

至于什么画面与声音同步啊,这个也可以有,但是有点复杂,这里就不讨论了。

#define BLACK   '*'
#define WHITE   ' '
#define FRAME_SIZE (80*25)

unsigned frame_count = 0;
unsigned frame_point = 0;
unsigned char frame[FRAME_SIZE * 2];

int getframe()
{
	if (data_point == data_size) {
		return 0;
	}

	if (frame_point >= FRAME_SIZE) {
		memcpy(frame, frame + FRAME_SIZE, FRAME_SIZE);
		frame_point = frame_point - FRAME_SIZE;
	}

	do {
		auto ch = data[data_point++];
		for (auto i = 0; i < (ch & 0x7F); i++) {
			frame[frame_point++] = (ch & 0x80) ? BLACK : WHITE;
		}
	} while (frame_point < FRAME_SIZE);

	frame_count++;
	return 1;
}

void printframe() {
	char process[64] = {};
	RtlStringCchPrintfA(process,ARRAYSIZE(process), "%04d/5260 ", frame_count);
	memcpy(frame, process, strlen(process));
	ULONG x1 = 0, y1 = 0, x2 = 639, y2 = 399;
	InbvSolidColorFill(x1, y1, x2, y2, 4);//刷新
	InbvSetScrollRegion(x1, y1, x2, y2);//设置光标
	InbvDisplayString(frame);
}

void testBadApple()
{
	ULONG x1 = 0, y1 = 0, x2 = 639, y2 = 399;
	UCHAR SpareColor = 4;	// blue,1 red 颜色很多,需要猜测!
	UCHAR BackColor = 3;	// green
	UCHAR TextColor = 15;	// white
	//接管系统显示
	InbvAcquireDisplayOwnership();
	//恢复屏幕
	//重设屏幕会让屏幕运行在黑色的世界里
	InbvResetDisplay();
	//画个屏幕区域
	InbvSolidColorFill(0, 0, 639, 479, 4);		// blue, 640x480
	//InbvSolidColorFill(x1, y1, x2, y2, SpareColor);		// green, (x1,y1)x(x2,y1)
	InbvSetTextColor(TextColor);					// white
													//设置文字显示模式
	InbvInstallDisplayStringFilter((INBV_DISPLAY_STRING_FILTER)NULL);
	InbvEnableDisplayString(TRUE);
	//设置文字光标位置
	InbvSetScrollRegion(x1, y1, x2, y2);
	//下面动画开始
	while (getframe())
	{
		printframe();
		ddk::util::sleep(ddk::util::milli_seconds(24));
	}
	//表演结束直接KeBugCheck重启
	//KeBugCheck(POWER_FAILURE_SIMULATE);
	//TODO:恢复屏幕
	//这个需要调用Win32k!NtUserChangeDisplaySettings(NULL, NULL, 0x40000000, NULL);
	return;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-3-5 15:32 被cvcvxk编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (13)
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶一下老V
2018-1-8 05:53
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3
win8.1的蓝屏不是已经支持画画了么
2018-1-8 09:15
0
雪    币: 0
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
就是头冷~
2018-1-8 09:30
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
hzqst win8.1的蓝屏不是已经支持画画了么
是可以,其实什么版本都能画画,只是BitBlt没导出
2018-1-8 09:31
0
雪    币: 6124
活跃值: (4661)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
你们是真的闲得慌
2018-1-8 17:12
0
雪    币: 1485
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
v老大。你现在还开培训班吗?想学驱动保护技术
2018-2-11 11:55
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
冰雄 v老大。你现在还开培训班吗?想学驱动保护技术
加群,关注群动态
2018-3-5 15:31
0
雪    币: 62
活跃值: (662)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢V大
最后于 2018-3-16 20:07 被dz默契编辑 ,原因:
2018-3-16 10:26
0
雪    币: 44
活跃值: (127)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
这个群有点贵..
2018-3-21 18:40
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
11
我去年某个晚上在群里发鬼脸  然后被人封了一年    。。。然后把群消息屏蔽        前段时间再看的时候我群都没了。。。
2018-3-21 19:58
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
有意思
2018-4-30 16:12
0
雪    币: 3907
活跃值: (5817)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
14
感谢V大
2018-6-9 22:46
0
游客
登录 | 注册 方可回帖
返回
//