下面汇编函数里的两条语句会不会内存越界

joshua0137 2012-06-22 06:32:59
对下面的
invoke RtlZeroMemory, addr @bufTemp1, 10
invoke RtlZeroMemory, addr @bufTemp2, 20
两行代码有疑问,里面的10和20是怎么来的,回不内存越界?



_openFile proc

local @stOF: OPENFILENAME
local @hFile, @hMapFile
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
local @dwCount; 计数,逢16则重新计
local @dwCount1; 地址顺号
local @dwBlanks; 最后一行空格数

invoke RtlZeroMemory, addr @stOF, sizeof @stOF
mov @stOF.lStructSize, sizeof @stOF
push hWinMain
pop @stOF.hwndOwner
mov @stOF.lpstrFilter, offset szExePe
mov @stOF.lpstrFile, offset szFileName
mov @stOF.nMaxFile, MAX_PATH
mov @stOF.Flags, OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
invoke GetOpenFileName, addr @stOF; 让用户选择打开的文件
.if !eax
jmp @F
.endif
invoke CreateFile, addr szFileName, 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 totalSize, 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 ;获得文件在内存的映像起始位置
assume fs:nothing
push ebp
push offset _ErrFormat
push offset _Handler
push fs:[0]
mov fs:[0], esp

; 开始处理文件
; 缓冲去初始化
invoke RtlZeroMemory, addr @bufTemp1, 10
invoke RtlZeroMemory, addr @bufTemp2, 20
invoke RtlZeroMemory, addr lpServicesBuffer, 100
invoke RtlZeroMemory, addr bufDisplay, 50

mov @dwCount, 1
mov esi, lpMemory
mov edi, offset bufDisplay

;将第一列写入lpServicesBuffer
mov @dwCount1,0
invoke wsprintf, addr @bufTemp2, addr lpszFilterFmt4, @dwCount1
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp2

;求最后一行的空格数(16-长度%16)*3
xor edx, edx
mov eax, totalSize
mov ecx, 16
div ecx
mov eax, 16
sub eax, edx
xor edx, edx
mov ecx, 3
mul ecx
mov @dwBlanks, eax

.while TRUE
.if totalSize == 0; 最后一行
;填充空格
.while TRUE
.break .if @dwBlanks == 0
invoke lstrcat, addr lpServicesBuffer, addr lpszBlank
dec @dwBlanks
.endw
;第二列和第三列中间的空格
invoke lstrcat, addr lpServicesBuffer, addr lpszManyBlanks
;第三列的内容
invoke lstrcat, addr lpServicesBuffer, addr bufDisplay
;回车换行符号
invoke lstrcat, addr lpServicesBuffer, addr lpszReturn
.break
.endif
; 将alf翻译成可以显示的ascii码字符,注意不要破坏al的值
mov al, byte ptr [esi]
.if al > 20h && al < 7eh
mov ah, al
.else ;如果不ASCII码值,则显示‘.’
mov ah, 2Eh
.endif
;写入第三列的值
mov byte ptr [edi], ah
;win2k不支持al字节级别,经常导致程序无故结束,
;因此用以下方法替代
;invoke wsprintf,addr @bufTemp1,addr lpszFilterFmt3,al

mov bl, al
xor edx, edx
xor eax, eax
mov al, bl
mov cx, 16
div cx; 结果放在al中,余数在dl中

;组合字节的十六进制字符串到@bfuTemp1中。类似与 "7F\0"
push edi
xor bx, bx
mov bl, al
movzx edi,bx
mov bl, byte ptr lpszHexArr[edi]
mov byte ptr @bufTemp1[0], bl

xor bx, bx
mov bl, dl
movzx edi, bx
mov bl, byte ptr lpszHexArr[edi]
mov byte ptr @bufTemp1[1], bl
mov bl, 20h
mov byte ptr @bufTemp1[2],bl
mov bl, 0
mov byte ptr @bufTemp1[3], bl
pop edi

;将第2列写入lpServicesBuffer
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp1
.if @dwCount == 16; 已到16个字节
;第二列和第三列中间的空格
invoke lstrcat, addr lpServicesBuffer, addr lpszManyBlanks
;显示第三列字符
invoke lstrcat, addr lpServicesBuffer, addr bufDisplay
;回车换行
invoke lstrcat, addr lpServicesBuffer, addr lpszReturn

;写入内容
invoke _appendInfo, addr lpServicesBuffer
invoke RtlZeroMemory, addr lpServicesBuffer, 100

.break .if dwStop == 1

;显示下一行的地址
inc @dwCount1
invoke wsprintf, addr @bufTemp2, addr lpszFilterFmt4, @dwCount1
invoke lstrcat, addr lpServicesBuffer, addr @bufTemp2
dec @dwCount1

mov @dwCount, 0
invoke RtlZeroMemory, addr bufDisplay, 50
mov edi, offset bufDisplay
;为了能和后面的inc edi配合使edi正确定位到bufDisplay处
dec edi
.endif

dec totalSize
inc @dwCount
inc esi
inc edi
inc @dwCount1
.endw

;添加最后一行
invoke _appendInfo, addr lpServicesBuffer

;处理文件结束
jmp _ErrorExit
_ErrFormat:
invoke MessageBox, hWinMain, offset szErrFormat, NULL, MB_OK
_ErrorExit:
pop fs:[0]
add esp, 0ch
invoke UnmapViewOfFile, lpMemory
.endif
invoke CloseHandle, @hMapFile
.endif
invoke CloseHandle, @hFile
.endif
.endif
@@:
ret

_openFile endp
...全文
83 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
haoyeren 2013-03-05
我也有跟楼主同样的疑问,我在网上百度,搜到这个帖子了。不知道这个问题有定论了没有,我目前还没有进行反汇编调试,没有去看这个初始化会造成多大的影响,为什么执行的时候,对运行没有影响。而且我昨天也向作者发了邮件了,不知道能否得到作者的回复。我今天晚上进行反汇编,调试一下程序,看一下为什么没有对运行造成影响,按理说,这个初始化是不对的。
回复
haoyeren 2013-03-05
我昨天给作者发邮件,没有收到回复,今天进行反汇编调试了一下,这两个变量@bufTemp1与@bufTemp2使用上,确实是有问题的,虽然也造成了一定的影响,但可能影响不是那么大,或是说,简单的操作,造成的影响并不能发现,具体情况说明如下: 经过我的反汇编,发现@stOF地址为EBP-4C,@hFile地址为EBP-50,@hMapFile地址为EBP-54,@bufTemp1地址为EBP-58,@bufTemp2地址为EBP-5B,对@bufTemp1按10个字节进行清零操作,会破坏掉变量@stOF的部分数据,以及@hFile与@hMapFile的全部数据。虽然变量@stOF在使用完了以后,就再也没有被使用了,不会造成什么影响,但是@hFile与@hMapFile可确是有用的,这个操作,会造成后面的CloseHandle传进去的句柄值不对,那么相应的资源就没办法被正常释放了。经过跟踪,发现错误的句柄值造成了CloseHandle的返回值为0,MSDN上查到,这个返回值为0,就表示有错误发生了,呵呵。 然后我按上面ProgrammingRing兄弟的方法,修改了程序,然后进行跟踪,发现CloseHandle的返回值为1了,MSDN上说只要是非零的值,就是成功了,呵呵,所以说,原来程序的写法,还是有问题的。我在想,如果不停地打开不同的文件,会不会造成占用的文件资源不被释放呢?不过这里是用线程在操作的,是不是线程退出,系统会回收资源,也不会造成什么问题呢,呵呵,这个就不做深入研究了,继续看Windows PE后面的内容
回复
sjjwind 2012-08-02
我也在看这本书,请问你的_appendInfo这个是怎么写的,我对RichEdit这个控件不是很熟悉,自己写的有错误
回复
WJN92 2012-07-02
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte


我先试一下,这个代码是随书代码,编译运行似乎没遇到问题,不得其解
[/Quote]
这个好象是从栈分配内存的,可能这只是一个指针.你输出LIST看看
回复
joshua0137 2012-06-29
[Quote=引用 1 楼 的回复:]
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte
[/Quote]

我先试一下,这个代码是随书代码,编译运行似乎没遇到问题,不得其解
回复
ProgrammingRing 2012-06-23
local @bufTemp1; 十六进制字节码
local @bufTemp2; 第一列
有问题吧,这两个只是申请了连个dword的局部变量啊,是不是应该是
local @bufTemp1[10]:byte
local @bufTemp2[20]:byte
回复
发动态
发帖子
汇编语言
创建于2007-08-27

2.0w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
申请成为版主
社区公告
暂无公告