삽질2008.12.05 16:24
어떤 프로그램 크랙을 위해서 특정 파일을 받아서 실행하고 나서 크랙도 안되고

윈도우 사용중에  불특정하게 계속 블루스크린이 떠서 Crash Dump 파일을 분석했다.

볼것도 없이 GTHOOK.sys 파일의 문제였다.



구글신께 물어보니 루트킷 -_-;; ㅎㄷㄷ

[SSDT HOOK / Hooking]    <\??\C:\WINDOWS\system32\drivers\GTHOOK.sys>

바로 찾아서 삭제하고 레지스트리의 서비스도 지워주니까 바로 정상 작동하였다.

요즘엔 크랙도 조심해서 써야 겠다.

-- 추가 --

이놈의 모체가 있었다. server.exe라는 파일로 Windows방안에 있었다.

무려 RemoteStorage라는 이름으로 서비스를 돌고있었고, 이놈이 계속 GTHOOK.sys를 생성하고 등록하고 있었다.

윈속 DLL을 가지고 어디로 연결을 해서 정보를 다른곳으로 보내는 것 같았다.

192.168.1.2 라는 문자열까지만 확인했는데, 설마 내부망으로 -,.-
Posted by 꿍스

댓글을 달아 주세요

  1. 감사..ㅠㅜ

    감사합니다..ㅜ 저도 이 트로이잔 gthook.sys가 계속뜨고 해서 server.exe가 remotestorage로 인해 자꾸 방해 했었군요...^^ V3도 잘 못잡군요..ㅠㅜ

    2009.03.10 00:04 [ ADDR : EDIT/ DEL : REPLY ]
  2. 꿍스님도와주세요 ㅠㅠ

    이놈 어떻게지우나여ㅠㅠ 자꾸 system32 - drivers 에 GTHOOK 생성해내던데 ㅠㅠ

    어떻게지워욤 ㅠㅠㅠㅠ

    2009.06.05 22:30 [ ADDR : EDIT/ DEL : REPLY ]
    • windows 방안에 server.exe라는 파일이 있습니다.

      그 파일을 지우고 gthook.sys를 지워보세요.

      2009.06.08 20:39 신고 [ ADDR : EDIT/ DEL ]
  3. 도와주세요 ㅠ

    윈도우방안에 server.exe이런파일이있나여? 없던것같은대 ㅠㅠ 아 맨날 블루스크린떠서 돌아버리겟어요 ㅠㅠ
    도와주세요

    2009.08.04 18:03 [ ADDR : EDIT/ DEL : REPLY ]
    • 켁 정확한 증상을 제가 안봐서 모르겠네요 ㅜ.ㅜ

      윈도우즈 방이나 시스템 방안에서 날짜순으로 정렬해서 최근에 생성된걸 지워보시구요

      레지스트리 에디터에서 gthook.sys로 검색하셔서 다 지워보세요.

      2009.08.07 15:42 신고 [ ADDR : EDIT/ DEL ]
  4. 헬미

    윈도우방안에 찾아봣더니PF파일로 server.exe가 잇더군요 이걸지우면되는건가요 ㅜ?

    2009.08.11 09:50 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 그걸 지우고 gthook.sys를 지우시면 됩니다. ^^

      레지스트리에서도 gthook.sys를 검색해서 지우시면 되구요 ^^

      2009.08.11 13:27 신고 [ ADDR : EDIT/ DEL ]
  5. 어휴.....

    이놈 진짜 개악질이더군요..; 이놈때문에 2틀동안 안전모드로 켜서 V3lite로 찾아서 지우고 했는데 계속생겨서 또 찾고지우고 하다가 얼마나 해댔는지; 나중에 v3로 검색하니까 아예 검색조차 안돼더군요.; 그래서 카스퍼스키를 한번 써봤는데 v3에서 안잡히던 바이러스 160몇개가 쫘르륵..역시 세계1위와 무료백신의 차이가;; 그리고 이놈은 그래도 리붓하니까 계속생기던데 직접 경로로 들어가서 잡으니까 잡히더군요; 얼마나 악질인지; 그리고 제경우는 system32방에 있었어요 근데 찾기 검색으로는 안잡히던데 숨어있어서 그런건지; 어쩄든 지금은 다 완치됐구요 ㅠㅠ 님의 정보와 카스퍼스키의힘 ㅎㅎ; 한가지 저처럼 초보자들은 위한 팁을 알았는데 부팅하고나서 1분정도 켜져있을때 바로 경로로 들어가서 gthook.sys 이놈을 빨리 지우면 리붓돼는일은 없더군요; 모체를 안잡아서 계속생겨나긴하지만 어쨌든 빠르게 지우고나서 카스퍼스키같은백신으로 잡으면 될것같네요.. 저같은 아픔을 겪으실분이 안생기길..ㄷㄷ

    2009.09.13 20:59 [ ADDR : EDIT/ DEL : REPLY ]
  6. 꿍스님헬프미

    ㅠ.ㅠ 꿍스님 맨날 블루스크린떠서 V3로 치료해도 개속 생기더니 제가 카스퍼스키 체험판을 받아서 치료를햇는대욤
    gthook.sys가 떳어요 그리고 server.exe도 떳는대 그냥 모두치료 눌르니까 '치료불가능한파일입니다'
    이런거뜨고 그다음에 잘못봤지만 어떤파일이 개속 gthook를 생성해내고 있습니다<<이말이떳어요 ㅠ
    그래서 맨날 컴퓨터 킨다음에 시스템32 들어가서 드라이버? 들어간다음에 gthook를 지우고 다음날 또지우고
    반복했는대요 본거지를 안잡아서 그런지 맨날 생성해내 더군요;,. 근대 제가 본거지를 찾는방법을 모르겟어요
    꿍스님말로는 server.exe를 지우고 gthook를 지우면 완치된다구 하셧잖아요 그런대 제가 검색을 해봣더니
    server.exe가 없더라구요 윗분말대루 숨어있는거같은데 윈도우 방안에 있다고 하셧잖아요 윈도우 방안이 윈도우에있는 모든 파일,풀더인가요 아니면 그냥 윈도우풀더 안에있는건가요? 제가 윈도우폴더랑 시스템 폴더에서
    S를 클릭 하니까 server.exe는 안보이구 다른것만보이던대 어떻개 찾는지 정확히 답변 해주시면 정말 감사하겠습니다.

    2009.09.24 19:57 [ ADDR : EDIT/ DEL : REPLY ]
  7. 해결법

    카스퍼스키 3개월 체험판을받아서 치료를하면 server.exe GTHOOK.sys이놈 두마리 잡히는대 처음에는
    치료안된다고 떳다가 개속 제부팅하구 치료하면 완치 됩니다 윗분 저도 처음엔 안됬는대 개속치료하니까 이제
    완치 됬슴 ㅎ

    2009.09.28 14:27 [ ADDR : EDIT/ DEL : REPLY ]

삽질2008.09.29 11:30

Minifilter 드라이버의 유저모드에서 \WINDDK\inc\ddk, \WINDDK\inc\api 를 추가하고도 Fillterxxx 함수를 사용할때 다음의 에러가 발생한다면

error C3861: 'FilterConnectCommunicationPort': 식별자를 찾을 수 없습니다.

stdafx.h 등에 선언되어있는 윈도우 버전 선언을 잘보자.

필터 매니저가 WinXP 서비스팩 2 부터 동작하기 때문에 그보다 높은 버전을 입력하거나 선언부분을 지우면 된다.

fltUser.h에 보면 다음과 같은 부분이 있다.

//
// IMPORTANT!!!!!
//
// This is how FltMgr was released (from oldest to newest)
// xpsp2, (srv03, w2ksp5), LH
//

//
// The defines items that are part of the filter manager baseline
//

#define FLT_MGR_BASELINE (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) || \
((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WINXPSP2))) || \
((OSVER(NTDDI_VERSION) == NTDDI_WS03) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) || \
(NTDDI_VERSION >= NTDDI_VISTA))

//
// This defines items that were added after XPSP2 was released. This means
// they are in Srv03 SP1, W2K SP5, and Longhorn
//

#define FLT_MGR_AFTER_XPSP2 (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) || \
((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) > SPVER(NTDDI_WINXPSP2))) || \
((OSVER(NTDDI_VERSION) == NTDDI_WS03) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) || \
(NTDDI_VERSION >= NTDDI_VISTA))

//
// This defines items that only exist in longhorn or later
//

#define FLT_MGR_LONGHORN (NTDDI_VERSION >= NTDDI_VISTA)



예를 들어 WTL 8 에서 생성한 코드에서

#define WINVER  0x0500
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200

부분을

#define WINVER  0x600
#define _WIN32_WINNT 0x0601
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200

바꾸어 주면된다. 윈도 2000 서비스팩 5에서도 필터매니저가 동작하나 보다.

Posted by 꿍스

댓글을 달아 주세요

삽질2008.09.10 00:18
Minifilter를 사용할때 유저모드 어플리케이션에서 FilterSendMessage로 필터로 메세지를 보내고 받을때

HRESULT
WINAPI

  FilterSendMessage(
    IN HANDLE  hPort,
    IN LPVOID  lpInBuffer OPTIONAL,
    IN DWORD  dwInBufferSize,
    IN OUT LPVOID  lpOutBuffer OPTIONAL,
    IN DWORD  dwOutBufferSize,
    OUT LPDWORD  lpBytesReturned
    ); 

lpInBuffer과 dwInBufferSize를 NULL, 0 으로 잡고 필터에 메세지를 보냈더니 리턴되는 HRESULT 값에 E_INVALIDARG 값으로 에러가 리턴되어 왔다. 분명히 WDK문서를 봐도 NULL이 될수 있다고 하는데 이상하다.

그래서 아무문자나 InBuffer에 입력하고 그 문자열 길이를 dwInBufferSize에 넣어주니 잘 동작한다.

검색해보니 나랑 비슷한 사례가 있다.

https://www.osronline.com/ShowThread.cfm?link=128683
Posted by 꿍스

댓글을 달아 주세요

삽질2008.09.04 14:36

WTL 8.0을 이용해서 개발하는 유저모드 어플리케이션에서 WDK 6001.18001 버전의 헤더파일이 필요해서

C:\WinDDK\6001.18001\inc\ddk 디렉토리를 포함디렉토리에 추가하고 빌드를 하니다음과 같은

오류가 났다.

1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6513) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6516) : error C2061: 구문 오류 : 식별자 '__RPC__deref_out_opt'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6519) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6522) : error C2061: 구문 오류 : 식별자 '__RPC__deref_out_opt'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6525) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6528) : error C2061: 구문 오류 : 식별자 '__RPC__deref_out_opt'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6531) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6534) : error C2061: 구문 오류 : 식별자 '__RPC__deref_out_opt'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6537) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6540) : error C2061: 구문 오류 : 식별자 '__RPC__deref_out_opt'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6543) : error C2061: 구문 오류 : 식별자 '__RPC__in'
1>c:\winddk\6001.18001\inc\ddk\mshtml.h(6543) : fatal error C1003: 오류 수가 100개를 초과했습니다. 컴파일을 중지합니다.

처음에는 mshtml.h에서 문제가 있는거 같아서 삭제를 해보고 수정도 해보고 했는데 좀더 근원적인 문제가 없을까 해서 뒤져봤지만 별 소득이 없었다. 그런중에 이것저것 시행착오를 거치다가

C:\WinDDK\6001.18001\inc\api 디렉토리를 포함디렉토리에 추가했더니 오류가 사라졌다.

Posted by 꿍스
TAG WDK

댓글을 달아 주세요

삽질2008.08.06 20:22
원본 : http://www.themssforum.com/Drivers/File-System-104809/

Will not work on x64 Vista/2008, also note that NtReadFile hook will not catch
paging IO.
- Maxim Shatskih, Windows DDK MVP

Using a SSDT hook driver for this is incredibly irresponsible. First as Max
pointed out, it will not work for X64, and it will not catch paging I/O.
Also, getting these right is harder than one thinks, and is likely to
destabilize the system. Also, the driver will immediately be flagged as
MALWARE. Following such a path for file operations that are easily
catchable with approved ways, is beyond stupid.
- Don Burn (MVP, Windows DDK)

This can be done with a mini-filter and Microsoft provides one FileSpy that
meets most of the OP's needs. Get the WDK and take a look.

I don't think SSDT hook driver look like malware. Too many HIPS
software are using this technology.
Mini-filter driver maybe is the best way to done this case.

And some not all of these are special cased in the MALWARE detection.
Bottom lime is you cannot hook and unhook safely and it is a damaging
practice that hopefully Microsoft will block in 32 bit someday as well as 64
bit.

결국은 미니 필터 드라이버, WDK에 새로 추가된 미니필터 드라이버를 공부해 보도록 해야겠다.

자료가 별로 없는게 단점이지만 WDK에 minifilter예제들이 있으므로 그걸참고로 해야할듯 -ㅁ-;
Posted by 꿍스

댓글을 달아 주세요

삽질2008.07.31 08:43
Adobe AIR가 SQLite및 File 함수를 지원하지만 정작 파일 실행은 하지 못한다.
예제로 배우는 Flex3 책에는 AIRConnect라는 AIR와 MFC를 연동한 부분이 있지만, 그 프로그램은 같은 파일을 반복적으로 쓰고,
또 검사해야하야 하기때문에, 빠른 응답을 기대할 수 없어서 소켓을 이용하여 Win32 어플리케이션과 통신을 하는 방법을 이용했다.

서버가 Socket Accepct를 하는 부분은 다음과 같다.

Win32


while(true) {
//접속을 기다림
hClntSock = accept(hServSock,(SOCKADDR*)&clntAddr,&clntAddrSize);
if(hClntSock == INVALID_SOCKET) {
MessageBox(m_hWnd,"ACCEPT 에러.","에러",NULL);
}

memset(message,0,BUFSIZE);

// 클라이언트와 통신
while((strLen = recv(hClntSock,message,BUFSIZE,0)) != 0) {
int rs = (int)ShellExecute(NULL, "open", message,
NULL,NULL, SW_SHOW);
sprintf_s(retMsg, "%d", rs);
send(hClntSock,retMsg,3,0);
}
closesocket(hClntSock);
}

여기서는 AIR에서 파일명을 던지면, Win32어플리케이션에서 무조건 실행을 시키도록 했다.
전체 파일은 첨부파일을 참고면 된다.
Win32 어플리케이션 (여기서는 WTL이용) 에서 서버소켓을 생성하고 AIR에서 이제 이벤트가 발생할때마다 Win32어플리케이션으로 통지를 한다.

AIR


var socket:Socket = new flash.net.Socket();
socket.addEventListener(Event.CONNECT, function(event:Event) :void {
socket.writeMultiByte(temp.label,"euc-kr");
socket.flush();
});

socket.addEventListener(IOErrorEvent.IO_ERROR,
function(event:Event) : void {
mx.controls.Alert.show(event.toString());
socket.close();
});

socket.addEventListener(ProgressEvent.SOCKET_DATA,
function(event:ProgressEvent) : void {
var str:String = socket.readMultiByte(3, "euc-kr");
if(int(str) < 32) {
mx.controls.Alert.show("파일 실행 에러 입니다. 에러 : " + str);
}
socket.close();
});

socket.connect("127.0.0.1",8000);

AIR 에서는 소켓으로 로컬로 접속하여 메세지를 보내고 결과값을 받는다. 여기서는 ShellExecute의 리턴값을 받는다.
에러처리를 AIR에서 하기위해서 이다. ( ShellExecute가 32보다 작은값을 리턴하면 에러이다. )

readMultiByte 일반 MultiByte String을 읽어와서 UTF-8로 변경해서 리턴한다. 이함수는 읽어올 데이터의 길이를 정해주어야 하는데, 틀릴경우 익셉션이 발생하므로 미리 프로토콜을 지정하는 것이 좋다.

Posted by 꿍스
TAG AIR, flex, socket

댓글을 달아 주세요

삽질2008.07.20 23:43

ZwDeleteFIle(NtDeleteFile) 이라는 함수가 있어서 파일 삭제가 될때 이 ZwDeleteFile이라는 함수가 불리어 질것이라고 예상을 하여 ZwDeleteFIle함수를 후킹하였으나 DbgPrint로 뿌리니 아무런 반응이 없어서, 인터넷을 찾는 도중 원인을 알아냈다.

http://www.rohitab.com/discuss/index.php?showtopic=29037

This should be interesting for you(Windows Nt/2000 Native Api Reference By Gary Nebbett):
"There are alternative methods of deleting a file, and the Win32 DeleteFile function uses ZwSetInformationFile with a FileInformationClass of
FileDispositionInformation."

간단하게 말해서 Win32의 파일 삭제 함수는 ZwSetInformation으로 FileInformationClass 정보가 FileDispostionInformation면 삭제되는 것이다.

대략적으로 소스코드를 보면

NTSTATUS NewZwSetInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
)
{
NTSTATUS rc;

rc = ((ZWSETINFORMATIONFILE)(OldZwSetInformationFile)) (
FileHandle,
IoStatusBlock,
FileInformation,
Length,
FileInformationClass
);

if(FileInformationClass == FileDispositionInformation) {
DbgPrint("Deleted File");

}
return rc;
}


이렇게 처리하면 된다.

Posted by 꿍스

댓글을 달아 주세요

삽질2008.07.08 13:33
WTL 설치

1. http://wtl.sf.net 에 가서 WTL최신버전인 8.0을 받아서, 압축을 푼다.

2. WTL 방의 AppWiz의 setup80.js 파일을 수정한다. 8.0 이라고 되어있는 부분을 모두 9.0으로 바꾼다.
2. http://scarletblue.net/78 에 수정된 setup90.js 가 있음 참고

3. setup80.js 를 실행하여 AppWizard를 설치한다.

4. WTL설치디렉토리의 include방을 Visual Studio C++ 디렉토리 환경에 추가한다.


5. AppWizard가 설치되어 마법사를 이용항 WTL 프로젝트를 생성할 수 있다.

WTL Helper 설치

WTL 개발시에 없어서는 안될(?) 아주 유용한 WTL Helper 를 설치해본다. VS 2005에서는 SP1 패치가 필요했다.

2008에서는 소스를 수정해서 재 컴파일을 하는 방법이 코드프로젝트에 올라왔지만, 누군가가 패치를 한 DLL을 올려놓아서
편하게 가능하다.

http://wmdevelopers.blogspot.com/2008/07/installing-wtl-helper-in-vs-2008.html 에 방법이 있다.

기존의 WTL Helper 실행파일을 받아서 인스톨 한후에 WtlHelper9.dll을 저기서 다운받은후 regsvr32를 통해 등록해 주는 방법이다.

WTL 관련 자료

WTL Document
http://www.viksoe.dk/code/wtldoc.htm

강좌
http://jacking75.cafe24.com/WTL/Index.htm

http://hanburn.tistory.com/3

하지만...

WtlWiz(Visual Studio에서 WTL Wizard 확장) 이 2008용이 없어서 WtlHelper의 모든 기능을 쓸 수 없다.

단적으로 다이얼로그에서 컨트롤에대한 이벤트를 바로 지정해 넣을 수가 없다.

그래서 결국 2005를 깔고 프로그래밍 중이다.
Posted by 꿍스

댓글을 달아 주세요

  1. c_user

    좋은 자료 감사합니다.
    퍼갑니다.

    2008.07.13 17:57 [ ADDR : EDIT/ DEL : REPLY ]
  2. c_user / 네 방문해 주셔서 감사합니다. ^^

    2008.07.20 23:49 [ ADDR : EDIT/ DEL : REPLY ]

삽질2008.07.05 05:46
WDK 파일 받기

https://connect.microsoft.com
 에 회원 가입후에

연결 디렉터리 에서 개발도구에 Windows Driver Kit (WDK), Windows Logo Kit (WLK) and Windows Driver Framework (WDF) 를 찾는다.

Windows Driver Kit (WDK), Windows Logo Kit (WLK) and Windows Driver Framework (WDF) 가입 후에 다운로드 받으면 된다.


WDK 와 Visual Studio 2008 연동

http://blog.naver.com/process3.do?Redirect=Log&logNo=20035804966


Visual Studio 2008에서 WDK IntelliSense 활성화 하기

http://blog.naver.com/process3.do?Redirect=Log&logNo=20050455898
Posted by 꿍스

댓글을 달아 주세요

삽질2008.05.01 11:17

간단한 웹사이트를 만들 일이 있어서 Ruby on Rails 에 대한 감각도 익힐 겸해서 CakePHP를 써서 프로그래밍을 하게 되었다.

다른 프레임워크와 마찬가지로 CakePHP역시 초기에 학습시간이 든다.
처음 Scaffolding을 써보고 CRUD를 바로 보여주는 것에 깜짝 놀랐다.

bake(make + baker(cake를 만드는) 인 듯) 를 이용하면 간단하게 DB에 맞는 Model, View, Controller를 각각 생성할 수 있으며, Model관계 Validation 등 다양한 옵션으로 각각을 생성 할 수 있다.
나 역시 예전에 프레임워크들에 대해서 많이 생각하고 직접 PHP에 관련된 데이터 처리 부분에 관해서 고심을 하였으나, CakePHP를 써보고 아 이거구나 하고 번뜩 느끼게 되었다.

테이블간 연관을 맺는것도 매우쉬위서 bake를 통하면 대부분다 적용가능하고 MVC로 분리 되어잇기때문에, 각 요소가 바뀌더라도 서로 영향을 부는 부분이 적다.

더욱더 많은 자료는 cakePHP공식 홈페이지에 가면 많다.
그리고 한국 포럼도 있고, 개발 가이드를 한글로 번역을 해놓으신 고마운 분들이 있다.
 

Posted by 꿍스
TAG cakePHP

댓글을 달아 주세요