【资料图】
在笔者上一篇文章《驱动开发:内核实现SSDT挂钩与摘钩》
中介绍了如何对SSDT
函数进行Hook
挂钩与摘钩的,本章将继续实现一个新功能,如何检测SSDT
函数是否挂钩,要实现检测挂钩状态
有两种方式,第一种方式则是类似于《驱动开发:摘除InlineHook内核钩子》
文章中所演示的通过读取函数的前16个字节与原始字节
做对比来判断挂钩状态,另一种方式则是通过对比函数的当前地址
与起源地址
进行判断,为了提高检测准确性本章将采用两种方式混合检测。
具体原理,通过解析内核文件PE结构
找到导出表,依次计算出每一个内核函数的RVA
相对偏移,通过与内核模块基址
相加此相对偏移得到函数的原始地址,然后再动态获取函数当前地址,两者作比较即可得知指定内核函数是否被挂钩。
在实现这个功能之前我们需要解决两个问题,第一个问题是如何得到特定内核模块的内存模块基址
此处我们需要封装一个GetOsBaseAddress()
用户只需要传入指定的内核模块即可得到该模块基址,如此简单的代码没有任何解释的必要;
// 署名权// right to sign one"s name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include #include #include typedef struct _LDR_DATA_TABLE_ENTRY{LIST_ENTRY InLoadOrderLinks;LIST_ENTRY InMemoryOrderLinks;LIST_ENTRY InInitializationOrderLinks;PVOID DllBase;PVOID EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;ULONG Flags;USHORT LoadCount;USHORT TlsIndex;LIST_ENTRY HashLinks;ULONG TimeDateStamp;} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;// 得到内核模块基址ULONGLONG GetOsBaseAddress(PDRIVER_OBJECT pDriverObject, WCHAR *wzData){UNICODE_STRING osName = { 0 };// WCHAR wzData[0x100] = L"ntoskrnl.exe";RtlInitUnicodeString(&osName, wzData);LDR_DATA_TABLE_ENTRY *pDataTableEntry, *pTempDataTableEntry;//双循环链表定义PLIST_ENTRY pList;//指向驱动对象的DriverSectionpDataTableEntry = (LDR_DATA_TABLE_ENTRY*)pDriverObject->DriverSection;//判断是否为空if (!pDataTableEntry){return 0;}//得到链表地址pList = pDataTableEntry->InLoadOrderLinks.Flink;// 判断是否等于头部while (pList != &pDataTableEntry->InLoadOrderLinks){pTempDataTableEntry = (LDR_DATA_TABLE_ENTRY *)pList;if (RtlEqualUnicodeString(&pTempDataTableEntry->BaseDllName, &osName, TRUE)){return (ULONGLONG)pTempDataTableEntry->DllBase;}pList = pList->Flink;}return 0;}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("驱动卸载 \n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark.com \n");ULONGLONG kernel_base = GetOsBaseAddress(Driver, L"ntoskrnl.exe");DbgPrint("ntoskrnl.exe => 模块基址: %p \n", kernel_base);ULONGLONG hal_base = GetOsBaseAddress(Driver, L"hal.dll");DbgPrint("hal.dll => 模块基址: %p \n", hal_base);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
如上直接编译并运行,即可输出ntoskrnl.exe
以及hal.dll
两个内核模块的基址;
其次我们还需要实现另一个功能,此时想像一下当我告诉你一个内存地址,我想要查该内存地址属于哪个模块该如何实现,其实很简单只需要拿到这个地址依次去判断其是否大于等于该模块的基地址,并小于等于该模块的结束地址,那么我们就认为该地址落在了此模块上,在这个思路下LyShark
实现了以下代码片段。
// 署名权// right to sign one"s name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include #include #include typedef struct _LDR_DATA_TABLE_ENTRY{LIST_ENTRY InLoadOrderLinks;LIST_ENTRY InMemoryOrderLinks;LIST_ENTRY InInitializationOrderLinks;PVOID DllBase;PVOID EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;ULONG Flags;USHORT LoadCount;USHORT TlsIndex;LIST_ENTRY HashLinks;ULONG TimeDateStamp;} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;// 扫描指定地址是否在某个模块内VOID ScanKernelModuleBase(PDRIVER_OBJECT pDriverObject, ULONGLONG address){LDR_DATA_TABLE_ENTRY *pDataTableEntry, *pTempDataTableEntry;PLIST_ENTRY pList;pDataTableEntry = (LDR_DATA_TABLE_ENTRY*)pDriverObject->DriverSection;if (!pDataTableEntry){return;}// 得到链表地址pList = pDataTableEntry->InLoadOrderLinks.Flink;// 判断是否等于头部while (pList != &pDataTableEntry->InLoadOrderLinks){pTempDataTableEntry = (LDR_DATA_TABLE_ENTRY *)pList;ULONGLONG start_address = (ULONGLONG)pTempDataTableEntry->DllBase;ULONGLONG end_address = start_address + (ULONG)pTempDataTableEntry->SizeOfImage;// 判断区间// DbgPrint("起始地址 [ %p ] 结束地址 [ %p ] \n",start_address,end_address);if (address >= start_address && address <= end_address){DbgPrint("[LyShark] 当前函数所在模块 [ %ws ] \n", (CHAR *)pTempDataTableEntry->FullDllName.Buffer);}pList = pList->Flink;}}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("驱动卸载 \n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark.com \n");ScanKernelModuleBase(Driver, 0xFFFFF8051AF5D030);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
我们以0xFFFFF8051AF5D030
地址为例对其进行判断可看到输出了如下结果,此地址被落在了hal.dll
模块上;
为了能读入磁盘PE文件到内存此时我们还需要封装一个LoadKernelFile()
函数,该函数的作用是读入一个内核文件到内存空间中,此处如果您使用前一篇《驱动开发:内核解析PE结构导出表》
文章中的内存映射函数来读写则会蓝屏,原因很简单KernelMapFile()
是映射而映射一定无法一次性完整装载其次此方法本质上还在占用原文件,而LoadKernelFile()
则是读取磁盘文件并将其完整拷贝一份,这是两者的本质区别,如下代码则是实现完整拷贝的实现;
// 署名权// right to sign one"s name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include #include #include // 将内核文件装载入内存(磁盘)PVOID LoadKernelFile(WCHAR *wzFileName){NTSTATUS Status;HANDLE FileHandle;IO_STATUS_BLOCK ioStatus;FILE_STANDARD_INFORMATION FileInformation;// 设置路径UNICODE_STRING uniFileName;RtlInitUnicodeString(&uniFileName, wzFileName);// 初始化打开文件的属性OBJECT_ATTRIBUTES objectAttributes;InitializeObjectAttributes(&objectAttributes, &uniFileName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);// 打开文件Status = IoCreateFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, &objectAttributes, &ioStatus, 0, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0, CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);if (!NT_SUCCESS(Status)){return 0;}// 获取文件信息Status = ZwQueryInformationFile(FileHandle, &ioStatus, &FileInformation, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);if (!NT_SUCCESS(Status)){ZwClose(FileHandle);return 0;}// 判断文件大小是否过大if (FileInformation.EndOfFile.HighPart != 0){ZwClose(FileHandle);return 0;}// 取文件大小ULONG64 uFileSize = FileInformation.EndOfFile.LowPart;// 分配内存PVOID pBuffer = ExAllocatePoolWithTag(NonPagedPool, uFileSize + 0x100, (ULONG)"LyShark");if (pBuffer == NULL){ZwClose(FileHandle);return 0;}// 从头开始读取文件LARGE_INTEGER byteOffset;byteOffset.LowPart = 0;byteOffset.HighPart = 0;Status = ZwReadFile(FileHandle, NULL, NULL, NULL, &ioStatus, pBuffer, uFileSize, &byteOffset, NULL);if (!NT_SUCCESS(Status)){ZwClose(FileHandle);return 0;}// ExFreePoolWithTag(pBuffer, (ULONG)"LyShark");ZwClose(FileHandle);return pBuffer;}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("驱动卸载 \n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){// 加载内核模块PVOID BaseAddress = LoadKernelFile(L"\\SystemRoot\\system32\\ntoskrnl.exe");DbgPrint("BaseAddress = %p\n", BaseAddress);// 解析PE头PIMAGE_DOS_HEADER pDosHeader;PIMAGE_NT_HEADERS pNtHeaders;// DLL内存数据转成DOS头结构pDosHeader = (PIMAGE_DOS_HEADER)BaseAddress;// 取出PE头结构pNtHeaders = (PIMAGE_NT_HEADERS)((ULONGLONG)BaseAddress + pDosHeader->e_lfanew);DbgPrint("[LyShark] => 映像基址: %p \n", pNtHeaders->OptionalHeader.ImageBase);// 结束后释放内存ExFreePoolWithTag(BaseAddress, (ULONG)"LyShark");Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
运行如上这段程序,则会将ntoskrnl.exe
文件载入到内存,并读取出其中的OptionalHeader.ImageBase
映像基址,如下图所示;
有了上述方法,最后一步就是组合并实现判断即可,如下代码通过对导出表的解析,并过滤出所有的Nt
开头的系列函数,然后依次对比起源地址与原地址是否一致,得出是否被挂钩,完整代码如下所示;
// 署名权// right to sign one"s name on a piece of work// PowerBy: LyShark// Email: me@lyshark.comULONGLONG ntoskrnl_base = 0;NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("Hello LyShark.com \n");// 加载内核模块PVOID BaseAddress = LoadKernelFile(L"\\SystemRoot\\system32\\ntoskrnl.exe");DbgPrint("BaseAddress = %p\n", BaseAddress);// 获取内核模块地址ntoskrnl_base = GetOsBaseAddress(Driver, L"ntoskrnl.exe");// 取出导出表PIMAGE_DOS_HEADER pDosHeader;PIMAGE_NT_HEADERS pNtHeaders;PIMAGE_SECTION_HEADER pSectionHeader;ULONGLONG FileOffset;PIMAGE_EXPORT_DIRECTORY pExportDirectory;// DLL内存数据转成DOS头结构pDosHeader = (PIMAGE_DOS_HEADER)BaseAddress;// 取出PE头结构pNtHeaders = (PIMAGE_NT_HEADERS)((ULONGLONG)BaseAddress + pDosHeader->e_lfanew);// 判断PE头导出表表是否为空if (pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0){return 0;}// 取出导出表偏移FileOffset = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;// 取出节头结构pSectionHeader = (PIMAGE_SECTION_HEADER)((ULONGLONG)pNtHeaders + sizeof(IMAGE_NT_HEADERS));PIMAGE_SECTION_HEADER pOldSectionHeader = pSectionHeader;// 遍历节结构进行地址运算for (UINT16 Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;}}// 导出表地址pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)((ULONGLONG)BaseAddress + FileOffset);// 取出导出表函数地址PULONG AddressOfFunctions;FileOffset = pExportDirectory->AddressOfFunctions;// 遍历节结构进行地址运算pSectionHeader = pOldSectionHeader;for (UINT16 Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;}}// 这里注意一下foa和rvaAddressOfFunctions = (PULONG)((ULONGLONG)BaseAddress + FileOffset);// 取出导出表函数名字PUSHORT AddressOfNameOrdinals;FileOffset = pExportDirectory->AddressOfNameOrdinals;// 遍历节结构进行地址运算pSectionHeader = pOldSectionHeader;for (UINT16 Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;}}// 注意一下foa和rvaAddressOfNameOrdinals = (PUSHORT)((ULONGLONG)BaseAddress + FileOffset);// 取出导出表函数序号PULONG AddressOfNames;FileOffset = pExportDirectory->AddressOfNames;// 遍历节结构进行地址运算pSectionHeader = pOldSectionHeader;for (UINT16 Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= FileOffset && FileOffset <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){FileOffset = FileOffset - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;}}// 注意一下foa和rvaAddressOfNames = (PULONG)((ULONGLONG)BaseAddress + FileOffset);// 分析导出表ULONG uOffset;LPSTR FunName;ULONG uAddressOfNames;ULONG TargetOff = 0;for (ULONG uIndex = 0; uIndex < pExportDirectory->NumberOfNames; uIndex++, AddressOfNames++, AddressOfNameOrdinals++){uAddressOfNames = *AddressOfNames;pSectionHeader = pOldSectionHeader;for (UINT16 Index = 0; Index < pNtHeaders->FileHeader.NumberOfSections; Index++, pSectionHeader++){if (pSectionHeader->VirtualAddress <= uAddressOfNames && uAddressOfNames <= pSectionHeader->VirtualAddress + pSectionHeader->SizeOfRawData){uOffset = uAddressOfNames - pSectionHeader->VirtualAddress + pSectionHeader->PointerToRawData;}}FunName = (LPSTR)((ULONGLONG)BaseAddress + uOffset);if (FunName[0] == "N" && FunName[1] == "t"){// 得到相对RVATargetOff = (ULONG)AddressOfFunctions[*AddressOfNameOrdinals];// LPSTR -> UNCODE// 先转成ANSI 然后在转成 UNCODEANSI_STRING ansi = { 0 };UNICODE_STRING uncode = { 0 };RtlInitAnsiString(&ansi, FunName);RtlAnsiStringToUnicodeString(&uncode, &ansi, TRUE);// 得到当前地址PULONGLONG local_address = MmGetSystemRoutineAddress(&uncode);/*// 读入内核函数前6个字节unsigned char local_opcode[6] = { 0 };unsigned char this_opcode[6] = { 0 };RtlCopyMemory(local_opcode, (void *)local_address, 6);RtlCopyMemory(this_opcode, (void *)(ntoskrnl_base + TargetOff), 6);// 当前机器码for (int x = 0; x < 6; x++){DbgPrint("当前 [ %d ] 机器码 [ %x ] ", x, local_opcode[x]);}// 起源机器码for (int y = 0; y < 6; y++){DbgPrint("起源 [ %d ] 机器码 [ %x ] ", y, this_opcode[y]);}*/// 检测是否被挂钩 [不相等则说明被挂钩了]if (local_address != (ntoskrnl_base + TargetOff)){DbgPrint("索引 [ %d ] RVA [ %p ] \n --> 起源地址 [ %p ] | 当前地址 [ %p ] | 函数名 [ %s ] \n\n",*AddressOfNameOrdinals, TargetOff, ntoskrnl_base + TargetOff, local_address, FunName);}// 检查当前地址所在模块// ScanKernelModuleBase(Driver, (PULONGLONG)local_address);}}// 结束后释放内存ExFreePoolWithTag(BaseAddress, (ULONG)"LyShark");Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
使用ARK工具手动改写几个Nt开头的函数,并运行这段代码,观察是否可以输出被挂钩的函数详情;
标签:
上一篇 : 环球热讯:郑振瑶:离开前已经遗忘丨逝者
下一篇 : 最后一页
最新推荐
在笔者上一篇文章`《驱动开发:内核实现SSDT挂钩与摘钩》`中介绍了如何
郑振瑶(1936-2023)安徽,演员对于年轻观众而言,郑振瑶这个名字,就
1、南阳市联合街东段过了解放路和联合街十字口往东路南,金汉丰附近,新
6月5日,国家自然博物馆在北京正式揭牌,标志着我国自然博物馆发展历程
1、fz是意大利语forzando的简写,意思是“加强的”,是一个音乐力度术
1、太祖爱新觉罗努尔哈赤孝慈高皇后阿巴亥太宗爱新觉罗皇太极孝端文皇
1、百度了一下,你说的两个人分别是陕西省委宣传部副部长刘伟和西安市
今天,大学路小编为大家带来了深圳校招对口院校排名有哪些途径可以报名
1、多余的矿泉水瓶可以有多种用途。矿泉水瓶的头部大多是圆锥形的,可
为博女友欢心,男子不惜铤而走险帮诈骗团伙“洗钱”---安徽男子洪某为
尚太科技:就目前市场情况来看公司二季度销售有回暖趋势
海南省网信办结合近期开展的“清朗·从严整治‘自媒体’乱象”专项行动
全省国家级科技企业孵化器达67家
阿房宫股东夏陆一减持14 52万股权益变动后直接持股比例为7%2023 6 520:
由经典国漫IP《西行纪》正版授权,恺英网络独代发行的国漫卡牌新游《龙
捷邦科技(301326)06月05日在投资者关系平台上答复了投资者关心的问题。
本报讯(记者安然)今年高考将于6月7日至10日(周三至周六)进行,6 5
在被拍到的照片中,文章身边的卷发美女,从脸部轮廓来看,的确跟姚笛相
1、自然数包括0和正整数小数和分数不是自然数希望我的回答能帮助你,如
1、使用牙膏清洗。这种方法最好只用在那些可以放进洗衣机清洗或可以用
1、是不是周传雄的割舍啊没有玫瑰花没有说情话只能为你默默的牵挂想你
演示机型:Iphone12系统版本:IOS15 4APP版本:null苹果后面闪
1、首重1KG20元,续重1KG10元(人民币)是按照重量计算的。2、大约2-3
同学们注意了!!教育部全国学生资助管理中心日前发布了2023年第1号预
6月4日,新乐市贾庄村峻业农场农民正在给葡萄蔬果。芒种将至,田野处处
恒指高开0 34%,科网股表现分化,光大证券:美加息预期下降等三大因素
近日,“策展在中国”论坛于首届武汉双年展落下帷幕前得以举办,这次的主题是“策展与文化赋能”。作为...
中信证券:科技大厂进军机器人产业推动技术创新与落地进程加速
我抽了三十年烟,一天基本两包半!前年的某一天,我看着手上的烟,青烟缭绕,忽然感觉这烟对于我来说有什么
6月4日,神舟十五号载人飞船返回舱沐浴着清晨的艳阳,护送“太空出差”6个月之久的神舟十五号飞行乘组返...
全场比赛中,法国男足在场面上占据压倒性优势,控球率高达68 7%,射门数20比3,几乎是中国男足的7倍,10次
1、1 4401属于奥氏体不锈钢对应标准为欧洲EN标准为EN10028-7:2000还有别的几个标准。2、德国标准为D
重庆静心SPA养身馆环境非常干净,舒适伏蠢产品用的是法国顶级进口Florial精油,芳疗师可以根据每位宾客的身
1、汇银大厦属于静安区写字楼,汇银大厦轨道交通地铁11号沿线,属于南京西路商圈写字楼,汇银大厦原名博爱大厦
直播吧6月4日讯在社交媒体中,罗德里戈发文告别了本泽马。罗德里戈写道:“KB9!!!非常感谢我们能在一起
全南县气象台2023年06月04日20时12分继续发布雷电黄色预警信号:预计未来6小时内,我县所有乡镇的部分地区
1、高中生自我介绍范文 尊敬的老师,同学们,你们好。2、 我叫超超,这名字可能有人听说过,也许有人
姜战林今何在,姜战林这个很多人还不知道,现在让我们一起来看看吧!1、如履薄冰、如临深渊、如坐针毡、生不
1、一条面包2、配料准备好了3、把面包切成片,装盘。4、菠萝丁5、面包片上浇有蜂蜜和酸奶。6、菠萝撒在上面
1、黄土高坡——黄土高原家在东北——东北平原。本文分享完毕,希望对大家有所帮助。
想必现在有很多小伙伴对于摊丁入亩究竟是什么意思方面的知识都比较想要了解,那么今天小好小编就为大家收集
原标题:上海医都医院项目举行数字化安全演练日前,中建科技“安全生产月”启动仪式暨2023年“智慧大安...
WNBA常规赛继续进行,中国球员李梦的机会越来越多,表现看起来也越来越好。我们都知道WNBA对抗强度很大,尤
央视网消息:近日,我国自主研制的超大型集装箱船“地中海米歇尔卡佩里尼”轮首航。该轮首站停靠宁波舟...
一、缴纳的公积金什么时候能到账户缴纳的公积金在提取手续后三个工作日后能到账户。单位在到建设银行住房公
大家好,小石来为大家解答以上问题。带人的四字成语,带人字的四字成语这个很多人还不太了解,现在一起来瞧
有用户制作好启动盘后重装系统电脑不能识别到U盘启动盘,这是怎么回事呢?下面给跟大家聊聊可能的原因以及解
近日,《原神》米哈游官方面向广大玩家发起“世界探索体验调研问卷”,收集大家对《原神》未来新增内容...
设计需求按1人设计意式极简,不需要强调传统的住家温馨氛围尽可能大胆一些房子位于深圳中心地段,天气晴朗
成都抗疫的外籍志愿者:愿为城市“康复”贡献力量
兄弟萌,你们近期想看那个假面骑士或奥特曼或光影铠甲都可以留言给我哟,我会尽力更新
【环球新视野】我国首次在载人飞船返回任务中新增后弹道返回搜救区域
微动态丨专访:应对气候变化需要全球协作——访世界可持续发展工商理事会主席彼得·巴克
天天最资讯丨三星笔记本电脑系统重装步骤_三星笔记本电脑系统重装
网友激动坏了?上海迪士尼辟谣乐园将落户武汉:假消息 完全不会去
出道即巅峰?入门级仿赛卷出新高度,RC250标配TCS、单摇臂!-世界热文
世界观焦点:宏发股份(600885):6月2日北向资金增持20.84万股
当前速递!波罗的海干散货运价指数周五继续下跌,已连续第十五个交易日下跌,周线创1月初以来最大跌幅
莱万:和梅西在一起踢球会很容易,我们希望他能够重返巴萨-全球播报
全球新动态:5月1688平台GMV提升超20% 新买家数提升近40%
环球观天下!非农喜忧参半!美国5月新增就业33.9万人远超预期 但失业率创2022年10月来新高
全球实时:泸州老窖:公司股东人数在定期报告中进行披露,请您关注公司定期报告
胜通能源:一季度国内需求不及预期,价格回落,导致营业收入下降
世界今热点:2023苏州中国银行×京东618数字人民红包金额
基金经理要失业了?有私募将AI用于全部在管基金,回应来了:暂时不会独立管理|全球观天下
四川乐山在蓉推广“探秘金口河”第四届“转转花”文旅季 当前观点
贵州省黔南布依族苗族自治州福泉市2023-06-02 04:08发布雷电黄色预警 当前观察
港股强势反弹,港股科技ETF(513020)涨超2.4%,明源云涨超5.9%
Copyright © 2015-2023 港澳律师网版权所有 备案号:京ICP备2023022245号-31 联系邮箱:435 226 40 @qq.com