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 就是认为文件名不对,文件名域处的内容正确的话,就是长度域是错误的了。