首页
社区
课程
招聘
[旧帖] [求助]来帮我看串简单的代码 0.00雪花
发表于: 2009-4-27 09:28 3568

[旧帖] [求助]来帮我看串简单的代码 0.00雪花

2009-4-27 09:28
3568
#include <stdio.h>

main( )
{
   FILE  *fp ;
   
   fp = fopen( "a.txt","r" ) ;
   while( !feof(fp) )
      putchar( getc(fp) );
   getch( );
}   
   


00401298  /$  55            push    ebp
00401299  |.  89E5          mov     ebp, esp
0040129B  |.  83EC 18       sub     esp, 18
0040129E  |.  83E4 F0       and     esp, FFFFFFF0
004012A1  |.  B8 00000000   mov     eax, 0
004012A6  |.  8945 F8       mov     dword ptr [ebp-8], eax
004012A9  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
004012AC  |.  E8 AF040000   call    <alloca>
004012B1  |.  E8 1A010000   call    <main>
004012B6  |.  C74424 04 901>mov     dword ptr [esp+4], 00401290      ; |r
004012BE  |.  C70424 921240>mov     dword ptr [esp], 00401292        ; |a.txt
004012C5  |.  E8 66050000   call    <jmp.&msvcrt.fopen>              ; \fopen
004012CA  |.  8945 FC       mov     dword ptr [ebp-4], eax
[COLOR="Red"]004012CD  |>  8B45 FC       /mov     eax, dword ptr [ebp-4]
004012D0  |.  8B40 0C       |mov     eax, dword ptr [eax+C]
004012D3  |.  83E0 10       |and     eax, 10
004012D6  |.  85C0          |test    eax, eax
004012D8  |.  74 02         |je      short 004012DC
004012DA  |.  EB 15         |jmp     short 004012F1[/COLOR]
004012DC  |>  8B45 FC       |mov     eax, dword ptr [ebp-4]          ; ||
004012DF  |.  890424        |mov     dword ptr [esp], eax            ; ||
004012E2  |.  E8 29050000   |call    <jmp.&msvcrt.getc>              ; |\getc
004012E7  |.  890424        |mov     dword ptr [esp], eax            ; |
004012EA  |.  E8 31050000   |call    <jmp.&msvcrt.putchar>           ; \putchar
004012EF  |.^ EB DC         \jmp     short 004012CD
004012F1  |>  E8 9A040000   call    <jmp.&msvcrt._getch>             ; [_getch
004012F6  |.  C9            leave
004012F7  \.  C3            retn



我是用Dev-C编译的,代码都是简单易懂

看红色部分,很明显就是!feof(fp)这句了

我看了下头文件,实在没理解这句汇编干什么用.为什么决定字符串是否结束的是eax+C这个地址呢

所以来求教

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
004012C5  |.  E8 66050000   call    <jmp.&msvcrt.fopen>              ; \fopen
004012CA  |.  8945 FC       mov     dword ptr [ebp-4], eax
004012CD  |>  8B45 FC       /mov     eax, dword ptr [ebp-4]
004012D0  |.  8B40 0C       |mov     eax, dword ptr [eax+C]
004012D3  |.  83E0 10       |and     eax, 10
004012D6  |.  85C0          |test    eax, eax

我认为是\fopen这里就已经把feof(fp)置好了
004012D0  |.  8B40 0C       |mov     eax, dword ptr [eax+C]
004012D3  |.  83E0 10       |and     eax, 10
004012D6  |.  85C0          |test    eax, eax
只是取出来实现 while( !feof(fp) )
2009-4-27 10:26
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
3
struct _iobuf {
        char *_ptr; // OFFSET + 0
        int   _cnt;  // OFFSET + 4
        char *_base;  // OFFSET + 8
        int   _flag;  // OFFSET + C
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

int __cdecl feof (
        FILE *stream
        )
{
        _VALIDATE_RETURN((stream != NULL),EINVAL, 0);
        return( ((stream)->_flag & _IOEOF) );
}
2009-4-27 12:07
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#define _IOEOF          0x0010
2009-4-27 12:31
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
通俗易懂啊,麻烦你了()
2009-4-27 12:32
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
其实EOF的值就是0x0010
2009-4-28 10:31
0
游客
登录 | 注册 方可回帖
返回
//