'2009/08'에 해당되는 글 4

  1. 2009/08/20 [델파이] Virus.Win32.Induc.a 바이러스로 오늘 하루 땀 삐질
  2. 2009/08/14 휴가 가고 싶다
  3. 2009/08/14 [델파이] 특정 파일 선택 상태로 폴더 열기
  4. 2009/08/14 [델파이] ActiveX 임베디드한 웹브라우저 정보 구하는 몇가지

[델파이] Virus.Win32.Induc.a 바이러스로 오늘 하루 땀 삐질


델파이 4,5,6,7 버전을 사용하는 개발자들은 오늘 하루 진땀께나 나셨을 듯 하네요.

Delphi 4~7을 감염시키는 바이러스 유행중 이라는 글을 보시면 아시겠지만
델파이가 사용하는 특정 소스 파일 하나를 열어서 문자열을 덧붙인 다음에 재컴파일해서 원래 컴파일된 파일과 교체를 해버리는 바이러스입니다. 이렇게 감염된 델파이를 이용해 제작된 프로그램도 동일한 바이러스를 가지게 되는거죠. 이걸 다른 곳에서 실행하면 그 PC의 델파이 환경도 똑같이 감염이 되는 겁니다. 다소 장난스러운 짓을 하는데요.. 이 바이러스가 악의적인 짓을 하거나 시스템 문제를 일으키는 바이러스는 아닙니다만.. 그래도 찜찜한 건 어쩔 수 없죠.. 내 컴퓨터를 나도 모르게 함부로 조작했으니.. 그리고 악의적으로 만들었다면 문제는 심각할 수 있는 거구요.

문제는... 

몇일전에 외국에서 이걸 알아내고 바이러스로 규정했는데..
백신회사들이 오늘 아침부터 이걸 Virus.Win32.Induc.a 라고 해서 체크항목에 포함되면서부터입니다.

치료하는 방법으로는 프로그램 종료 후 치료하는 경우가 있고, 아예 프로그램을 삭제하는 경우가 있었는데요.
배포된 프로그램들이 종료가 되버리고, 경우에 따라 삭제까지 되어버리니 난리가 날 수 밖에요.

개인적으로도 오늘 아침에 무지 바빴구요.
특히 서버 프로그램이 그냥 종료가 되어버리니까 서비스에 차질이 생겨버리고 여기저기서 전화오고 -_-

감염된 델파이 환경은 Delphi 4~7을 감염시키는 바이러스 유행중 에 나와있듯이 아래처럼 해결하시면 되겠구요.

피씨의 Delphi 4, 5, 6, 7이 설치된 디렉토리에서 sysconst.bak 파일이 있는지 검사해서 있다면 감염된 것입니다. sysconst.bak 파일이 존재하는 경우, 즉 감염된 경우에는 원래의 원본 sysconst.dcu 파일이 확장자가 .bak으로 리네임된 것이고 sysconst.dcu 이름의 파일이 감염된 파일입니다. 따라서 sysconst.dcu 파일을 삭제한 후 sysconst.bak 파일의 확장자를 dcu로 변경해주기만 하면 됩니다.


백신을 돌려서 PC 전체를 한 번 검사해보세요. 감염된 프로그램이 있으면 치료 받으시구요...
저작자 표시 비영리 변경 금지

Trackback 1 Comment 0

휴가 가고 싶다


날은 덥고..
몸은 지치고..
다 잘먹고..
 잘살자고..
 하는 짓인데..

나도 휴가라는 걸 가보고 싶구나..
휴가 안가본지 몇년째.. (ㅡ_-)


호핑투어
호핑투어 by JaeYong, BAE
저작자 표시변경 금지
저작자 표시 비영리 변경 금지

Trackback 0 Comment 0

[델파이] 특정 파일 선택 상태로 폴더 열기



보통 폴더 열때 아래처럼 사용을 합니다.

ShellExecute(Handle, 'open', PChar('C:\Data'), nil, nil, SW_SHOWNORMAL);


근데 파일 다운로드하고 폴더 열때 다운로드한 파일이 선택된 상태로 열려면 아래처럼 하시면 됩니다.

ShellExecute(Handle, 'open', 'explorer.exe', PChar('/select,"C:\Data\text.exe"'), nil, SW_SHOWNORMAL);


explorer.exe 의 옵션 중에 /select 라는 게 있더군요.

근데 하나의 파일은 되는데.. 여러 파일이 선택된 상태로 여는 건 어떻게 하는지 궁금.. ^^
저작자 표시 비영리 변경 금지

Trackback 0 Comment 0

[델파이] ActiveX 임베디드한 웹브라우저 정보 구하는 몇가지


예전에 웹채팅하면서 사용한 코드 중에서..
특히 GetTopBrowser 이 놈은 유용한데..
IWebBrowser2 를 얻어서 해당 웹브라우저의 핸들값(.HWND)을 구할 수 있기 때문입니다.
SID_STopLevelBrowser 을 이용해 프레임 깊숙이 박힌 ActiveX 일지라도 해당 탑 브라우저를 얻어내도록 합니다.

const
SID_STopLevelBrowser: TGUID = (D1:$4C96BE40; D2:$915C; D3:$11CF; D4:($99, $D3, $00, $AA, $00, $4A, $E8, $37));

function TXChat.GetSite(obj: IInterface): IOleClientSite;
var
Site: IOleClientSite;
OleObj: IOleObject;
begin
Result := nil;
if SUCCEEDED(obj.QueryInterface(IOleObject, OleObj)) and (OleObj <> nil) then
  if SUCCEEDED(OleObj.GetClientSite(Site)) and(Site <> nil) then
   Result := Site;
end;

function TXChat.GetDocument: IHTMLDocument2;
var
Site: IOleClientSite;
Container: IOleContainer;
Document: IHTMLDocument2;
begin
Result := nil;
Site := GetSite(ComObject);
if Site = nil then Exit;
if SUCCEEDED(Site.GetContainer(Container)) and (Container <> nil) then
  if SUCCEEDED(Container.QueryInterface(IHTMLDocument2, Document)) and (Document <> nil) then
   Result := Document;
end;

function TXChat.GetTopBrowser: IWebBrowser2;
var
Site: IOleClientSite;
ServiceProvider: IServiceProvider;
ServiceProviderTop: IServiceProvider;
Browser: IWebBrowser2;
begin
Result := nil;
Site := GetSite(ComObject);
if Site = nil then Exit;
if SUCCEEDED(Site.QueryInterface(IServiceProvider, ServiceProvider)) and (ServiceProvider <> nil) then
  if SUCCEEDED(ServiceProvider.QueryService(SID_STopLevelBrowser,
IServiceProvider, ServiceProviderTop)) and (ServiceProviderTop <> nil) then
   if SUCCEEDED(ServiceProviderTop.QueryService(IID_IWebBrowserApp, IWebBrowser2, Browser)) and (Browser <> nil) then
    Result := Browser;
end;


저작자 표시 비영리 변경 금지

Trackback 0 Comment 0