码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-26 08:06:08      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

http://blog.csdn.net/hgy413/article/details/7907057

 

1.如在ring3下,则要判断是否可读可写:

 

[cpp] view plaincopy
 
  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 plaincopy
 
  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 plaincopy
 
  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 plaincopy
 
    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. }  

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

标签:

原文地址:http://www.cnblogs.com/gamekk/p/4839942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!