首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

NtCreateFile DATATYPE_MISALIGNMENT(80000002h)有别的可能吗解决办法

2013-01-25 
NtCreateFile DATATYPE_MISALIGNMENT(80000002h)有别的可能吗在写个小壳,遇到了点麻烦。壳段代码里,用堆栈

NtCreateFile DATATYPE_MISALIGNMENT(80000002h)有别的可能吗
在写个小壳,遇到了点麻烦。

壳段代码里,用堆栈存储的IO_STATUS_BLOCK、OBJECT_ATTRIBUTES、UNICODE_STRING三个结构体,为什么数据还会对不齐:

lea eax,[ebp+FilePath]                      ;ebp是重定位,[ebp+FilePath]指向欲打开的文件路径
push eax
call _GetStrLenW                            ;自编过程,获取字串长度,字串长度返回于eax
push 0
mov edi,esp                                 ;待用于存储NtCreateFile返回的句柄
lea ebx,[ebp+FilePath]
push ebx                                    ;构造UNICODE_STRING结构体
push ax
ror eax,10h
pop ax
add ax,2
push eax
mov ebx,esp
push 0                                      ;构造OBJECT_ATTRIBUTES结构体
push 0
push OBJ_CASE_INSENSITIVE+OBJ_KERNEL_HANDLE
push ebx
push 0
push 18h
mov ebx,esp
push 0                                      ;构造IO_STATUS_BLOCK结构体
push 0
mov ecx,esp
push 0                                                    ;EaLength
push 0                                                    ;EaBuffer
push FILE_NON_DIRECTORY_FILE+FILE_SYNCHRONOUS_IO_NONALERT ;CreateOptions
push FILE_OPEN                                            ;CreateDisposition
push FILE_SHARE_READ                                      ;ShareAccess
push 0                                                    ;FileAttributes
push 0                                                    ;AllocationSize
push ecx                                                  ;指向IO_STATUS_BLOCK结构体


push ebx                                                  ;指向OBJECT_ATTRIBUTES结构体
push SYNCHRONIZE + FILE_READ_DATA                         ;DesiredAccess
push edi                                                  ;指向存储返回句柄的地址
call [ebp+_NtCreateFile]
mov eax,[edi]                                ;将获得的句柄传入eax

结果执行完NtCreateFile后,eax返回值0x80000002,即STATUS_DATATYPE_MISALIGNMENT。

因为是在壳代码里,align不起作用,存在重定位问题,于是我想到用堆栈存储结构体,居然还返回我80000002h,想死了……

难道Windows觉得堆栈里的地址不是4的倍数吗?!!!

是不是和它是壳段代码有联系?
[解决办法]
dword 格式的 0038003A ?看你上面的算法,这两个长度域不还是反的吗?在内存里的字节排列顺序应该是:
0013FFB8  38 00 3a 00 00 30 01 00
0xC0000033 就是认为文件名不对,文件名域处的内容正确的话,就是长度域是错误的了。

热点排行