Windows API和C Runtime对安全性的影响【浮生若梦】

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Windows API和C Runtime对安全性的影响

CopyMemory

VOID CopyMemory(PVOID Destination, CONST VOID *Source,DWORD Length); Destination 要复制内存块的目的地址。

Source 要复制内存块的源地址。

Length 指定要复制内存块的大小,单位为字节。

返回值该函数为VOID型,没有返回值。

头文件winbase.h.

注意一点CopyMemory和MoveMemory不过是RtlMoveMemory的一个别名而已。

示例代码段

char szname[50]="阵雨";

char szfriend[]="polelf,oo";

CopyMemory(szname+4,szfriend,10);

OutputDebugString(szname); //输出结果为"阵雨polelf,oo"

安全性评价

第一个参数Destination必须足以容纳count个字节的Source组合大小,否则就可能发生缓冲区溢出。这样,当发生违规访问时,应用程序就可能会遭到拒绝服务攻击,或者更坏,可能会使攻击者将可执行

代码注入到您的进程中。如果Destination是基于堆栈的缓冲区,则尤为如此。要注意的是,最后一个参数Length是要复制到Destination 的字节数,而不是Destination的大小。

以下代码示例演示了安全使用CopyMemory()的方法:

void test(char *pbData, unsigned int cbData)

{

char buf[BUFFER_SIZE];

CopyMemory(buf, pbData, min(cbData,BUFFER_SIZE));

}

CreateProcess

CreateProcessAsUser

CreateProcessWithLogonW

安全性评价

第一个参数lpApplicationName可以为NULL。在这种情况下,可执行程序的名称必须是lpCommandLine中第一个用空格分隔的字符串。但是,如果可执行程序的名称或路径名中有空格,则存在一定的风险,因为如果空格处理不当,就可能会运行恶意的可执行程序。以下示例是危险的,因为该进程将试图运行“Program.exe”(如果该程序存在),而不是“foo.exe”。

CreateProcess(NULL, "C:\Program Files\foo", ...)

如果恶意用户要在系统中创建名为“Program.exe”的特洛伊程序,那么任何使用“Program Files”目录不正确地调用CreateProcess的程序都将启动特洛伊程序,而不是要调用的应用程序。

注意不要为lpApplicationName传递NULL,以避免函数根据其运行时参数来分析并确定可执行文件路径名。如果lpApplicationName 一定要为NULL,则用引号将lpCommandLine中的可执行路径引起,如下例所示。

CreateProcess(NULL, "\"C:\Program Files\foo.exe\" -L -S", ...)

WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

BOOL CreateProcess

(LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes。

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation);

参数

1.lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于lpCommandLine 参数的最前面并由空格符与后面的字符分开。这个被指定的模块可以是一个Win32应用程序。如果适当的子系统在当前计算机上可用的话,它也可以是其他类型的模块(如MS-DOS 或OS/2)。在Windows NT 中,如果可执行模块是一个16位的应用程序,那么这个参数应该被设置为NULL并且应该在lpCommandLine参数中指定可执行模块的名称。16位的应用程序是以DOS虚拟机或Win32上的Windows(WOW)为进程的方式运行。

2.lpCommandLine:指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当作要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。如果lpApplicationName参数为空,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。如果文件名以一个点(.)结尾且没有扩展名,或文件名中包含路径,.exe 将不会被加到后面。如果文件名中不包含路径,Windows将按照如下顺序寻找这个可执行

相关文档
最新文档