源自某大佬的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;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-3-5 15:32
被cvcvxk编辑
,原因: