• 1283阅读
  • 1回复

ring0-内存可读、可写、有效性、指针是否为空、深度校验字符串(随手代码) [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-11
— 本帖被 天道酬勤 从 驱动保护 移动到本区(2016-05-19) —
1.如在ring3下,则要判断是否可读可写:


[cpp] view plain copy

  1. KPROCESSOR_MODE PreviousMode;  
  2.     ULONG PID;  
  3.     PreviousMode = ExGetPreviousMode();  
  4.   
  5.     // 如果非内核模式,就要开始检查IN的这些参数都否可读  
  6.     if (PreviousMode != KernelMode)  
  7.     {  
  8.         try  
  9.         {  
  10.              ProbeForRead(ClientId, sizeof(CLIENT_ID), sizeof(ULONG));  
  11.                          ProbeForWrite(ClientId, sizeof(CLIENT_ID), sizeof(ULONG));  
  12.         }  
  13.         __except(EXCEPTION_EXECUTE_HANDLER)  
  14.         {  
  15.             return GetExceptionCode();  
  16.         }  
  17.     }  


2. 校验指针是否为空,内存有效性:



[cpp] view plain copy

  1. // 效验ClientId是否为NULL  
  2. if (ARGUMENT_PRESENT(ClientId)  
  3.     && MmIsAddressValid(ClientId))  
  4. {  
  5.      //更安全的访问。  
  6.      PID = (ULONG)ClientId->UniqueProcess;  
  7.      KdPrint(("OpenProcess %d\r\n",PID));  
  8. }  

3.深度校验字符串函数:


[cpp] view plain copy

  1. //深度的效验  
  2. BOOLEAN ValidateUnicodeString(PUNICODE_STRING usStr)  
  3. {  
  4.     ULONG i;  
  5.   
  6.     __try  
  7.     {  
  8.         if (!MmIsAddressValid(usStr))  
  9.         {  
  10.             return FALSE;  
  11.         }  
  12.         if (usStr->Buffer == NULL || usStr->Length == 0)  
  13.         {  
  14.             return FALSE;  
  15.         }  
  16.         for (i = 0; i < usStr->Length; i++)  
  17.         {  
  18.             if (!MmIsAddressValid((PUCHAR)usStr->Buffer + i))  
  19.             {  
  20.                 return FALSE;  
  21.             }  
  22.         }  
  23.   
  24.     }__except(EXCEPTION_EXECUTE_HANDLER){  
  25.   
  26.     }  
  27.     return TRUE;  
  28. }  



[cpp] view plain copy

  1. //验证一个WCHAR内容的指针是否可以访问  
  2. BOOLEAN ValidateWCHARString(WCHAR *pwzStr,ULONG_PTR Length)  
  3. {  
  4.     ULONG i;  
  5.   
  6.     __try  
  7.     {  
  8.         //第一步判断指针和大小是否为NULL,是的话就没必要验证了  
  9.         if  (pwzStr == NULL || Length == 0)  
  10.         {  
  11.             return FALSE;  
  12.         }  
  13.         //以length长度循环检查指针pwzStr里面的值  
  14.         for (i = 0; i < Length; i++)  
  15.         {  
  16.             //检查是否可以访问。  
  17.             if  (!MmIsAddressValid((PUCHAR)pwzStr + i))  
  18.             {  
  19.                 //只要有一个字节是不可读取  
  20.                 return FALSE;  
  21.             }  
  22.         }  
  23.   
  24.     }  
  25.         __except(EXCEPTION_EXECUTE_HANDLER)  
  26.         { //触发了异常  
  27.         return FALSE;  
  28.     }  
  29.     return TRUE;  
  30. }  


离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个