首页
社区
课程
招聘
[求助]这两个fopen函数的返回值为什么不同?
发表于: 2007-8-9 21:06 11086

[求助]这两个fopen函数的返回值为什么不同?

2007-8-9 21:06
11086
FILE* stream;
stream = fopen( "c:\\test.exe", "wb" ); //这里fopen返回的 0x00424AF8

我把以上改成内联汇编
FILE* stream;
char arg1[]= "c:\\test.exe";
char arg2[] = "wb";
LoadLibrary("msvcrt.dll");
__asm{

        lea eax, arg2
        push eax
        lea eax, arg1
        push eax
               
        mov eax, 0x77c0f010 // fopen 在msvcrt中的地址
        call eax
               
        mov stream, eax //这里返回值为0x77C0F010。。。请问为什么会不同?
        add esp, 8
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
2
fopen 的返回值是一个结构指针,其内存是在堆中的动态分配的。值每次都可能都不同
2007-8-9 21:40
0
雪    币: 0
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
但是汇编形式的fopen有问题,后面用fwrite往文件写入数据,文件大小还是为0,而第一种形式就没问题

我估计是这样,这两个fopen是不同的函数,
stream = fopen( "c:\\update.exe", "wb" ); 并没有load msvcrt.dll
而第二个fopen是用的msvcrt.dll里的,那么第一个fopen是怎么来的呢
我用od看了下fopen( "c:\\test.exe", "wb" );

004010E3  |.  68 10304200   push    00423010          ; /mode = "wb"
004010E8  |.  68 80204200   push    00422080          ; |path = "c:\test.exe"
004010ED  |.  E8 BE010000   call    fopen             ; \fopen
下面提示 4012B0=fopen, 并不是0x77c0f010
2007-8-9 23:12
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
C带有两个运行库,一个是静态的,一个是动态的,第一个你使用的是静态库中的函数。
你的第二个函数不成功的原因我想可能是你那个硬编码出现的错误,函数最好不要使用硬编码,最好使用GetProcAddress获取再call。
2007-8-10 09:08
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
fopen返回的是一个文件结构体的指针,每次都是动态分配的,所以内容不一样
2007-8-10 09:25
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
测试了一下,静态库函数返回的地址和动态库函数返回的地址不能通用,静态库函数返回的地址只能使用静态库函数fwrite操作,动态库函数返回的地址只能通过动态库函数的fwrite操作。操成这个原因可能是因为像这些fopen等函数内部使用了某些全局的变量,所以静态库的函数不能和动态库的函数混合使用。
2007-8-10 10:38
0
雪    币: 0
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
原来如此,感谢~
2007-8-10 13:29
0
游客
登录 | 注册 方可回帖
返回