none
求助:关于用VS2010反汇编C代码,找不到INT 13的问题 RRS feed

  • 问题

  • 我用C里面的文件读写函数写了一个对硬盘读写功能小程序,代码如下:

    /****************************************
    程序功能:读取c:\source.txt文件的内容,
    取其中'#'开头行的内容写入c:\dest.txt中。
    如:source.txt文件内容为如下:
    #jksfjlsd
    12jlkdjfsl
    #jfiejw
    #jkfldsl
    iejfja;fj
    则程序会产生一个dest.txt文件内容如下:
    #jksfjlsd
    #jfiejw
    #jkfldsl
    ****************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main()
    {
        FILE *fp1;
        FILE *fp2;     //申明72个文件指针,一个打开源文件,一个打开目标文件
        char buf[1024];     //申明一个大字符数组,用于保存文件每一个行的内容

        //只读方式打开源文件,这里得用两个反斜杠转义字符
        if( (fp1=fopen("d:\\source.txt","r"))==NULL )//linux "./"
        {
            printf("打开source.txt失败,可能文件还没有创建!");
            exit(0);
        }
        //创建目标文件,这里一般不会发生错误
        if( (fp2=fopen("d:\\test.txt","w"))==NULL )
        {
            printf("创建test.txt失败!");
            fclose(fp1);
            exit(0);
        }

        while(!feof(fp1))       //当文件指针fp1指向文件末尾时,feof返回0,否则返回1,该句作用是只要未到末尾则进入循环
        {
            memset(buf, 0, 1024);       //buf字符串清0
            fgets(buf, 1024, fp1);      //从fp1文件当前指针读取一行内容到buf
            if(buf[0]=='#')             //判断该行的第一个字符是否为'#'
            {
                fputs(buf, fp2);        //是'#',写内容到fp2文件
            }
        }

        fclose(fp1);
        fclose(fp2);        //循环结束,关闭fp1,fp2文件,程序结束

        return 0;
    }

     

    按理说对硬盘进行了读写操作,系统回调用BIOS的相应的INT 13 来完成对硬盘的读写实现,但我反汇编了这段代码后并为找到INT 13 ,求解这是为何啊?

    反汇编的代码如下:

    int main()
    {
    00CC13C0  push        ebp 
    00CC13C1  mov         ebp,esp 
    00CC13C3  sub         esp,4E4h 
    00CC13C9  push        ebx 
    00CC13CA  push        esi 
    00CC13CB  push        edi 
    00CC13CC  lea         edi,[ebp-4E4h] 
    00CC13D2  mov         ecx,139h 
    00CC13D7  mov         eax,0CCCCCCCCh 
    00CC13DC  rep stos    dword ptr es:[edi] 
    00CC13DE  mov         eax,dword ptr [___security_cookie (0CC7000h)] 
    00CC13E3  xor         eax,ebp 
    00CC13E5  mov         dword ptr [ebp-4],eax 
        FILE *fp1;
        FILE *fp2;     //申明72个文件指针,一个打开源文件,一个打开目标文件
        char buf[1024];     //申明一个大字符数组,用于保存文件每一个行的内容

        //只读方式打开源文件,这里得用两个反斜杠转义字符
        if( (fp1=fopen("d:\\source.txt","r"))==NULL )//linux "./"
    00CC13E8  mov         esi,esp 
    00CC13EA  push        offset string "r" (0CC57A8h) 
    00CC13EF  push        offset string "d:\\source.txt" (0CC5798h) 
    00CC13F4  call        dword ptr [__imp__fopen (0CC82C4h)] 
    00CC13FA  add         esp,8 
    00CC13FD  cmp         esi,esp 
    00CC13FF  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
    00CC1404  mov         dword ptr [ebp-0Ch],eax 
    00CC1407  cmp         dword ptr [ebp-0Ch],0 
    00CC140B  jne         main+75h (0CC1435h) 
        {
            printf("打开source.txt失败,可能文件还没有创建!");
    00CC140D  mov         esi,esp 
    00CC140F  push        offset string "\xb4\xf2\xbf\xaasource.txt\xca\xa7\xb0\xdc\xa3\xac\xbf\xc9\xc4\xdc\xce\xc4\xbc\xfe\xbb\xb9\xc3\xbb"... (0CC5768h) 
    00CC1414  call        dword ptr [__imp__printf (0CC82C8h)] 
    00CC141A  add         esp,4 
    00CC141D  cmp         esi,esp 
    00CC141F  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
            exit(0);
    00CC1424  mov         esi,esp 
    00CC1426  push        0 
    00CC1428  call        dword ptr [__imp__exit (0CC82CCh)] 
    00CC142E  cmp         esi,esp 
    00CC1430  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
        }
        //创建目标文件,这里一般不会发生错误
        if( (fp2=fopen("d:\\test.txt","w"))==NULL )
    00CC1435  mov         esi,esp 
    00CC1437  push        offset string "w" (0CC5764h) 
    00CC143C  push        offset string "d:\\test.txt" (0CC5754h) 
    00CC1441  call        dword ptr [__imp__fopen (0CC82C4h)] 
    00CC1447  add         esp,8 
    00CC144A  cmp         esi,esp 
    00CC144C  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
    00CC1451  mov         dword ptr [ebp-18h],eax 
    00CC1454  cmp         dword ptr [ebp-18h],0 
    00CC1458  jne         main+0D8h (0CC1498h) 
        {
            printf("创建test.txt失败!");
    00CC145A  mov         esi,esp 
    00CC145C  push        offset string "\xb4\xb4\xbd\xa8test.txt\xca\xa7\xb0\xdc!" (0CC573Ch) 
    00CC1461  call        dword ptr [__imp__printf (0CC82C8h)] 
    00CC1467  add         esp,4 
    00CC146A  cmp         esi,esp 
    00CC146C  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
            fclose(fp1);
    00CC1471  mov         esi,esp 
    00CC1473  mov         eax,dword ptr [ebp-0Ch] 
    00CC1476  push        eax 
    00CC1477  call        dword ptr [__imp__fclose (0CC82D0h)] 
    00CC147D  add         esp,4 
    00CC1480  cmp         esi,esp 
    00CC1482  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
            exit(0);
    00CC1487  mov         esi,esp 
    00CC1489  push        0 
    00CC148B  call        dword ptr [__imp__exit (0CC82CCh)] 
    00CC1491  cmp         esi,esp 
    00CC1493  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
        }

        while(!feof(fp1))       //当文件指针fp1指向文件末尾时,feof返回0,否则返回1,该句作用是只要未到末尾则进入循环
    00CC1498  mov         esi,esp 
    00CC149A  mov         eax,dword ptr [ebp-0Ch] 
    00CC149D  push        eax 
    00CC149E  call        dword ptr [__imp__feof (0CC82D4h)] 
    00CC14A4  add         esp,4 
    00CC14A7  cmp         esi,esp 
    00CC14A9  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
    00CC14AE  test        eax,eax 
    00CC14B0  jne         main+155h (0CC1515h) 
        {
            memset(buf, 0, 1024);       //buf字符串清0
    00CC14B2  push        400h 
    00CC14B7  push        0 
    00CC14B9  lea         eax,[ebp-420h] 
    00CC14BF  push        eax 
    00CC14C0  call        @ILT+120(_memset) (0CC107Dh) 
    00CC14C5  add         esp,0Ch 
            fgets(buf, 1024, fp1);      //从fp1文件当前指针读取一行内容到buf
    00CC14C8  mov         esi,esp 
    00CC14CA  mov         eax,dword ptr [ebp-0Ch] 
    00CC14CD  push        eax 
    00CC14CE  push        400h 
    00CC14D3  lea         ecx,[ebp-420h] 
    00CC14D9  push        ecx 
    00CC14DA  call        dword ptr [__imp__fgets (0CC82DCh)] 
    00CC14E0  add         esp,0Ch 
    00CC14E3  cmp         esi,esp 
    00CC14E5  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
            if(buf[0]=='#')             //判断该行的第一个字符是否为'#'
    00CC14EA  movsx       eax,byte ptr [ebp-420h] 
    00CC14F1  cmp         eax,23h 
    00CC14F4  jne         main+153h (0CC1513h) 
            {
                fputs(buf, fp2);        //是'#',写内容到fp2文件
    00CC14F6  mov         esi,esp 
    00CC14F8  mov         eax,dword ptr [ebp-18h] 
    00CC14FB  push        eax 
    00CC14FC  lea         ecx,[ebp-420h] 
    00CC1502  push        ecx 
    00CC1503  call        dword ptr [__imp__fputs (0CC82E4h)] 
    00CC1509  add         esp,8 
    00CC150C  cmp         esi,esp 
    00CC150E  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
            }
        }
    00CC1513  jmp         main+0D8h (0CC1498h) 

        fclose(fp1);
    00CC1515  mov         esi,esp 
    00CC1517  mov         eax,dword ptr [ebp-0Ch] 
    00CC151A  push        eax 
    00CC151B  call        dword ptr [__imp__fclose (0CC82D0h)] 
    00CC1521  add         esp,4 
    00CC1524  cmp         esi,esp 
    00CC1526  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 
        fclose(fp2);        //循环结束,关闭fp1,fp2文件,程序结束
    00CC152B  mov         esi,esp 
    00CC152D  mov         eax,dword ptr [ebp-18h] 
    00CC1530  push        eax 
    00CC1531  call        dword ptr [__imp__fclose (0CC82D0h)] 
    00CC1537  add         esp,4 
    00CC153A  cmp         esi,esp 
    00CC153C  call        @ILT+320(__RTC_CheckEsp) (0CC1145h) 

        return 0;
    00CC1541  xor         eax,eax 

     

    2011年10月20日 3:26

全部回复