我为此事缺乏知识而道歉,但这对我来说非常重要,所以至少我会试一试。 我在Windows 7旗舰版上使用Visual Studio 2012 Express, 我已经写了一些非常基本的傻程序来练习C语言中的结构。不幸的是,我编写的方法之一有一个错误的条件停止,它进入一个无限循环,更糟糕的是它超过了给定的数组边界。我将在下面添加代码,但代码不是我的主要关注点,我已经设法修复它,我只想知道我是否可以损害我的系统或我的个人文件(视频,照片,办公文件等)给定的方法,因为当我试图运行这个代码时,发生了一件可怕的事情,我的电脑开始&" Beep"无休止地每0.5秒我无法阻止它,程序无限循环而且我设法阻止这个"有趣"只有使用Ctrl + Alt + Del。我之前编写的代码曾多次崩溃,但我确定我的电脑第一次发出哔哔声。我希望专家可以帮助我解决这个问题。非常感谢。
导致所有问题的无限循环方法是" printArrHero":
#include<stdio.h>
#include<string.h>
struct Date{
int day, month, year;
} typedef date_s;
struct Superhero{
char name[30];
double power, speed;
date_s birthday;
} typedef sp_s;
void printInfo(sp_s hero){
printf("Super hero info:\nName: [%s]\n" , hero.name);
printf("Power: [%.2lf]\n" , hero.power);
printf("Speed: [%.2lf]\n" , hero.speed);
printf("Birthday: [%d/%d/%d]\n\n" , hero.birthday.day, hero.birthday.month, hero.birthday.year );
}
void addHero (sp_s arr[], int *k, sp_s newHero){
arr[*k] = newHero;
(*k)++;
printf("\nSuccess! a new superhero is added.\n");
}
void printArrHero (sp_s arr[]){
int j=0;
while ( arr[j] != NULL ){
printf("[#%d]>>>>>>>>>>>>>>>>>>\n" , j+1);
printInfo( arr[j] );
j++;
}
}
void main(){
sp_s myHeros[100];
sp_s newHero;
int i = -1;
int k = 0;
while (i != 0){ // menu loop
printf("Welcome to my game!\n");
printf("To add a hero press 1\n");
printf("To find you're strongest hero press 2\n");
printf("To find you're fastest hero press 3\n");
printf("To see all of you're heroes list 4\n");
printf("To exit press 0\n");
scanf("%d" , &i);
switch (i){
case 0:
break;
case 1:
printf("Please enter the #%d hero characteristics:\nName: " , k+1);
scanf("%s" , &newHero.name);
printf("Power: ");
scanf("%lf" , &newHero.power);
printf("Speed: ");
scanf("%lf" , &newHero.speed);
printf("Birth date [xx/xx/xx](format): ");
scanf("%d/%d/%d" , &newHero.birthday.day, &newHero.birthday.month, &newHero.birthday.year);
addHero(myHeros, &k, newHero); // now when I collecten all the info needed to make a new hero lets send it to the func tht puts it in the #k place in the array
break;
case 2:
break;
case 3:
break;
case 4:
printArrHero(myHeros);
break;
} // END of switch-case
} // while menu loop
} // main
答案 0 :(得分:0)
如果我可以损害我的个人文件(视频,照片,办公室文件等)
Windows程序在当前用户的上下文中运行,并且可以执行当前用户的任何操作。这意味着它可以编辑和删除您的个人文件。
一般来说,对于一个流氓的程序,它需要在其中进行活动。删除文件的程序可以更容易地意外删除文件。 编辑文件的程序可以进行狡猾的编辑。
这不是先决条件,因为一旦它停止在您的设计之外执行,任何事情都可能发生。
如果我可以伤害我的系统?
要使您的系统受到损害,您需要以管理员身份运行。这使程序能够执行管理员可以执行的任何操作,这可能包括对您的计算机造成严重损坏。
还有一个阶段,system
,它可以完全控制机器,而不是管理员。
虽然有可能,但不太可能。现代程序的可能性是在它们破坏文件而不是它们当前打开之前崩溃,但是你可以采取一些措施使损害不太可能或更有限。
如果您的用户拥有重要文件,请考虑切换到其他帐户进行开发。这样可以限制错误程序造成的损害。
确保在关闭用户访问保护的情况下不运行。这限制了您的程序管理机器的能力。
raspberry-pi
或英特尔计算棒提供一个廉价的平台,如果出现问题可以重建。在这种情况下会发生什么?
假设它在循环中陷入困境,没有正确读取数据(可能是scanf()返回0)。
数组被所有100个元素填满,然后开始破坏堆栈。
有两种似是而非的内存布局(windows x86 / x86-64)。
+---------+
| return |
| from |
| main |
+---------+
|hero[99] |
+---------+
|hero[98] |
+---------+
|hero[97] |
+---------+
| ... |
和
+---------+
| return |
| from |
| main |
+---------+
| k |
+---------+
|hero[99] |
+---------+
|hero[98] |
+---------+
|hero[97] |
+---------+
| ... |
在第一种情况下,数组超载,并修改返回地址。正常编译(安全cookie)中内置了代码,可以检测到这一点,结果是在发生坏事之前发生崩溃。
在第二种情况下,变量k的内存被一个数组写入覆盖。然后将k发送到某个怪异的地方,并覆盖随机存储器。这可能会破坏程序数据,但很可能第一次尝试非自然k(0-99之外)会导致崩溃。
可能的失败是你打印出一个控制代码,如哔哔声 - 导致奇怪的行为,并且与你所看到的一致 - 我认为你没有发生任何不好的事。