非正规又不可靠的方法获得系统服务号

本文围绕ntdll展开,分析了ZwXXX的API与系统服务的关系,指出XP系统将进入RING0的方式从int改为sysenter。通过遍历ntdll.dll的导出函数获取服务号,并给出相关代码。最后发现XP系统下增加了不少系统服务。

前段时间对ntdll比较感兴趣,因为我现在只能在RING3徘徊,加上ntdll是最接近RING0的地方。

那IDA反它,发现了ZwXXX的API都是直接调用系统服务了,换句话说就是系统服务RING3的表现形式是ZwXXX的API。ZwXXXAPI里没有什么代码,就是

2000Srv的:
.text:77F8F9C8 ZwAccessCheckByTypeAndAuditAlarm:       ; NtAccessCheckByTypeAndAuditAlarm
.text:77F8F9C8                 mov     eax, 4
.text:77F8F9CD                 lea     edx, [esp+4]
.text:77F8F9D1                 int     2Eh             ; DOS 2+ internal - EXECUTE COMMAND
.text:77F8F9D1                                         ; DS:SI -> counted CR-terminated command string
.text:77F8F9D3                 retn    40h
XP的:
.text:7C92D3CD                 mov     eax, 4
.text:7C92D3D2                 mov     edx, 7FFE0300h
.text:7C92D3D7                 call    dword ptr [edx]
.text:7C92D3D9                 retn    40h

很明显的区别就是XP已经把int进入RING0的方式改为sysenter了(在AMD上是syscall),另外7FFE0300这个地方放着KiFastSystemCall的地址,当然XP也有INT方式的函数:KiIntSystemCall,我想不直接调用KiFastSystemCall而是选择使用函数指针是因为XP不让经典的INT方式消失吧(我是这么想的),改7FFE0300的内容为KiIntSystemCall就等于使用INT方式了,那样会慢哦。

说了点和主题无关的东西。通过以上的分析,得到一个不可靠的结论:凡是Zw打头的API都是去掉系统服务的,然后开头代码都是mov eax,xx,根据这个不可靠的结论, 就可以通过遍厉ntdll.dll的导出函数,然后直接取得服务号就行,呵呵,自己都觉得很不可靠,下面是代码,遍厉导出函数的代码不是我写的,因为仅仅搞清楚了导入表

#include "windows.h"
#include "stdio.h"


BOOLEAN checkZwXXXByCode(DWORD funcEP)
{
 unsigned char code;
 code=*(char*)funcEP;
 if(code==0xb8)
  return TRUE;
 else
  return FALSE;
}
//开始想不加这个,结果输出了一些Rtl开头的API,他们都直接返回0x8004001
BOOLEAN checkZwXXXByName(char* apiName)  
{
 if(*(WORD*)apiName == 0x775A)
  return TRUE;
 return FALSE;
}

DWORD procAPIExportAddr(DWORD hModule)

 char *ptr = (char *)hModule;

 DWORD numEntries;
 DWORD *ExportNamePointerTable;
 DWORD ordinalBase;
 WORD *ExportOrdinalTable; 
 DWORD *ExportAddrTable;
 DWORD i,ii=0;
 char *exportName;
 DWORD funcEP;
 DWORD ord;

 if(!hModule)
  return 0;

 ptr += 0x3c;          // offset 0x3c contains offset to PE header
 
 ptr = (char *)(*(DWORD *)ptr) + hModule + 0x78;  // offset 78h into PE header contains addr of export table

 ptr = (char *)(*(DWORD *)ptr) + hModule;   // ptr now points to export directory table

 // offset 24 into the export directory table == number of entries in the Export Name Pointer Table
 // table
 numEntries = *(DWORD *)(ptr + 24);
 //printf("NumEntries = %d/n", numEntries);

 ExportNamePointerTable = (DWORD *)(*(DWORD *)(ptr + 32) + hModule); 
// offset 32 into export directory contains offset to Export Name Pointer Table 
 ordinalBase = *((DWORD *)(ptr + 16));
 //printf("OrdinalBase is %d/n", ordinalBase);
ExportOrdinalTable = (WORD *)((*(DWORD *)(ptr + 36)) + hModule);
 // offset 36 into export directory contains offset to Ordinal Table
 ExportAddrTable = (DWORD *)((*(DWORD *)(ptr + 28)) + hModule);
// offset 28 into export directory contains offset to Export Addr Table

 for(i = 0; i < numEntries; i++)
 {  
  exportName = (char *)(ExportNamePointerTable[i] + hModule);
  ord= ExportOrdinalTable[i];
  funcEP=ExportAddrTable[ord]+hModule;
  
  if( checkZwXXXByName(exportName) && checkZwXXXByCode(funcEP) )
  { 
   printf("[0x%x]%s/n",*(DWORD*)(funcEP+1),exportName);  //获得功能号
   ii++;
  }
 }
 printf("Total=0x%x/n",ii);      //统计个数
 return 0;
}


main()
{
 DWORD i=0,funcNum;
 DWORD ntdllBase;
 char* funcEP;
 if(ntdllBase=LoadLibrary(".//ntdll.dll"))          //这样是为了也能弄2000的,我的就XP,但是有2000的ntdll
  procAPIExportAddr(ntdllBase);
}

最后发现XP下加了不少系统服务:)

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值