看流星社区

 找回密码
 注册账号
查看: 2261|回复: 0

校验驱动调用者防止被恶意调用

[复制链接]

该用户从未签到

发表于 2013-4-12 09:39:59 | 显示全部楼层 |阅读模式
  1. VOID CalcChar(PUNICODE_STRING logFileUnicodeString, LONG *XorChar, LONG *AnSChar)
  2. {
  3.     OBJECT_ATTRIBUTES objectAttributes;
  4.     IO_STATUS_BLOCK iostatus;
  5.     HANDLE hfile;
  6.     NTSTATUS ntStatus;
  7.     FILE_STANDARD_INFORMATION fsi;
  8.     PUCHAR pBuffer;
  9.     ULONG i=0,y1=0,y2=0;
  10.     //初始化objectAttributes
  11.     InitializeObjectAttributes(&objectAttributes,
  12.                             logFileUnicodeString,
  13.                             OBJ_CASE_INSENSITIVE,//对大小写敏感
  14.                             NULL,
  15.                             NULL);
  16.     //创建文件
  17.     ntStatus = ZwCreateFile(&hfile,
  18.                             GENERIC_READ,
  19.                             &objectAttributes,
  20.                             &iostatus,
  21.                             NULL,
  22.                             FILE_ATTRIBUTE_NORMAL,
  23.                             FILE_SHARE_READ,
  24.                             FILE_OPEN,//即使存在该文件,也创建
  25.                             FILE_SYNCHRONOUS_IO_NONALERT,
  26.                             NULL,
  27.                             0 );
  28.     if (!NT_SUCCESS(ntStatus))
  29.     {
  30.         dprintf("The file is not exist!\n");
  31.         return;
  32.     }
  33.     //读取文件长度
  34.     ntStatus = ZwQueryInformationFile(hfile,
  35.                                     &iostatus,
  36.                                     &fsi,
  37.                                     sizeof(FILE_STANDARD_INFORMATION),
  38.                                     FileStandardInformation);
  39.     dprintf("The program want to read %d bytes\n",fsi.EndOfFile.QuadPart);
  40.     //为读取的文件分配缓冲区
  41.      pBuffer = (PUCHAR)ExAllocatePool(PagedPool, (LONG)fsi.EndOfFile.QuadPart);
  42.     //读取文件
  43.     ZwReadFile(hfile,NULL,
  44.                 NULL,NULL,
  45.                 &iostatus,
  46.                 pBuffer,
  47.                 (LONG)fsi.EndOfFile.QuadPart,
  48.                 NULL,NULL);
  49.     dprintf("The program really read %d bytes\n",iostatus.Information);
  50.     //异或计算
  51.     for(i=0;i<iostatus.Information;i++)
  52.         y1=y1^(LONG)(*(pBuffer+i));
  53.     *XorChar=y1;
  54.     //加减计算
  55.     for(i=0;i<iostatus.Information;i++)
  56.     {
  57.         if(i%2==0)
  58.             y2=y2+(LONG)(*(pBuffer+i));
  59.         else
  60.             y2=y2-(LONG)(*(pBuffer+i));
  61.     }
  62.     *AnSChar=y2;
  63.     //关闭文件句柄
  64.     ZwClose(hfile);
  65.     //释放缓冲区
  66.     ExFreePool(pBuffer);
  67. }

  68. char *cs(char *str1, char *str2) //connect string
  69. {
  70.     long newstrlen=strlen(str1)+strlen(str2)+1;
  71.     char *newstr=(char*)ExAllocatePool(NonPagedPool, newstrlen);
  72.     memcpy(newstr,str1,strlen(str1));
  73.     memcpy(newstr+strlen(str1),str2,strlen(str2)+1);
  74.     return newstr;
  75. }

  76. LONG VerifyCaller(void)
  77. {
  78.     PEPROCESS cur_ep;
  79.     char cur_pp[260];
  80.     char *nt_cur_pp;
  81.     ANSI_STRING asCur_pp;
  82.     UNICODE_STRING usCur_pp;
  83.     LONG xorc, ansc;
  84.     cur_ep=PsGetCurrentProcess();
  85.     GetFullPathByEprocess((ULONG)cur_ep, cur_pp);
  86.     nt_cur_pp=cs("\\??\",cur_pp);
  87.     DbgPrint("%s",nt_cur_pp);
  88.     RtlInitAnsiString(&asCur_pp, nt_cur_pp);
  89.     RtlAnsiStringToUnicodeString(&usCur_pp, &asCur_pp, TRUE);
  90.     DbgPrint("%wZ",&usCur_pp);
  91.     CalcChar(&usCur_pp, &xorc, &ansc);
  92.     DbgPrint("XorChar: %ld; AnSChar: %ld",xorc,ansc);
  93.     //这个就是事先算好的合法程序的特征码,【必须】固化在驱动里!
  94.     if(xorc==186 && ansc==136176)
  95.         return 1;
  96.     else
  97.         return 0;
  98. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-30 15:54

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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