用户态轻松调用ntdll中的native api收藏

用户态轻松调用ntdll中的native api ntdll中的native api功能非常强大,然而微软却没有提供用户态调用native api的接口,而这些native api所需要的数据结构微软也基本没有公布,幸好有了一批牛人的贡献,给出了很多native api的定义,让我们的生活免去了许多痛苦,本文在介绍了最基本的native api的调用方式之外,还介绍了一种更加优美,移植性更强的调用方式 调用方式一(一般方式):第一步: 阅读详情
 

ntdll中的native api功能非常强大,然而微软却没有提供用户态调用native api的接口,而这些native api所需要的数据结构微软也基本没有公布,幸好有了一批牛人的贡献,给出了很多native api的定义,让我们的生活免去了许多痛苦,本文在介绍了最基本的native api的调用方式之外,还介绍了一种更加优美,移植性更强的调用方式

 

调用方式一(一般方式):

第一步:声明函数指针
             比如我们需要调用NtCreateFile函数,那么我们就需要根据NtCreateFile的定义来声明一个相同类型的函数指针(这样做会让编译器比较高兴)

typedef NTSTATUS ( *  MyNtCreateFile) (
                      OUT PHANDLE             FileHandle,
                      IN ACCESS_MASK          DesiredAccess,
                      IN POBJECT_ATTRIBUTES   ObjectAttributes,
                      
// OUT PIO_STATUS_BLOCK    IoStatusBlock,
                      OUT PVOID    IoStatusBlock,
                      IN PLARGE_INTEGER       AllocationSize OPTIONAL,
                      IN ULONG                FileAttributes,
                      IN ULONG                ShareAccess,
                      IN ULONG                CreateDisposition,
                      IN ULONG                CreateOptions,
                      IN PVOID                EaBuffer OPTIONAL,
                      IN ULONG                EaLength 
                     );
    MyNtCreateFile MyNtCreateFileFun;

第二步: 获取native api在natdll中的地址

MyNtCreateFileFun =  (MyNtCreateFile)GetProcAddress (GetModuleHandle( " ntdll.dll " ),  " NtCreateFile " ); 

第三步: 调用native api完成功能

其实这也不算复杂,然而每次在程序移植的时候让我非常的郁闷,每次都要去定义声明函数指针,每次都要在代码中出现获取指定native api地址的代码,又烦又乱,后来终于在<Undocumented Windows 2000 Secrets>中找到了一个更加有可移植性的方法

 

调用方式二(仍然以NtCreateFile来举例):

第一步:添加ntdll.lib到工程中,(在工程设置里面添加或者加上 #pragma comment(lib,"ntdll.lib") ),ntdll.lib在安装了DDK之后就可以找到

第二步:声明指定native api
            我将native api的定义放在了统一的头文件中,以后可以不断的丰富该文件,将来工作量会不断的减小,在使用的时候将该头文件包含进来即可

/*
    NativeApiDef.h
    define the Native Api
*/


#ifndef GALIHOO_NATIVE_API_DEF
#define  GALIHOO_NATIVE_API_DEF


#pragma  once


#ifdef __cplusplus
extern   " C "   {
#endif


typedef LONG NTSTATUS, 
*PNTSTATUS, **PPNTSTATUS;

#define STATUS_SUCCESS                      ((NTSTATUS) 0x00000000)
#define STATUS_INFO_LENGTH_MISMATCH         ((NTSTATUS) 0xC0000004)
#define STATUS_IO_DEVICE_ERROR              ((NTSTATUS) 0xC0000185)


typedef 
struct _UNICODE_STRING
        
{
/*000*/ WORD  Length;
/*002*/ WORD  MaximumLength;
/*004*/ PWORD Buffer;
/*008*/ }

        UNICODE_STRING,
     
* PUNICODE_STRING,
    
**PPUNICODE_STRING;

#define UNICODE_STRING_ 
        
sizeof (UNICODE_STRING)

typedef 
struct _OBJECT_ATTRIBUTES
        
{
/*000*/ DWORD                        Length; // 0x18
/*004*/ HANDLE                       RootDirectory;
/*008*/ PUNICODE_STRING              ObjectName;
/*00C*/ DWORD                        Attributes;
/*010*/ PSECURITY_DESCRIPTOR         SecurityDescriptor;
/*014*/ PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
/*018*/ }

        OBJECT_ATTRIBUTES,
     
* POBJECT_ATTRIBUTES,
    
**PPOBJECT_ATTRIBUTES;

#define OBJECT_ATTRIBUTES_ 
        
sizeof (OBJECT_ATTRIBUTES)
        


NTSYSAPI 
NTSTATUS
NTAPI
NtCreateFile(
              OUT PHANDLE             FileHandle,
              IN ACCESS_MASK          DesiredAccess,
              IN POBJECT_ATTRIBUTES   ObjectAttributes,
              
//OUT PIO_STATUS_BLOCK    IoStatusBlock,
              OUT PVOID    IoStatusBlock,
              IN PLARGE_INTEGER       AllocationSize OPTIONAL,
              IN ULONG                FileAttributes,
              IN ULONG                ShareAccess,
              IN ULONG                CreateDisposition,
              IN ULONG                CreateOptions,
              IN PVOID                EaBuffer OPTIONAL,
              IN ULONG                EaLength 
             );

#ifdef __cplusplus
}

#endif

#endif

这里只有NtCreateFile的定义,需要使用其他的函数的时候可以通过The Undocument Function -microsoft windows 2000 查找并添加进来 

第三步: 像系统的api一样开始调用吧,

还是可以看出第二种方法的优越性吧,主程序没有出现额外的语句,将所有的函数定义放在了一个头文件中,方便了移植

总之我觉得第二种方法要优雅一点,不知阁下以为呢?

最后请注意NativeApiDef.h文件中的 extern "C" ,它是必须使用的,不然在链接的时候会出现下面的错误
error LNK2001: unresolved external symbol "__declspec(dllimport) long __stdcall
"无法解析的外部符号"
主要是C++ 和 C编译方式的不同造成的,C++支持重载机制当是这个问题的"罪魁祸首",关于extern "C" 我就不多说了,有兴趣的可以去看看这篇文章http://blog.youkuaiyun.com/wfwd/archive/2006/05/30/763734.aspx,讲的比较通俗易懂

Hooka Shellcode加载器实战:避开5大常见错误,打造稳定隐蔽的恶意代码加载器 Shellcode加载器是红队评估与权限维持中的关键技术组件,其核心原理在于将加密的机器代码注入目标进程内存并执行。理解内存操作、进程注入和API调用等底层机制,对于实现稳定、隐蔽的恶意代码执行至关重要。在工程实践中,编码混淆、反调试和流量伪装等技术能有效提升加载器的对抗能力,规避安全软件的静态与动态检测。本文聚焦于Hooka这类流行框架,针对“谷歌验证器未能加载账号”、“checkpoint加载器没有模型”等常见集成困惑,深入剖析Shellcode处理、进程注入、编译配置、环境感知和网络通信五大典型错误, 阅读详情

相关推荐

ntdll.lib文件

ntdll.lib是编译lmdb数据库时需要用到的静态库,在编译caffe时有用

CVE-2024-26229 Windows CSC服务权限提升漏洞复现

CVE-2024-26229 Windows CSC服务权限提升漏洞的复现过程

m0_62584974的博客 1605

NTDLL 库文件和头文件

NTDLL 库文件和头文件 SDK平台的源文件和lib,大家肯定需要的!呵呵!

ntdll之api

ntdll.dll是Windows系统从ring3到ring0的入口。位于Kernel32.dll和user32.dll中的所有win32 API 最终都是调用ntdll.dll中的函数实现的。ntdll.dll中的函数使用SYSENTRY进入ring0,函数的实现实体在ring0中

B_H_L的专栏 3595

ntdll.lib x64/x86

包含ntdll.h 64位ntdll.lib 32位btdll.lib

ntdll.lib和ntdll.h文件压缩包

ntdll.lib和ntdll.h文件压缩包,免积分下载

用户轻松调用ntdll中的native api

 ntdll中的native api功能非常强大,然而微软却没有提供用户态调用native api的接口,而这些native api所需要的数据结构微软也基本没有公布,幸好有了一批牛人的贡献,给出了很多native api的定义,让我们的生活免去了许多痛苦,本文在介绍了最基本的native api的调用方式之外,还介绍了一种更加优美,移植性更强的调用方式调用方式一(一般方式):第一步:声明

368

使用native API时需要的ntdll.h与ntdll.lib

windows所有的Native API都包含了,开心吧

用户态调用ntdll中的native api

用户态轻松ntdll中的native api 调用方式一(一般方式): 第一步:声明函数指针 比如我们需要调用NtCreateFile函数,那么我们就需要根据NtCreateFile的定义来声明一个相同类型的函数指针(这样做会让编译器比较高兴) typedefNTSTATUS(*MyNtCreateFile)(OU...

weixin_30369087的博客 174

ntdll.lib

这是ntdll的导出库文件,编写native函数时要用到,其中的ntdll.h也一起发上来

NTDLL导出API的头文件及LIB文件

资源为NTDLL的导出API的头文件及LIB文件

别让AI Agent白烧Token:agentics的Cost Tracker成本核算完整教程

你是否还在为 **AI Agent 的 Token 费用** 摸黑烧钱?[agentics](https://link.gitcode.com/i/fd027ac137cc6ec404125c7491e2367d) 是 GitHub 官方 Agentic Workflows 的示例工作流合集,其中的 **Cost Tracker** 工作流能自动核算每次 Agent 运行的 Token 花费,并把

gitblog_01177的博客 453

飞腾X100芯片GPU状态查询

本文档对在linux系统下查看X100芯片GPU状态信息进行说明,可以帮助大家了解芯片的实时工作状态。

乌拉大喵喵 2820

maldev 前置课:掌握进程注入前必懂的 5 个 Windows API 核心概念

无论你是安全爱好者还是刚开始接触 Windows 底层开发的初学者,maldev(Malware Development)项目都是一份难得的学习资料。这个开源仓库用 C 语言完整实现了 DLL 注入、Shellcode 注入、NTAPI 注入、直接/间接系统调用(Syscalls)和线程劫持等进程注入技术。很多人一上来就盯着花哨的绕过技巧,结果连最基本的代码都读不懂——原因很简单:**进程注入的所

gitblog_00478的博客 154

LEF文件介绍及其生成

介绍LEF文件及其生成方法

weixin_43249158的博客 3万+

量子磁场测量技术在生物磁场成像领域的应用现状与产业趋势

首先对量子磁场测量技术的发展进行了简述,然后介绍了量子磁场测量技术在生物磁场成像领域的应用,最后分析了量子磁场测量技术的两大重要应用方向(心磁图仪和脑磁图仪)及其产业现状和未来发展趋势。美国普林斯顿大学在《自然》上公布了目前人类磁场测量灵敏度最高的基于量子磁场测量技术的零场原子磁力计。拥有巨大的发展潜力及庞大的市场空间。因此其数千万元的高昂售价及每年数百万元的超导维护成本限制了超导式心磁图仪的发展和临床应用。而基于超导式脑磁图仪的癫痫、阿尔兹海默症、抑郁症等脑疾病患者的临床研究也取得丰富的研究成果。

罗伯特技术屋 1531

fatal error LNK1104: cannot open file "ntdll.lib"

输出窗口提示: Linking...LINK : fatal error LNK1104: cannot open file "ntdll.lib"执行 link.exe 时出错. Server.dat - 1 error(s), 0 warning(s) 解决法案: 把ntapi.h、ntdll.lib放在你的工程目录下面 然后再在程序预编译中添加:#include ...

716

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 377

总结一下进程句柄和“文件句柄”

进程句柄,顾名思义,一个进程所对应的句柄 如何获得一个电脑上所运行的所有进程ID和进程Name? Demo: #include <stdio.h> #include <Windows.h> #include <winternl.h> #pragma comment(lib,"ntdll.lib") // Need to link with ntdll....

qq_39529180的博客 1434

使用PLINK做GWAS(2)

利用PLINK对单基因控制的性状进行定位,之前一篇文章粗滤的记录了一下使用PLINK的命令,本次博客主要记录一下如何根据SNP芯片的数据制作PLINK的格式,以及分析的步骤,最后数据的可视化。 首先,有的公司给的新片的数据就是一个excel表格,列表示的是样品,行表示的是基因型,基因型用ATCG构成,当然有的基因型是用数字0或者1表示的。下面我拿到的一个数据是15个样品构成的基因型,有13个样品是突变体,2个样品是野生型。 格式如下: 第二步:将此基因型存成csv文件,使用R进行读取,在R中制作pl

samhuairen的专栏 2923

机器视觉框架源码——解读5(Dock和开源UI)

本文介绍了工业软件中Dock工具面板的使用方法,主要包括三个部分:添加avalonDock引用、修改属性配置(如显示样式和背景色),以及通过MVVM命令实现布局的加载和保存。加载布局通过XmlLayoutSerializer从XML文件恢复界面状态,保存布局则将当前DockManager的布局序列化为XML文件。文章提供了代码示例和截图说明,帮助开发者快速掌握Dock面板的核心功能。

Z's Palace 404

导出和分析 API

我们都知道 C/C++ 的输出函数, 最终都会转发到到 Windows API 的调用中, 那直接调用 Windows API 是不是就没有中间商赚差价了?

airaou 907

Cilium动手实验室: 精通之旅---5.Mutual Authentication with Cilium

在Cilium 入门实验室中,您将在受《星球大战》启发的场景中实施高级第 3-7 层网络策略。在实验结束时,您将实施强大的网络策略,并通过微分段保护 Empire 免受来自叛乱的攻击。在本实验中,您将重新部署《星球大战》演示应用程序,但除了网络策略之外,您还将了解如何在工作负载之间实施相互身份验证。

Q先生 1400
上一篇: INFO: NDIS 调试跟踪和内核调试器扩展
下一篇: 绕过安全软件挂钩SSDT的检测
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值