首页
社区
课程
招聘
[求助]发送文件
发表于: 2007-5-10 21:50 5157

[求助]发送文件

2007-5-10 21:50
5157
szBuff db "test",0

.
.
invoke send,hSocket,addr szBuff,4,0
.

利用send来发送文本数据,是这样,但是如果发送一个文件,比如发送一个exe文件,改怎么解决?

我是这样想:把文件映射到内存,然后分配一块内存来保存这个文件,之后发送出去.

代码:

      invoke  CreateFile,CTXT("c:\test.exe"),GENERIC_READ,\ ;打开文件
                            FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
                            OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
                    .if    eax !=  INVALID_HANDLE_VALUE
                            mov    hFile,eax
                            invoke  GetFileSize,eax,NULL ;获取其长度
                            mov    @dwFileSize,eax
                            .if    eax
                          invoke  CreateFileMapping,hFile,\ ;创建一个内存映射
                                    NULL,PAGE_READONLY,0,0,NULL
                            .if    eax
                                    mov    @hMapFile,eax
                                    invoke  MapViewOfFile,eax,\ ;把文件读进内存中
                                            FILE_MAP_READ,0,0,0
                                    .if    eax
                                            mov    @lpMemory,eax
                invoke LocalAlloc, LPTR, 10000000
                     mov hMemory1, eax
                     invoke lstrcpy,hMemory1,@lpMemory
                     invoke lstrlen,hMemory1
                        invoke        send,hSocket,hMemory1,eax,0
                        .if        eax ==        SOCKET_ERROR
                                invoke        WSAGetLastError
                                .if        eax == WSAEWOULDBLOCK
                                        invoke        EnableWindow,hWinOK,FALSE
                                .endif
                        .endif

                invoke  UnmapViewOfFile,@lpMemory
                .endif
                invoke CloseHandle,@hMapFile
                .endif
                invoke CloseHandle,hFile
                .endif
                .endif

经过我的测试,发送过去保存为exe文件后,仅仅看到 MZ这个文本,其他的数据均没看到.

求大大们解个经。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
2
感觉好像问题是
         
invoke lstrcpy,hMemory1,@lpMemory
invoke lstrlen,hMemory1
引起的
你不妨测试一下invoke  send,hSocket,hMemory1,eax,0 中的参数eax的值
2007-5-10 22:38
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3


已经测试,结果还是一样

传文本文件就可以,但是传其他文件就不行了.
2007-5-11 00:44
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
其他文件里有特殊字符的,比如0x00
The lstrcpy function copies a string to a buffer,a string only!

try this:
mov ecx,@dwFileSize
mov edi,hMemory1
mov esi,,@lpMemory
rep movsb
etc...
2007-5-11 03:20
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
5
文本文件和二进制文件是有分别的,文本文件中字符0表示30h,二进制文件0就是0h(跟字符串结束标志'\0'是一样的),你把二进制文件读到内存然后用lstrcpy复制,你的lstrcpy当判断到了字符串结束标志便会停止复制的。
不知你是怎么测试的,你的invoke send,hSocket,hMemory1,eax,0 中的参数eax的值 难道会等于@dwFileSize ?????
2007-5-11 08:47
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
6
invoke send,hSocket,hMemory1,eax,0 中的参数eax的值,是 invoke lstrlen,hMemory1的返回值嘛,才刚改过来。

我用4楼的代码测试看看。
2007-5-11 10:48
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7


4楼的代码也不行哦.

继续等待支招
2007-5-12 12:52
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
8
你想想别的办法,非得用lstrcpy吗,用movsb也可以移动你的数据
2007-5-12 19:46
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
9
RtlMoveMemory  
2007-5-12 21:17
0
游客
登录 | 注册 方可回帖
返回
//