以NtDeviceIoControlFile(IOCTL_AFD_SEND)为例:
当WS2_32.send 向socket发送消息时,实际调用
NtDeviceIoControlFile(IOCTL_AFD_SEND)
NtDeviceIoControlFile 的 InputBuffer指向结构_AFD_SEND_INFO ;
在结构_AFD_SEND_INFO 有一指针,
当32位进程send时,此指针长4,
当64位进程send时,此指针长8,
请教,内核是如何知道此指针长度的?
Ps: 似乎不是看进程是32位,还是64位的问题,
我在内核中模拟API: IsWow64Process
即ZwQueryInformationProcess(-1, ProcessWow64Information, ...)
总是返回是64位
PPs: 似乎不是看进程是32位,还是64位的 2,
因为在进程的内核执行中,调用其它内核64位程序,还是还64位方式的
PPPs:是根据 FileHandle 查出来的吗?
typedef struct _AFD_SEND_INFO {
PAFD_WSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags;
} AFD_SEND_INFO , *PAFD_SEND_INFO ;
typedef struct _AFD_WSABUF {
UINT len;
PCHAR buf;
} AFD_WSABUF, *PAFD_WSABUF;
typedef NTSTATUS (_stdcall* _NtDeviceIoControlFile)(
IN HANDLE FileHandle,
IN OPTIONAL HANDLE Event,
IN OPTIONAL PIO_APC_ROUTINE ApcRoutine,
IN OPTIONAL PVOID ApcContext,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN OPTIONAL PVOID InputBuffer,
IN ULONG InputBufferLength,
OUT OPTIONAL PVOID OutputBuffer,
IN ULONG OutputBufferLength
);
感谢layerfsd , 问题解决,直接IoIs32bitProcess(null), 即可
[课程]FART 脱壳王!加量不加价!FART作者讲授!