HanDs
管理员

[Visual Studio文章] 学习熊猫烧香的几个问题 



1、熊猫烧香的指导思想:

         它要感染文件,所以要遍历所有磁盘上的文件:

     所以先确定本机的所有磁盘盘符和网络盘符。用GetDrives函数和GetDriveType() API函数找出有效逻辑盘。

在某个磁盘中找文件。用FindFirstFindNext找文件;IsValidDir()判断是否为目录,不是目录即为文件,判断什么类型的文件:

.EXE .SCR

.HTM .HTML .ASP

       .WAB  //Outlook地址簿文件

.ADC  //Foxmail地址自动完成文件

.IND  //Foxmail地址簿文件

是日文代码页摧毁一下文件:

(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

 

 

2、程序开始

       RegisterServiceProcess()函数只有在wind98才可以使用,在XP下调用API函数RegisterServiceProcess出现无法找到DLL入口。如何解决?

 

3ExtractFileName(ParamStr(0))提取本程序文件名函数

       VCL函数Paramstr(n)的作用是返回当前可执行文件指定的命令行参数;当n=0时,返回当前可执行文件名(包含完整的路径)。

       ExtractFileName() 是提取文件名和扩展名,不包括路径如:sh.exe

4、自定义过程 ExtractFile(FileName: string)  把合并的文件分离

把合并的文件分离,即将宿主文件从已感染的PE文件中分离出来。

何为PE文件:PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXEDLLOCXSYSCOM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL

       它利用文件流对象来进行分离。即TFileStream对象。见我的博客2010-04-20 "怎样把Delphi程序嵌入到其他程序中"

5、自定义过程 FillStartupInfo (var Si: STARTUPINFO; State: Word);

       填充STARTUPINFO结构。STARTUPINFO结构是

 

 

6CreateProcess(PChar(TmpFile), PChar(TmpFile),nil,nil,True,0,nil,'.',Si,Pi)

建立进程的函数,注意和建立线程函数的区别。

进程控制的意义在于可以创建一个进程,并可以通过进程句柄结束进程。     
创建进程的函数为CreateProcess,该函数比较复杂共有十个参数。

BOOL   CreateProcess(  
      LPCTSTR   lpApplicationName,   //  
执行程序文件名  
      LPTSTR   lpCommandLine,     //  
参数行  
      LPSECURITY_ATTRIBUTES   lpProcessAttributes,     //  
进程安全参数  
      LPSECURITY_ATTRIBUTES   lpThreadAttributes,       //  
线程安全参数  
      BOOL   bInheritHandles,     //  
继承标记  
      DWORD   dwCreationFlags,   //  
创建标记  
      LPVOID   lpEnvironment,     //  
环境变量  
      LPCTSTR   lpCurrentDirectory,       //  
运行该子进程的初始目录  
      LPSTARTUPINFO   lpStartupInfo,     //  
创建该子进程的相关参数  
      LPPROCESS_INFORMATION   lpProcessInformation     // 
创建后用于被创建子进程的信息  
);  

lpApplicationName:为执行程序的文件名,如果在创建进程时要使用参数,则该参数可以为NULL  
   
lpCommandLine
:为参数行,如果无参数可以为NULL,在有参数传递给进程时如下设置:lpApplicationName=NULLlpCommandLine=para,例如lpCommandLine="c:\\windows\\notepad.exe   c:\\autoexec.bat"    
   
lpProcessAttributes
lpThreadAttributes:分别描述了创建的进程和线程安全属性,如果使用NULL表示使用默认的安全描述。  
   
bInheritHandles
:表示当前进程中的打开的句柄是否能够被创建的子进程所继承。  
   
dwCreationFlags
:表示创建标记,通过该标记可以设置进程的创建状态和优先级别。常用的有下面的标记:  
   
CREATE_NEW_CONSOLE
:为子进程创建一个新的控制台。    
CREATE_SUSPENDED
:子进程在创建时为挂起状态。    
HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS
:高/普通优先级别。    
lpEnvironment
:表示子进程所使用的环境变量,如果为NULL,则表示与当前进程使用相同的环境变量。  
   
lpCurrentDirectory
:表示子进程运行的初始目录。  
   
lpStartupInfo
:用于在创建子进程时设置各种属性。该结构定义如下:  
   
typedef   struct   _STARTUPINFO   {   //   si    
          DWORD       cb;   //
结构长度  
          LPTSTR     lpReserved;   //
保留  
          LPTSTR     lpDesktop;   //
保留  
          LPTSTR     lpTitle;   //
如果为控制台进程则为显示的标题  
          DWORD       dwX;   //
窗口位置  
          DWORD       dwY;   //
窗口位置  
          DWORD       dwXSize;   //
窗口大小  
          DWORD       dwYSize;   //
窗口大小  
          DWORD       dwXCountChars;   //
控制台窗口字符号宽度  
          DWORD       dwYCountChars;   //
控制台窗口字符号高度  
          DWORD       dwFillAttribute;   //
控制台窗口填充模式  
          DWORD       dwFlags;   //
创建标记  
          WORD         wShowWindow;   //
窗口显示标记如同ShowWindow中的标记  
          WORD         cbReserved2;   //  
          LPBYTE     lpReserved2;   //  
          HANDLE     hStdInput;   //
标准输入句柄  
          HANDLE     hStdOutput;   //
标准输出句柄  
          HANDLE     hStdError;   //
标准错误句柄  
}   STARTUPINFO,   *LPSTARTUPINFO;    
   
如果要使结构中相关的分量起作用,必须正确的设置dwFlags。例如:dwFlags包含STARTF_USESIZE表示dwXSizedwYSize有效,包含STARTF_USEPOSITION表示dwXdwY有效。  
   
lpProcessInformation
:用来在进程创建后接收相关信息,该结构由系统填写。  
   
typedef   struct   _PROCESS_INFORMATION   {   //   pi    
          HANDLE   hProcess;   //
进程句柄  
          HANDLE   hThread;   //
进程的主线程句柄  
          DWORD   dwProcessId;   //
进程ID  
          DWORD   dwThreadId;   //
进程的主线程ID  
}   PROCESS_INFORMATION;  

7Windows Api函数GetACP  

返回Windows ANSI code page的数值,用来判断语言类型

Windows Api函数VB版:GetACP

API函数、数据结构、常数VB声明格式(原创:飞娥软件技术交流平台www.Feiesoft.com

Declare Function GetACP Lib "kernel32" Alias "GetACP" () As Long

API函数、数据结构、常数VB说明

判断目前正在生效的ANSI代码页

API函数返回值

Long,目前活动ANSI代码页的标识符。针对一种特定的语言,可能存在多个这样的代码页。可能的代码页包括下面这些:

874

泰语

932

日语

936

中文(简体)

949

朝鲜语

950

中文(台湾和香港繁体)

1200

Unicode

1250

东欧语言

1251

西里尔语

1252

美国和西欧语言

1253

希腊语

1254

土耳其语

1255

希伯来语

1256

阿拉伯语

1257

波罗的语

注解

不要混淆ANSI代码页与OEM代码页的概念!ANSI代码页为不同版本的windows定义标准的ANSI 8位字符集。而OEM代码页指定基础DOS代码页,由系统及键盘使用


飞娥软件技术交流平台www.Feiesoft.com

 

 

8、自定义函数GetDrives()  返回所有在本地计算机中定义的逻辑驱动器的名称

 

9API函数GetDriveType()函数  判断一个磁盘驱动器的类型

       for i := 0 to 25 do //遍历26个字母

    begin

D := Chr(i + 65);//大写字母AASCII值为65

      Str := D + ':\';

DiskType := GetDriveType(PChar(Str));

返回值

DRIVE_UNKNOWN 未知的磁盘类型

  DRIVE_NO_ROOT_DIR 说明lpRootPathName是无效的

  DRIVE_REMOVABLE 可移动磁盘

  DRIVE_FIXED 固定磁盘

  DRIVE_REMOTE 网络磁盘

  DRIVE_CDROM 光驱

  DRIVE_RAMDISK RAM

 

10、小技巧:字符串可以表示成数组

         DriverList: string;//声明一个字符串

         DriverList=’abcd’;

         DriverList[i]      //转换成数组

        

11、自定义过程  LoopFiles(DriverList[i] + ':\', '*.*')

         { 遍历目录,感染和摧毁文件 }

         总体作用:

1)、先找驱动器,在驱动器上判断是否为目录,不是目录,则判断文件类型:

.EXE .SCR  感染可执行文件

.HTM .HTML .ASP      //感染HTMLASP文件,将Base64编码后的病毒写入

                         //感染浏览此网页的所有用户

       .WAB  //Outlook地址簿文件

.ADC  //Foxmail地址自动完成文件

.IND  //Foxmail地址簿文件

是日文代码页摧毁一下文件:

(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

2)、先找驱动器,在驱动器上判断是否为目录,如果是目录,则递归调用LoopFiles(Path, Mask: string),找每个目录下的文件,感染之。

      

 

 

12、函数声明可以在过程中

         procedure LoopFiles(Path, Mask: string);

var

             i, Count: Integer;

       function IsValidDir(SearchRec: TSearchRec): Integer;

      begin

       if (SearchRec.Attr <> 16) then

       ………

      end;

begin

       ……….

       ……….

end;

 

 

 

13FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

         参数Path是路径。如:d:\

 

参数Attr是如下常数:是要找的文件类型,Any file文件是包括文件和目录

Constant                    Value                Description
faReadOnly              $00000001      Read-only files
faHidden                   $00000002      Hidden files
faSysFile                   $00000004      System files
faVolumeID              $00000008       Volume ID files
faDirectory               $00000010       Directory files
faArchive                  $00000020      Archive files
faAnyFile                   $0000003F      Any file

 

参数F是返回值,通过返回值可以进一步在判断文件的类型。TSearchRec定义如下:

  TSearchRec = record

    Time: Integer;

    Size: Integer;

    Attr: Integer;

    Name: TFileName;

    ExcludeAttr: Integer;

{$IFDEF MSWINDOWS}

    FindHandle: THandle  platform;

    FindData: TWin32FindData  platform;

{$ENDIF}

{$IFDEF LINUX}

    Mode: mode_t  platform;

    FindHandle: Pointer  platform;

    PathOnly: String  platform;

    Pattern: String  platform;

{$ENDIF}

  end;

 

delphifindfirst说明  Units  SysUtils

FindFirst是用来寻找目标目录下的第一个文件,FindNext则是寻找下一个。TSearchRec是一个文件信息的纪录, FindFirst返回SearchRec。你可以通过SearchRec.Attr获取文件的类型(目录看做文件),通过SearchRec.Name获取文件名,通过SearchRec.Size获取文件大小等信息。

在指定的文件目录内,搜寻符合特定属性参数的文件,如果成功地查找到符合条件的文件,则函数返回0,否则函数返回一个错误。

 

14、自定义过程InfectOneFile(FileName: string)  { 感染PE文件 }

 

       检查PE文件头的方法要学会。利用以下方法:

 

SrcStream := TFileStream.Create(FileName, fmOpenRead)

       IcoStream := TMemoryStream.Create;

       aIcon := TIcon.Create;

 

TFileStream

       TMemoryStream

       TIcon

 

15、自定义过程SmashFile(FileName: string); { 将目标文件写入垃圾码后删除 }

 

SetFileAttributes(PChar(FileName), 0); //去掉只读属性


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
学习 熊猫 烧香 几个问题
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复