当前位置: 首页 > news >正文

建设个人网站用什么软件jsp 网站连接数据库

建设个人网站用什么软件,jsp 网站连接数据库,建产品网站怎么做,seo网络推广企业SSDT表#xff08;System Service Descriptor Table#xff09;是Windows操作系统内核中的关键组成部分#xff0c;负责存储系统服务调用的相关信息。具体而言#xff0c;SSDT表包含了系统调用的函数地址以及其他与系统服务相关的信息。每个系统调用对应SSDT表中的一个表项…SSDT表System Service Descriptor Table是Windows操作系统内核中的关键组成部分负责存储系统服务调用的相关信息。具体而言SSDT表包含了系统调用的函数地址以及其他与系统服务相关的信息。每个系统调用对应SSDT表中的一个表项其中存储了相应系统服务的函数地址。SSDT表在64位和32位系统上可能有不同的结构但通常以数组形式存在。 对于系统调用的监控、分析或修改等高级操作常需要内核枚举SSDT表基址。这一操作通常通过内核模块实现涉及技术手段如逆向工程和Hooking。 看一款闭源ARK工具的枚举效果: 直接步入正题首先SSDT表中文为系统服务描述符表SSDT表的作用是把应用层与内核层联系起来起到桥梁的作用枚举SSDT表也是反内核工具最基本的功能通常在64位系统中要想找到SSDT表需要先找到KeServiceDescriptorTable这个函数由于该函数没有被导出所以只能动态的查找它的地址庆幸的是我们可以通过查找msr(c0000082)这个特殊的寄存器来替代查找KeServiceDescriptorTable这一步在新版系统中查找SSDT可以归纳为如下这几个步骤。 rdmsr c0000082 - KiSystemCall64Shadow - KiSystemServiceUser - SSDT 首先第一步通过rdmsr C0000082 MSR寄存器得到KiSystemCall64Shadow的函数地址计算KiSystemCall64Shadow与KiSystemServiceUser偏移量如下图所示。 得到相对偏移6ed53180(KiSystemCall64Shadow) - 6ebd2a82(KiSystemServiceUser) 1806FE也就是说 6ed53180(rdmsr) - 1806FE KiSystemServiceUser 如上当我们找到了KiSystemServiceUser的地址以后在KiSystemServiceUser向下搜索可找到KiSystemServiceRepeat里面就是我们要找的SSDT表基址。 其中fffff8036ef8c880则是SSDT表的基地址紧随其后的fffff8036ef74a80则是SSSDT表的基地址。 那么如果将这个过程通过代码的方式来实现我们还需要使用《内核枚举IoTimer定时器》中所使用的特征码定位技术如下我们查找这段特征。 #include ntifs.h #pragma intrinsic(__readmsr)ULONGLONG ssdt_address 0;// 获取 KeServiceDescriptorTable 首地址 ULONGLONG GetLySharkCOMKeServiceDescriptorTable() {// 设置起始位置PUCHAR StartSearchAddress (PUCHAR)__readmsr(0xC0000082) - 0x1806FE;// 设置结束位置PUCHAR EndSearchAddress StartSearchAddress 0x100000;DbgPrint([LyShark Search] 扫描起始地址: %p -- 扫描结束地址: %p \n, StartSearchAddress, EndSearchAddress);PUCHAR ByteCode NULL;UCHAR OpCodeA 0, OpCodeB 0, OpCodeC 0;ULONGLONG addr 0;ULONG templong 0;for (ByteCode StartSearchAddress; ByteCode EndSearchAddress; ByteCode){// 使用MmIsAddressValid()函数检查地址是否有页面错误if (MmIsAddressValid(ByteCode) MmIsAddressValid(ByteCode 1) MmIsAddressValid(ByteCode 2)){OpCodeA *ByteCode;OpCodeB *(ByteCode 1);OpCodeC *(ByteCode 2);// 对比特征值 寻找 nt!KeServiceDescriptorTable 函数地址/*nt!KiSystemServiceRepeat:fffff8036ebd2b94 4c8d15e59c3b00 lea r10,[nt!KeServiceDescriptorTable (fffff8036ef8c880)]fffff8036ebd2b9b 4c8d1dde1e3a00 lea r11,[nt!KeServiceDescriptorTableShadow (fffff8036ef74a80)]fffff8036ebd2ba2 f7437880000000 test dword ptr [rbx78h],80hfffff8036ebd2ba9 7413 je nt!KiSystemServiceRepeat0x2a (fffff8036ebd2bbe) Branch*/if (OpCodeA 0x4c OpCodeB 0x8d OpCodeC 0x15){// 获取高位地址fffff802memcpy(templong, ByteCode 3, 4);// 与低位64da4880地址相加得到完整地址addr (ULONGLONG)templong (ULONGLONG)ByteCode 7;return addr;}}}return 0; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((驱动程序卸载成功! \n)); }NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark);ssdt_address GetLySharkCOMKeServiceDescriptorTable();DbgPrint([LyShark] SSDT %p \n, ssdt_address);DriverObject-DriverUnload UnDriver;return STATUS_SUCCESS; }如上代码中所提及的步骤我想不需要再做解释了这段代码运行后即可输出SSDT表的基址。 如上通过调用GetLySharkCOMKeServiceDescriptorTable()得到SSDT地址以后我们就需要对该地址进行解密操作。 得到ServiceTableBase的地址后就能得到每个服务函数的地址。但这个表存放的并不是SSDT函数的完整地址而是其相对于ServiceTableBase[Index]4的数据每个数据占四个字节所以计算指定Index函数完整地址的公式是 在x86平台上: FuncAddress KeServiceDescriptorTable 4 * Index在x64平台上FuncAddress [KeServiceDescriptorTable4*Index]4 KeServiceDescriptorTable 如下汇编代码就是一段解密代码代码中rcx寄存器传入SSDT的下标而rdx寄存器则是传入SSDT表基址。 48:8BC1 | mov rax,rcx | rcxindex4C:8D12 | lea r10,qword ptr ds:[rdx] | rdxssdt8BF8 | mov edi,eax |C1EF 07 | shr edi,7 |83E7 20 | and edi,20 |4E:8B1417 | mov r10,qword ptr ds:[rdir10] |4D:631C82 | movsxd r11,dword ptr ds:[r10rax*4] |49:8BC3 | mov rax,r11 |49:C1FB 04 | sar r11,4 |4D:03D3 | add r10,r11 |49:8BC2 | mov rax,r10 |C3 | ret |有了解密公式以后代码的编写就变得很容易如下是读取SSDT的完整代码。 #include ntifs.h #pragma intrinsic(__readmsr)typedef struct _SYSTEM_SERVICE_TABLE {PVOID ServiceTableBase;PVOID ServiceCounterTableBase;ULONGLONG NumberOfServices;PVOID ParamTableBase; } SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE;ULONGLONG ssdt_base_aadress; PSYSTEM_SERVICE_TABLE KeServiceDescriptorTable;typedef UINT64(__fastcall *SCFN)(UINT64, UINT64); SCFN scfn;// 解密算法 VOID DecodeSSDT() {UCHAR strShellCode[36] \x48\x8B\xC1\x4C\x8D\x12\x8B\xF8\xC1\xEF\x07\x83\xE7\x20\x4E\x8B\x14\x17\x4D\x63\x1C\x82\x49\x8B\xC3\x49\xC1\xFB\x04\x4D\x03\xD3\x49\x8B\xC2\xC3;/*48:8BC1 | mov rax,rcx | rcxindex4C:8D12 | lea r10,qword ptr ds:[rdx] | rdxssdt8BF8 | mov edi,eax |C1EF 07 | shr edi,7 |83E7 20 | and edi,20 |4E:8B1417 | mov r10,qword ptr ds:[rdir10] |4D:631C82 | movsxd r11,dword ptr ds:[r10rax*4] |49:8BC3 | mov rax,r11 |49:C1FB 04 | sar r11,4 |4D:03D3 | add r10,r11 |49:8BC2 | mov rax,r10 |C3 | ret |*/scfn ExAllocatePool(NonPagedPool, 36);memcpy(scfn, strShellCode, 36); }// 获取 KeServiceDescriptorTable 首地址 ULONGLONG GetKeServiceDescriptorTable() {// 设置起始位置PUCHAR StartSearchAddress (PUCHAR)__readmsr(0xC0000082) - 0x1806FE;// 设置结束位置PUCHAR EndSearchAddress StartSearchAddress 0x8192;DbgPrint(扫描起始地址: %p -- 扫描结束地址: %p \n, StartSearchAddress, EndSearchAddress);PUCHAR ByteCode NULL;UCHAR OpCodeA 0, OpCodeB 0, OpCodeC 0;ULONGLONG addr 0;ULONG templong 0;for (ByteCode StartSearchAddress; ByteCode EndSearchAddress; ByteCode){// 使用MmIsAddressValid()函数检查地址是否有页面错误if (MmIsAddressValid(ByteCode) MmIsAddressValid(ByteCode 1) MmIsAddressValid(ByteCode 2)){OpCodeA *ByteCode;OpCodeB *(ByteCode 1);OpCodeC *(ByteCode 2);// 对比特征值 寻找 nt!KeServiceDescriptorTable 函数地址// lyshark// 4c 8d 15 e5 9e 3b 00 lea r10,[nt!KeServiceDescriptorTable (fffff80264da4880)]// 4c 8d 1d de 20 3a 00 lea r11,[nt!KeServiceDescriptorTableShadow (fffff80264d8ca80)]if (OpCodeA 0x4c OpCodeB 0x8d OpCodeC 0x15){// 获取高位地址fffff802memcpy(templong, ByteCode 3, 4);// 与低位64da4880地址相加得到完整地址addr (ULONGLONG)templong (ULONGLONG)ByteCode 7;return addr;}}}return 0; }// 得到函数相对偏移地址 ULONG GetOffsetAddress(ULONGLONG FuncAddr) {ULONG dwtmp 0;PULONG ServiceTableBase NULL;if (KeServiceDescriptorTable NULL){KeServiceDescriptorTable (PSYSTEM_SERVICE_TABLE)GetKeServiceDescriptorTable();}ServiceTableBase (PULONG)KeServiceDescriptorTable-ServiceTableBase;dwtmp (ULONG)(FuncAddr - (ULONGLONG)ServiceTableBase);return dwtmp 4; }// 根据序号得到函数地址 ULONGLONG GetSSDTFunctionAddress(ULONGLONG NtApiIndex) {ULONGLONG ret 0;if (ssdt_base_aadress 0){// 得到ssdt基地址ssdt_base_aadress GetKeServiceDescriptorTable();}if (scfn NULL){DecodeSSDT();}ret scfn(NtApiIndex, ssdt_base_aadress);return ret; }VOID UnDriver(PDRIVER_OBJECT driver) {DbgPrint((驱动程序卸载成功! \n)); }NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {DbgPrint(hello lyshark \n);ULONGLONG ssdt_address GetKeServiceDescriptorTable();DbgPrint(SSDT基地址 %p \n, ssdt_address);// 根据序号得到函数地址ULONGLONG address GetSSDTFunctionAddress(51);DbgPrint([LyShark] NtOpenFile地址 %p \n, address);// 得到相对SSDT的偏移量DbgPrint(函数相对偏移地址 %p \n, GetOffsetAddress(address));DriverObject-DriverUnload UnDriver;return STATUS_SUCCESS; }运行后即可得到SSDT下标为51的函数也就是得到NtOpenFile的绝对地址和相对地址。 你也可以打开ARK工具对比一下是否一致如下图所示LyShark的代码是没有任何问题的。
http://www.zqtcl.cn/news/244426/

相关文章:

  • 郑州高端网站制作wordpress那个版本好
  • wordpress屏蔽右键f12奉化首页的关键词优化
  • cn域名做犯法网站做电影网站需要哪些证
  • 官方网站有哪些韶关做网站的公司
  • 商城网站设计公司怎么样网站制作预算
  • 在济南什么人想做网站网站建设后怎么做主页
  • 联合年检怎么做网站上国家备案查询
  • 社交网站wap模板wordpress网址导航插件
  • 沈阳快速建站公司有哪些国外做二手服装网站
  • 手机如何建立网站平台seo比较好的优化
  • 电商网站建设外包禅城南庄网站制作
  • 哈尔滨企业网站开发报价免费php网站源码
  • 东莞市公司网站建设淄博网站制作营销
  • 企业网站无线端怎么做手机网站做成app
  • 让他人建设网站需要提供的材料可在哪些网站做链接
  • 外贸公司做网站3d建模好学吗
  • dedecms新网站 上传到万网的空间上海新媒体运营公司排名
  • 包装东莞网站建设0769三层网络架构
  • 淘客网站自己做固安建站公司
  • 咸阳学校网站建设联系电话网络app开发网站建设价格
  • 没网站怎么做淘宝客网站建设耂首先金手指
  • 网站带做收录排名淘外网站怎么做
  • 网站建设分金手指排名五申请邮箱账号注册
  • 餐饮加盟网站建设字体怎么安装wordpress
  • 网站建设与维护培训凡科和有赞哪个好用
  • 景区网站的作用长春新冠最新情况
  • 个人网站上传有啥要求wordpress 浏览记录
  • appcan 手机网站开发wordpress首页音乐
  • 杭州响应式网站案例建筑工程网站建站方案
  • 网站访客抓取国内网站搭建