最近我在*NIX操作系统中使用了很多汇编语言.我想知道Windows域名.
在linux中调用约定:
mov $SYS_Call_NUM, %eax
mov $param1 , %ebx
mov $param2 , %ecx
int $0x80
Run Code Online (Sandbox Code Playgroud)
而已.这就是我们应该如何在linux中进行系统调用.
在linux中引用所有系统调用:
关于哪个$ SYS_Call_NUM以及哪些参数我们可以使用这个参考:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
官方参考:http://kernel.org/doc/man-pages/online/dir_section_2.html
在Windows中调用约定:
???
Windows中所有系统调用的引用:
???
非官方:http://www.metasploit.com/users/opcode/syscalls.html,但除非我知道调用约定,否则如何在汇编中使用它们.
官方:???
现在,与所谓的Native API有什么关系?是Native API和System calls for windows两者都是指同一件事的不同术语吗?为了证实我将这些来自两个非官方来源进行了比较
系统调用:http://www.metasploit.com/users/opcode/syscalls.html
Native API:http://undocumented.ntinternals.net/aindex.html
我的观察:
Nt其中Native API由许多不以字母开头的函数组成Nt.System Call of windows是.的子集Native API.系统调用只是Native API的一部分.任何人都可以证实并解释.
编辑:
还有另一个答案.这是第二个答案.我真的很喜欢它,但我不知道为什么回答者已删除它.我请他转发他的答案.
NT有一个大多数未记录的API,称为"Native API",在其上实现了公共子系统(即Windows API,OS/2 API和POSIX(现在通常称为" Interix ")子系统).
存在一些试图记录此API的书籍和网站:
不幸的是,没有一本书或网站,我可以尝试触摸64位版本的Windows(当然除了WDK,但WDK是有限的....).API调用本身是相同的 - 最大的问题与结构定义本身有关.即 - 指针值和DWORD在32位平台上的大小相同,但在x64平台上不同.因此,在x64窗口上,通常被定义为DWORD数组的结构的"未知填充"位是错误的 - 结果是完全垃圾.
我通过每次API调用手动添加额外的填充来手动处理这些事情,但是这真的令人沮丧,并且有一个资源只是记录这些事情以便他们正确使用会很好指针而不是DWORD(如果需要),因此单个结构定义可以同时用于32位和64位Windows.
这样的资源是否存在?
在Native API中,Microsoft导出每个api调用的两个版本,一个以Zw为前缀,另一个以Nt为前缀,例如.ZwCreateThread和NtCreateThread.
我的问题是这两个版本的调用之间有什么区别,以及何时以及为什么应该只使用Zw或Nt?据我所知,Zw版本确保调用者驻留在内核模式,而Nt则不然.
我也想知道Zw和Nt前缀/缩写的具体含义?可以猜测Nt可能是指NT(新技术)Windows系列或Native(可能不是)?至于Zw,它代表什么?
我想用C++从用户模式调用一些Native API函数.我想知道是否可以完全绕过Windows API接口并从用户模式直接调用Native API函数.
如果可能,那么任何代码示例都会非常有用.
显然,EASEUS Partition Master程序可以在Windows GUI启动之前显示图形 (即,它在启动时CheckDisk运行的同时运行).
我所知道的:
这可能需要没有很好记录的功能.这对我来说没问题.
我已经知道如何编译本机NT可执行文件,因此可以从响应中省略它.
问题:
如何在一切启动之前显示图形?(即你使用什么功能/库?)
它如何在屏幕上显示格式化和对齐的文本?
我知道NtDisplayString能够写文本,但它无法以格式化的方式绘制内容,如下所示.您使用什么功能来复制下面的行为?

有没有办法列出Win32 Device Namespaces(UNC路径前缀:) \\.\和Win32 File Namespaces(UNC路径前缀:)的内容\\?\?
目标是使应用程序适合作为命令行(1)工具,可以使用UNC(通用命名约定)进行导航.是否已经为此编写了工具?我知道WinObj,但这不是开源和GUI工具.
同样,如何列出哪些命名空间可用NT namespace?
是否有处理这些问题的Windows API调用? 更新2 WinApi不适用于此,NT Native API正如Hans Passant和Roger Lipscombe的评论中所指出的那样
.
更新1如果它们没有被winapi暴露,WinObj如何列出它们?
参考:http: //msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#paths
(1):Win32控制台
我编写了一个简单的(测试)脚本来列出所选目录中的文件.不使用FindFirstFile; 只有原生API.当我执行脚本并观察时,Win32API监视器告诉我STATUS_SUCCESS.我的文件信息缓冲区c_buffer(1024)不是使用Unicode缓冲区来查看原始数据.
所以电话结束后NtQueryDirectoryFile一切都好.当我c_buffer以原始模式写入控制台以查看目录中的文件时,输出不是结构化的.我创建了一个FILE_DIRECTORY_INFORMATION结构,但它不能用于Windows 7 X86,或者我的代码中存在问题.
我的问题:请告诉我在Windows 7 X86或任何变种上使用哪种FILE_DIRECTORY_INFORMATION结构
from ctypes import *
hFile = windll.kernel32.CreateFileW("C:\\a",0x80000000,0,0,3,0x02000000,0)
class Info(Union):
_fields_ = [('STATUS',c_long),
('Pointer',c_ulong),]
class io_stat(Structure):
_fields_ = [('Stat',Info),
('Information',c_ulong),]
class FILE_OBJECT(Structure):
_fields_ = [('Next',c_ulong),
('FileIndex',c_ulong),
('ctime',c_longlong),
('lat',c_longlong),
('wtime',c_longlong),
('ch',c_longlong),
('Endogfile',c_longlong),
('allo',c_longlong),
('Fileattr',c_ulong),
('Filenalen',c_ulong),
('Filename',c_wchar * 2),]
b = io_stat()
a = c_buffer(1024)
windll.ntdll.NtQueryDirectoryFile(hFile,0,0,0,byref(b),byref(a),sizeof(a), 1,0,None,0)
print(a.raw)
Run Code Online (Sandbox Code Playgroud)
没有优化.
我对Windows Native API很好奇.我一直在网上搜索,但未能找到从用户模式调用Native API函数的示例.我相信我对这需要有一个基本的把握 - 具体来说,我必须在我的程序中定义常量和本机API函数,并使用GetProcAddress在ntdll.dll中查找函数,然后调用该函数.
这是正确的,任何人都可以引导我朝着正确的方向前进吗?示例代码将成为我的一天,因为我完全没有找到它.
我在这里遇到了这个代码(http://www.eggheadcafe.com/software/aspnet/31520494/native-application--ntc.aspx),但在我看来它打算在内核模式下运行:
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING szPath = {0};
OBJECT_ATTRIBUTES Attr = {0};
IO_STATUS_BLOCK IoStatusBlock = {0};
HANDLE hBeep = 0;
RtlInitUnicodeString(&szPath, L"\\??\\C:\\A.TXT");
InitializeObjectAttributes(&Attr, &szPath, 0, NULL, NULL);
ntStatus = NtCreateFile(&hBeep, GENERIC_READ, &Attr, &IoStatusBlock, NULL,
0, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0);
if (hBeep != NULL)
{
NtClose(ntStatus);
Run Code Online (Sandbox Code Playgroud)
如何修改此代码以在用户模式下运行?我正在用c ++工作,你可能已经猜到了这一点.
提前致谢.
我试图制作一个程序,通过进程 ID 获取进程的命令行。我使用 eclipse c++ 和 mingw 编译器
所以我找到了一个教程如何做到这一点,它需要ntstatus就像我包含的教程中那样#include <ntstatus.h>
我添加了代码的第一部分:
typedef NTSTATUS (NTAPI *_NtQueryInformationProcess)(
HANDLE ProcessHandle,
DWORD ProcessInformationClass,
PVOID ProcessInformation,
DWORD ProcessInformationLength,
PDWORD ReturnLength
);
Run Code Online (Sandbox Code Playgroud)
我发现这 3 个错误:
expected primary-expression before '__attribute__
Type 'NTSTATUS' could not be resolved
typedef 'NTSTATUS' is initialized (use decltype instead)
Run Code Online (Sandbox Code Playgroud)
在这一行:typedef NTSTATUS (NTAPI *_NtQueryInformationProcess)(
我用谷歌搜索了这个问题,但我找不到它......
我没有收到关于NT进程,因为我使用他们正在返回像值的本地APIs.Since概念STATUS_TIMEOUT,STATUS_PENDINGetc.What不STATUS_PENDING究竟意味着什么?
我的代码是这样的.
NTSTATUS rc;
rc = NtReadFile(
Keybrds[iLoop].hKeyboard,
Keybrds[iLoop].hEvent,
NULL,
NULL,
&IoStatusBlock,
&KbData,
sizeof(KEYBOARD_INPUT_DATA),
&ByteOffset,
NULL
);
Run Code Online (Sandbox Code Playgroud)
在这里,NtReadFile()回归STATUS_PENDING,这意味着什么?
有没有人设法弄清楚NtQueryDirectoryFile的异步调用是如何工作的?
通过异步调用,我的意思是调用未使用FILE_SYNCHRONOUS_IO_ALERT或FILE_SYNCHRONOUS_IO_NONALERT打开的NtQueryDirectoryFile目录.
对我来说,它似乎STATUS_PENDING像普通的NtReadFile请求一样返回普通文件,但是当我尝试在目录上使用NtWaitForSingleObject时,它没有正确结束,我仍然没有获得所有数据...为什么这会发生吗?
我正在通过挂钩内存API来实现内存管理工具,当我来到NtAllocateVirtualMemoryEx时,我试图在谷歌上找到它的定义,但什么也没找到,但是NtAllocateVirtualMemory在https://learn.microsoft.com/en-us上有明确的定义/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntallocatevirtualmemory,有人知道其详细信息吗?