- Introduction -


Rootkit을 분석하는데 이 Rootkit은 로드 타임(Load Time)에 커널 디버거가 붙여져 있으면 그것을 감지하고 드라이버 로드가 되지 않게끔 구현 되어져 있었다.

그것이 프로텍터에 의한 것인지 실제 악성코드 제작자가 의도하고 구현한 것인지는 모르겠지만,  어쨌든 분석하는 입장에서는 VMWare에 Windbg를 붙인 상태에서 마음 놓고 Rootkit을 로드 시켰는데 로드가 안되니 답답할 노릇이었다.


그래서 생각한 것이 Rootkit이 완전히 로드 되고난 다음에는 Timer DPC나 쓰레드 등을 이용해서 따로 실시간 감시하는 루틴이 존재하지 않을 것이란 전제하에, 즉, 로드 타임에만 검사가 이루어진다면 WinDbg를 잠시 떼어낸 상태에서 Rootkit 드라이버를 로드 시킨 다음에 다시 WinDbg를 붙이면 어떨까 하는 생각에 의해서 나온 것이 이것이다.



- How to implement -


구현 방법은 간단하다.


커널에서 Export 하고 있는 KdDebuggerEnabled, KdDebuggerNotPresent 변수의 값을 내가 원하는 값으로 바꿔버리는 것이 전부이다.


When you want to detach Windbg : KdDebuggerEnabled = FALSE,   KdDebuggerNotPresent = TRUE

When you want to attach Windbg again : KdDebuggerEnabled = TRUE, KdDebuggerNotPresent = FALSE


이렇게만 설정 해주면 된다.



- Supported OS -


32Bit, 64Bit  Windows XP/7/8 have been tested.

(64Bit should be in Test Mode. The 64bit kernel driver has been test signed.)


In 32bit OS, "ctrlkerneldbgX86.sys" will be dropped and executed.

In 64bit OS, "ctrlkerneldbgX64.sys" will be dropped and executed.



- How to use -


1. Windbg를 VMware나 VirtualPC 등등에 입맛에 맞게 붙이고 가상 머신을 켠다.


2. Rootkit이 로드 타임에 커널 디버거를 감지하는 루틴을 가지고 있다면, 이 프로그램을 이용해서 잠시 Windbg를 Disable 시킨다.


3. Rootkit을 로드시킨다.


4. 다시 Windbg를 Enable 시킴으로써 Rootkit의 디버깅이 가능해진다.



- ETC -


This app hasn't been tested on real PC. It may cause BSOD. Don't run this on your real PC. Just try it on VM.


This app has been built by VS2012 Update 3. If you can't run this app on your PC. 

Install this : (http://www.microsoft.com/en-us/download/details.aspx?id=30679)






ctrl_hookdriver.exe



저작자 표시 비영리 변경 금지
신고
by Sone 2013.08.02 09:30

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

윈도우NT Version 6 이상의 커널부터 UAC가 도입되었고, 이때부터 모든 실행파일은 실행할 때 권한체크를 거치게 된다.

일반적으로 EXE파일이 실행될 때 요구되는 권한은 3가지가 존재한다.

 

 

asInvoker : Parent Process의 토큰을 그대로 따라간다. 빌드할 때 기본적으로 설정되어져 있는 UAC Manifest 값이다. 보통 일반적인 어플리케이션의 평범한 실행을 할때 요구되는 권한이다.

 

highestAvailable : 현재 로그인 된 유저의 권한을 따라간다. 예를 들어 현재 로그인 된 유저가 슈퍼관리자라면, 슈퍼관리자의 권한으로 실행하고, 일반 사용자라면 일반 사용자의 권한으로 실행한다.

 

requireAdministrator : 실행되기 위해서는 무조건 관리자 권한이 필요하다.

 

 

오늘 삽질을 좀 하다가, asInvoker UAC Manifest를 가진 프로세스에서 requireAdministrator UAC Manifest를 가진 프로세스를 실행을 해보려고 했다.

CreateProcess를 이용해서 실행하려고 했는데 실패하면서 GetLastError로  에러코드 740을 내뱉는다.

에러코드 740의 내용을 참조해보았더니 다음과 같았다.

 

 

ERROR_ELEVATION_REQUIRED
740 (0x2E4)

The requested operation requires elevation.

권한 상승이 필요하단다.

생각을 해보니 asInvoker 권한만을 가진 프로세스가 requireAdmin 권한을 필요로 하는 프로세스를 정상적으로 실행시키는것이 말이 안되었다. 졸개가 왕에게 명령하는꼴 아닌가?

 

그런데 어디선가 찾아보니 CreateProcess 대신에 Shell API인 ShellExecute를 사용해서 실행시키면 된다고 한다.

그래서 코드를 좀 고쳤다.

 

 

 /*
*
*
*
*   asInvoker.c
*
*
*/

#include <stdio.h>
#include <windows.h>
#include <shellapi.h>
#include <stdlib.h>

int main(void)
{
 STARTUPINFO si;
 PROCESS_INFORMATION pi;

 ZeroMemory(&si, sizeof(si));
 ZeroMemory(&pi, sizeof(pi));
 si.cb = sizeof(si);

 printf("This is a asInvoker process.\n");

 if ( !CreateProcess (
    NULL,
    "requireAdmin.exe",
    NULL,
    NULL,
    FALSE,
    0,
    NULL,
    NULL,
    &si,
    &pi) )
 {

  printf("CreateProcess failed. Error code : %d\n", GetLastError());
  printf("Try to execute using ShellExecute...\n");
  system("pause");

  if ( ShellExecute(NULL, "open", "requireAdmin.exe", NULL, NULL, SW_SHOW) <= (HINSTANCE)32 )
  {
   printf("ShellExecute failed.\n");
   system("pause");
   return EXIT_FAILURE;
  }

  system("pause");
  return EXIT_SUCCESS;
 }

 CloseHandle(pi.hThread);
 CloseHandle(pi.hProcess);
 system("pause");

 return EXIT_SUCCESS;
}

 

 

 

 /*
*
*
*
*   requireAdmin.c
*
*
*/


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 printf("This is a requiredAdmin process.\n");
 system("pause");

 return 0;
}

 

 

 

 

실행을 해보니 asInvoker.exe에서 requireAdmin.exe 프로세스를 정상적으로 실행할 수 있었다.

물론 ShellExecute를 이용해서다.

 

 

 

 

 이때 권한 상태를 보니 아래와 같았다.

 

 asInvoker.exe는  Elevated 되지 않은 상태이다.

 

 

requireAdmin.exe는  Elevated 된 상태이다.

Non-elevated Process에서 실행을 하는데, 자식이 Elevated 될수가 있단 말인가? OS자체에서 그냥 권한을 띄워주는건가?

 

 

부모 자식 관계를 살펴보니 아래와 같았다.

 

ShellAPI로 실행했기 때문에, 부모 자식 관계가 없을줄 알았는데 requireAdmin은 asInvoker의 자식 관계로 생성되었다.

ShellExecute는 내부적으로 어떻게 구현되어져 있길래, 이러한 실행이 가능해지는거지?

ShellAPI에 대해서 좀 조사해봐야 될것 같다.

 

 

저작자 표시 비영리 변경 금지
신고
by Sone 2013.06.01 04:38

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

흔히들 Windows 운영체제 내부구조를 살펴보거나 자신이 개발중인 커널 드라이버를 디버깅 할때, VMWare나 VirtualBox등의 가상 환경에 테스트 운영체제를 띄운 후, WinDbg로 파이프 연결해서 커널 디버깅을 하곤 합니다.

이때, 디버깅 속도는 그래도 나름 빠른 정도이긴 하지만, 가끔 속터질때가 있었을겁니다.


이번에 소개하는 플러그인은 VMWare와 WinDbg를 연동한 Windows 운영체제의 디버깅을 수행할 때, 심지어 올리디버그의 Trace보다 훨씬 빠른 초강력 스피드를 내게 해주는 WinDbg Extension 입니다.



출처 : http://virtualkd.sysprogs.org/





설치 방법 (이하 방법은 VMWare를 기준으로 합니다.)



0. 먼저 VirtualKD를 다운로드 받는다. (http://virtualkd.sysprogs.org/download/VirtualKD-2.8.exe)


1. VMWare에서 자신이 디버깅하고자 하는 OS를 실행시킨다. 

    (가상머신의 하드웨어 구성에서 커널 디버깅을 위한 COM포트 등을 따로 추가할 필요 없음)


2. 다운로드 받은 VirtualKD의 압축을 풀고 target 폴더안에 존재하는 "vminstall.exe" 를 가상머신으로 옮긴다.


3. 가상머신 내부에서 vminstall.exe 을 실행한다.




4. 위 스샷과 같이 Create a new boot entry 를 선택하고 Install을 누른다. 기타 체크박스 옵션들은 본인의 취향에 맞게 선택한다.


5. 설치가 끝나면 재부팅 하겠냐는 메시지가 뜨는데, 잠시 보류하고 다운로드 받은 VirtualKD를 실행하기 위해서 vmmon.exe (64비트는 vmmon64.exe) 를 실행한다.




6. Debugger Path... 를 클릭해서 WinDbg의 실행파일 경로를 지정해준다.


7. VM List에서 본인이 연결하고자 하는 VM을 선택해주고 (이때 VM의 pipe name이 vmmon에 떠있어야 함) 

    Run debugger를 눌러서 WinDbg를 띄워준다.


8. WinDbg는 Pipe를 기다리는 상태가 되고, 5에서 보류했었던 메시지를 Yes 눌러서 가상머신을 재부팅 한다.


9. 이후에 뜨는 Boot Entry에서 VirtualKD 엔트리를 선택하여 부팅한다.




위 스샷과 같이 vmmon화면에서 OS와 debugger 항목이 yes로 나오면 정상적으로 연결된 것입니다.

DbgBreakPoint() on start에 체크가 되어져 있는 경우, 위 화면과 같이 KiSystemStartup에서 KdInitSystem을 호출하게 되고,

KdInitSystem 내부에서 BP가 걸리게 됩니다. 극초반에 BP가 걸리기 때문에 Windows OS의 부트 프로세스를 파악할때는 좋은 옵션이 될것 같습니다.



VirtualKD를 이용할 경우,  무슨 60FPS 게임 조작하듯이 엄청난 응답성을 보장받게 되니, 디버깅할때 훨씬 수월해집니다.

이것도 러시아 사람이 만든것 같은데, 머리 좋은 사람이 참 많은듯..

저작자 표시 비영리 변경 금지
신고
by Sone 2013.05.25 04:42

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

 Surface 시리즈가 발표된지도 어언 1년가까이 되었습니다. 여전히 한국에는 출시가 되어있지 않은 상태이지만, 오늘 서피스 공식 블로그를 통해서 나온 소식에 의하면 (Expanding Surface Pro and Surface RT Availability) 올해 6월경에 한국에도 출시 예정이라고 합니다. 서피스 유저로써 반가운 소식이 아닐 수 없네요. 유저가 늘어나면 그만큼 활용도도 비교적 넓어지겠지요.

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/17sec | F/2.6 | 0.00 EV | 3.7mm | ISO-320 | Flash did not fire | 2013:04:24 23:00:47

 

  저는 Surface RT를 사용중입니다. RT는 뭐 망작 아니냐,  x86 프로그램 돌릴수도 없는데 뭣하러 사는지 이해 안간다 등등의 평가가 대부분인데, 물론 저도 동의는 합니다만 본인이 어떻게  활용하느냐에 따라서 달려있다고 생각하네요. 저는 뭐 게임같은것 하지 않는이상 RT로도 잘 쓰고 있습니다.

 

 

RT를 구매한 이유는 Windows RT라는 시스템이 너무 궁금했기 때문이기도 합니다. Windows RT는 다른 말로 Windows On ARM (WOA) 라고도 하는데, 원래 MS는 NT커널을 다양한 시스템에 돌릴 수 있게끔 이식성을 목표로도 하고 있었지만, 실질적으로는 x86이나 x64의 인텔CPU에 초점을 맞추고 있었습니다. 이러한 상황에서 마이크로소프트가 처음으로 NT커널을 ARM으로 이식해서 실제 제품으로 내놓은것이기 때문입니다.

 

 

 

 

ARM시스템이기 때문에 기존 x86 프로그램들을 돌릴 수는 없습니다. 원래 Windows 라는 운영체제는 데스크탑 프로그램을 돌릴수 있다는것이 최고의 장점인데... Windows 라는 운영체제임에도 불구하고 데스크탑 어플을 실행할 수 없다는건 치명적인 단점이라고 할수 있겠네요..

RT가 Pro에 비해서 압도적으로 가지는 장점은 무게, 배터리 입니다. 무게와 배터리라는 무기를 가지고 있으니 이제 여기서 활용폭만 좀 넓혀본다면 나름대로 훌륭한 디바이스가 될수 있을거라고 생각합니다.

그래서 RT의 활용성을 조금이나마 올릴 수 있는  2가지 방안을 공유하고자 합니다.

곧 한국에 출시도 될테니, 이쯤에서 제가 알고있는 방법을 터뜨려서 공유를 하면 다른 유저분들께도 도움이 될거라 생각합니다.

 

 

 

1) Jailbreak

 

MS는, Windows 8 Style UI의 앱만 실행되도록 허용해놓았고, 설령 ARM기반으로 빌드된 데스크탑 어플이라 할지라도, 기존 데스크탑 환경을 사용하는 프로그램은 Windows RT에서 실행되지 않도록 막아놨습니다.  공식적으로 알려진 이유는 없지만, 아마 퍼포먼스, 신뢰성(보안), 배터리 타임을 확보하기 위해서 이런 결정을 내렸을 가능성이 큽니다. 만약에 MS에서 데스크탑 어플을 공식적으로 허용해주었다면 이미 지금쯤 여러 소프트웨어 업체에섯 앞다퉈서 Windows RT, ARM기반 프로그램들을 쏟아냈을지도 모릅니다.

 

어쨌든 결론은 우리는 Windows RT에서 데스크탑 어플을 사용하지 못합니다. ARM기반으로 빌드된 데스크탑 어플을 실행하려고 하면 아래와 같은 오류메시지가 뜹니다.

 

 

노트패드++은 오픈소스이고 어떤 개인 유저가 ARM으로 새롭게 빌드해서 제공해주었지만,  Windows는 이것의 실행을 막습니다.

그럼 이제 Windows RT에서 어떻게 Jaiilbreak를 해서 Win32 데스크탑 어플을 실행하는지 아주 간단하게 알아봅시다.

 

(1) XDA를 방문합니다. 우리에겐 언제나 XDA횽님이 계십니다. (http://forum.xda-developers.com/showthread.php?t=2092158)

 

(2) 위 페이지를 살펴보면 궁금한점도 친절하게 FAQ로 알려줍니다. 영어로 더욱 친절하게 설명도 해놓았으니 읽어보세요! 읽기가 귀찮다 하시면, 아래로 쭉 내리시다보면 "Click here to download the latest version" 이라는 글이 있습니다. 그것을 클릭해서 다운로드 받습니다.  (2013년 4월24일 기준, 최신버젼 1.20)

 

(3) ZIP으로 압축 되어져 있습니다. 아무리 데스크탑을 돌릴수 없는 RT라도 ZIP 압축은 풀수 있습니다! 오른쪽 마우스 버튼을 눌러서 "압축풀기"를 눌러서 압축을 풉니다.

 

(4) "runExploit.bat" 을 실행해줍니다. 관리자 권한으로 실행하지 않아도, 중간에 관리자 권한을 요구하는 창이 나오는데 "예" 를 누르시면 됩니다!

 

(5) 중간에 볼륨 업 또는 볼륨 다운을 눌러라고 하는데, 서피스 본체 왼쪽에 위치해 있는 소리 크기를 조절하는 버튼 두개 중에서 아무거나 딸깍 눌러주면 됩니다.

 

(6) 완료!

 

쉽죠? 탈옥 금방 끝납니다. 물론 이걸 개발한 개발자는 편리하게 탈옥을 하기 위한 방법을 찾느라 심각하게 고민했을겁니다. 어쨌든 우리는 편하게 사용하면 됩니다.

 

탈옥 했는데 뭔가 달라진게 없어보입니다. 네, 탈옥만 하고 그 다음부터 귀찮다고 아무것도 안하시면 달라지는거 하나도 없습니다. 이제 데스크탑 어플들은 다운로드 받으러 가야합니다. 기존에 사용했었던 포토샵 같은건 안되냐고요? 네, 불행하게도 탈옥한다고 해서 인텔CPU 기반에서 돌아갔던 프로그램이 ARM CPU에서 돌아갈리 없습니다. 우리는 ARM CPU용으로 빌드된 프로그램을 발품 팔아서 다운로드 받아서 사용해야 합니다. 그럼 어디서 다운 받느냐?

 

우리에겐 XDA 횽님이 있습니다. 어떤 유저가 ARM용으로 빌드된 프로그램들을 간편하게 다운로드 받을 수 있게끔 링크들을 정리해 둔 페이지가 있습니다. (http://forum.xda-developers.com/showthread.php?t=2092348)

 

위 페이지를 들어가보시면 그렇게 많지는 않지만, 나름대로(?) 수많은 앱 리스트를 보유하고 있습니다. 심지어 MAME !!! 도 있습니다. (MAME 모르면 실망입니다.)

영어에 익숙하지 않으신분들은 읽는데 지장이 있을수도 있겠으나, 문장 왼쪽 부분에 프로그램 제목과 대충 뭐하는 프로그램이다 정도만 읽어보고 링크로 들어가셔서 다운로드 받으시면 됩니다.

 

 

 

참고로 제가 사용하는 어플들은 아래와 같습니다.

 

 

 

 

7-Zip : 이거 없으면 미칩니다. ZIP만 압축풀 수 있었던것이 RAR, 7Zip 등등등 다양한 압축포맷을 다룰 수 있습니다.

 

 

 

 

 

 

Audacity : 전문적인 오디오 녹음 프로그램입니다. MP3 파일을 불러와서 간단하게 태그를 수정할 수 있는 기능도 있습니다.

 

 

 

 

 

 

Bochs : x86 에뮬레이터 입니다. x86이 에뮬레이션 된다라? 다른 말로 하면 우리가 대부분 사용하는 인텔 기반 시스템을 가상환경에서 돌릴 수 있다는 뜻입니다. 그러나 성능은 기대하면 안됩니다. 저는 여기에 Windows XP 설치하다가 언제 끝날지 몰라서 포기했습니다.

 

 

 

 

NotePad++ : EditPlus와 같은 메모장 편집기 프로그램입니다. 커맨드라인 기능도 지원하기 때문에 다른 어플과 연동하면 그 효율성이 더 늘어나며, 참고로 RT에서 C# 어플 개발이 가능한데, 노트패드++을 적극 활용하면 C# 개발 머신으로 탄생합니다.

 

 

 

 

 

Process Hacker : 포렌식쪽 하시거나 리버싱에 관심있으신 분들은 아실법한 툴인데, Process Explorer보다 강력한 기능이 많아서 개인적으로 활용하는 툴입니다. 작업관리자의 진보판이라고 생각하시면 됩니다. 커널 드라이버까지 모두 ARM용으로 빌드됐기 때문에 거의 모든 기능을 사용하실 수 있습니다. 커널 레벨의 Stack Trace등도 모두 지원합니다.

 

 

 

 

 

 

Python 라이브러리 : 파이썬 라이브러리 또한 Windows RT용으로 포팅된것이 있습니다. 파이썬 어플의 개발도 가능합니다! 다만, 제가 파이썬을 모르기 때문에 아직 개발해본적은 없습니다. (개발을 할줄 모릅니다 ㄷㄷ)

 

 

 

 

 

Sumatra PDF : PDF를 읽을 때 사용하는 프로그램 입니다. 생각보다 터치 감도도 좋아서 손으로 페이지 내리는것에 크게 지장은 없습니다. 단, 앱스토어에서 Adobe PDF Reader도 제공하기 때문에 이것은 본인의 편의에 따라서 사용하시면 됩니다.

 

 

 

 

 

 

MAME : 마메 모르면 간첩입니다. 거의 모든 종류의 오락실 게임을 구동시킬 수 있습니다. 혁신적이게도 이것 또한 Windows RT용으로 포팅된게 있습니다. 철권태그 같은건 속도가 느려서 할맛 안나지만, 다른 2D게임들은 원활히 구동이 된다는 보고가 있습니다.

 

 

만약에 본인이 직접 프로그램을 개발해서 Windows RT에서 돌리고 싶다?  가능합니다.

Visual Studio 2012가 실행 가능한 개발 머신과 Windows RT 기기만 있으면 됩니다.

자세한것은 아래 링크를 참조하세요!

http://sone.tistory.com/283

 

 

이쯤이면 이제 감 잡으셨을것으로 보고, Jailbreak에 관한 설명은 모두 마치겠습니다. 아, Jailbreak를 하면 이 한가지는 명심하고 있어야 됩니다. 만약에 악의적인 해커가 악성코드를 RT용으로 개발해서 배포한다면 악성코드에 감염될 위험성이 있습니다.

 

 

 

 

 

 

 

2) RemoteApp을 이용하는 방법

 

 

 MS에서는 예전부터 RemoteApp이라는 기능을 제공해 왔습니다.  RemoteApp은 원래 서버에서 주로 사용하던 기능인데, 원격지의 프로그램을 내 컴퓨터에서 마치 직접 실행하는것처럼 구동할 수 있게 해줍니다.

그러기 위해선 RemoteApp을 호스팅 해주는 시스템에 몇가지 설정을 해줄 필요가 있는데, 먼저 그전에 운영체제에 대한 요구사항이 있습니다.

 

요구사항 :

Windows 8은 Enterprise 이상,  Windows Server 2008 R2 또는 그 이상.

RemoteApp을 사용하길 원할 때, 집 컴퓨터는 켜두어야 함.

 

제가 윈도우7 Enterprise나 Ultimate에서는 호스팅 해보지 않아서 될지 안될지 모르겠으나, RDP기능을 따로 설치하면 된다는 글도 본것 같습니다.

 

 

 

아직까지 RemoteApp이  무슨 기능인지 모르시겠다구요? 아래 화면을 보시면 알게됩니다.

 

 

 

 

 

모든 작업은 Surface RT에서 진행하고 있습니다.  스샷은 x86 시스템이 아닙니다. VMWare와 Visual Studio 2012를 실행시킨 모습 입니다.

 

 

 

 

 

 

Surface RT에서 Visual Studio 2012를 이용해서 감미롭게 코딩하고 있는 모습의 예입니다.

 

 

 

 

 

Surface RT에서 다음 팟플레이어를 이용하여 동영상을 므흣하게 감상하고 있는 모습의 예입니다.

 

 

 

 

 

 

Surface RT에서 IDA Pro 6.1을 이용해서 심오하게 윈도우8 64비트 커널 이미지를 까고 있는 모습의 예입니다.

 

 

 

 

 

 

Surface RT에서 OS개발을 진행하면서, 셋탑박스에서 흘러나오는 감미로운 발라드를 감상하는 모습의 예입니다.

 

 

 

 이쯤되면 눈치 까셨을거라고 봅니다. 네, 맞습니다.

현재 저는 지방에 내려와있지만, 서울에 있는 저의 코어i7 머신은 제가 부재중인 와중에도 항상 돌아가고 있습니다. 제가 Surface RT에서 미리 원격지에 설정해둔 RemoteApp 실행 명령을 내리면, 코어i7 머신이 해당 프로그램을 실행시켜서 화면을 저에게 띄워줍니다. 그럼 Surface RT에서 마치 x86 프로그램을 실행시켜서 작업하는듯한 느낌을 받을 수 있습니다.

참고로, 인터넷뱅킹도 됩니다. 부모 프로세스가 RemoteApp으로 실행됐다면, 아래에 새로 생성되는 모든 Child 프로세스들은 RemoteApp으로 실행되기 때문에, 아주 편리합니다.

 

물론 단점은 있습니다. 동영상을 재생할때는 실제 머신처럼 부드럽게 재생되지 못하고,  크나큰 단점은....항상 컴퓨터를 켜놓아야 하기 때문에 전기세가 많이 나옵니다. 전기세 걱정이 없으시고 Windows 8 Enterprise를 사용중이신분이라면 시도해볼만합니다.

 

RemoteApp Tool.exe

 

RemoteApp Tool은 이러한 RemoteApp설정을 간편하게 할수 있도록 도와주는 프로그램입니다.

설정의 예시는  (https://sites.google.com/site/kimknight/remoteapptool) 에 들어가셔서 나와있는 그림과 같은 형식대로 하시면 됩니다. Save를 한뒤에 RDP파일을 만들어서 Surface RT로 가져오면 되고, 그것을 실행하면 됩니다.

 

 

 

 적어도 위 2가지 방법을 이용한다면 Windows RT 시스템을 x86 머신처럼 활용하는데는 큰 문제가 없습니다. 단, 방법들이 고급 사용자들에게 익숙한 방법들이기 때문에 초반에 접근성이 좀 어렵다는 단점이 있습니다. 아무쪼록 한국에 Surface RT가 출시되고, 많은 사람들이 이 정보를 활용해서 Windows RT 생태계에 조금이나마 도움이 되었으면 좋겠습니다!

저작자 표시 비영리 변경 금지
신고
by Sone 2013.04.25 01:23

Windows RT용  Win32 Desktop Application을 개발할 때 필요한 라이브러리 파일들 입니다.

Windows RT의 System32 디렉토리에 위치해 있는 DLL들을 직접 LIB으로 변환한 결과물입니다.


DLL파일은 혹시나 필요하신 분들이 계실까봐 첨부한 것이며,

실질적으로 개발때 필요한것은 LIB 파일입니다.


LIB파일을 Visual Studio 2012가 설치된 경로에 붙여넣어 주시면 됩니다.



"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\arm"



 한가지 주의하실 점은, 절대로 기존에 존재하던 LIB을  덮어씌우면 안된다는 것입니다.

(다시 한번 반복하지만, 기존에 VS2012 의 LIB 폴더에 존재했었던 파일을 제가 올린 LIB으로 덮어씌우지 마십시오.)

DO NOT OVERWRITE ANY EXISITNG LIBS !!

(repeat: DO NOT OVERWRITE ANY EXISITNG LIBS, YOU MAY HAVE TO REPAIR/REINSTALL VS)



VS2012에서 ARM용 플랫폼을 타겟으로 해서 Win32 Application을 컴파일 하는 방법은 아래 링크를 참조하십시오.

How to compile desktop application for Windows RT




 Download LIBS for Windows RT   :    http://me2.do/5OLCxHMW


저작자 표시 비영리 변경 금지
신고
by Sone 2013.02.27 19:01

과거 XueTr이라 불렸던 안티 루트킷 프로그램의 개명버젼입니다.

XueTr은  x86 시스템만 지원했었지만, PC Hunter부터는 x64 버젼도 지원합니다.

거의 왠만한 기능은 다 보유하고 있는 초강력 안티 루트킷 프로그램입니다.


(출처  : http://www.xuetr.com/)


Supported OS:

Windows 2000 SP4 (32-bit only)

Windows XP (32-bit only)

Windows Server 2003 (32-bit only)

Windows Vista (32-bit only)

Windows Server 2008 (32-bit only)

Windows 7 (32/64)

Windows 8 (32/64)



Currently,the following features are available:


*Process Manager

View system process and thread basic information.

Detect hidden processes,threads,process modules.

Terminate, suspend and resume processes and threads.

View and manipulate process handles,windows and memory regions.


*Kernel Module Viewer

Display kernel module information including ImageBase,Size,Driver Object,ImagePath,ServiceName and Load Order.

Detect hidden kernel modules.

Unload kernel module(dangerous).

Dump kernel image memory.

Display and delete system driver service information.


*Hook Detector

View and restore SSDT,Shadow SSDT,sysenter and int2e hooks.

View and restore FSD and keyboard disptach hooks.

View and restore kernel code hooks including kernel inline hooks,patches,IAT and EAT hooks.

View and restore usermode process hooks incluing inline hooks,patches,IAT and EAT hooks.

View and restore message hooks(both global and local).

View and restore kernel ObjectType hooks.

Display Interrupt Descriptor Table(IDT).


*System Callback Viewer

Display and remove Kernel Notifications(Process/Thread/Image/Registry/Lego/Shutdown/Bugcheck/FileSystem/Logon).


*Network Viewer

Display current network connections, including the local and remote addresses and state of TCP connections.

View and delete IE plugins and context menu.

View and restore tcpip dispatch hooks.

Display winsock providers(SPI).

View and edit hosts file.


*Filter Viewer

View and remove filters for common devices including disk,volume,keyboard and network devices. 

 

*Registry Viewer

View and edit system registry.

Detect hidden registry entries using live registry hive analysis.


*File Explorer

Detect hidden files using both disk analysis and driver methods.

View and delete locked files and folders.

View file basic information including NTFS Alternate Data Streams. 


*Autorun Manager

Display and delete common autorun entries.


*Service Manager 

Display Win32 service information (for Ring0 modules,it is included in Kernel Module Viewer).

Change service status and configuration.


*DPC Timer

Enumerate and delete DPC Timer objects.


*Miscellaneous

View and repair common filetype assosications.

View and repair image hijacks.


*Settings

Option to defense from process creation,thread creation,module load and message hook installation.

Option to defense from file creation,registry key creation.

Option to prevent system suspend,log-off,shutdown and reboot.

Option to prevent locking workstation and switching destop.

option to prevent setting system time.



PCHunter_free.rar


저작자 표시 비영리 변경 금지
신고
by Sone 2013.02.15 00:13

작년 여름쯤에 마이크로소프트에서 윈도우8을 출시한 이후로, 태블릿PC 시장에서 또 하나의 변수가 생겼다. 윈도우8이 태블릿PC에서 원활히 작동되도록 설계된 탓이다. 윈도우8 RTM을 여러 OEM에 배포해서 윈도우8 기반 타블렛PC의 출시를 노리고, MS 자체적으로는 서피스라는 브랜드네임을 가지는 태블릿PC를 출시했다.

 

 

서피스는 크게 RT 버젼과  Pro 버젼으로 나뉜다.

 

 

Surface RT : Windows RT가 탑재된 ARM 기반의 윈도우 태블릿PC

Surface Pro : Windows 8 Pro가 탑재된 인텔 기반의 윈도우 태블릿PC

 

 

Windows RT는 또 다른 말로, Windows On ARM(WOA)라고도 불린다. Windows NT의 첫번째 ARM용 버젼인 셈이다. 원래 MS윈도우는 ARM아키텍쳐에 대한 대응이 되어져 있지 않았으나, MS가 다른 아키텍쳐에 윈도우를 이식해서 돌리는것은, 윈도우 NT4나 2K 커널 소스코드를 보더라도 크게 생소한점은 아니었기 때문에, ARM으로 이식하는데 있어서 크게 어려운점은 없었을 것이다. CPU Dependent한 부분만 따로 작성해주고, 나머지는 C코드를 공유하는 형태인것도 비교적 쉽게 이식하는데 한몫 했을것이다.

 

 

 

작년 12월말 쯤에 미국 방문차, 뉴욕의 타임스퀘어에 위치해 있는 MS 스토어에 들려서, Surface RT를 구입하였다.

현재는 Surface Pro가 막 출시된 상태이지만, 미국에 있었을때만 해도 Surface RT밖에 없었다. 그리고 의외로 사람들은 Surface RT에 대해서 깊은 관심을 보이고 있었다. 애플스토어만큼이나 MS스토어도 사람들의 왕래가 잦았던 것으로 기억한다.

 

 

이번 포스트에서는 Surface RT의 외관을 아주 간단히 살펴보고자 한다.

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/20sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 00:48:59

패키지 박스의 모습으로, 심플한 외관이나 박스 사이즈는 다소 큰편이었다.

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/18sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 00:49:29

Touch Cover는 아무래도 불편할것 같아서, Type Cover를 구매하였다.

Touch Cover의 타이핑 감을 굳이 표현하자면, 손가락들을 땅바닥위에 올리고 자연스럽게 힘을 주르면서 그냥 땅을  누르는듯한 느낌?

타이핑감을 기대한다면 굉장히 실망할 것이다. 정신건강상 무모한 도전보다는, $10 더 비싸더라도 안전해보이는 Type Cover를 선택하였다. Touch Cover가 더 얇긴 하지만, Type Cover와 비교했을 때, 무게 차이가 거의없고, 두께도 거의 차이가  없는 수준이라.

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/45sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 00:51:30

32GB 버젼을 구매하였다. 64GB까지는 굳이 필요없을것 같았는데, 지금 생각해보면 64GB를 선택했다 하더라도, 후회하지는 않았을것 같다. Windows RT가 탑재되어져 있다는것도 확인할 수 있다.

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/23sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 00:53:38

박스를 오픈해보았더니 구성물은 간단하다. 충전기와 Surface 본체, 보증서와 매뉴얼이 전부이다.

(보증서와 매뉴얼은 본체 하단에 숨겨져 있었다.) 매뉴얼에는 스카이프 무료 통화권과, 스카이 드라이브 추가 저장용량 제공 시리얼 넘버가 들어있다.

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/15sec | F/2.6 | 0.00 EV | 3.7mm | ISO-160 | Flash fired | 2012:12:30 01:06:55

Type Cover와 Surface를 결합한 모습이다. 아이패드의 그것과 유사한 형태지만, 이것은 키보드가 달린 형태이기 때문에 상이하다고 비슷하면서도 상이하다고 볼수 있다. 기본적으로 커버는 트랙패드와 키보드 레이아웃을 가지며, 윈도우 언어 설정에서 Microsoft 입력기를 선택하면,  오른쪽 Alt키가 한영키로 작동하고 한자키는 입력할 수 없다. (한자키는 화상키보드로 입력할 수 있다.) 또한, 키보드에 한글은 인쇄되어져 있지 않지만, 키 배치를 잘 아는 사람에게는 한글을 입력하는데는 아무런 문제가 없다. 커버를 연결시, 장치관리자에서 HID디바이스로 잡히게 된다.

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/40sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 01:07:07

후면부에 킥스탠드가 있어서, 태블릿 본체를 세워서 고정시킬 수 있다. 다만 아쉬운점은 각도조절이 불가능하다는 것인데, 개인적으로는 이것에 대해서 크게 신경쓰이거나 불편한건 없었고, 편한 경우가 더 많았다.

 

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/15sec | F/2.6 | 0.00 EV | 3.7mm | ISO-125 | Flash fired | 2012:12:30 01:09:41

전원을 켜면, Surface라는 문구만 뜨고 바로 윈도우RT 부팅이 시작된다. 부팅 시간은 그렇게 빠르지는 않지만 Connected Stanby 기능이 윈도우8부터 탑재되었기 때문에, 한번 켜고나서 굳이 PC를 끄거나, 재부팅할 일은 거의 없다. Connected Stanby상태에서는 전원버튼이나 키보드, 홈버튼을 누르기만 하면 그 즉시 Resume되기 때문에 바로 작업을 수행할 수 있다.

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/82sec | F/2.6 | 0.00 EV | 3.7mm | ISO-80 | Flash fired | 2012:12:30 01:10:40

커버를 덮으면 요런 형태가 되며, 노트처럼 손에 쥐고 다닐수 있다. 아이패드에 비해서 무게가 가벼운편은 아니나, 그렇다해도 손으로 들고다니는데는 아무런 지장이 없다. 쌩판 기계를 들고다니는게 무서우면, 파우치에 넣어다녀도 된다. 참고로 아이패드같이 자석으로 붙는 형태가 아니고 그냥 닫히는 형태이다.

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/15sec | F/2.6 | 0.00 EV | 3.7mm | ISO-125 | Flash fired | 2012:12:30 01:11:57

처음에 Surface를 켜면 약관 동의부터 시작해서 여러 개인 정보를 설정하는 프로세스가 시작된다. 더불어서 온라인 상태일 경우, 정품인증도 자동으로 진행된다. 어차피 Win RT는 OEM라이센스 형태기 때문에 정품인증은 그냥 무리없이 바로 진행된다.

 

 

 

 

 

 

SAMSUNG | GT-I9300 | Aperture priority | Center-weighted average | 1/17sec | F/2.6 | 0.00 EV | 3.7mm | ISO-800 | Flash did not fire | 2012:12:30 01:36:02

우리가 일반적으로 윈도우에서 사용해왔던 툴들은 모두 기본 제공된다. 더불어서 Office 2013 for Windows RT 버젼도 기본으로 제공된다. 디바이스를 수령했을 당시에는 Preview 버젼이 탑재되어져 있었지만, 윈도우 업데이트를 통해서 Final Release 버젼으로 업데이트 할수 있다. PowerShell이 된다는것도 좋은점인데, 다음 포스팅에서 설명하겠지만 이것 때문에 Windows RT가 Jailbreak가 가능하게 되었다.

 

 

 

이번 포스팅에서는 간단히 외관만 살펴보았고, 다음 포스팅에서는 Windows RT의 JailBreak 및 기타 유용한 활용법에 대해서 간단히 알아볼 예정이다.

 

저작자 표시 비영리 변경 금지
신고
by Sone 2013.02.14 01:47

  이제 Microsoft Surface Tablet의 출시도 불과 9일남은 이 시점에서, Windows RT 플랫폼에서 돌아가는 애플리케이션에 대해서 관심을 가지시는 분이 여럿 계실것으로 생각이 된다.


http://surface.microsoftstore.com/store/msstore/Content/pbpage.Surface


위 URL은 미국에 거주하는 사람들을 대상으로 해서, Surface RT 예약구매를 진행하는 페이지이다.

스펙을 보면서, 문득 그런 생각이 들었다. 


- 흠, 언제던가 유투브에서 언리얼 엔진3 을 Windows RT 태블릿에서 구동시키는 모습을 본적이 있는것 같은데?

(http://www.youtube.com/watch?v=TGi6j3RkPLg)


- 어라, 그렇다면 Windows RT 태블릿도 어느정도 쓸만한 성능이 아닌가? 일단 NVIDIA T30은  Tegra Quad-core ARM processor를 의미한다. 시스템 메모리는 2GB가 채택됐다.ARM 시스템 치고는, 그렇게 부족한 사양은 아니다.


- 자, 사양이 쓸만하고 무게도 인텔 버젼보다 가볍고 메리트가 있다고 생각이 되었다. 사고싶다!


- 이제, 관건은 기존 x86 용으로 짜여진 프로그램이 소스코드의 리컴파일 과정을 통해서, 과연 Windows RT 에서도 정상적으로 구동될것인가?



  여기까지 생각한 뒤,  또 생각난것이  Visual Studio 2012 에는  Windows RT 개발을 위한 ARM Cross Compiler가 탑재되어져 있다고 들었다.

어라? 그렇다면, ARM을 위한 Native application을 짤수 있을까?

Visual Studio 2012 를 살펴보자.


먼저, 대충 Win32 Console Application 프로젝트를 생성한다. 그 뒤에, Configuration Manager로 들어간다.



ARM이 선택이 가능하다 !

세팅은 기존 Win32에서 가져오기로 하고, ARM플랫폼을 새로 생성한다.




자, 이제 타겟을 ARM으로 지정하고,  Hello World를 빌드해보자.



어라, Failed가 뜨면서 실패가 됐다. 에러메시지를 살펴보니 아래와 같았다.





그냥 간단히 말하면 , ARM에서 돌아가는 데스크탑 어플리케이션의 컴파일을 지원하지 않는다는 뜻이다.

구글링을 해보니, Visual Studio 2012 Beta에서는 이것이 가능했다고 들었는데, RC버젼부터 MS에서 막아놓았다고 들었다.

왜 막아놓았는지는 알수가 없다.




여하튼, 이 문제를 해결하기 위해서 또 구글링을 했더니, 아래와 같이 해주면,  Desktop application을 ARM용으로 컴파일할 수 있다고 한다.



Path : C:\Program Files (x86)\Windows Kits\8.0\DesignTime\CommonConfiguration\Neutral

Needed file : Windows.desktop.arm.props

Code : 

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>

    <WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport>

  </PropertyGroup>

</Project>





위 방법을 적용해서 아래와 같이 완료하였다.





이제 다시 빌드를 수행해보자.



오! ARM용으로 데스크탑 콘솔 애플리케이션의 빌드가 성공하였다.

이제, 테스트를 해야하는데.........Windows RT 태블릿이........없다! ㅠㅠ




제대로 ARM용으로 빌드되었는지 확인해보기 위해서, IDA로 속을 간단히 들여다보았다.

먼저, 빌드에 사용된 샘플 C 코드는 아래와 같다.


#include <stdio.h>

#include <tchar.h>

#include <windows.h>

#include <stdlib.h>


#define SAMPLE_TEXT _T("Hello World!\n")


EXTERN_C

__declspec(dllexport)

BOOL MyFunc (VOID)

{

TCHAR *lpTemp = NULL;

CONST TCHAR tcStr[] = SAMPLE_TEXT;


//

// Allocate new memory to save string

//

lpTemp = (TCHAR*)VirtualAlloc (

NULL,

((_tcslen(tcStr) + 1) * sizeof(TCHAR)),

MEM_COMMIT,

PAGE_READWRITE

);


if ( lpTemp == NULL ) {


// If failed to allocate ?

_tprintf(_T("Failed to allocate memory. (%d)\n"), GetLastError());

return FALSE;

}



__try {


//

// Copy string to target

// 

memcpy (

lpTemp,

tcStr,

_tcslen(tcStr) * sizeof(TCHAR)

);



//

// Print out string on screen

// 

_tprintf(lpTemp);


return TRUE;


}

__finally {


//

// Deallocate memory

// 

VirtualFree(lpTemp, 0, MEM_RELEASE);

}

}



int _tmain(int argc, _TCHAR* argv[])

{


if ( !MyFunc() )

{

return EXIT_FAILURE;

}



return EXIT_SUCCESS;

}




아래는 IDA로 뜯어본 화면이다.




ARM용으로 빌드가 아주 잘 되었음을 확인할 수 있었다.

이제 관건은, 이렇게 빌드된 ARM 데스크탑용 프로그램이  "특별한 라이센스나 제한 없이"  Windows RT 태블릿에서 잘 구동되느냐에 달려있을 것 같다. 만약에, 개인이 빌드한 RT용 데스크탑 프로그램이, 특별한 라이센스 없이 모든 유저의 RT 타블렛에서 정상적으로 구동된다면, Windows RT 태블릿은 앞으로 매우 기대될것으로 생각되리라. 왜냐면 특별히 x86 인라인 어셈블리나 Intrinsic을 사용하지 않은 이상,  그 프로그램은 리컴파일만으로 ARM용으로 그대로 포팅이 가능하기 때문이다.  필자의 생각으로는 MS에서도 , RT에서의 데스크탑 애플리케이션 실행을 굳이 막아두지는 않았으리라 생각된다. 만약에 이것을 막아놨다면 RT 태블릿의 메리트가 확 떨어지기 때문이다.


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

'Study' 카테고리의 다른 글

How to compile desktop applications for Windows On ARM (Windows RT)  (7) 2012.10.17
by Sone 2012.10.17 04:59

 얼마전, 윈도우8 RTM이 MSDN/TechNet을 통해서 배포가 되어서, 설치를 해보았다. 

나의 첫번째 관심사는 시스템콜의 추가/삭제 여부였는지라, ntoskrnl.exe의 Export Table을 바로 까보았다.

시스템콜을 변경 유무를 살펴만 봐도, 해당 OS가 어떤 부분을 중점으로 개발이 진행되었는지, 유추정도는 할수 있으리라 생각했기 때문이다. 또한 커널 드라이버 개발때도 이러한 API들이 있구나, 하고 약간은 도움이 될것으로 생각된다.



* 아래 비교는  

Windows 8 Enterprise x64  <> Windows 7 Ultimate SP1 x64 

간의 비교임을 알려드립니다.




Removed System Calls on Windows 8 x64


Executive

ExUpdateLicenseData



I/O Manager

IoSetOplockKeyContext (Existed on Windows 8 x86)



Kernel Core

KeUpdateSystemTime



Process and Threads

PsSetJobUIRestrictionsClass



Transaction Manager

TmpIsKTMCommitCoordinator






Added System Calls on Windows 8 x64



Background Manager (?) (Can be related to BSOD?)

BgkDisplayCharacter

BgkGetConsoleState

BgkGetCursorState

BgkSetCursor



Cache Control

CcAddDirtyPagesToExternalCache

CcCopyReadEx

CcCopyWriteEx

CcDeductDirtyPagesFromExternalCache

CcFlushCacheToLsn

CcIsThereDirtyLoggedPages

CcRegisterExternalCache

CcScheduleReadAheadEx

CcSetAdditionalCacheAttributesEx

CcSetLogHandleForFileEx

CcSetLoggedDataThreshold

CcSetReadAheadGranularityEx

CcUnmapFileOffsetFromSystemCache

CcUnregisterExternalCache

CcZeroDataOnDisk



Configuration Manager

CmCallbackGetKeyObjectIDEx

CmCallbackReleaseKeyObjectIDEx



Executive

ExBlockOnAddressPushLock

ExBlockPushLock

ExCompositionSurfaceObjectType

ExGetFirmwareEnvironmentVariable

ExNotifyBootDeviceRemoval

ExQueryFastCacheAppOrigin

ExQueryFastCacheDevLicense

ExQueryTimerResolution

ExQueryWnfStateData

ExRealTimeIsUniversal

ExRegisterBootDevice

ExSetFirmwareEnvironmentVariable

ExSubscribeWnfStateChange

ExTimedWaitForUnblockPushLock

ExTryQueueWorkItem

ExUnsubscribeWnfStateChange

ExWaitForUnblockPushLock



File System

FsRtlAcquireEofLock

FsRtlAcquireHeaderMutex

FsRtlAreThereWaitingFileLocks

FsRtlCheckLockForOplockRequest

FsRtlDismountComplete

FsRtlGetFileNameInformation

FsRtlGetIoAtEof

FsRtlGetSectorSizeInformation

FsRtlGetSupportedFeatures

FsRtlInitializeEofLock

FsRtlIsSystemPagingFile

FsRtlIssueDeviceIoControl

FsRtlKernelFsControlFile

FsRtlMdlReadEx

FsRtlPrepareMdlWriteEx

FsRtlPrepareToReuseEcp

FsRtlQueryCachedVdl

FsRtlQueryKernelEaFile

FsRtlReleaseEofLock

FsRtlReleaseFileNameInformation

FsRtlReleaseHeaderMutex

FsRtlSetKernelEaFile

FsRtlTryToAcquireHeaderMutex

FsRtlUpdateDiskCounters



HyperVisor Library (?)

HvlGetLpIndexFromApicId

HvlPerformEndOfInterrupt

HvlQueryActiveHypervisorProcessorCount

HvlQueryActiveProcessors

HvlQueryHypervisorProcessorNodeNumber

HvlQueryProcessorTopology

HvlQueryProcessorTopologyCount

HvlQueryProcessorTopologyHighestId

HvlRegisterInterruptCallback

HvlRegisterWheaErrorNotification

HvlUnregisterInterruptCallback

HvlUnregisterWheaErrorNotification



BSOD Screen

InbvNotifyDisplayOwnershipChange



I/O Manager

IoBoostThreadIo

IoClearActivityIdThread

IoClearReservedDependency

IoCompletionObjectType

IoCopyDeviceObjectHint

IoCreateStreamFileObjectEx2

IoCreateSystemThread

IoDecrementKeepAliveCount

IoGetActivityIdIrp

IoGetActivityIdThread

IoGetDeviceInterfacePropertyData

IoGetInitiatorProcess

IoGetOplockKeyContextEx

IoIncrementKeepAliveCount

IoInitializeMiniCompletionPacket

IoIsActivityTracingEnabled

IoIsInitiator32bitProcess

IoIsValidIrpStatus

IoPropagateActivityIdToThread

IoQueueWorkItemToNode

IoRegisterBootDriverCallback

IoRegisterIoTracking

IoReportInterruptActive

IoReportInterruptInactive

IoReserveDependency

IoResolveDependency

IoSetActivityIdIrp

IoSetActivityIdThread

IoSetDeviceInterfacePropertyData

IoSetMasterIrpStatus

IoSynchronousCallDriver

IoTransferActivityId

IoTryQueueWorkItem

IoUnregisterBootDriverCallback

IoUnregisterIoTracking

IoVolumeDeviceToGuid

IoVolumeDeviceToGuidPath



Kernel Debugger

KdLogDbgPrint



Kernel Core

KeDispatchSecondaryInterrupt

KeForceEnableNx

KeGetNextTimerExpirationDueTime

KeHwPolicyLocateResource

KeInitializeSecondaryInterruptServices

KeInitializeSpinLock (Not existed on Windows 8 x86)

KeLoadMTRR

KeQueryEffectivePriorityThread

KeQueryInterruptTimePrecise

KeQuerySystemTimePrecise

KeQueryTotalCycleTimeThread

KeStallWhileFrozen

KeSweepLocalCaches

KeUpdateTime

KeUpdateTimeAssist

KeWriteProtectPAT



Unknown prefix

KseQueryDeviceData

KseQueryDeviceDataList

KseQueryDeviceFlags

KseRegisterShim

KseRegisterShimEx

KseSetDeviceFlags

KseUnregisterShim



Memory Manager

MmAllocateContiguousNodeMemory

MmAllocateMdlForIoSpace

MmAllocateNodePagesForMdlEx

MmAreMdlPagesCached

MmGetMaximumFileSectionSize

MmIsDriverSuspectForVerifier

MmMapViewInSessionSpaceEx

MmMapViewInSystemSpaceEx

MmMdlPageContentsState

MmPrefetchVirtualAddresses



NT System Calls (NT prefix)

NtSetCachedSigningLevel

NtSetInformationVirtualMemory



Object Manager

ObDuplicateObject

ObReferenceObjectSafe

ObReferenceObjectSafeWithTag

ObWaitForMultipleObjects

ObWaitForSingleObject




Power Manager

PoAllProcessorsDeepIdle

PoFxActivateComponent

PoFxCompleteDevicePowerNotRequired

PoFxCompleteIdleCondition

PoFxCompleteIdleState

PoFxIdleComponent

PoFxNotifySurprisePowerOn

PoFxPowerControl

PoFxProcessorNotification

PoFxRegisterCoreDevice

PoFxRegisterDevice

PoFxRegisterPlugin

PoFxRegisterPluginEx

PoFxRegisterPrimaryDevice

PoFxReportDevicePoweredOn

PoFxSetComponentLatency

PoFxSetComponentResidency

PoFxSetComponentWake

PoFxSetDeviceIdleTimeout

PoFxStartDevicePowerManagement

PoFxUnregisterDevice

PoGetProcessorIdleAccounting

PoInitiateProcessorWake

PoLatencySensitivityHint

PoNotifyDisableDynamicTick

PoNotifyVSyncChange

PoRegisterCoalescingCallback

PoSetUserPresent

PoUnregisterCoalescingCallback

PoUserShutdownCancelled



Process and Threads

PsChargeProcessWakeCounter

PsCreateSystemThreadEx

PsDereferenceKernelStack

PsGetProcessCommonJob

PsGetProcessSignatureLevel

PsGetThreadExitStatus

PsIsDiskCountersEnabled

PsQueryProcessAttributesByToken

PsQueryTotalCycleTimeProcess

PsReferenceKernelStack

PsReleaseProcessWakeCounter

PsUpdateDiskCounters



Runtime Library

RtlAddAtomToAtomTableEx

RtlAddResourceAttributeAce

RtlCheckPortableOperatingSystem

RtlCheckTokenCapability

RtlCheckTokenMembership

RtlCheckTokenMembershipEx

RtlCopyBitMap

RtlCrc32

RtlCrc64

RtlCreateAtomTableEx

RtlCreateHashTableEx

RtlCreateUserThread

RtlCultureNameToLCID

RtlDecompressBufferEx

RtlDeleteElementGenericTableAvlEx

RtlEqualWnfChangeStamps

RtlExtractBitMap

RtlGenerateClass5Guid

RtlGetAppContainerNamedObjectPath

RtlIsUntrustedObject

RtlLCIDToCultureName

RtlNumberOfClearBitsInRange

RtlNumberOfSetBitsInRange

RtlOpenCurrentUser

RtlQueryInformationAcl

RtlQueryPackageIdentity

RtlQueryRegistryValuesEx

RtlQueryValidationRunlevel

RtlRbInsertNodeEx

RtlRbRemoveNode

RtlSetControlSecurityDescriptor

RtlSetPortableOperatingSystem



Security

SeAccessCheckFromStateEx

SeAuditingAnyFileEventsWithContextEx

SeAuditingFileEventsWithContextEx

SeCreateClientSecurityEx

SeCreateClientSecurityFromSubjectContextEx

SeGetLogonSessionToken

SeQuerySecureBootPolicyValue

SeSecurityAttributePresent

SeSystemDefaultSd

SeTokenFromAccessInformation



Transaction Manager

TmRequestOutcomeEnlistment

TmSinglePhaseReject



Windows Hardware Error Architecture

WheaRegisterInUsePageOfflineNotification (Not existed on Windows 8 x86)

WheaUnregisterInUsePageOfflineNotification (Not existed on Windows 8 x86)



NT System Calls (ZW prefix)

ZwAlpcConnectPortEx

ZwCreateWnfStateName

ZwDeleteWnfStateData

ZwDeleteWnfStateName

ZwFlushBuffersFileEx

ZwQuerySystemEnvironmentValueEx

ZwQueryWnfStateData

ZwQueryWnfStateNameInformation

ZwSetCachedSigningLevel

ZwSetInformationKey

ZwSetInformationVirtualMemory

ZwSetSystemEnvironmentValueEx

ZwUnlockVirtualMemory

ZwUpdateWnfStateData



Standard Library

bsearch_s


저작자 표시 비영리 변경 금지
신고
by Sone 2012.08.21 18:00

  

Apple | iPhone 4S | Normal program | Pattern | 1/20sec | F/2.4 | 4.3mm | ISO-100 | Off Compulsory | 2012:06:10 18:07:28



  현재 한국에는 갤럭시S3를  3G모델과 LTE모델 2종류로 판매하고 있습니다. SKT는 3G모델과 LTE모델,  KT는 LTE모델만 판매하고 있죠.

한국의 갤럭시S3 유저분들중, KT를 사용하시는분들이라면 대부분 LTE를 사용하고 계시겠지만, 저는 해외판 갤럭시S3 GT-I9300을 KT통신사를 통해서 3G요금제를 이용하고 있습니다. 




  잘 사용하고 있던 즈음, 어느날 환경설정을 뒤적거리다가 NFC라는 기능을 좀더 효과적으로 활용해볼 방안이 없을까, 생각을 하게 되었습니다.







  모두 아시다시피, 이번 갤럭시S3부터는 해외판도 NFC기능을 지원합니다. 따라서 통신사에서 제공하는 NFC USIM을 사용하면 그 기능을 효과적으로 활용할 수 있습니다. 아래처럼 갤럭시S3의 배터리에 Near Field Communication이라는 문장이 써져있고, 즉 NFC통신을 위한 안테나가 배터리속에 내장되어져 있다는 말이 되겠습니다.


SAMSUNG | GT-I8700 | Normal program | Center-weighted average | 1/8sec | F/2.6 | 0.00 EV | 3.8mm | ISO-200 | Off Compulsory | 2012:07:23 16:20:55





갤럭시S3는 Micro-USIM 규격을 사용합니다. 저는 KT를 사용하고 있어서, KT에 Micro-USIM 규격이면서 NFC기능이 탑재된 USIM이 있는지 여부를 물었더니, KT에서 온 답변은 아래와 같았습니다.




위 답변내용에서 확인할 수 있다시피, KT에서 Micro-USIM이면서도 NFC기능이 탑재된 USIM은 LTE폰에만 들어가는 USIM밖에 존재하지 않습니다. 즉, 니가 아무리 3G폰을 지금 쓰고 있어도 , Micro-NFC USIM으로 바꾸려면 LTE요금제로 바꿔라!  라는 말입니다. LTE폰을 쓰지도 않는데 LTE요금제로 바꾸라니? 사용자입장에서는 그저 황당할뿐이죠.




그래서 저는 다른 방법을 택했습니다.


SAMSUNG | GT-I9300 | Aperture priority | Average | 1/100sec | F/2.6 | 0.00 EV | 3.7mm | ISO-125 | Flash did not fire | 2012:07:20 18:00:15



  (구형 SHOW USIM은 무시)

  USIM커터기를 대리점에 당당히 들고갔습니다. 그리고 갤럭시S2에 들어가는 NFC유심을 달라고 했습니다. 당연히 직원분은 당황할 수 밖에 없겠죠. 왠 생판 이상한 사람이 손에 스태플러 같은것을 들고 들어오더니, Micro-USIM을 이용해야 하는 폰인데, 일반USIM을 달라고 하니 말이죠. (제가 사는 동네는 촌동네라 대리점 직원이 USIM커터기같은건 모르더군요)



그러곤 직원이 보는 앞에서, 커터기로 USIM을 조졌습니다.


SAMSUNG | GT-I8700 | Normal program | Center-weighted average | 1/13sec | F/2.6 | 0.00 EV | 3.8mm | ISO-160 | Off Compulsory | 2012:07:23 16:33:53


(옴니아7 카메라 유리 부분이 뿌옇게 되서, 화질이 구린점 양해바랍니다.)

이제 갤럭시S3에 잘 들어갑니다. 어제 시험삼아, 지하철역에서 티머니 1만원치 충전해보니 잘 충전되더군요. 혹시 해외판 갤럭시S3를 사용하시면서 KT통신사를 이용하신다면 참조하시면 되겠습니다.





저작자 표시 비영리 변경 금지
신고
by Sone 2012.07.23 16:44

  근 4달여만에 새로운 주제로 블로깅을 하려니 약간 낯선점이 많다. 그래도 이렇게 블로깅을 하려고 한 이유는 어떤 프로그램의 문제점을 알리기 위해서이다.





  최근 해외에 잠시 여행을 다녀왔는데, 그때도 원격으로 컴퓨터를 컨트롤하기 위해서 컴퓨터를 4일동안 켜두었다. 그런데 한 이틀정도 지나서 컴퓨터에 원격으로 접속을 해보니, 아래와 같은 메시지가 떠 있었다.






"컴퓨터의 메모리가 부족합니다."






참고로 컴퓨터의 사양은 아래와 같다.


CPU : Intel Core i7 2670QM 2.2Ghz (Turbo Boost 3.1Ghz)

RAM : TeamGroup DDR3 1333Mhz 8Gb * 2 = 16Gb

VGA : NVIDIA Geforce GT 540M  GDDR3 2048Mb

O/S : MS Windows 7 SP1 x64




  가만히 생각을 해보니, 필자가 윈도우NT/2000기반의 완전한 32비트 운영체제로 넘어오고나서, "메모리가 부족합니다" 라는 메시지를 본적이 기억에도 없는것 같은데, 몇일전에 이 메시지를 보고야 만것이다. 더군다나, 메모리를 16기가로 업그레이드한지 그리 오래되지 않았는데, 메모리 부족 메시지를 보고야 만것이다!  이 메시지를 처음 보고나서,  메모리가 쪼달리나? 싶어서,  보드만 지원된다면 16Gb메모리를 버리고, 32Gb 메모리를 달고 싶었으나, 샌디브릿지 모바일 플랫폼 최대 지원용량은 16Gb기 때문에 아쉬움이 밀려왔다.(?)


  어쨌든 16Gb Physical Memory 환경에서 아무런 작업도 없는 Idle 상태에서 메모리 부족 메시지가 떴다는것은 분명 어떠한 프로그램에서 메모리 할당 후 해제를 해주지 않아서 이러한 문제가 발생했을 가능성이 높다고 판단해서 얼른 작업관리자를 열어서 확인을 해보았다.





 자! 작업관리자로 가만히 살펴보니, Memory Commit으로 정렬해서 살펴보았지만 크게 메모리 누수라 할만큼 사이즈가 크게 잡힌 프로세스는 보이지 않았다. 그래서 핸들을 기준으로 정렬해보니,  oemmice.exe 라는 녀석이 당당하게도 윈도우NT 커널을 제치고 1등으로 핸들을 잡아먹고 있었다. 지금 이 글을 쓰는 시점에서도 oemmice.exe의 핸들은 2개씩 차곡차곡 쌓이고 있다. 시스템의 메모리는 내가 다 독차지 해버리겠다!!   라고 말하면서 메모리를 다 갉아먹는 벌레같이 보일 정도이다.


( 참고 : 컴퓨터를 이틀동안 켜놓았더니  oemmice.exe가 잡아먹는 핸들의 갯수는 무려 3만2천개였으며, 

Physical Memory 사용량은 99%였음 )





  도저히 저 프로그램이 뭐 길래, 어떤 부분에서 핸들을 오픈하고 닫지않는지를 살펴보기 위해서 Process Hacker를 이용해서 내부를 살펴보았다. 



  핸들 리스트를 살펴보니, 레지스트리 키가 계속 2개씩 오픈되고 있음을 확인할 수 있었다. 현재 프로그램의 흐름상 저것이 닫힐일은 절대 없는것이다. 지금 이 글을 쓰는 시점에도 계속 2개씩 열리고 있다.



 저 핸들이 도대체 뭘 하는것인가, 궁금해서 속성을 살펴보았다.


Reference 카운트도 1임을 보면, 여러곳에서 참조를 해서 사용하고 있는것도 아니다. 즉, 단발성으로 Open - Use - Close 형식으로 작성되어져 있을것이다.





  그럼 이제 저 문자열로 레지스트리 키가 오픈된다는것은 알았으니 , RegOpenKey 또는 RegOpenKeyEx 등의 API로 저 경로의 레지스트리를 오픈할것이기 때문에,  API와 문자열을 바탕으로 프로그램의 속을 훑어보았다.



  위 부분은 SCX-1750 Series라는 키와 SCX-1770F Series 라는 키가 오픈될때 사용되는 루틴이다. 사실 SCX-1750과 SCX-1770F라 두 문자열에서 하나의 서브루틴을 사용하는 형태로 프로그램을 짜면 될텐데, 두 문자열이 각각의 루틴을 가지고 있었다. 어쨌든 루틴을 살펴보면, 앞서 언급한 문자열을 파라메터로 넘기면서 RegOpenKeyExA를 호출하고 있음을 확인할 수 있다. 여기까지는 아주 정상적으로 보였다. RegOpenKeyExA가 성공하면 0x00000000 성공이라는 리턴을 뱉을것이고, TEST EAX,EAX를 거친 뒤, JE 점프문에서 점프를 해서 아래로 실행이 쭉쭉 될것이다. 


이제 JE점프문을 따라가보자.

  잉? 앞서 RegOpenKeyExA를 성공하고 JE점프문을 따라서 그대로 내려왔는데, 또 똑같은 파라메터를 전달하면서 RegOpenKeyExA를 호출하고 있다!  즉, 결과적으로 RegOpenKeyExA가 두번 호출되고나서, 아래에서 RegSetValueExA를 이용해서 원하는 작업을 수행한 뒤, RegCloseKey를 수행해서 핸들을 닫는것이다.


즉 수행 루틴은 다음과 같다.

RegOpenKeyExA   ->  RegOpenKeyExA -> RegSetValueExA -> RegCloseKey



이 루틴은 다음과 같은 두 키를 대상으로 두번씩 반복적으로 진행된다.

HKLM\SOFTWARE\Wow6432Node\Samsung\DigitalImaging\CIPToolbox\Samsung SCX-1750 Series

HKLM\SOFTWARE\Wow6432Node\Samsung\DigitalImaging\CIPToolbox\Samsung SCX-1770F Series



이거 아무리 봐도 개발자가 개발하다가 귀찮아서 Copy & Paste를 했거나, 실수로 못봤을 가능성이 크다.



이 프로그램의 정체가 도대체 뭔가 싶어서 바이너리 정보를 살펴봤더니, 다음과 같았다.


 잉? 삼성 디지털 이미징?  생각해보니, 필자는 현재 삼성 SCX-1490W 라는 잉크젯 복합기를 사용중이다. 그럼 SCX-1490W 프린터를 사용하는 사람은 죄다 이 프로그램이 시스템 메모리에 상주하고 있을텐데, 죄다 이런 현상을 겪고 있는건가?

근데 생각해보니 나는 SCX-1490W 모델을 쓰고있는데,  레지스트리 핸들은 왜 SCX-1750 시리즈와 SCX-1770F 시리즈가 열리고 있는거지? 내가 저 프린터 모델을 쓰고 있는것도 아닌데? 아하! 이 프로그램을 여러 모델에서 돌려쓰고 있을 것이다. 그러면...이 문제는 SCX-1490W만의 문제가 아닌, 여러 프린터 모델에도 해당되는 문제일 것이다.



더 큰 문제는 Oemmice 프로그램이 윈도우 시작시 자동실행되고 있다는점이다.


Oemmice Application이라고 떡하니 이름을 올리고 있다!   그렇다면 윈도우 부팅때부터 야금야금 메모리를 잡아먹을 것이다.




핸들 누수는 심각한 문제로 판단되어져서, 프로그램에 임의로 패치를 해야될 필요가 있다. 

(원래는 삼성에서 개선해줘야 하는 문제이다.)

RegOpenKeyExA 가 두번 호출되는것을, 한번 호출되는 형태로 바꿔주어야 될것이다.

따라서 두번째 호출되는 RegOpenKeyExA는 NOP처리를 해주어야 한다.


결론적으로, 패치할 부분은 아래 두군데 이다. (SCX-1750, SCX-1770F 두군데.)













패치를 수행했더니 핸들 테이블이 아래와 같이 아주 깨끗한 상태임을 확인할 수 있었다.







아래는 패치된 파일이다. (만약을 대비해서 원본파일을 백업해두고 덮어씌울것을 권장한다.)

덮어씌울때는 작업관리자에서 oemmice.exe를 강제종료 시킨 뒤, 파일을 교체하고 다시 실행하면 된다.


oemmice.exe






아울러, 삼성에서도 이 문제를 인지하고 프로그램을 개선해야될것이다.


저작자 표시 비영리 변경 금지
신고
by Sone 2012.07.04 13:01

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

  종종 프로세스의 메모리를 덤프해야될때가 있는데, 이 프로그램은 특정 프로세스의 COMMIT && READ 가능한 영역은 모두다 찾아서 덤프해줍니다. 참고로 유저모드 프로그램이며, 커널 영역으로는 내려가지 않습니다.
(커널에서 후킹이 이루어지는 프로세스인 경우, (ex. 자가보호)  덤프가 안될수 있음)
잘못된 점이 있으면 알려주세요 !





#include <stdio.h>
#include <Windows.h>
#include <Tlhelp32.h>
#include <tchar.h>


//to set super privilege for current process
VOID SetSuperPrivilege(IN LPCTSTR PrivilegeName)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp;

//get token handle from current process
if ( !OpenProcessToken( 
GetCurrentProcess(), 
TOKEN_ADJUST_PRIVILEGES, 
&hToken)
) {
_tprintf(_T("OPToken error. %d\n"), GetLastError());
return;
}
__try {


//query debug privilege
if ( !LookupPrivilegeValue(
NULL, 
PrivilegeName, 
&tp.Privileges[0].Luid)
) {
_tprintf(_T("LUPPrivilege error. %d\n"), GetLastError());
return;
}


tp.PrivilegeCount = 1; //must be 1
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //privilege enabled


//adjust token privilege
if ( !AdjustTokenPrivileges(
hToken, 
FALSE, 
&tp, 
sizeof(TOKEN_PRIVILEGES), 
NULL, 
NULL)
) {
_tprintf(_T("ADJUPrivilege error. %d\n"), GetLastError());
return;
}

}
__finally {
CloseHandle(hToken);
}
}


//Enum process list on display
BOOL EnumerateProcessList(VOID)
{
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;

//get a snapshot handle
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( hSnapShot == INVALID_HANDLE_VALUE ) {
_tprintf(_T("CTHelp32 error. %d\n"), GetLastError());
return FALSE;
}

__try {

//initialize PROCESSENTRY structure
ZeroMemory(&pe32, sizeof(PROCESSENTRY32));
pe32.dwSize = sizeof(PROCESSENTRY32);

//call first
if ( !Process32First(hSnapShot, &pe32) ) {
_tprintf(_T("PE32First error. %d\n"), GetLastError());
return FALSE;
}

//call next until ERROR_FILE_NOT_FOUND or failed to call next
while( Process32Next(hSnapShot, &pe32) ) {

if ( GetLastError() == ERROR_FILE_NOT_FOUND ) {
break;
}

//Enum process list on display
_tprintf(
_T("%-30s\t\t%-4d\n"), 
pe32.szExeFile, 
pe32.th32ProcessID
);

}

return TRUE;

}
__finally {
CloseHandle(hSnapShot);
}

}

//dump memory which is on target process
VOID DumpAllMemory(IN HANDLE hProcess)
{
HANDLE hFile;
LPVOID lpMem, lpBuffer;
DWORD NumberofBytesWritten;
TCHAR szFileName[MAX_PATH];
SYSTEM_INFO si;
MEMORY_BASIC_INFORMATION mbi;

if ( hProcess == NULL ) {
_tprintf(_T("hProcess is an invalid value.\n"));
return;
}


/* Get maximum address range from system info */
GetSystemInfo(&si);
//initialize MBI
ZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
lpMem = NULL;

while (lpMem < si.lpMaximumApplicationAddress) {
if ( !VirtualQueryEx(
hProcess, 
lpMem, 
&mbi, 
sizeof(MEMORY_BASIC_INFORMATION)) 
) {

_tprintf(_T("VQuery failed. %d\n"), GetLastError());
CloseHandle(hProcess);
return;

}

/* Increase lpMem to next region of memory */
lpMem = (PVOID)( ( (DWORD_PTR)mbi.BaseAddress + 
(DWORD_PTR)mbi.RegionSize) );


if ( (mbi.BaseAddress != NULL) &&
(mbi.State == MEM_COMMIT) ) {


switch (mbi.Protect)
{
case PAGE_EXECUTE_READ:
case PAGE_EXECUTE_READWRITE:
case PAGE_EXECUTE_WRITECOPY:
case PAGE_READONLY:
case PAGE_READWRITE:
case PAGE_WRITECOPY:

//allocate temp buffer to save data
lpBuffer = VirtualAlloc(
NULL, 
mbi.RegionSize, 
MEM_COMMIT, 
PAGE_READWRITE
);

//read data from target process's memory, data is gonna be saved into lpBuffer
if ( !ReadProcessMemory(
hProcess, 
mbi.BaseAddress, 
lpBuffer, 
mbi.RegionSize, 
NULL) 
) {
_tprintf(_T("ReadMemory failed. %d\n"), GetLastError());
VirtualFree(lpBuffer, mbi.RegionSize, MEM_FREE);
break;
}
//generate file name
_stprintf_s(
szFileName, 
sizeof(szFileName), 
_T("%X - %X.dmp"), 
mbi.BaseAddress, 
((DWORD_PTR)mbi.BaseAddress + (DWORD_PTR)mbi.RegionSize)
);

//create file
hFile = CreateFile(
szFileName, 
GENERIC_WRITE, 
0, 
NULL, 
CREATE_ALWAYS, 
FILE_ATTRIBUTE_NORMAL, 
NULL
);

//write data into file
if ( WriteFile(
hFile, 
lpBuffer, 
(DWORD_PTR)mbi.RegionSize, 
&NumberofBytesWritten, 
NULL) 
) {
_tprintf(_T("Dumped successfully : %s\n"), szFileName);
} else _tprintf(_T("failed to dump : %s,  %x\n"), szFileName, GetLastError());

//return resources
VirtualFree(lpBuffer, mbi.RegionSize, MEM_FREE);
CloseHandle(hFile);
break;

default:
break;
}


}


}

CloseHandle(hProcess);
return;
}


int _tmain( int argc, TCHAR* argv[] )
{
DWORD target_pid;

//obtain super privilege
SetSuperPrivilege(SE_DEBUG_NAME);

//enum process list on display
if ( !EnumerateProcessList() ) {
return EXIT_FAILURE;
}

//input target PID
_tprintf(_T("\n\n ### Choose target PID : "));
_tscanf(_T("%d"), &target_pid);

//dump
DumpAllMemory ( 
OpenProcess(
PROCESS_ALL_ACCESS, 
FALSE, 
target_pid
);

//end
system("pause");
return EXIT_SUCCESS;
}
저작자 표시 비영리 변경 금지
신고
by Sone 2012.01.19 02:44
  다들 잘 아시다시피, x64기반에서는 인라인어셈블리를 사용하지 못합니다. 그래서 VC컴파일러가 제공하는 Intrinsics를 써야합니다. 그런데 DDK환경에서 개발할때, WinDDK라이브러리에는 intrin.h 파일이 포함되어져 있지 않기때문에, 이것을 모른다면 좀 골치아픕니다. 오늘 구글링을 하다가 알아내었는데, 다음과 같이 선언을 해주면 해결이 됩니다.

 #ifdef _X86_
unsigned long __readcr0(void);
void __writecr0(unsigned long);
#else
unsigned __int64 __readcr0(void);
void __writecr0(unsigned __int64);
#endif

#pragma intrinsic(__readcr0)
#pragma intrinsic(__writecr0)

  만약에 cr0 레지스터를 읽어오고 싶다면 __readcr0 라는 펑션을 사용합니다. 그런데 cr0는 32비트환경에서는 32비트만 사용되고, 64비트 환경에서는 64비트로 확장됩니다.(물론 상위 32비트는 Reserved로써 현재로썬 사용이 되고 있지 않습니다.) 따라서 32비트와 64비트에서 Intrinsic이 동작하는 방식이 다릅니다. 그래서 X86과 X64일때 선언을 달리해주어야합니다.


  하나 예를 더 들어볼까요. MSR레지스터를 읽어오는 Intrinsic을 선언하고싶다면 아래와 같이 하면 됩니다.

 unsigned __int64 __readmsr(unsigned long);
void __writemsr(unsigned long, unsigned __int64);
#pragma intrinsic(__readmsr)
#pragma intrinsic(__writemsr)

MSR은 32비트 환경이건, 64비트 환경이건간에,  64비트 레지스터이므로 X86과 X64나눠서 선언을 달리 해줄 필요가 없습니다.
 
저작자 표시 비영리 변경 금지
신고
by Sone 2012.01.06 02:41




Windows Internals: Covering Windows Server 2008 R2 and Windows 7

 0735648735  978-0735648739 December 22, 2011 Sixth Edition

Delve inside Windows architecture and internals—guided by a team of internationally renowned internals experts. Fully updated for Windows 7 and Windows Server 2008 R2, this classic guide delivers key architectural insights on system design, debugging, performance, and support—along with hands-on experiments to experience Windows internal behavior firsthand.

See how Windows components work behind the scenes:

  • Understand how the core system and management mechanisms work
  • Explore internal system data structures using tools like the kernel debugger
  • Go inside the Windows security model to see how it authorizes access to data
  • Understand how Windows manages physical and virtual memory
  • Tour the Windows networking stack from top to bottom
  • Troubleshoot file-system access problems and system boot problems
  • Learn how to analyze crashes

뭔가 거창하게 복사해서 붙여넣기는 했는데, 결국은 12월달에 나오는군요.
아마존닷컴에서는 이미 선주문을 받고 있습니다.
(http://www.amazon.com/Windows-Internals-Covering-Server-2008/dp/0735648735/ref=pd_sim_b_15)

원가는 $69.99 로써,  우리나라에 입고가 된다면 7만원 후반대에서 8만원정도에 팔릴것으로 예상되나,
아마존닷컴에서 선주문시에는 45%세이빙 된 가격인, 38달러정도에 구매할 수 있습니다.


저자는 역시나  환상의콤비  마크 러시노비치, 데이비드 솔로몬, 알렉스 이오네스쿠가 되겠고, 
책 내용은 예상했던대로 윈도우NT커널 6.1(윈도우7, 서버2008 R2) 의 내용이 주가 될것으로 보여집니다.
그런데 여전히 5판도 다 못읽은 상태......
저작자 표시 비영리 변경 금지
신고
by Sone 2011.09.13 06:12


 MS에서 윈도우모바일6을 버리고, 윈도우폰7을 2010년4분기에 내놓았었습니다. 그때 잠깐 반응이 들썩하더니, 이내 가라앉고 말았죠. 초반에 윈도우폰7의 완성도는 그다지 좋은편이 아니었습니다. 멀티태스킹이 안되고, 심지어 복사&붙여넣기도 안됐었죠. 물론 코드명 "Nodo"가 업데이트 되면서 복사&붙여넣기는 가능해졌지만, 여전히 멀티태스킹은 불가능했었습니다.


그리고 점유율이 추락하면서 시간이 오늘에까지 이르렀습니다.


 이제 MS의 행보를 살펴보면, 윈도우폰7.5 코드네임 "Mango"의 RTM을 완성했고, 그것을 제조사에게 전달한 시점입니다. 그리고 이번달에 있을것으로 예상되는 망고 업데이트를 위해서 제조사에서 열심히 작업중이죠. 그것과 더불어서 MS에서 새롭게 제시한 사양 규격인 윈도우폰7.5를 기반으로 하는 새로운 디바이스를 출시할 예정입니다.


 
 모든 이목이 새로운 디바이스 출시에 집중된 가운데,  1세대 디바이스에 망고가 적용된것을 한번 살펴볼 필요가 있을것도 같습니다. 이전 윈도우모바일6때 MS가 업데이트도 제공안하고 버렸다는 편견이 아직도 많은 사람들의 머릿속에 남아있죠. 그리고 1세대와 2세대간의 성능차이도 비약적으로 많이 나진 않고, 여전히 1세대 디바이스의 성능은 그렇게 나쁜편은 아닙니다. 아직 공식적으로 망고업데이트가 제공되진 않았습니다만,  많은 사용자들이 비공식루트로 입수해서 사용중입니다. 



 저는 많은 디바이스 중, 삼성 "옴니아7" 을 구매했습니다. 여전히 옴니아하면 많은 사람들에게 안좋은 기억만이 있을뿐이죠. 물론 저도 한국에 있을때, 옴니아2를 사용했었고, 뭐 이런 쓰레기 디바이스가 다 있나 싶어서 욕하고 그랬었습니다. 그러나 옴니아7을 실제로 사용해보면 그 안좋은 기억이 단번에 날아갈거라고 생각되네요. 물론 옴니아 뿐만 아니라, 다른 윈도우폰7 디바이스를 사용하면 이전의 안좋은 윈도우모바일에 대한 기억은 다 사라질것입니다. 일단 옴니아7의 사양을 살펴보겠습니다.



출처 : http://www.gsmarena.com/samsung_i8700_omnia_7-3537.php

GENERAL 2G Network GSM 850 / 900 / 1800 / 1900
3G Network HSDPA 900 / 2100
Announced 2010, October
Status Available. Released 2010, October
SIZE Dimensions 122.4 x 64.2 x 11 mm
Weight 138.2 g
DISPLAY Type Super AMOLED capacitive touchscreen, 16M colors
Size 480 x 800 pixels, 4.0 inches (~233 ppi pixel density)
  - Multi-touch input method
- Accelerometer sensor for UI auto-rotate
- Proximity sensor for auto turn-off
SOUND Alert types Vibration, MP3, WAV ringtones
Loudspeaker Yes
3.5mm jack Yes, check quality
MEMORY Phonebook Practically unlimited entries and fields, Photocall
Call records Practically unlimited
Internal 8GB/16GB storage
Card slot No
DATA GPRS Class 12 (4+1/3+2/2+3/1+4 slots), 32 - 48 kbps
EDGE Class 12
3G HSDPA, 7.2 Mbps; HSUPA, 5.76 Mbps
WLAN Wi-Fi 802.11 b/g/n
Bluetooth Yes, v2.1 with A2DP
Infrared port No
USB Yes, microUSB v2.0
CAMERA Primary 5 MP, 2592 x 1944 pixels, autofocus, LED flash, check quality
Features Geo-tagging, image stabilization
Video Yes, 720p@25fps
Secondary No
FEATURES OS Microsoft Windows Phone 7
CPU 1 GHz Scorpion processor, Adreno 200 GPU, Qualcomm QSD8250 Snapdragon chipset
Messaging SMS (threaded view), MMS, Email, Push Email, IM
Browser HTML (Internet Explorer)
Radio Stereo FM radio with RDS
Games Yes + downloadable
Colors Black
GPS Yes, with A-GPS support
Java No
  - Digital compass
- Microsoft office document viewer/editor
- MP4/WMV player
- MP3/WAV/WMA/eAAC+ player
- Facebook integration
- Organizer
- Voice memo
- Predictive text input
BATTERY   Standard battery, Li-Ion 1500 mAh
Stand-by Up to 390 h (2G) / Up to 330 h (3G)
Talk time Up to 5 h 40 min (2G) / Up to 6 h 10 min (3G)
MISC SAR US 0.78 W/kg (head)     0.41 W/kg (body)    
SAR EU 0.65 W/kg (head)    
Price group


 스냅드래곤 1Ghz, 512램, 8/16기가, 컴파스, 조도센서, 근접센서, 모션센서, GPS 등 지원할건 다 지원합니다. GPU성능이 좀 부족한데, 개인적으로 크게 개의친 않기 때문에 크게 문제는 없을것으로 생각되네요. 저는 16기가 버젼을 구매했습니다. 16기가 버젼은 유럽 일부 국가에서만 유통되고 있습니다. 



SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:48:52
 패키지 앞 모습입니다. 유럽 돼지코와 미국 돼지코는 호환이 되지 않기 때문에, 판매사이트에서 컨버터도 제공해주었습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-480 | Off Compulsory | 2011:07:02 12:49:11
 패키지 뒷 모습입니다. 사양을 간단히 표시하고 있는데, 위에서 살펴본 바와 같이 그럭저럭 무난한 스펙을 가지고 있습니다.






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/15sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:49:33

 박스를 열자, 옴니아7의 모습이 드러납니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:50:34

 박스 내용물 입니다. 해외 등지에서 판매되는 제품들은 배터리가 하나밖에 제공되지 않습니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-640 | Off Compulsory | 2011:07:02 12:51:05

 MS에서 강제로 정한것 중 하나가, 하드웨어 버튼에 관한것인데,  홈버튼, 검색, 뒤로, 오른쪽측면 카메라, 오른쪽측면 전원, 왼쪽 측면 볼륨조절  이 버튼들 외에는 장착하지 못하도록 했습니다. 그래서 대부분의 윈도우폰은 위와 비슷한 형식으로 나올것입니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-480 | Off Compulsory | 2011:07:02 12:51:16

 디바이스 바디 제질은 알루미늄 금속 재질로 되어져 있어서 손에 쥐면 견고한 느낌을 받습니다. 디자인은 삼성 웨이브2 바다폰과 매우 흡사해보입니다. 참고로 2세대 윈도우폰은 Windows Phone 글씨 옆의 동그란 로고가 네모난 로고로 바뀌어져서 출시될 예정입니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:57:24

 왼쪽 측면엔 볼륨조절 버튼만 자리하고 있습니다. 그렇게 두껍지도, 얇지도 않은 두께입니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:52:18

현재 아이폰3GS를 사용하고 있는데, 지루함을 느낄때마다 가끔씩 바꿔서 사용합니다. 옴니아7이 성능이 전반적으로 더 좋아서, 옴니아7을 사용하지만 아이폰의 소프트웨어는 무시할수가 없는지라 가끔 아이폰도 사용합니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:53:52

AT&T심카드를 옴니아7으로 옮겨서 사용해보도록 하겠습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:55:22

전원을 켜면 삼성 옴니아7이라고 글자가 나타납니다. 옴니아라는 이름이 거부감이 좀 있긴하지만, 아마 사용해보시면 거부감이 사라질가능성이 높습니다. ㅎㅎ





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:55:36

윈도우폰 초기버젼의 로고 입니다. 망고로 업데이트하면 저 초록색 동그란 윈도우마크가  네모난 빨간색 윈도우마크로 바뀝니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-200 | Off Compulsory | 2011:07:02 12:55:50

 굳이 윈도우모바일과 비교하자면, 조금은 아니 많이 낯설은 모습의 초기화면입니다. 라이브타일 형식을 취하고 있는데, 아이폰과 안드로이드와 굳이 비교하자면, 윈도우폰은 어플리케이션을 딱딱 찾아가서 실행하는 방식에서 약간 벗어나서, 뭔가 물흐르듯이 자연스럽게 연결되는 방식이 기존 OS들과의 차이점이라고 할수 있을것 같네요.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/15sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 12:56:34

 완전한 초기버젼의 옴니아7 입니다. 복사 붙여넣기도 지원이 안되는 완전 초기버젼이라고 보면 되겠네요. 컴파스도 지원안되고 기능이라고는 그저 인터넷,오피스,메일,어플리케이션 실행, 문자메시지, 전화 , 카메라, 노래, 동영상 이정도가 끝입니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:07:02 15:58:41

그래서 운영체제를 최신으로 업데이트를 시도했습니다. 위 사진은 망고 베타버젼으로 업데이트할때의 사진입니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:06 22:35:57

 망고로 업데이트 한뒤, 부팅때의 모습입니다. 로고가 이전버젼과는 달라졌음을 확인할 수 있습니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:06 22:38:59

I8700XXKH2 롬으로 플래쉬를 마치고 난뒤의 버젼정보입니다. 이번 버젼의 롬은 삼성내부적으로 RC버젼으로 분류되며 거의 릴리즈 직전 단계의 롬이라고 볼수 있을것 같습니다. 망고RTM을 탑재했고, 디바이스 드라이버등을 거의 개발&수정을 끝마치고 테스트를 위해서 빌드한것 같네요. 각종 센서 추가 지원 및  많은 버그 수정이 이루어졌습니다. 망고의 기능을 풀로 발휘하는 버젼으로 볼수 있습니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:06 22:36:44

 디스플레이 언어를 한국어를 지원하지는 않지만,  Region을 Korea로 바꾸면 위와 같이 날짜와 요일정도는 한국어로 표시됩니다.
ROM파일안에 상식적으로 모든 국가 언어를 담을수 없기때문에(용량이 커지므로), 기본적으로는 Deutsch, English, Espanol, Francais, Italiano 만 지원합니다. 한국어버젼은 편법으로 받을수도 있지만, 추후에 공식적으로 업데이트가 제공될때 문제없이 받을수 있을것으로 생각되네요.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-200 | Off Compulsory | 2011:09:03 20:19:04

 메인화면은 별반 다를것이 없습니다. 단, 하나 추가된것이 있다면 3번째줄에 제 사진이 보이는데 저 타일은 "ME" 라는 타일로써 저를 의미하는 객체입니다. ME타일로 들어가면 각종 제가 등록해놓은 페이스북,트위터,윈도우라이브 등 소셜네트워크 등의 계정상황을 쉽게 확인할 수 있고, 포스팅, 체크인등을 쉽게 할수 있습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-240 | Off Compulsory | 2011:09:03 20:20:32

앞서 말씀드린대로 디스플레이언어에 한국어는 없지만 Region은 코리안으로 설정 가능합니다. 사용하는데는 아무런 불편함이 없습니다. 영어를 잘 못하시는분께도 별로 영어 울렁증이란것도 없을듯 하네요..




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/6sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:22:05

키보드는 당연히 한국키보드도 지원합니다. 한국어 외에도 일본어, 중국어 등도 다 지원합니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:22:38

 망고부터 페이스북, 트위터, Linkedln, Windows Live, Google, Yahoo, Outlook 등을 기본 지원하며, OEM재량에 따라 다른 계정 등록도 가능합니다.






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:23:16

 Battery Saver라는 기능인데 이 기능을 작동시키면 모든 푸쉬서비스와 채팅 서비스같은것이 중지됩니다. 배터리 레벨이 낮아지면 자동으로 켜지게 할수 있으며, 충전기를 꽂으면 배터리세이버 기능이 자동으로 해제됩니다.

 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/4sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:24:18

 망고부터 써드파티 어플리케이션의 백그라운드 태스킹을 지원합니다. 원래는 푸쉬정도는 가능했는데, 백그라운드 태스킹은 불가능했었습니다. 설정에 들어가서 백그라운드 태스킹을 지원하는 써드파티 어플리케이션들을 나열하고 그것들의 설정을 쉽게 관리할 수 있습니다.






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/6sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:25:07

 카메라부분도 기능이 추가된것이 있는데, 사진을 찍는 즉시 바로 스카이드라이브에 업로드가 가능하며, 소셜네트워크와도 연동이 가능하게끔 되어져 있습니다. 그리고 폰이 Sleep인 상태에서 카메라버튼을 홀딩하면 카메라가 바로 작동하게끔 되어져 있습니다. 만약 폰이 주머니속에 들어 있을때는 근접센서가 그것을 감지해서 카메라버튼이 눌러져도 카메라 기능이 작동안하게끔 설정할수도 있습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-240 | Off Compulsory | 2011:09:03 20:26:03

 이전까지는 써드파티 어플리케이션이 라이브타일을 제대로 활용하는걸 본적이 별로 없었는데, 망고SDK부터 슬슬 라이브타일을 제대로 활용하는 어플리케이션이 나오기 시작하는거 같네요. Task라고 할일을 관리하는 어플리케이션인데, 라이브타일에 오늘의 할일등을 표시해줍니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/15sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:26:18

 다운받은 어플리케이션들은 위와 같이 화면에 표시되며, 만약 리스트가 45개 이상이 될 경우, 위와 같이 Alphabetical Order로 나열됩니다. 물론 한글은 ㄱ,ㄴ,ㄷ,ㄹ,ㅁ,ㅂ,ㅅ....순으로 나열이 됩니다. 45개 미만일 경우, 인덱스가 표시되지 않습니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:26:52

 인덱스 버튼을 누르면 위와 같이 Order 순으로 타일이 나열이 되서 손쉽게 찾아갈 수 있습니다. 단, 어플리케이션 이름을 기억해야 하는 단점이 있을수도 있는데 , 익숙해지면 별 문제 없을것으로 생각 됩니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:27:21

 망고에서 자신있게 내세울수 있는 부분 중 하나가, 바로 PEOPLE부분에 소셜네트워크 기능을 도입한 것입니다. 더이상 PEOPLE은 달랑 전화번호부가 아닌, 각종 소셜네트워크와 연계되어 사람들과 쉽게 소통할 수 있는 공간으로 완전히 바뀌었습니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/4sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:28:15

 어느 한 사람의 연락처를 선택하면,   전화와 SMS메시지는 기본이고, 그 사람의 최신소식, 페이스북에 바로 글을 남길수도 있고, 채팅도 할수있습니다.






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:28:55

 사진 메뉴도 더이상 폰에 저장된 사진만 보여주는것이 아닙니다. 소셜네트워크와 연계되서 각종 친구들의 사진을 볼수 있습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-200 | Off Compulsory | 2011:09:03 20:29:30

 MS윈도우하면 빠질수 없는것이 오피스가 되겠는데,  오피스14.5 버젼이 기본으로 탑재되어져 있습니다. 엑셀,파워포인트,워드,쉐어포인트, 원노트 등을 지원합니다. 그리고 스카이드라이브와 연동되게끔 되어져 있어서, 문서를 스카이드라이브에 저장해두면 바로바로 불러서 읽고 수정할수가 있습니다. MS에서 이미 클라우드 서비스를 시작했다고 볼수 있겠네요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-120 | Off Compulsory | 2011:09:03 20:29:51

 앞서 말했던바와 같이, 스카이드라이브, 오피스365 등을 지원합니다. 단, 제가 알기로 오피스365는 돈을 내야되는것으로 알고있습니다. 스카이드라이브는 무료로 제공됩니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:31:02

 모바일 운영체제에서 절대 빼놓을수 없는 중요한 기능, 멀티태스킹을 이번 망고부터 지원합니다. MS에서는 Fast App Switching이라고 표현하는데, 백 버튼을 홀딩하면 위와 같이 화면이 뜹니다. 그리고 자기가 원하는 앱을 선택하면 그 앱으로 빠르게 스위칭이 됩니다. 아이폰에서는 쓸모없는 프로세스를 히스토리 목록에서 제거시켜줬어야했지만 , 윈도우폰 같은 경우는, 운영체제에서 알아서 5~6개정도 최근에 사용한 목록만 표시해주고 나머지 오래된 프로세스는 자동으로 자원반환과 동시에 리스트에서 제거합니다. 그리고 리스트에 나타나 있는 프로세스를 강제로 종료시킬 수 없습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-120 | Off Compulsory | 2011:09:03 20:31:43

 여느 다른 OS와 마찬가지로 메일을 지원하는것은 기본이며, 여러 계정의 메일을 하나로 묶어서 쉽게 관리할수 있습니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:32:19

 망고부터는 하드웨어 검색 버튼을 누르면  무조건 Bing 검색으로 이동합니다. Bing검색은 단순히 웹검색만 해주는것이 아니라, 마켓플레이스, 로컬검색 등과 연계되어져 있습니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:32:37

 Bing 검색은 Local검색, 음악, 이미지(바코드, 태그, 문서번역 등), 음성 등의 여러가지 방식을 포함하고 있습니다. 단, 현재 몇가지 기능은 영어권, 유럽권에서만 작동하고 아시아권에서는 몇가지 기능은 작동하지 않는것이 흠이네요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:35:06

 멀티미디어 기능은 ZUNE하나로 모두 통합되어져 있습니다. 음악, 동영상, 라디오, 팟캐스트를 지원합니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/15sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:35:33

심지어 써드파티 어플리케이션 중, 카테고리가 멀티미디어쪽에 들어가는 어플들도 ZUNE과 간접적으로 연계됩니다. 





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-320 | Off Compulsory | 2011:09:03 20:36:13

 브라우져는 인터넷익스플로러9가 탑재되어져 있습니다. 속도도 나쁘지 않고, 자바스크립트 가속, HTML5를 지원하긴 합니다만, 아직 우리나라에 출시가 되지 않아서 그런지 국내 웹페이지와 호환이 안되는 부분이 많습니다. 그리고 HTML5 스코어가 타 브라우져에 비해서 썩 좋진 못합니다. 구글 뮤직은 지원하더군요.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:36:49

 망고에서 메시지함은 더이상 문자메시지만을 의미하는것이 아닌,  소셜네트워크에서의 채팅 기능도 통합되어져 있습니다. 페이스북 채팅, 윈도우라이브메신저 채팅이 가능합니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/15sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:37:21

 앞서, ME라는 타일을 언급했었는데, ME에 들어가면 위와 같이 자신의 최신소식을 확인, 담벼락에 글을 남길수도 있고, 체크인, 채팅상태 등을 설정할 수 있습니다. 




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-120 | Off Compulsory | 2011:09:03 20:38:00

 윈도우폰에서의 게임을 살펴보면 XBOX LIVE와 연동되는 게임들도 있고, 그렇지 않은 게임들은 일반 분류로 들어가게 됩니다. 아직까지 게임의 수는 다른 모바일 OS에 비해서는 매우 부족하지만,  차차 나아질거라고 기대하고 있습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/6sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:38:58

 마켓플레이스를 들어가보면 , 앱, 게임, 음악 구매등을 할수가 있습니다. 어플의 숫자는 3만개 정도로 추산되는데, 오늘 나온 모 언론 소식에 의하면 어플 2만4천개 중에 진짜 Unique한 어플은 1만8천개 정도이고 나머지 6천여개는 다른 어플과 기능이 비슷하거나 모방된것들이라고 하는군요. 우리나라에서 사용하는것을 생각해본다면 카카오톡이나, 마이피플 등의 메신저가 없기때문에 불편할것으로 생각됩니다. 단, 외국은 페이스북 챗, 트위터등을 더 많이 이용하기 때문에 크게 불편한점은 없었습니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/10sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:39:29

 일부 어플리케이션은 구매하기전에 Try를 해볼수 있습니다. MS에서 이를 위해서 API까지 제공해주고 있죠. Try는 일부 기능을 체험해볼수 있는데,  돈을 내지 않아도 됩니다. 다른 OS에서는 Lite버젼 또는 Free버젼이 나올때까지 기다려야 하는데, MS에서 이 부분은 잘한 부분이라고 볼수 있겠네요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/6sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:40:11

 시각장애인 등을 위해서 음성인식 기능도 지원합니다. 다만, 아직까지는 영어만 지원하는것 같네요. Microsoft Tellme라고 하는 MS에서 자체 개발한 기술인것 같은데, 인식율이 상당히 좋은 편입니다.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/8sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:09:03 20:40:19

 음성인식에 실패하면 가능한 경우의 수를 몇가지 보여줍니다. Call mom 부터 시작해서 Find pizza 등  쉽게쉽게 말할수 있는 경우의 수 들이 많네요. 한국어도 이용가능할지는 의문입니다.








비공식 업데이트만으로도 망고의 기능을 충분히 활용하고 엿볼수 있었습니다.

현재 HTC에서 2종류의 망고기기를 발표했고, 일본에서는 이미 판매를 하고 있죠.

개인적인 생각으로 우리나라에서 나와서 활성화만 제대로 이루어진다면 파급효과는 클것으로 기대하고 있습니다.



저작자 표시 비영리 변경 금지
신고
by Sone 2011.09.07 14:05
* 모든 내용은 Windows 7 x64 를 기반으로 진행되었음 *  


짬을 내서, 64비트 시스템의 시스템콜 메커니즘에 관해서 한번 살펴보았다. x86에 관한 내용은 인터넷에 매우 많은데 비해, x64에 관한 내용은 그다지 많지가 않아서, 나름대로 정리를 해보려고 한다. 일단 시스템콜의 순서를 서술해보면 다음과 같다.


Native Service를 요청할 경우
kernel32!CreateFileA -> kernel32!CreateFileW -> ntdll!NtCreateFile -> nt!KiSystemCall64 -> nt!NtCreateFile

GUI Service를 요청할 경우
USER32!NtUserCallNoParam -> nt!KiSystemCall64 -> win32k!NtUserCallNoParam

 
  공통적인 점은, Native건 GUI건 모두 KiSystemCall64를 통과한다는 것이다. 관심 있는사람이라면 다 알다시피, x86 Windows에서는 SYSENTER를 사용하였고, 이는 곧 MSR의 0x176번지인 IA32_SYSENTER_EIP를 참조하여, KiFastCallEntry 함수의 주소를 EIP에 대입하여 실행되는 형태였다. 그러나 64비트에서는 좀 다른데, 이는 유저모드의 NtXXXXXX 함수의 코드를 살펴보면 금방 확인할 수 있다.

00000000`76fcd190 4c8bd1          mov     r10,rcx
00000000`76fcd193 b805100000      mov     eax,1005h
00000000`76fcd198 0f05            syscall
00000000`76fcd19a c3              ret

위 코드는  USER32!NtUserCallNoParam 함수의 코드를 따온것이다. (Export 된 함수는 아님) 살펴보면, syscall 명령어가 있는것을 확인할 수 있는데, SYSCALL과 SYSENTER는 엄연히 다르다. 인텔IA32 문서를 참조해보면 다음과 같이 나와있다.

 SYSCALL saves the RIP of the instruction following SYSCALL to RCX and loads a new RIP from the IA32_LSTAR (64-bit mode). Upon return, SYSRET copies the value saved in RCX to the RIP.

IA32_LSTAR로부터 64비트만큼 값을 읽어와서 RIP에 대입한다고 되어져 있는데, IA32_LSTAR에 관해서도 알아봐야 될것 같다.

Register Address는 0xC0000082 이며, 이름은 IA32_LSTAR 이다.
따라서 rdmsr 0xC0000082 를 쳐보면, KiSystemCall64의 주소가 나올것이다.

1: kd> rdmsr C0000082
msr[c0000082] = fffff800`02cd8ec0
1: kd> r $t0 = fffff800`02cd8ec0
1: kd> u @$t0
nt!KiSystemCall64:
fffff800`02cd8ec0 0f01f8          swapgs
fffff800`02cd8ec3 654889242510000000 mov   qword ptr gs:[10h],rsp
fffff800`02cd8ecc 65488b2425a8010000 mov   rsp,qword ptr gs:[1A8h]
fffff800`02cd8ed5 6a2b            push    2Bh
fffff800`02cd8ed7 65ff342510000000 push    qword ptr gs:[10h]
fffff800`02cd8edf 4153            push    r11
fffff800`02cd8ee1 6a33            push    33h
fffff800`02cd8ee3 51              push    rcx



  이제 KiSystemCall64까지 오는건 알았는데, 그다음부터 실제 Service Function이 어떻게 호출되는지를 살펴봐야 될것이다. 32비트 시스템에서는 SSDT를 살펴보면 , 그냥 Direct로 Service Routine의 주소가 때려박혀져 있었다. 그러나 x64에서는 일부는 그대로 대입되어져 있는 반면, 대부분은 이상한 QWORD 값으로 저장되어져 있다. 아래와 같이 말이다.

1: kd> dqs nt!KeServiceDescriptorTable
fffff800`02f10840  fffff800`02cdab00 nt!KiServiceTable
fffff800`02f10848  00000000`00000000
fffff800`02f10850  00000000`00000191
fffff800`02f10858  fffff800`02cdb78c nt!KiArgumentTable
fffff800`02f10860  00000000`00000000
fffff800`02f10868  00000000`00000000
fffff800`02f10870  00000000`00000000
fffff800`02f10878  00000000`00000000
fffff800`02f10880  fffff800`02cdab00 nt!KiServiceTable
fffff800`02f10888  00000000`00000000
fffff800`02f10890  00000000`00000191
fffff800`02f10898  fffff800`02cdb78c nt!KiArgumentTable
fffff800`02f108a0  fffff960`001c1c00 win32k!W32pServiceTable
fffff800`02f108a8  00000000`00000000
fffff800`02f108b0  00000000`0000033b
fffff800`02f108b8  fffff960`001c391c win32k!W32pArgumentTable
1: kd> dqs poi(nt!KeServiceDescriptorTable) L191

..............................
..............................
fffff800`02cdb0c8  03216b01`0456b900
fffff800`02cdb0d0  02b88980`04809300
fffff800`02cdb0d8  0450ca00`01151200
fffff800`02cdb0e0  042b9500`045f7400
fffff800`02cdb0e8  02518280`044e9800
fffff800`02cdb0f0  0261f900`028f83c2
fffff800`02cdb0f8  00fdc700`02ca6b40
fffff800`02cdb100  02a7b402`03d60700
fffff800`02cdb108  0386dd00`04259c00
fffff800`02cdb110  028af440`03e82d00
fffff800`02cdb118  04504800`028a0c00
fffff800`02cdb120  01146500`02726801
fffff800`02cdb128  04381b00`04649600
fffff800`02cdb130  000f5100`02e8e2c0
fffff800`02cdb138  041f0900`041f0000
fffff800`02cdb140  fffff800`ffe74c40
fffff800`02cdb148  fffff800`03103090 nt!NtFreezeTransactions
fffff800`02cdb150  fffff800`02f2c280 nt!NtGetContextThread
fffff800`02cdb158  fffff800`02f68610 nt!NtGetCurrentProcessorNumber
fffff800`02cdb160  fffff800`030fe2b0 nt!NtGetDevicePowerState
fffff800`02cdb168  fffff800`02f90788 nt!NtGetMUIRegistryInfo
fffff800`02cdb170  fffff800`0310bb80 nt!NtGetNextProcess
fffff800`02cdb178  fffff800`0310b890 nt!NtGetNextThread
..................................................
..................................................


가만히 생각해보면 이상하지 않은가? 분명히 System Service Routine의 주소를 얻어와서 CALL  하는 과정은 KiSystemCall64에서 이루어지고,  그 속에서 Service Routine의 주소를 얻어오는 일련의 과정은  동일할텐데, 어떤 서비스는 주소값이 제대로 들어가있고 , 어떤 서비스는 정체불명의 QWORD값의 형태로 들어있다니?  

결론부터 말하면 이리저리 살펴본 결과, 위 의문점에 관해서 의문을 가질 필요가 없다는것을 알게되었다.
그러기 위해선 KiSystemServiceStart 주변부의 어셈블리 코드를 살펴볼 필요가 있다.
KiSystemServiceStart는 KiSystemCall64에서 조금만 밑으로 디스어셈블 하다보면 나오는 부분이다.
이제  실행순서 및 코드를 살펴보자.



USER32!NtUserCallNoParam (사실, 이 함수는 Export 되지 않은 함수)

00000000`76fcd190 4c8bd1          mov     r10,rcx
00000000`76fcd193 b805100000      mov     eax,1005h
00000000`76fcd198 0f05            syscall
00000000`76fcd19a c3              ret



1: kd> u @$t0 L 100
nt!KiSystemCall64:
fffff800`02cd8ec0 0f01f8          swapgs
fffff800`02cd8ec3 654889242510000000 mov   qword ptr gs:[10h],rsp
fffff800`02cd8ecc 65488b2425a8010000 mov   rsp,qword ptr gs:[1A8h]
fffff800`02cd8ed5 6a2b            push    2Bh
fffff800`02cd8ed7 65ff342510000000 push    qword ptr gs:[10h]
.....................
.....................
//현재 쓰레드의 PKTHREAD를 얻어옴.
fffff800`02cd8f14 65488b1c2588010000 mov   rbx,qword ptr gs:[188h]
.....................
.....................
fffff800`02cd8fce 6690            xchg    ax,ax
fffff800`02cd8fd0 fb              sti
//서비스의 첫번째 파라메터를 PKTHREAD->FirstArgument 에 저장
fffff800`02cd8fd1 48898be0010000  mov     qword ptr [rbx+1E0h],rcx
//시스템 서비스 번호를 PKTHREAD->SystemCallNumber 에 저장
fffff800`02cd8fd8 8983f8010000    mov     dword ptr [rbx+1F8h],eax
nt!KiSystemServiceStart:
//커널 트랩 프레임을  PKTHREAD->TrapFrame 에 저장
fffff800`02cd8fde 4889a3d8010000  mov     qword ptr [rbx+1D8h],rsp
//시스템 서비스 넘버를 EDI에 넣음. EDI는 GUI서비스인지 판별하려는 의도 (EAX에는 0x1005 가 있음) 

fffff800`02cd8fe5 8bf8            mov     edi,eax            //Rax = 0x1005 , Rdi = 0x1005
fffff800`02cd8fe7 c1ef07          shr     edi,7               //Right Shift 하여 하위 7비트 모두 잘라냄. (RDI = 0x20)
fffff800`02cd8fea 83e720          and     edi,20h           //GUI서비스인지 AND를 이용해서 판별. ( RDI = 0x20 )
fffff800`02cd8fed 25ff0f0000      and     eax,0FFFh       //테이블 비트를 잘라내고 서비스 넘버만을 검출 ( RAX = 0x0005 )
nt!KiSystemServiceRepeat:
// DescriptorTable과 , ShadowTable의 주소를 각각 r10과 r11에 대입
fffff800`02cd8ff2 4c8d1547782300  lea     r10,[nt!KeServiceDescriptorTable (fffff800`02f10840)]
fffff800`02cd8ff9 4c8d1d80782300  lea     r11,[nt!KeServiceDescriptorTableShadow (fffff800`02f10880)]
// if ( PKTHREAD->GuiThread ) 가 유효하다면, 즉 GuiThread라면
fffff800`02cd9000 f7830001000080000000 test dword ptr [rbx+100h],80h
// Conditional MOVe if Not Equal  즉 , KeServiceDescriptorTableShadow을 r10에 대입.
// GuiThread가 아니라면 , KeServiceDescriptorTable 의 값이 r10에 그대로 보존 됨. 
fffff800`02cd900a 4d0f45d3        cmovne  r10,r11
fffff800`02cd900e 423b441710      cmp     eax,dword ptr [rdi+r10+10h]
fffff800`02cd9013 0f83e9020000    jae     nt!KiSystemServiceExit+0x1a7 (fffff800`02cd9302)
// r10 = * (KeServiceDescriptorTableShadow + 0x20) 즉,  win32k!w32pServiceTable을 r10에 대입
fffff800`02cd9019 4e8b1417        mov     r10,qword ptr [rdi+r10]
// w32pServiceTable + Service Number * 4DWORD만큼 R11에 저장한다. QWORD만큼 읽는게 아니다!!
fffff800`02cd901d 4d631c82        movsxd  r11,dword ptr [r10+rax*4] 

참고로 이때 w32pServiceTable + 0x05 * 4 의 값은 아래와 같았다.
1: kd> dds win32k!w32pServiceTable + 0x05 * 4
fffff960`001c1c14  00022700
 
fffff800`02cd9021 498bc3          mov     rax,r11               // r11 = 0x022700
// 서비스 테이블에서 DWORD만큼 읽었던것을 4만큼 Arithmetic Shift Right 함. 
fffff800`02cd9024 49c1fb04        sar     r11,4               // r11 = 0x2270
// R10  실제 Service Routine = w32pServiceTable + 0x2270 
fffff800`02cd9028 4d03d3          add     r10,r11          // r10 = 실제서비스루틴   
fffff800`02cd902b 83ff20          cmp     edi,20h
...............................
...............................
 nt!KiSystemServiceCopyEnd:
fffff800`02cd9140 f705fee4180040000000 test dword ptr [nt!PerfGlobalGroupMask+0x8 (fffff800`02e67648)],40h
fffff800`02cd914a 0f8550020000    jne     nt!KiSystemServiceExit+0x245 (fffff800`02cd93a0)
fffff800`02cd9150 41ffd2          call    r10        //서비스 호출
fffff800`02cd9153 65ff042538220000 inc     dword ptr gs:[2238h]
 

자, 이제 서비스 호출과정이 대략적으로 다 밝혀진것 같다. 
이제 이걸 WinDBG 스크립트로 한번 만들어보자.
그럼 모든 서비스의 실제 주소를 추출해낼 수 있을것 같다.
(사실, WinDBG 스크립트에 익숙치 않아서 , 이 스크립트를 짜기까지 많은 삽질이 있었따 ㅠㅠ)



// sdt.txt    -> for KeServiceDescriptorTable  x64 system
r $t0 = nt!KeServiceDescriptorTable

.for (r $t2 = 0; (@$t2 < poi(@$t0 + 0x10) * 0x04); r $t2 = @$t2 + 0x04)
{
r $t3 = poi(poi(@$t0) + @$t2)
r? $t4 = (long*) @$t3
.if ( (@$t4 & 00000000`f0000000) == 0 ) { r $t4 = @$t4 & 00000000`ffffffff }
.else { r $t4 = @$t4 | ffffffff`00000000 }
r $t4 = @$t4 >>> 4
r $t5 = poi(@$t0) + @$t4
u @$t5 L1
}
//////////////////// end of sdt.txt ////////////////////





// sdtshadow.txt   -> for KeServiceDescriptorTableShadow   x64 system
r $t1 = nt!KeServiceDescriptorTableShadow + 0x20

.for (r $t2 = 0; (@$t2 < poi(@$t1 + 0x10) * 0x04); r $t2 = @$t2 + 0x04)
{
r $t3 = poi(poi(@$t1) + @$t2)
r? $t4 = (long*) @$t3
.if ( (@$t4 & 00000000`f0000000) == 0 ) { r $t4 = @$t4 & 00000000`ffffffff }
.else { r $t4 = @$t4 | ffffffff`00000000 }
r $t4 = @$t4 >>> 4
r $t5 = poi(@$t1) + @$t4
u @$t5 L1
}
//////////////////////// end of sdtshadow.txt ////////////////////////



결과는 아래와 같다.

Result of SDT
nt!NtMapUserPhysicalPagesScatter:
fffff800`030eb190 48895c2408      mov     qword ptr [rsp+8],rbx
nt!NtWaitForSingleObject:
fffff800`02fd1a00 4c8bdc          mov     r11,rsp
nt!NtCallbackReturn:
fffff800`02cd1dd0 4883ec18        sub     rsp,18h
nt!NtReadFile:
fffff800`02ff4b10 4c8bdc          mov     r11,rsp
nt!NtDeviceIoControlFile:
fffff800`02ff2bb0 4883ec68        sub     rsp,68h
...........................
nt!NtAddBootEntry:
fffff800`0311d7d0 ??              ???

이상하게 nt!NtAddBootEntry 에서 메모리를 읽을수가 없는데, 왜 그런지 이유는 나중에 살펴봐야될것 같다.
일단 , 이 에러를 해결하기 위해서 부트타임에 실행을 중단시키고 , 서비스를 읽으니 잘 읽혔다.
아마 패치가드때문인것으로 생각된다.


 
Result of SDTSHADOW
1: kd> $$><myscript\sdtshadow.txt
win32k!NtUserGetThreadState:
fffff960`001b5580 48895c2408      mov     qword ptr [rsp+8],rbx
win32k!NtUserPeekMessage:
fffff960`001b2630 48895c2408      mov     qword ptr [rsp+8],rbx
win32k!NtUserCallOneParam:
fffff960`001c3c6c 48895c2408      mov     qword ptr [rsp+8],rbx
win32k!NtUserGetKeyState:
fffff960`001d1dd0 48895c2408      mov     qword ptr [rsp+8],rbx
......................... 
.........................
win32k!NtUserYieldTask:
fffff960`001ce06c 48895c2408      mov     qword ptr [rsp+8],rbx
win32k!NtUserSetClassLongPtr:
fffff960`001c6b84 48895c2408      mov     qword ptr [rsp+8],rbx
win32k!NtUserSetWindowLongPtr:
fffff960`001a1ca0 48895c2408      mov     qword ptr [rsp+8],rbx


win32k는 정상적으로 모두 출력된다.
 결과 파일은 따로 파일로 첨부한다.
 



그리고 스크립트 파일도 따로 첨부한다.




이제 이러한 내용을 바탕으로 패치가드를 무력화시키고, 후킹을 하기만 한다면 64비트에서도 후킹은 성공할 수 있을것 같다.
패치가드 무력화에 관한 방법들은 이미 몇몇 문서가 공개된것으로 알고있다.


ps. NtAddBootEntry 가 왜 안읽히는지 아시는분?
저작자 표시 비영리 변경 금지
신고
by Sone 2011.06.14 06:51
  이미 많은 드라이버 개발자분들께서  잘 아시다시피, 프로세스와 쓰레드의 생성과 종료 감시를 위해서 , 커널단에서 NotifyRoutine을 등록함으로써, 적절한 처리를 수행할 수 있다. (콜백루틴은 그 종류가 여러가지가 있지만 여기서는 Process와 Thread만 살펴보기로 한다.) 그런데, 필자도 이때까지 사용해오면서 정확히 어느 시점에 NotifyRoutine이 호출되는지는 모르고, 그냥 생성과 종료시점에 호출이 되는구나 정도로만 이해하고 있었다.

  어느날 VS2010을 열어놓고 키보드를 갈기고 있던중, PsSetCreateProcessNotifyRoutine, PsSetThreadNotifyRoutine 에 의하여 등록된 콜백루틴은 대체 커널의 어느부분에서 최초로 호출이 이루어질까? 라는 생각이 들어서, 디버깅을 해보기로 했다. 디버깅을 위해서 코드를 아주 씸플하게 작성했다.

VOID
ProcessNotifyRoutine
(
IN HANDLE  ParentId,
IN HANDLE  ProcessId,
IN BOOLEAN  Create
)
{
__asm int 3h //breakpoint exception for debugging

return;
}

당연히 디버거가 커널에 붙어있는 상태여야하며 , 디버거없이 냅다 로드시켰다간 프로세스의 생성 또는 종료시점에 공포의 BSOD를 보게 될것이다.
이제 드라이버를 로드시키고 , 프로세스를 하나 살며시 띄워서 Breakpoint가 걸리게끔 유도 해주었다.

 Break instruction exception - code 80000003 (first chance)
h00kdrlv3r!ProcessNotifyRoutine+0x2:
f8bc098c cc              int     3

이제 현재 상태에서 스택을 살펴보자.

 0: kd> kb
ChildEBP RetAddr  Args to Child              
b21e6b80 805d24e5 000006b4 00000cf0 00000001 h00kdrlv3r!ProcessNotifyRoutine+0x2 [d:\program\h00kdrlv3r\h00kdrlv3r\process.c @ 21]
b21e6cc4 805d3144 0007d934 001f03ff 00000000 nt!PspCreateThread+0x3a7
b21e6d3c 8054367c 0007d934 001f03ff 00000000 nt!NtCreateThread+0xfc
b21e6d3c 7c93e514 0007d934 001f03ff 00000000 nt!KiFastCallEntry+0xfc
0007d560 7c93d1ba 7c7e9ea7 0007d934 001f03ff ntdll!KiFastSystemCallRet
0007d5a8 7c9446f9 0007d6b4 0007d8a0 00000004 ntdll!ZwCreateThread+0xc
0007dfb0 7c7d2362 00000000 001654ac 00163214 ntdll!RtlIntegerToUnicode+0x11d

ZwCreateThread가 호출이되고 , KiFastCallEntry를 통과해서 , NtCreateThread, PspCreateThread를 호출한다음 드라이버 영역이 호출되었다. 그렇다면 PspCreateThread 내부에서 콜백루틴을 호출했다는건데, PspCreateThread 내부를 간단히 살펴보기로 했다.

 0: kd> uf /c nt!PspCreateThread
nt!PspCreateThread (805d213e)
 ........................
  nt!PspCreateThread+0x386 (805d24c4):
    call to nt!ExReferenceCallBackBlock (8060f514)
  nt!PspCreateThread+0x392 (805d24d0):
    call to nt!ExGetCallBackBlockRoutine (805a1e54)
  nt!PspCreateThread+0x3a5 (805d24e3):
    unresolvable call: call    eax
  nt!PspCreateThread+0x3ab (805d24e9):
    call to nt!ExDereferenceCallBackBlock (8060f616)
  nt!PspCreateThread+0x3ef (805d252d):
  ..............................

PspCreateThread 함수의 규모가 생각보다 상당히 커서, 앞뒤부분은 짜르고 PspCreateThread+0x3a7 부근만 살펴보기로 했다.
call eax  를 보니 특별히 어떤 심볼을 가진 함수나 Import 함수를 내부적으로 호출하진 않고, 바로 PspCreateThread 내부에서 함수포인터를 가져와서 호출하는 방식이다. 그런데 MSDN에서 살펴보니 PsSetCreateProcessNotifyRoutine  API는  Windows 2000에서도 사용이 가능하다고 한다. 그렇다면 예전에 유출되었던 윈도우2K 소스코드에서 PspCreateThread를 살펴보면 어느시점에 호출되는지 어느정도 정확히 알아낼 수 있을것 같다. (윈도우 NT4 소스코드에서도 확인은 가능하다.)

 PspCreateThread의 소스코드는  "\win2k\private\ntos\ps\create.c" 에서 확인할 수 있다.
먼저 PspCreateThread의 형태를 살펴보자.
 

NTSTATUS
PspCreateThread(
    OUT PHANDLE ThreadHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    IN HANDLE ProcessHandle,
    IN PEPROCESS ProcessPointer,
    OUT PCLIENT_ID ClientId OPTIONAL,
    IN PCONTEXT ThreadContext OPTIONAL,
    IN PINITIAL_TEB InitialTeb OPTIONAL,
    IN BOOLEAN CreateSuspended,
    IN PKSTART_ROUTINE StartRoutine OPTIONAL,
    IN PVOID StartContext
    ) ;
/*++

Routine Description:

    This routine creates and initializes a thread object. It implements the
    foundation for NtCreateThread and for PsCreateSystemThread.

Arguments:  ....

++*/

파라메터가 엄청 많다. 그래도 파라메터 하나하나를 살펴보면 그다지 어렵지는 않음을 확인할 수 있다. 
프로세스 생성과정에서 Initialize Thread를 생성하는데, 그때 내부적으로 PspCreateThread가 호출되는것으로 생각된다.
이제 핵심부만 간단히 살펴보자.



.................

   //
     // If the process does not have its part of the client id, then
    // assign one
    //

    if ( !Process->UniqueProcessId ) {       //Unique한 PID가 지정되어져 있지않다면  1
        CidEntry.Object = Process;
        CidEntry.Attributes = 0;
        Process->UniqueProcessId = ExCreateHandle(PspCidTable,&CidEntry);   //PID를 지정해주고 2
        ExSetHandleTableOwner( Process->ObjectTable, Process->UniqueProcessId );
        if (!Process->UniqueProcessId) {
            PsUnlockProcess(Process);

            MmDeleteKernelStack(KernelStack, FALSE);
            ObDereferenceObject(Process);
            ObDereferenceObject(Thread);

            return STATUS_UNSUCCESSFUL;
        }

        if (PspCreateProcessNotifyRoutineCount != 0) {     //Callback Routine이 하나이상 등록되있다면 3
            ULONG i;

            for (i=0; i<PSP_MAX_CREATE_PROCESS_NOTIFY; i++) {
                if (PspCreateProcessNotifyRoutine[i] != NULL) {
                    (*PspCreateProcessNotifyRoutine[i])( Process->InheritedFromUniqueProcessId,
                                                         Process->UniqueProcessId,
                                                         TRUE
                                                       );
                }
            }
        }
    } 

.......
 
자, 그럼 좀더 자세히 살펴보자.

 1. 디스크립션을 보니  프로세스가 PID를 가지고 있지 않으면, 하나를 할당한다고 되어져 있다. IF문 스코프를 가만히 살펴보니 이 조건에 걸리지 않으면 Process Notiry Routine도 호출되지 않는다.  이 조건에 해당되는 경우를 가만히 생각해보면, 프로세스가 생성될때라는것을 알수 있다. 즉, Unique PID가 없는 시점은 , 프로세스가 처음 생성될때의 시점이며, 만약에 프로세스가 이미 생성되어져 있었다면 UniquePID는 최초 호출된 PspCreateThread에 의해서 이미 지정되어져 있었을 것이다. 그러면 Process Callback Routine이 호출되지 않게 된다. 결과적으로 Process Callback Routine은 프로세스가 처음에 생성될때만 호출될 것이다.  다른 말로 표현하면 Process의 Initialize Thread를 생성하는 시점이고,  이때는 EPROCESS에  PID가 Assign 되어져 있지 않기 때문에,  고유 PID 지정을 PspCreateThread 내부에서 처리해주면서 Process Callback도 호출하는것이다. (자세한것은 WinDBG에서 라이브디버깅으로 적절한 위치에 BP를 걸어두고 EPROCESS를 확인하면 되겠다.)
PID 지정은 PspCreateProcess 등에서 처리할줄 알았는데 의외다.

2.  PID가 없다면 ExCreateHandle을 호출하여  Unique한 PID를 지정해준다. 

3. 그 후에 Process Callback Routine이 하나이상 배열에 존재한다면 배열을 인덱스의 처음부터 시작해서 등록된 순서대로 호출한다. 

그럼 만약 이미 생성되어져 있는 프로세스의 EPROCESS->UniquePID를 NULL로 지정해버리고, 그 후에 CreateThread를 이용해서 쓰레드를 생성해버리면 어떻게 될까?  과연 이미 생성되어져 있는 프로세스 내부에서 CreateThread를 호출했을 경우, 쓰레드가 생성될때마다 Process Callback Routine이 호출될것인가?  이 내용은 다음에....-_-;;; (현재는 귀차니즘이 발동해서)
 



다음으로 Thread Notify Routine을 살펴보자.  이건 간단하다.
본문상에는 서술하지 않았지만 , 코드를 살펴보면 Process Callback이 호출된 다음, 컨텍스트와 StartRoutine을 초기화 해주고KiInitializeThread 를 호출하고 난뒤,  Thread Ready List에 집어넣기전에, Thread Callback Routine을 호출하는 부분이 존재한다.

     //
    // Notify registered callout routines of thread creation.
    //

    if (PspCreateThreadNotifyRoutineCount != 0) {
        ULONG i;

        for (i=0; i<PSP_MAX_CREATE_THREAD_NOTIFY; i++) {
            if (PspCreateThreadNotifyRoutine[i] != NULL) {
                (*PspCreateThreadNotifyRoutine[i])( Thread->Cid.UniqueProcess,
                                                    Thread->Cid.UniqueThread,
                                                    TRUE
                                                   );
            }
        }
    }

그냥 특별한 다른 조건은 존재하지 않고, Thread Notify Routine이 하나이상 등록되어져 있다면 , Thread Callback을 호출한다.

결과적으로 유저가 만약에  Process와 Thread 콜백을 둘다 등록해놓았을 경우, 프로세스가 처음에 생성될때는 Process,Thread 둘다 호출이 될것이다.



ps. Terminate 될때의 호출시점은 다루지 않았는데, 그것은 다음에.... 
저작자 표시 비영리 변경 금지
신고
by Sone 2011.05.21 00:09
시간이 나서, Timer DPC에 관해서 정리해보고자 글을 쓴다.

  먼저 Timer DPC 라는 제목을 살펴보자. Timer와 DPC 2개로 분리가 된다. Timer는 뭔가 시간이 흐른다는것을 예상해볼 수 있고, DPC는 Deferred Procedure Call 의 약자로써, 지연된 처리의 호출이라고 해석할 수 있다. 사실 Timer의 의미는 대략적으로 예상해볼 수 있는데,  DPC는 뭐가 도대체 지연된 호출인가? 지연된 호출이 왜 필요하단 말인가? 하고 궁금증이 생길 수 있다.

  DPC를 이해하기 위해서는 IRQ 우선순위와 커널의 인터럽트 처리 메커니즘을 알고있어야 하는데, 일반적으로 외부 하드웨어에서 CPU에 인터럽트를 보내면 커널은 이를 인지하여 , 해당 하드웨어에 맞는 ISR을 적절히 선택하여 인터럽트 처리를 수행한다. 그런데 보통 이러한 인터럽트 서비스 루틴은 해당 하드웨어의 요청에 정말 필요한 크리티컬 코드들로만 짧게 구성되어져 있는데, 이는 어느 특정 인터럽트 서비스 루틴으로 인해, 다른 인터럽트 처리의 방해가 없도록 하기 위해서이다. 여기서 갑자기 방해가 왜 나올까? 라고 생각해볼수가 있는데, 여기에서 인터럽트 우선순위 레벨(IRQL) 을 생각해볼 수 있다. 예를 들어 시스템에서 특정 하드웨어가 있는데 , 이 하드웨어는 매우 크리티컬한 요소라서 최우선적으로 처리되어야 할 놈이라고 가정해보자. 이 하드웨어는 IRQL26 우선순위를 부여받고, ISR을 처리하게된다고 가정했을때,  ISR에서 빨리 끝내주지 않고 , 질질 끌게되면 다른 우선순위 낮은 하드웨어(예 : 키보드) 가 인터럽트 처리를 요청했을때, 우선순위 높은 애가 아직 CPU를 부여잡고 있으므로, 기다릴수 밖에 없을것이다.  키보드 빨리빨리 입력해야하는데 , 키보드가 드득드득 지연되면서 입력되는것을 상상해본적이 있는가? 
  그럼 이 문제를 해결하려면 어떻게 해야할까? 참 이런거 생각한사람들은 머리가 좋은것 같다. (어찌보면 단순한가?)  해결법은 ISR을 최대한 단순하고 중요한 코드들로만 구성하고, 만약에 ISR에서 못다한 그리 중요하지않은 추가적인 작업이 필요할 경우, DPC라는 녀석을 요청하는것이다. DPC는  DIRQL이상의 하드웨어 인터럽트 처리가 완료되고나서 , PASSIVE_LEVEL로 떨어지기 전에 DISPATCH_LEVEL에서 작동하는 구간인데, SW Interrupt(PASSIVE_LEVEL, APC_LEVEL , DISPATCH_LEVEL) 중에서는 가장 높은 레벨에 속한다. 이렇게 되면 하드웨어 인터럽트 처리가 완료되고 난다음에 DPC가 처리되기 때문에 , 다른 하드웨어의 인터럽트를 처리하는데 별 무리가 없을것이다.


  이제 Timer DPC의 의미를 다시 한번 생각해보자. DPC는 HW ISR처리가 완료되고난다음, DISPATCH_LEVEL에서 작동하는 SW INT인데 , 이것이 Timer와 합쳐지면 어떤 관련이 있을까? 사실 필자도 이것에 관해서 딱히 책에서 찾아본적은 없는데, 가만히 생각해보면 DPC는 SW INT이므로 , "커널 Timer의 힘을 빌어서 주기적으로 발생되는 SW INT" 라고 생각해도 크게 나쁜것 같지는 않다.

본격적으로 윈도우 커널에서 제공하는 Timer 관련 함수들중 자주 사용되는 함수들을 알아보자.
 
 
1. NTKERNELAPI VOID KeInitializeTimer ( __out PKTIMER Timer );

2. NTKERNELAPI BOOLEAN KeSetTimerEx ( __inout PKTIMER Timer, __in LARGE_INTEGER DueTime, __in LONG Period, __in_opt PKDPC Dpc );

 3. NTKERNELAPI BOOLEAN KeCancelTimer ( __inout PKTIMER )
 

 
 1. 타이머를 사용하기에 앞서 , 초기화를 수행해주는 함수이다.  ExAllocatePool을 이용하여 SystemPool에 KTIMER만큼 할당한뒤, 사용하는것을 권장.

2. 타이머 설정&시작 함수인데, 옵션으로 DPC루틴도 파라메터로 전달할수 있어서, 주기적으로 처리해야할 작업이 있을경우 요긴하게 쓸수 있다. 참고로 , KeSetTimer 함수와 KeSetTimerEx 함수간의 차이가 존재하는데,  KeSetTimer 함수는 Signal이 한번만 발생해서 DPC루틴이 한번만 호출되고 끝나게 되고,  KeSetTimerEx는 LONG Period만큼 주기적으로 DPC루틴이 호출되게 된다.
 
 
3. 타이머를 취소하는 함수로써 , 본인 코드 구성에 따라, 필요에따라 UnloadRoutine 같은곳에 넣어준다.


필자는 따로 편리하게 쓰기 위해서 함수를 정의한뒤, 

PKTIMER
InitializeTimer(VOID)
{
PKTIMER Timer;

Timer = (PKTIMER)ExAllocatePool(NonPagedPool, sizeof(KTIMER));
if(Timer == NULL)
{
return NULL;
}

KeInitializeTimer(Timer);
return Timer;
}

PKDPC
SetTimer
(
IN PKTIMER Timer,
IN LONG Period, 
IN OPTIONAL KDEFERRED_ROUTINE TimerDpcRoutine, 
IN OPTIONAL PVOID DpcRoutineContext
)
{
LARGE_INTEGER TimePeriod;
PKDPC DpcObj;

DpcObj = NULL;

if(TimerDpcRoutine != NULL)
{
DpcObj = (PKDPC) ExAllocatePool(NonPagedPool, sizeof(KDPC));
if(DpcObj == NULL)
{
return NULL;
}
KeInitializeDpc(DpcObj, TimerDpcRoutine, DpcRoutineContext);
}

TimePeriod.QuadPart = -100;
KeSetTimerEx(Timer, TimePeriod, Period, DpcObj);

return DpcObj;
}
 
VOID
ReleaseTimer(IN PKTIMER Timer, IN OPTIONAL PKDPC DpcObj)
{
KeCancelTimer(Timer);
ExFreePool(Timer);

if(DpcObj != NULL)
{
ExFreePool(DpcObj);
}
}


DriverEntry에  다음과 같은 코드를 넣어주었다.


TimerObj = InitializeTimer();
if(TimerObj == NULL)
{
return STATUS_UNSUCCESSFUL;
}
TimerDpcObj = SetTimer(TimerObj, 1000, TimerDpcRoutine, NULL);
if(!TimerDpcObj)
{
return STATUS_UNSUCCESSFUL;
}


또한 UnloadRoutine에는 다음과 같은 코드를 넣어주었다.

ReleaseTimer(TimerObj, TimerDpcObj);
 


이제 TimerDpcRoutine을 살펴보자.

 VOID TimerDpcRoutine(
IN PKDPC Dpc,
IN OPTIONAL PVOID DeferredContext,
IN OPTIONAL PVOID SystemArgument1,
IN OPTIONAL PVOID SystemArgument2
)
{
DBG_PRINT1("Warning! This routine executes on DISPATCH_LEVEL!\n");

if(IsSSDTAlreadyHooked(
(PBYTE)ZwSetInformationThread, 
(PBYTE)NewZwSetInformationThread, 
(PDWORD)KeServiceDescriptorTable.KiServiceTable) == FALSE)
{
disableWP_CR0();
OldZwSetInformationThread = (ZwSetInformationThreadPtr) hookSSDT((PBYTE)ZwSetInformationThread, 
(PBYTE)NewZwSetInformationThread, 
(PDWORD)KeServiceDescriptorTable.KiServiceTable);
enableWP_CR0();
}
return;
}

Timer DPC를 이용해서 간단하게 주기적으로 SSDT훅을 거는 코드를 구성해보았다. 이렇게 코드를 구성하면 , Timer DPC Detect 기능이 없는 루트킷 디텍터에서 SSDT를 Restore 한다고 해도, 1초마다 훅이 걸려있는지 검사해서 다시 훅을 걸어버리기 때문에, 악성 루트킷에서 요긴하게 사용될법 하다.
주의할점은, DPC Routine에서 Zw Routine은 호출하면 안된다는것이다. (Zw Routine은  PASSIVE_LEVEL에서만 호출이 가능하다!)

 

테스트 결과 잘 작동이 되었다.
아래는 스크린 샷.


드라이버를 시작한 모습.  DriverEntry에서 훅을 거는 코드를 작성하진 않았고 , TimerDpcRoutine에 훅을 거는 코드를 삽입했다. 따라서 , 훅은 TimerDpcRoutine에 의해서 걸린것이다.


SSDT Restore를 수행하려고 시도중인 모습.


SSDT Restore를 수행해도 바로 훅이 다시 걸린다. Period를 적절히 조절해주면 Performance도 어느정도 확보할 수 있을것 같다.


 
저작자 표시 비영리 변경 금지
신고
by Sone 2011.05.05 11:30
VMWare Team 으로부터 새로운 베타 소식지가 메일로 날아들었다.
Workstation 2011 Beta Binary가 릴리즈 되었다는 소식이다.
아직은 April 버젼으로써 최종 정식버젼이 릴리즈되려면 시간이 어느정도 소요될것 같다.
 
일단 , VMWare Team에서 공개한 이번 버젼의 특징을 몇가지만 살펴보자.

The VMware Workstation 2011 Beta includes several new features and hundreds of minor improvements. Some highlights include:

  • New User Interface – The user interface has been updated with new menus, toolbars, and an improved preferences screen, but that is just the beginning!
  • Remote Connections – “Connect to Server” feature allows remote connections to hosts running Workstation, ESX 4.x and Virtual Center.  Now workstation is a single interface to access all of the VMs you need regardless of where they reside!
  • “Share” your VMs – Share and permission VMs that can be accessed by other instances of Workstation.  This is a great way to run server operating systems in more production like environment.
  • Upload to vSphere - Integrated VMware’s OVFTool so you can drag and drop to upload a VM to vSphere.
  • Better “Teams” – Add team attributes to any VM without any of the drawbacks.  No longer forced to make a Team in order to manage multiple VMs together.
  • Enhanced Virtual Hardware – Faster graphics, improved vsmp, up to 64 GB of RAM per VM, USB 3.0, HD Audio and Bluetooth.
  • Much more….
 
* 새로운 GUI 인터페이스 도입. 메뉴, 툴바등의 인터페이스를 새롭게 변경했다고 한다. 아직은 초기단계이며, 시작의 일부라고 한다.
* 리모트 접속을 지원함으로써 , VM을 효율적으로 관리할수 있게 되었다. 기업체로써는 굉장히 좋은 기능인듯.
* VM을 Share할수 있는 기능을 제공한다. 즉, VM을 가져다쓸수 있다는것 같은데, 이것도 기업체 입장에서는 굉장히 좋은 옵션으로 적용될것 같다.
* VM을 vSphere에 업로드 할수있다는것 같은데,  vSphere를 써보지 않아서 잘 모르겠다.
* VM에 Team 속성을 부여할수 있어서, 더이상의 Team 구성으로 인한 불편함은 없다고 한다.
* Virtual Hardware의 퍼포먼스를 증가시켰다고 한다. 보다 빠른 그래픽처리, SMP 향상, VM당 최대 64기가까지 지원, USB3.0지원, HD오디오와 블루투스 지원 등.


Installation Changes and Enhanced Keyboards

The hardware requirements to install this version of Workstation have changed. Workstation now requires a relatively modern 64-bit CPU.

The keyboard filter driver is no longer installed by default. When the driver is not installed, the enhanced keyboard functionality is unavailable and you must press Ctrl-Alt-Ins instead of Ctrl-Alt-Del to exit the guest. To use the enhanced keyboard functionality, you must perform a custom installation and select the component. If you select the component, you must reboot whenever you install or uninstall Workstation. 

64비트 CPU는 필수적으로 필요하다고 한다. (이건 요즘엔 별로 문제되지 않는 내용이다.)
그리고 키보드 필터 드라이버는 더이상 기본값으로 설치되지 않는다고 하니, 보다 향상된 키보드 기능을 이용하려면 , 따로 설치해야한다고 한다.


인터페이스 부분을 살펴보니 , 크게 변화된것 같지는 않다.
조금 더 명확하고 깔끔하게 바뀌었다고 보면 될듯.

2011:04:10 15:29:07




OS 리스트에 Windows 8 Server도 존재하는데, 7.1.4-385536 부터 추가되었는지 아니면, 이번 April 2011 Beta부터 추가되었는지는 확실히 모르겠다.



이제 개발중반으로 접어드려는 단계일뿐이니, 정식버젼이 나오려면 더 기다려야될듯 하다.
http://www.vmware.com/betaprogram/WKST-2011-Beta (회원만 입장가능)







 
저작자 표시 비영리 변경 금지
신고
by Sone 2011.04.11 06:42
처음 SSDT 훅을 접해보는 사람은, 그냥 아무 생각없이 서비스넘버를 하드코딩 하는 경우가 다반사일 것이다. 물론 필자도 그랬었다. 
(아 그냥 , 하드코딩 개념이랑 비슷하구나, 단순히 구분을 위한 숫자이구나 라고 생각했었다.)
  그래서 서비스넘버에 관해서 자세히 알아볼 필요성이 있을것 같아서, 생각 정리도 할겸 포스팅을 해본다.


아래는 Windows Internal Fifth Edition 영문판의 128페이지에 나오는 내용이다.

2011:04:09 00:45:00

 
 Windows Internal에 따르면 , System Service Number는  Compile time때 Automatic Generate된 번호로써, 마이크로소프트 서비스팩 버젼에 따라서, OS버젼에 따라서 바뀔 가능성이 언제든지 존재한다. (이래서, 하드코딩은 금물이다)
 그 번호는 총 14비트로 구성되며, MSB 2Bit는 Service Table Index, LSB 12Bit는 System Service Number 이다.
System Service Number는 말 그대로,  시스템콜 디스패칭 식별을 위한 식별자이며,
Service Table Index를 살펴보면 , 2Bit이므로 총 4개까지의 서비스 테이블이 시스템에 존재할 수 있게된다.
ServiceDescriptorTable 구조체를 살펴보면 쉽게 알수있다.

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
UINT* ServiceTableBase;
UINT* ServiceCounterTableBase;
UINT NumberOfServices;
UCHAR* ParamTableBase;
} SDE, *PSDE;
#pragma pack()

typedef struct ServiceDescriptorTable
{
SDE ntoskrnl;           //00b
SDE win32k;             //01b
SDE Reserved0;        //10b
SDE Reserved1;        //11b
} SDT, *PSDT;

 ntoskrnl와 , win32k, Reserved0, Reserved1  총 4개의 서비스 테이블이 존재할수가 있다.
WinDBG로 살펴보면 알수있다.

 

2011:04:09 01:06:19

위 스샷에는 Reserved0와 Reserved1 항목은 서비스 디스패칭 용도가 아닌, 아예 다른 용도로 쓰여지고 있는것 같았다.
(확실치는 않다. 아시는분 알려주세요)
결과적으로 MSB 2Bit는 테이블 인덱스 식별자이다.

NTDLL.DLL에 포함되어져 있는, 서비스 디스패칭 루틴들의 서비스번호는
0x0XXX형태를 띄고있는데,
이것을 Binary로 바꿔보면,

00 1111 1111 1111 의 형태이다.

USER/GDI 서비스가 호출될때의 서비스 디스패칭 루틴들의 서비스번호는
0x1XXX형태를 띄고 있고, 이것을 바이너리로 바꿔보면

01 1111 1111 1111 의 형태이다.
(참고로, win32k subsystem driver는  Current Thread가 GUI Thread일때 , KeAddSystemServiceTable에 의해서 추가되어져서, NonPagedPool로 바뀌면서 ,, 서비스 호출이 이루어진다고 알고있다.)


나중에 혹시나 서비스 테이블이 더 추가된다면,
0x2XXX (10 1111 1111 1111) , 0x3XXX( 11 1111 1111 1111) 의 형태로 추가될 것이다.

저작자 표시 비영리 변경 금지
신고
by Sone 2011.04.09 14:29

USA카테고리에 첫 글을 쓰는게 아이패드 관련 글이네요 -_-;
정신없이 지내다보니 벌써 미국에 온지도 한달이 넘었군요...
사진은 수두룩한데 , 정리도 안하고 그래서 글을 쓰지 않았는데,
요번주내로 정리를 좀 해야할듯.




어찌됐든 아이패드2가 미국에 출시된지 일주일도 넘은  3월24일.
이날까지 2~3번 애플스토어를 방문해서 직원에게 재고가 있냐고 물어보았지만, 돌아오는 답변은  "Out of Stock"
사실 생각해보니 제가 오후에 애플스토어를 방문해서 재고가 있냐고 물어본게 잘못이라면 잘못인거같네요. (오후에 아이패드2를 찾는게 말이되냐? 오전에 다 팔리지)

그래서 에라 모르겠다 하고 , 오전에 날잡고 찾아가보기로 했습니다.
물론 재고상황이고 뭐고 아무것도 모른채 말이죠




미 동부시각으로   3월24일 오전8시.



Apple | iPhone 3GS | Normal program | Average | 1/150sec | F/2.8 | 3.9mm | ISO-64 | No flash function | 2011:03:24 08:33:26

오전8시30분에 Boylston Apple Store에 도착을 했습니다.
도착하니, 이미 많은 사람들이 줄을 서있더군요. 그래도 이정도는 사람이 별로 없는거죠.
제 생각에는 이날 오전에 아이패드2를 사려고 줄을 선 사람의 수는 대략 6~70명정도가 될것같네요.
그래도 줄 선 사람들은 모두 다 아이패드2를 구입한것 같았습니다.
물량이 많이 풀리고 있나봅니다.
저 사람들중에서 유일하게 저를 째려보고 있는 친구가, 저를 대신해서 오전8시부터 줄을 서줬습니다 -_-;;
사우디아라비아 친구인데, 언어를 배우는데 정말 열정적인 친구입니다.
저 친구 아니었으면, 오늘도 쓸쓸히 집으로 발걸음을 돌려야 했을수도...ㅋㅋㅋ




잠시 , Boylston Apple Store에 관해서 간단히 설명을 하자면..

(출처 : http://www.apple.com/retail/boylstonstreet/)

(출처 : http://www.apple.com/retail/boylstonstreet/)

(출처 : http://www.apple.com/retail/boylstonstreet/)

Store Information

Address:

815 Boylston StreetBoston, MA 02116(617) 385-9400

MBTA T  Green Line를 타고 , Copley Station에서 내려서 ,  Boston Library 옆길 따라서 쭉 가면 나옵니다.
한국 Apple Store에 가본적이 없어서 , Boylston Apple Store가 얼마나 큰지는 모르겠습니다만, 직원은 정말 많더군요 ㄷㄷㄷ




Apple | iPhone 3GS | Normal program | Average | 1/465sec | F/2.8 | 3.9mm | ISO-64 | No flash function | 2011:03:24 08:36:42

사우디 친구는 잠자러 집에 가고, 티켓을 대신 겟 했습니다~!
줄서는 동안에, 직원이 어떤 모델을 구매할건지 물어보고, 구매하고자 하는 모델을 말하면, 그에 맞는 티켓을 줍니다.
한동안 이런 상황이 계속된다면, (오전에 줄을 서고, 재고가 넘치지 않는 상황)  저 티켓이 없으면 구매는 불가능합니다.
원래 저는 16기가 AT&T를 구매하려고 했습니다만,  다 떨어졌다고 해서 어쩔수없이 32기가를 선택하게 되었습니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.9 | 0.00 EV | 6.3mm | ISO-400 | Off Compulsory | 2011:03:24 10:21:32

iPad 2 WIFI + 3G White 32GB , Smart Cover leather Brown color
여차저차해서, 구매해서 집으로 가져 왔네요.
애플제품은 포장이나 박스나 디자인이 심플하군요.
스마트커버는 Leather Brown인데 , 가죽이라 그런지 69달러나 하더군요.
결제를 하면 영수증PDF 파일이 메일로 날라옵니다.

32GB AT&T White : 729$
Smart Cover leather with Brown color : 69$
Tax (6.25%) : 49.88$
Total : 847.88$  (947,351 KRW. 25 March 2011)




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.9 | 0.00 EV | 6.3mm | ISO-200 | Off Compulsory | 2011:03:24 10:21:56

AT&T 모델을 구매했기 때문에,  HSDPA/GSM을 사용해서  한국에서도 사용이 가능합니다.
저는 한국에서도 사용할것을 염두에 두고 3G모델을 구매했습니다.






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:24 10:24:26

구성품도 심플합니다.
어댑터 , Dock USB Connector , Manual, iPad 2

어댑터 플러그가 날카롭네요.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:24 10:25:17

뭐 이미 인터넷에 사진이 수두룩하게 올라와있겠지만 , 저도 측면 두께를 한번 찍어봤습니다.
얇긴 얇더군요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:24 10:25:36

후면 모습입니다.
아이패드1에는 카메라가 없다고 하는군요.
카메라가 있는것으로 봐서, 아이패드2가 맞긴 맞네요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:24 10:29:38



SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:24 10:29:10

스마트커버를 장착해보았습니다.
커버를 들어올리면, 자동으로 화면이 켜지던데 , 근접센서와 커버를 응용한것으로 보이네요.
검정색 커버도 있었는데, 검정은 좀 투박한것 같아서 , 갈색을 선택했습니다.
나쁘진 않은거같네요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-320 | Off Compulsory | 2011:03:24 10:42:11
여기 iPad 2는  출고때부터 심카드가 장착되어져서 나옵니다.
우리나라같이 폰을 개통하는 개념으로 1년, 2년 약정으로 하는것이 아니라,
iPad 2 전용 데이터 플랜이 존재하며, 계약기간은 30일을 주기로 합니다.
즉 ,  30일 간격으로 자동갱신이 이루어지다가 , 다음달에 쓰기 싫으면  취소 신청을 하면 , 다음달에는 갱신이 안되고 알아서 데이터플랜이 해지 됩니다.  정말 좋은 시스템이죠.
이런걸 보면 , 우리나라 통신사는 도대체 어떤 생각을 가지고 있는지 궁금합니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/45sec | F/3.3 | 0.00 EV | 4.2mm | ISO-100 | Off Compulsory | 2011:03:24 10:49:47

통신사 찾아갈 필요도 없고 , 심카드도 박혀있기 때문에 번거로운것이 하나도 없습니다.
그냥,    설정 - Cellular Data에 들어가서 가입하고싶으면 간단한 유저정보와 지불방법만 입력하고 약관에 동의하면 가입이 완료됩니다.
한국도 이런식으로 개선해줬으면 좋겠군요.





SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/30sec | F/3.3 | 0.00 EV | 4.2mm | ISO-120 | Off Compulsory | 2011:03:24 10:58:22

사실 저는 뭐 속된말로 애플빠, 삼성빠가 아니고, 그저 중립적으로 지켜보는 사람인데
이것저것 써보니 , 사람들이 왜 애플을 좋아하는지는 알것 같네요.
심플하면서도 기능이 파워풀합니다.




SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/20sec | F/3.3 | +0.60 EV | 4.2mm | ISO-400 | Off Compulsory | 2011:03:26 19:39:37

0.99달러 돈내고 다운로드 받은 날씨 어플






SAMSUNG | SAMSUNG WB500, WB510 / VLUU WB500 / SAMSUNG HZ10W | Normal program | Pattern | 1/45sec | F/3.3 | 0.00 EV | 4.2mm | ISO-100 | Off Compulsory | 2011:03:26 11:30:07

PDF를 띄워서 읽는데도 아무런 문제가 없습니다.
줌이나 축소를  할 필요가 없네요.





한마디로 요약하면 , "돈값은 한다"  라고 할수 있겠네요. (대부분의 전자기기가 다 그렇긴 하지만...)
한국도 다음달에 어서 출시되서 , 많은 사람들이 써서 커뮤니티 활성화가 되길 바라며...
저작자 표시 비영리 변경 금지
신고
by Sone 2011.03.26 05:36
Named-mutant를 이용한 다중실행 방지 기법은 , 이미 지겹도록 다루어졌고 널리 퍼졌기때문에
이번엔 다른 커널 객체를 이용한 방법을 간단히 다루고자 한다.

결론부터 말하면, 별거없고 그냥 다른 커널객체를 이용할 뿐이다.

바로 소스를 살펴보면,

NTSTATUS ntRet = STATUS_SUCCESS;
HANDLE hSection;
UNICODE_STRING SectionName;
OBJECT_ATTRIBUTES SectionAttributes;
LARGE_INTEGER SectionSize;
CHAR Dbgmsg[100];

RtlInitUnicodeString(&SectionName, L"\\BaseNamedObjects\\s0neSectionObject");
InitializeObjectAttributes(&SectionAttributes, &SectionName, OBJ_OPENIF, NULL, NULL);
SectionSize.QuadPart = 0x1000;   //optional

ntRet = ZwOpenSection(&hSection, SECTION_ALL_ACCESS, &SectionAttributes);

//Is named-section already exist?
if( NT_SUCCESS(ntRet) )
{
ZwClose(hSection);
sprintf_s(Dbgmsg, sizeof(Dbgmsg), "Application is already running. (0x%08X)", ntRet);
MessageBoxA(GetForegroundWindow(), Dbgmsg, "Error", MB_OK);
return EXIT_SUCCESS;
}
else
{
//Create new named-section.
ntRet = ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &SectionAttributes, &SectionSize, PAGE_READWRITE, SEC_COMMIT, NULL);

if( !NT_SUCCESS(ntRet) )
{
sprintf_s(Dbgmsg, sizeof(Dbgmsg), "Section create failed. (0x%08X)", ntRet);
MessageBoxA(GetForegroundWindow(), Dbgmsg, "Error", MB_OK);
return EXIT_FAILURE;
}


//.....continue execution......
         }


먼저 특정 이름의 섹션이 존재하는지 확인한 뒤, 존재한다면 이미 실행중이라 판단하고 종료하고, 
존재하지 않는다면 실행중이지 않다고 판단해서 고유의 이름을 가진 섹션을 새로 생성한다.
사람들이 거의다 뮤텍스만 사용하기때문에, 섹션은 조금 생소할수도 있으나,
따지고보면 결국은 이름 지정이 가능한 다른 커널 객체를 이용한다고 볼수있다.

VS2010 빌드

저작자 표시 비영리 변경 금지
신고
by Sone 2011.02.27 10:25
| 1 2 3 4 |