电脑报C:\WINNT\system32\services.exe:KERNEL32.LoadLibraryA缓冲区溢出是怎么回事?

来自:    更新日期:早些时候
MACFEE老提示C:\WINDOWS\system32\svchost.exe:KERNEL32.LoadLibraryA缓冲区溢出是怎么回事?~

老大 我也一直出现这个问题 难兄难弟啊

一般来说,是你的机子被攻击了,出现这种情况,应该都是在局域网的情况下,特别是在单位的时候

你滴电脑被攻击拉!
估计你的已经成了肉鸡了!
具体的就是这个了!我复制的呵呵!希望对你有帮助
DLL的远程注入技术

作者:未知 文章来源:网络 点击数:198 更新时间:2006-3-23

DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运行。这样一来,普通的进程管理器就很难发现这种病毒了,而且即使发现了也很难清除,因为只要病毒寄生的进程不终止运行,那么这个DLL就不会在内存中卸载,用户也就无法在资源管理器中删除这个DLL文件,真可谓一箭双雕哉。
记得2003年QQ尾巴病毒肆虐的时候,就已经有些尾巴病毒的变种在使用这种技术了。到了2004年初,我曾经尝试着仿真了一个QQ尾巴病毒,但独是跳过了DLL的远程加载技术。直到最近在学校论坛上看到了几位朋友在探讨这一技术,便忍不住将这一尘封已久的技术从我的记忆中拣了出来,以满足广大的技术爱好者们。

必备知识

在阅读本文之前,你需要了解以下几个API函数:

OpenProcess - 用于打开要寄生的目标进程。
VirtualAllocEx/VirtualFreeEx - 用于在目标进程中分配/释放内存空间。
WriteProcessMemory - 用于在目标进程中写入要加载的DLL名称。
CreateRemoteThread - 远程加载DLL的核心内容,用于控制目标进程调用API函数。
LoadLibrary - 目标进程通过调用此函数来加载病毒DLL。

在此我只给出了简要的函数说明,关于函数的详细功能和介绍请参阅MSDN。

示例程序

我将在以下的篇幅中用一个简单的示例Virus.exe来实现这一技术。这个示例的界面如下图:

首先运行Target.exe,这个文件是一个用Win32 Application向导生成的“Hello, World”程序,用来作为寄生的目标进程。
然后在界面的编辑控件中输入进程的名称“Target.exe”,单击“注入DLL”按钮,这时候Virus.exe就会将当前目录下的DLL.dll注入至Target.exe进程中。
在注入DLL.dll之后,你也可以单击“卸载DLL”来将已经注入的DLL卸载。
点这里下载示例程序

模拟的病毒体DLL.dll

这是一个简单的Win32 DLL程序,它仅由一个入口函数DllMain组成:

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
switch ( fdwReason )
{
case DLL_PROCESS_ATTACH:
{
MessageBox( NULL, _T("DLL已进入目标进程。"), _T("信息"), MB_ICONINFORMATION );
}
break;
case DLL_PROCESS_DETACH:
{
MessageBox( NULL, _T("DLL已从目标进程卸载。"), _T("信息"), MB_ICONINFORMATION );
}
break;
}
return TRUE;
}

如你所见,这里我在DLL被加载和卸载的时候调用了MessageBox,这是用来显示我的远程注入/卸载工作是否成功完成。而对于一个真正的病毒体来说,它往往就是处理DLL_PROCESS_ATTACH事件,在其中加入了启动病毒代码的部分:

case DLL_PROCESS_ATTACH:
{
StartVirus();
}
break;

注入!

现在要开始我们的注入工作了。首先,我们需要找到目标进程:

DWORD FindTarget( LPCTSTR lpszProcess )
{
DWORD dwRet = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof( PROCESSENTRY32 );
Process32First( hSnapshot, &pe32 );
do
{
if ( lstrcmpi( pe32.szExeFile, lpszProcess ) == 0 )
{
dwRet = pe32.th32ProcessID;
break;
}
} while ( Process32Next( hSnapshot, &pe32 ) );
CloseHandle( hSnapshot );
return dwRet;
}

这里我使用了Tool Help函数库,当然如果你是NT系统的话,也可以选择PSAPI函数库。这段代码的目的就是通过给定的进程名称来在当前系统中查找相应的进程,并返回该进程的ID。得到进程ID后,就可以调用OpenProcess来打开目标进程了:

// 打开目标进程
HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessID );

现在有必要说一下OpenProcess第一个参数所指定的三种权限。在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都相互独立。如果一个进程需要完成跨进程的工作的话,那么它必须拥有目标进程的相应操作权限。在这里,PROCESS_CREATE_THREAD表示我可以通过返回的进程句柄在该进程中创建新的线程,也就是调用CreateRemoteThread的权限;同理,PROCESS_VM_OPERATION则表示在该进程中分配/释放内存的权限,也就是调用VirtualAllocEx/VirtualFreeEx的权限;PROCESS_VM_WRITE表示可以向该进程的地址空间写入数据,也就是调用WriteProcessMemory的权限。
至此目标进程已经打开,那么我们该如何来将DLL注入其中呢?在这之前,我请你看一行代码,是如何在本进程内显式加载DLL的:

HMODULE hDll = LoadLibrary( "DLL.dll" );

那么,如果能控制目标进程调用LoadLibrary,不就可以完成DLL的远程注入了么?的确是这样,我们可以通过CreateRemoteThread将LoadLibrary作为目标进程的一个线程来启动,这样就可以完成“控制目标进程调用LoadLibrary”的工作了。到这里,也许你会想当然地写下类似这样的代码:

DWORD dwID;
LPVOID pFunc = LoadLibraryA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)"DLL.dll", 0, &dwID );

不过结果肯定会让你大失所望——注入DLL失败!
嗯嗯,那么现在让我们来分析一下失败的原因吧。我是前说过,在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。在这里,我们当作参数传入的字符串"DLL.dll"其实是一个数值,它表示这个字符串位于Virus.exe地址空间之中的地址,而这个地址在传给Target.exe之后,它指向的东西就失去了有效性。举个例子来说,譬如A、B两栋大楼,我住在A楼的401;那么B楼的401住的是谁我当然不能确定——也就是401这个门牌号在B楼失去了有效性,而且如果我想要入住B楼的话,我就必须请B楼的楼长为我在B楼中安排新的住处(当然这个新的住处是否401也就不一定了)。
由此看来,我就需要做这么一系列略显繁杂的手续——首先在Target.exe目标进程中分配一段内存空间,然后向这段空间写入我要加载的DLL名称,最后再调用CreateRemoteThread。这段代码就成了这样:

// 向目标进程地址空间写入DLL名称
DWORD dwSize, dwWritten;
dwSize = lstrlenA( lpszDll ) + 1;
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
if ( NULL == lpBuf )
{
CloseHandle( hProcess );
// 失败处理
}
if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )
{
// 要写入字节数与实际写入字节数不相等,仍属失败
if ( dwWritten != dwSize )
{
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hProcess );
// 失败处理
}
}
else
{
CloseHandle( hProcess );
// 失败处理
}
// 使目标进程调用LoadLibrary,加载DLL
DWORD dwID;
LPVOID pFunc = LoadLibraryA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );

需要说的有两点,一是由于我要在目标进程中为ANSI字符串来分配内存空间,所以这里凡是和目标进程相关的部分,都明确使用了后缀为“A”的API函数——当然,如果要使用Unicode字符串的话,可以换作后缀是“W”的API;第二,在这里LoadLibrary的指针我是取的本进程的LoadLibraryA的地址,这是因为LoadLibraryA/LoadLibraryW位于kernel32.dll之中,而Win32下每个应用程序都会把kernel32.dll加载到进程地址空间中一个固定的地址,所以这里的函数地址在Target.exe中也是有效的。
在调用LoadLibrary完毕之后,我们就可以做收尾工作了:

// 等待LoadLibrary加载完毕
WaitForSingleObject( hThread, INFINITE );
// 释放目标进程中申请的空间
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hThread );
CloseHandle( hProcess );

在此解释一下WaitForSingleObject一句。由于我们是通过CreateRemoteThread在目标进程中另外开辟了一个LoadLibrary的线程,所以我们必须等待这个线程运行完毕才能够释放那段先前申请的内存。
好了,现在你可以尝试着整理这些代码并编译运行。运行Target.exe,然后开启一个有模块查看功能的进程查看工具(在这里我使用我的July)来查看Target.exe的模块,你会发现在注入DLL之前,Target.exe中并没有DLL.dll的存在:

在调用了注入代码之后,DLL.dll就位于Target.exe的模块列表之中了:

矛盾相生

记得2004年初我将QQ尾巴病毒成功仿真后,有很多网友询问我如何才能杀毒,不过我都没有回答——因为当时我研究的重点并非病毒的寄生特性。这一寄生特性直到今天可以说我才仿真完毕,那么,我就将解毒的方法也一并公开吧。
和DLL的注入过程类似,只不过在这里使用了两个API:GetModuleHandle和FreeLibrary。出于篇幅考虑,我略去了与注入部分相似或相同的代码:

// 使目标进程调用GetModuleHandle,获得DLL在目标进程中的句柄
DWORD dwHandle, dwID;
LPVOID pFunc = GetModuleHandleA;
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
// 等待GetModuleHandle运行完毕
WaitForSingleObject( hThread, INFINITE );
// 获得GetModuleHandle的返回值
GetExitCodeThread( hThread, &dwHandle );
// 释放目标进程中申请的空间
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hThread );
// 使目标进程调用FreeLibrary,卸载DLL
pFunc = FreeLibrary;
hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)dwHandle, 0, &dwID );
// 等待FreeLibrary卸载完毕
WaitForSingleObject( hThread, INFINITE );
CloseHandle( hThread );
CloseHandle( hProcess );

用这个方法可以卸载一个进程中的DLL模块,当然包括那些非病毒体的DLL。所以,这段代码还是谨慎使用为好。
在完成卸载之后,如果没有别的程序加载这个DLL,你就可以将它删除了。

到此为止,整个的技术细节我就讲完了。不过,我还是不能免俗地再次强调:李马发表本文及其源代码仅作技术讨论之用,请勿将此技术用作破坏之途,李马本人也不为各种可能出现的后果负任何责任

这个问题其实是当网页打开时有上传下载或软件有下载行为时是存在缓存区的帐户权限溢出,有可能造成病毒或木马的权限提升.
一般来说当有缓冲区溢出,在我们硬盘缓存区(IE的临时文件夹)中才能打开网页.
当下载软件的网页插件侦测到网页中有下载命令时会自动启动下载软件,这时下载软件的临时文件区也会发生缓冲区溢出,但不会发生恶意行为
WINDOWS的缓冲区溢出补丁是最多的也是WINDOWS最弱的地方,最容易受到攻击的地方
MACFEE的这个功能就是把这个缓冲区溢出的权限控制起来防止恶意行为发生权限提升


电脑报C:\WINNT\system32\services.exe:KERNEL32.LoadLibraryA缓冲区溢出是怎么回事?视频

相关评论:
  • 19855334514电脑报文件或目录C:\\windows\\prefetch\\下若干文件已损坏且无法读取。请...
    闻蓓胃1、U盘安装:下载个经过验证的系统安装盘文件(ISO文件),用ultraiso软件做个安装系统的启动u盘,用这个做好的系统u盘引导启动机器后,即可顺利安装系统的;2、硬盘安装:前提是,需要有一个可以正常运行的Windows系统,提取下载的ISO文件中的“*.GHO”和“安装系统.EXE”到电脑的非系统分区,然后运行“...

  • 19855334514电脑报C1633故障码的具体含义是什么?
    闻蓓胃当遇到这个故障码,其核心含义是电子转向助力的控制单元未能接收到车辆的行驶速度信息。因为电脑需要依据实时的车速变化,调整其提供助力的强度。一旦信号中断,系统会自动记录这个故障码,并切换到备份模式,以固定80公里\/小时的速度提供助力。常见的原因包括:首先,轮速传感器可能出现了故障,它负责将车轮转动...

  • 19855334514电脑报c:\\windows\\temp\\vonepf_1.exe后速度极慢
    闻蓓胃这个位置的可执行文件不正常,这个位置是临时文件夹.结束掉后杀毒再看.

  • 19855334514电脑报C:\\WINNT\\system32\\services.exe:KERNEL32.LoadLibraryA缓冲区...
    闻蓓胃这几天macfee扫描老报C:\\WINNT\\system32\\services.exe:KERNEL32.LoadLibraryA缓冲区溢出:可写缓冲区溢出:堆被缓冲区溢出保护阻挡... 这几天macfee扫描老报C:\\WINNT\\system32\\services.exe:KERNEL32.LoadLibraryA缓冲区溢出: 可写 缓冲区溢出: 堆被缓冲区溢出保护阻挡 展开  我来答 2个回答 #热议# 职场上受委...

  • 19855334514电脑报C0000218是什么故障
    闻蓓胃这个代码,主要是:“内存有错误”或“非正常关机”引起!这是解决方法:1。试试开机,出完电脑品牌后,按F8,安全模式,光标选定:最后一次正确配置,回车,回车,按下去!【关键一步】2。再不行,进安全模式,回车,到桌面后,杀毒软件,全盘杀毒!“隔离区”的东西,彻底删除!3。再使用:360安全...

  • 19855334514电脑报报纸介绍
    闻蓓胃成为电脑爱好者和初学者的首选读物,每本售价仅为3元人民币。电脑报分为多个板块,包括新闻评论(A)、评测实验室(B)、笔记本整机(C)、平板数码(D)、硬件发烧友(E)、APP软件(F),以及专门的“i企业”周刊和科技新知的月末刊,全面满足各类读者的需求,展现了其内容的丰富多样。

  • 19855334514电脑报的资料
    闻蓓胃现在的售价为人民币2.5元。电脑报分为A(新闻评论周刊)、B(笔记本整机周刊)、C(消费电子周刊)、D(硬件评测周刊)、E(游戏娱乐周刊)、F(网络软件周刊)六大板块,外加当地所在省的市场情况的介绍。1997年2月,《电脑报》官方网站www.cpcw.com首度亮相;1999年1月,CPCW被CNNIC评为中国十大...

  • 19855334514电脑报0xc0000fd错怎么解决啊?
    闻蓓胃1、清除一下IE浏览器的缓存,点IE上的工具——然后再选择最下面的Internet选项,再点Internet删除文件(记得勾上删除所有脱机内容),确定后再重新打开IE浏览器试试,同时请确认您使用的是IE6.0及以上版本。2、您的网页上清缓存,在网页上选择工具->Interner选项->删除Cookies和删除文件,然后再确定。3、请...

  • 19855334514别克君越手刹电脑报C056-71
    闻蓓胃系统停用信息储存故障。别克君越手刹电脑报C056-71系统停用信息储存,驻车制动控制模块,用解码器消除看看。有时候是偶发性故障,消了就好了。

  • 19855334514众泰ABS内部故障C1055
    闻蓓胃这个故障码含义是ABS电脑报内部故障,先删除试一下,如果删不了直接更换ABS泵吧。众泰汽车是以汽车整车研发、制造及销售为核心业务的汽车整车制造企业。自2016年以来,众泰汽车连续两年销量突破31万辆。目前,众泰汽车已在杭州、重庆、日本横滨和意大利都灵设立了四大研发中心,已形成了A、B、L三大技术平台...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网