【问题标题】:C homework - trojan found when compiling the codeC作业——编译代码时发现木马
【发布时间】:2012-11-17 21:32:03
【问题描述】:

我正在编写一些作业(101 级)。当我尝试编译代码时,我从位防御者那里得到了一些病毒警报:

#include <stdio.h>

int main ( void ) {
int numbers [10];
int i, temp;

for (i = 1; i <= 10; ++i)
    numbers[i] = 0;

printf("Enter up to 10 integers. input '-1' to finish \n");

for (i = 0; i < 10; i++) {
    scanf("%d", &temp);
    if (temp == -1) {
        break;
    } else {
        numbers [i] = temp - 1;
    }
}

for (i = 1; i <= 10; ++i)
    printf("the numbers are: %d\n", numbers[i]);

return 0;
}

我认为问题出在这段代码上:

    for (i = 1; i <= 10; ++i)
        numbers[i] = 0;

为什么会出现木马病毒警报?我做了什么?

【问题讨论】:

  • 别以为这和你的功课有关系,你好像有病毒在跑。
  • 哇,如果这真的是因为你的代码,这是一个非常偏执的病毒扫描程序。你正在访问不属于你的应用程序的内存。数组索引从 0 开始。
  • 超出了数组边界,但如果您的病毒扫描程序能够检测到这一点,我会感到非常惊讶。
  • @KerrekSB 我仍然对扫描仪为什么会拾取它感兴趣。更具体地说,为什么它认为缓冲区溢出= Meur.GZ
  • @JanDvorak:注意它是 Heur(用于启发式),而不是 Meur。因此,它通过启发式分析检测通用木马。

标签: c trojan


【解决方案1】:

不要注意一些防病毒程序将编译的项目识别为病毒,它与 Visual Studio 相同,只是将例外添加到您的防病毒列表中。 但是您的代码确实存在一些问题。

  • for (i = 1; i &lt;= 10; ++i) 是不正确的,因为 C 中的数组从 0 开始,其次是初始化你不需要为循环执行的变量,你可以像任何其他变量一样为它们赋值。
  • numbers [i] = temp - 1 将值存储在数组中的方式不太好,因为当您执行 -1 时,您正在更改输入的值。

一个

/*For the array initialization.*/
int numbers[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

/*For inputing the values.*/

for ( i = 0; i < 10; i++ ){
    scanf( "%d", &temp );
    if( temp == -1 ){
        numbers[ i ] = -1;
        break;
    else{
        numbers[ i ] = temp;
    }
}

/*For the printing. */

for( i = 0; i < 10 ; i++ ){
    if( numbers[ i ] == -1 ){
        break;
    }
    printf( "numbers[%d] is %d", i, numbers[ i ] );
}

【讨论】:

  • 所以,如果我输入 10 个有效数字,我将面对一个包含 10 个有效数字的数组。 != -1 多久检查一次打印部分实际上会捕获数组的末尾?
  • if( numbers[ i ] = -1 ) 将始终评估为真。请改用==
【解决方案2】:

您触发了缓冲区溢出。您的数组“数字”有 10 项大,您访问第 11 项。

【讨论】:

    【解决方案3】:

    使用i=0 而不是i =1,因为在C 中,数组索引从0 开始

    数组的大小是 10,所以最后一个索引是 9 所以你正在访问numbers[10]中超出范围的数组索引,所以它是undefined behaviour

    数组是这样的:

    numbers[0] ,numbers[1], . . . numbers[9]

    修改代码为:

    for(i=0;i<10;i++)
      printf("%d\t",numbers[i]);
    

    【讨论】:

    • 只要他留在数组的边界内:他从哪里开始或结束都没有问题。
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多