紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3362|回复: 1

自己写的代码还是太菜。。。

[复制链接]

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2016-6-5 21:35:15 | 显示全部楼层 |阅读模式
无聊的时候写了个获取PspExitThread原始的玩意,于是蓝屏了。。。
  1. #include <ntddk.h>
  2. #include <windef.h>
  3. #include <ntimage.h>
  4. #include "LDE64.h"

  5. ULONG32 Rva_PsTST;
  6. ULONG32 Rva_PspTTBP;
  7. ULONG32 Rva_PspET;

  8. ULONG RvaToRaw(PIMAGE_SECTION_HEADER pSections,USHORT SectionNumbers,ULONG dwRvaAddr)
  9. {
  10.         USHORT i;
  11.     ULONG AposRva;
  12.     ULONG dwOffset;
  13.     for(i=0;i<=SectionNumbers-1;i++)
  14.         {
  15.         if(dwRvaAddr>=pSections[i].VirtualAddress && dwRvaAddr<pSections[i].VirtualAddress+pSections[i].Misc.VirtualSize)
  16.                 {
  17.             AposRva=dwRvaAddr-pSections[i].VirtualAddress;
  18.             dwOffset=pSections[i].PointerToRawData+AposRva;
  19.             break;
  20.         }
  21.         }
  22.         return dwOffset;
  23. }

  24. void GetPspExitThread()
  25. {
  26.         NTSTATUS st;
  27.         HANDLE hFile;
  28.         OBJECT_ATTRIBUTES oa;
  29.         UNICODE_STRING uniFileName;
  30.         BYTE ansFuncName[23]="PsTerminateSystemThread";
  31.         IO_STATUS_BLOCK iosb;
  32.         LARGE_INTEGER Offset;
  33.         IMAGE_DOS_HEADER DosHead;
  34.         IMAGE_NT_HEADERS64 NtHead;
  35.         PIMAGE_SECTION_HEADER pSection;
  36.         IMAGE_EXPORT_DIRECTORY ExpDir;
  37.         PULONG32 FuncRva;
  38.         PULONG32 NameRva;
  39.         PUSHORT OridRva;
  40.         PVOID PsBuffer;
  41.         PVOID PspBuffer;
  42.         BYTE pName[23]={0};
  43.         ULONG i;
  44.         ULONG64 j;
  45.         ULONG64 k;
  46.         ULONG pLen=0;
  47.         RtlInitUnicodeString(&uniFileName,L"C:\\Windows\\System32\\ntoskrnl.exe");
  48.         InitializeObjectAttributes(&oa,&uniFileName,OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,NULL,NULL);
  49.         st=IoCreateFile(&hFile,GENERIC_READ,&oa,&iosb,0,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN,0,NULL,0,0,NULL,IO_NO_PARAMETER_CHECKING);
  50.         if(NT_SUCCESS(st))
  51.         {
  52.                 RtlZeroMemory(&Offset,sizeof(Offset));
  53.                 st=ZwReadFile(hFile,NULL,NULL,NULL,&iosb,&DosHead,sizeof(DosHead),&Offset,NULL);
  54.                 if(NT_SUCCESS(st) && DosHead.e_magic==0x5A4D)
  55.                 {
  56.                         Offset.LowPart=DosHead.e_lfanew;
  57.                         st=ZwReadFile(hFile,NULL,NULL,NULL,&iosb,&NtHead,sizeof(NtHead),&Offset,NULL);
  58.                         if(NT_SUCCESS(st) && NtHead.Signature==0x4550)
  59.                         {
  60.                                 pSection=ExAllocatePool(NonPagedPool,NtHead.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER));
  61.                                 Offset.LowPart+=sizeof(NtHead);
  62.                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,pSection,NtHead.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER),&Offset,NULL);
  63.                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,NtHead.OptionalHeader.DataDirectory[1].VirtualAddress);
  64.                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,&ExpDir,sizeof(ExpDir),&Offset,NULL);
  65.                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,ExpDir.AddressOfFunctions);
  66.                                 FuncRva=ExAllocatePool(NonPagedPool,4 * ExpDir.NumberOfFunctions);
  67.                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,FuncRva,4 * ExpDir.NumberOfFunctions,&Offset,NULL);
  68.                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,ExpDir.AddressOfNames);
  69.                                 NameRva=ExAllocatePool(NonPagedPool,4 * ExpDir.NumberOfNames);
  70.                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,NameRva,4 * ExpDir.NumberOfNames,&Offset,NULL);
  71.                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,ExpDir.AddressOfNameOrdinals);
  72.                                 OridRva=ExAllocatePool(NonPagedPool,2 * ExpDir.NumberOfFunctions);
  73.                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,OridRva,2 * ExpDir.NumberOfFunctions,&Offset,NULL);
  74.                                 for(i=1;i<=ExpDir.NumberOfNames;i++)
  75.                                 {
  76.                                         Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,NameRva[i]);
  77.                                         ZwReadFile(hFile,NULL,NULL,NULL,&iosb,pName,23,&Offset,NULL);
  78.                                         if(RtlCompareMemory(pName,ansFuncName,23)==23)
  79.                                         {
  80.                                                 Rva_PsTST=FuncRva[OridRva[i]-ExpDir.Base];
  81.                                                 PsBuffer=ExAllocatePool(NonPagedPool,50);
  82.                                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,Rva_PsTST);
  83.                                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,PsBuffer,50,&Offset,NULL);
  84.                                                 for(j=(ULONG64)PsBuffer;j<=(ULONG64)PsBuffer+50;j+=pLen)
  85.                                                 {
  86.                                                         pLen=SizeOfCode((PVOID)j,64);
  87.                                                         if(pLen==5 && *(PBYTE)j==0xE8)
  88.                                                         {
  89.                                                                 Rva_PspTTBP=(ULONG32)(*(PULONG32)(j+1)+(j-(ULONG64)PsBuffer)+5);
  90.                                                                 PspBuffer=ExAllocatePool(NonPagedPool,0x100);
  91.                                                                 Offset.LowPart=RvaToRaw(pSection,NtHead.FileHeader.NumberOfSections,Rva_PspTTBP);
  92.                                                                 ZwReadFile(hFile,NULL,NULL,NULL,&iosb,PspBuffer,0x100,&Offset,NULL);
  93.                                                                 pLen=0;
  94.                                                                 for(k=(ULONG64)PspBuffer;k<=(ULONG64)PspBuffer+0x100;k+=pLen)
  95.                                                                 {
  96.                                                                         pLen=SizeOfCode((PVOID)k,64);
  97.                                                                         if(pLen==5 && *(PBYTE)k==0xE8)
  98.                                                                         {
  99.                                                                                 Rva_PspET=(ULONG32)(*(PULONG32)(k+1)+(k-(ULONG64)PspBuffer)+5);
  100.                                                                                 break;
  101.                                                                         }
  102.                                                                 }
  103.                                                         }
  104.                                                 }
  105.                                         }
  106.                                 }
  107.                         }
  108.                 }
  109.                 ZwClose(hFile);
  110.         }
  111. }
复制代码

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2016-11-17 21:26:15 | 显示全部楼层
用符号!!!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-25 14:46 , Processed in 0.023387 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表