我是否可以使用Visual Studio 2012意外损坏系统文件或个人文件

时间:2016-05-01 19:46:15

标签: c visual-studio visual-studio-2012 structure infinite-loop

我为此事缺乏知识而道歉,但这对我来说非常重要,所以至少我会试一试。 我在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

1 个答案:

答案 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之外)会导致崩溃。

可能的失败是你打印出一个控制代码,如哔哔声 - 导致奇怪的行为,并且与你所看到的一致 - 我认为你没有发生任何不好的事。