크윽... 죽는 줄 알았습니다. ㅠㅠ 지난 휴가와 이번주 주말을 모두 투자해서 드디어 Interrupt 처리 부분을 넣고, 나중에 사용할 APIC 와 IO APIC쪽 설정 기능을 넣었습니다. ㅠㅠ 사실 훨씬 더 일찍 끝났어야 하는 일이나... 가상 머신에 불완전함 때문에 코드를 고치고 테스트하다보니 많이 늦어졌습니다.

 현재 테스트 중인 가상머신은 총 3개인데, VMware, Bochs, 그리고 QEMU를 사용하고 있습니다. 재미있는건 각자 BIOS 설정이 조금씩 다르고, 같은 코드라도 동작하는 방식이 다르다는 것이죠. ㅠㅠ 이것 때문에 죽는 줄 알았습니다. 특히 Interrupt 처리부분에서 Bochs와 VMware에 문제가 있는 것 같더군요.

 테스트를 몇시간동안 한 결과 코드에서 Stack을 Align하지 않고 사용하는 경우, 간혹 Stack에 데이터가 덮어써져서 나중에 iretq로 돌아왔을 때 정상적으로 수행되지 않는 문제가 있었습니다. 원래 CPU가 realign을 해주게 되어있습니다만, 정상적으로 동작하지 않는 때가 있는 것 같습니다. 물론 꼼수로 해결했습니다만, 뭔가 좀 씁쓸하네요. ^^;;; 더 웃긴건 QEMU의 경우는 괜찮다는 것이죠. ;) 이 문제 때문에 거의 이틀을 꼬박 날렸습니다. 아흑 내시간...ㅠㅠ

 더 가관인 문제는 VMware에서 생겼습니다. Keyboard Interrupt를 발생하지 못하게 한 뒤에, 키를 마구 입력해서 키보드 버퍼를 체운 후 APIC쪽을 Enable 하니 Interrupt가 발생하지 않는 것이 아니겠습니까? @0@)/~!!! VMware의 APIC쪽하고 PIC쪽에 매치하는 부분에서 문제가 있는 것 같은데, 키보드 버퍼에서 데이터를 다 읽어내면 그때부터 인터럽트가 발생하기 시작합니다. ㅡ_ㅡa;;;;; 이것도 결국 땜빵코드로 해결... ^^;;;

 마지막으로 애교로 넘어가줄 수 있는 문제... Qemu에서 int 13, 즉 Disk Read에 문제가 있더군요. 여러 섹터를 읽도록 요청하면 간혹 덜 읽히고 종료되는 문제가 있었습니다. 이 문제는 어느정도 예상을 하고 있던 것이라 역시나 땜빵으로 해결... 예전에 만들면서 겪었던 문제라서 그냥 애교로 넘어갔습니다. ㅎㅎ

 결국 온갖 삽질 끝에 세가지 에뮬레이터에서 모두 동작시키는데 성공했습니다. 아래는 세가지 에뮬레이터에서 동작시킨 화면입니다.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

 이제 대충 멀티 태스킹과 elf64의 재배치(Relocation) 쪽만 해결하면 되겠군요. ㅎㅎ 코어를 하나 더 활성화 시키는 것은 저번에 해봤으니 그냥 붙여넣기만 하면... (설마 이것도 쉽게 안되려나..ㅠㅠ)  그나저나 계속 삽질만 해서 큰일입니다. ㅠㅠ 크윽...

 제발 좀 한번에 가자 ㅠㅠ)/~~

 그럼 다들 좋은 밤 되시길~ ^^)-b



 Cywin에서 크로스 컴파일러를 만들기위해서는 먼저 소스 패키지를 설치해야합니다. setup.exe 를 실행해서 Devel 부분의 Binutil gcc-core 의 소스 패키지를 선택하고 설치를 수행하면 소스가 /usr/src 폴더에 설치될 겁니다. ^^

1.Binary Utility Build

 제일 먼저 해야할 일은 binutil을 빌드하는 일입니다. x86_64용 크로스컴파일러를 빌드하기 위해서는 x86_64용 ld와 as 등등 각종 링커와 어셈블러들이 필요하기 때문이지요 ;) bintul을 빌드하는 방법은 아래와 같습니다.
  • export PREFIX=/usr/cross
  • export TARGET=x86_64-pc-linux
  • ./configure --target=$TARGET --prefix=$PREFIX --enable-64-bit-bfd --disable-shared
  • make configure-host
  • make LDFLAGS="-all-static"
  • make install
 위와 같이 실행하고나면 정상적으로 build된 경우 /usr/cross 라는 폴더가 생성되어있을 겁니다. 그 폴더에 들어가보시면 빌드 결과물을 확인할 수 있습니다. ;) 현재 x86_64 용 glib가 생성되어있지 않은 상태이므로, 공유라이브러리를 사용하지 않도록 --disable-shared-all-static 옵션을 줘야합니다. 주지 않을 경우 나중에 gcc 빌드할 때 문제가 발생합니다. ㅜ_ㅜ crti.o가 없다고 계속 에러가... ㅠㅠ

2. GCC Build

 그 다음 해야할 일은 gcc를 생성하는 일입니다. cygwin에 포함된 gcc 소스에는 소스 파일과 패치파일을 포함하고 있습니다. 정상적으로 빌드하기위해서는 패치를 수행해야 하는데, 다행이도 gcc-3.4.4.sh 라는 스크립트가 있습니다. 아래의 빌드를 수행하기 전에 먼저 아래와 같이 입력해서 패치를 수행합니다.
  • gcc-3.4.4.sh prepare
 위 과정이 정상적으로 끝나고나면 gcc-3.4.4-3 이라는 폴더로 이름이 변경될겁니다. 그럼 해당 폴더로 이동해서  아래의 순서대로 실행합니다.
  • export PATH=$PREFIX/bin:$PATH
  • ./configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --with-newlib --without-headers --disable-shared --disable-threads
  • make configure-host
  • make LDFLAGS="-static" all-gcc
  • make install-gcc
 위와 같이 실행하고나면 /usr/cross에서 gcc관련 파일들을 보실 수 있습니다.

 이 간단한걸 하려고 며칠을 해매었는지 모르겠군요. ㅜ_ㅜ)-b
 다른 분들은 이런 걸로 고생 안하셨으면 합니다. ㅜ_ㅜ
아아~ 진짜 거의 3일만에 성공했습니다. ㅜ_ㅜ 주말 내내 붙잡고 있다가 해결 못하고 있었는데... 구글의 자료를 뒤지다가 --disable-shared 옵션 및 LDFLAGS="-static" 으로 해결했습니다.

 ㅜ_ㅜ 진짜 되고 안되고가 한끗 차이더군요. 저런 옵션 하나때문에 몇시간을 날렸는지... ㅜ_ㅜ... 아래는 빌드가 끝나고 cygwin에 설치된 64bit 크로스 컴파일러(cross complier) 입니다. 감동해서 스샷 하나 찍어 올립니다(반갑다 애들아~ 우리 이제 잘해보자꾸나...). ㅜ_ㅜ)-b

사용자 삽입 이미지

 자세한 빌드 방법은 내일 정리해서 올리겠습니다. 앞으로는 저처럼 삽질하는 사람이 없었으면 하는 생각이 드는군요. 진짜 어의없습니다. ㅜ_ㅜ

 그럼 다들 좋은 밤 되시고, 내일 허접한 문서로 다시 찾아 뵙겠습니다. ㅜ_ㅜ)-b
 아아 이거 또 실패했습니다. ㅜ_ㅜ ln 까지는 갔으나... crti.o를 자꾸 찾는 바람에.... ㅜ_ㅜ cygwin에서 컴파일하는데 저 파일을 찾는 걸 보니 --target=x86_64-linux 옵션으로 줘서 그런 것 같습니다.

사용자 삽입 이미지

 크윽... 왜 Cygwin Package에는 64bit로 크로스 컴파일하는 옵션이 없을까요... ㅜ_ㅜ --target=x86_64-cygwin 요런거라도 있으면 좋을 텐데 말입니다. ㅜ_ㅜ

 당체 이 삽질을 언제 끝낼 수 있을지... 크윽... ㅜ_ㅜ 눈물이 앞을 가립니다. 흑흑...



 아아~ 이거 주말을 다 날렸습니다. 결국 cygwin으로 옮겨타고 나서야 binutil을 컴파일 할 수 있었는데... gcc를 컴파일 하려니 이것 저것 문제가 많아서 결국 실패했습니다. ㅜ_ㅜ

 컴파일을 한참 진행하다보니 거의 마지막 단계인 nm을 사용하는 부분과 ar을 사용하는 부분이 문제인것 같던데... makefile 안에 있는 아래와 같은 부분이 정상적으로 동작하지 않는 것 같습니다.

AR_FOR_TARGET = ` \
  if [ -f $(objdir)/../binutils/ar ] ; then \
    echo $(objdir)/../binutils/ar ; \
  else \
    if [ "$(host)" = "$(target)" ] ; then \
      echo ar; \
    else \
       t='$(program_transform_name)'; echo ar | sed -e $$t ; \
    fi; \
  fi`
AR_FLAGS_FOR_TARGET =
AR_CREATE_FOR_TARGET = $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) rc
AR_EXTRACT_FOR_TARGET = $(AR_FOR_TARGET) $(AR_FLAGS_FOR_TARGET) x

RANLIB_FOR_TARGET = ` \
  if [ -f $(objdir)/../binutils/ranlib ] ; then \
    echo $(objdir)/../binutils/ranlib ; \
  else \
    if [ "$(host)" = "$(target)" ] ; then \
      echo $(RANLIB); \
    else \
       t='$(program_transform_name)'; echo ranlib | sed -e $$t ; \
    fi; \
  fi`

NM_FOR_TARGET = ` \
  if [ -f ./nm ] ; then \
    echo ./nm ; \
  elif [ -f $(objdir)/../binutils/nm-new ] ; then \
    echo $(objdir)/../binutils/nm-new ; \
  else \
    if [ "$(host)" = "$(target)" ] ; then \
      echo nm; \
    else \
       t='$(program_transform_name)'; echo nm | sed -e $$t ; \
    fi; \
  fi`

 원래의 의도대로라면 if else에 의해서 x86_64-linux-nm 이나 x86_64-linux-ar과 같이 치환되어야할 것들이 그대로 쉘에 출력되어 난데없는 rc.exe가 실행되는 안습인 상황이 벌어지더군요. ㅡ_ㅡa... 쉘이 문제인지 makefile이 문제인지 확실하게 모르겠습니다만... 정상적으로 실행이 안되는 것은 사실인 것 같습니다. ㅎㅎ

 아아~ 이거 주말을 다 날렸네요. ㅜ_ㅜ 내일은 꼭 성공해야할텐데... 큰일입니다. ㅜ_ㅜ
 그럼 좋은 밤 되세요 ;)

ps) cygwin에서 x86_64로 크로스 컴파일 해보신 분 있으시면 팁 좀 부탁 드립니다. (_ _)


 32bit 윈도우라서 64bit 코드를 생성하는게 상당히 힘들군요. ㅜ_ㅜ 되도록이면 Open Source를 사용하려고 MinGW나 Cygwin을 보고 있습니다만... 다들 m64 옵션이 먹지 않는 것 같네요. ㅜ_ㅜ

 MinGW에 GCC 소스를 받아서 컴파일 해보니 이것도 에러가 발생... ㅜ_ㅜ... 아놔 천지 쉬운게 없군요. 이거 하루종일했는데, 결국 실패했습니다.

 어디 m64 옵션 먹게 컴파일된 GCC 없나요? ㅜ_ㅜ


 크윽... 이럴수가... 64bit 코드를 생성할 일이 있어서 MinGW를 설치했는데, m64 옵션이 먹지 않더군요. ㅜ_ㅜ 구글을 뒤져보니 디폴트로 컴파일되서 32bit 만 지원하나 봅니다. ㅜ_ㅜ

 결국 한 2시간을 찾아 해매다가... 결국 gcc 소스를 받아서 새로 컴파일하기로 했습니다. 어휴... 이거 초장부터 쉽지 않습니다. ㅜ_ㅜ... 아흑... 오늘 하루종일하겠군요.

 일단 컴파일되서 테스트까지 끝나면 포스팅하겠습니다. ;)
 다들 즐거운 주말 되시길 ^^)/~


 거의 4일 동안 문서를 뒤지고 직접 테스트를 수행한 결과, IO APIC와 APIC간의 관계와 8259A(PIC) 칩간의 관계에 대해서 알아냈습니다. 더불어 BIOS에 존재하는 MP 관련 정보와 IO APIC의 Redirection Table, CPU의 APIC의 레지스터에 의미에 대해서도 대충 알아냈습니다. ㅜ_ㅜ)-b

 어떻게 테스트 했는지는 나중에 올리겠습니다. 나름 복잡한 내용을 포함하고 있고, 또 시간이 너무 늦은지라 ㅎㅎ 대신 아래의 스샷을 첨부합니다. 제가 만든 OS(KKAMAGUI OS)에서 IO APIC를 통해 BSP(Bootstrap Processor)에 키보드와 타이머 이벤트를 밀어넣는 화면입니다. 볼품없지만 이게 4일 동안 작업한 것이라는... OTL....
사용자 삽입 이미지

 그래도 IO APIC와 Local APIC에 대해 잘 모르면 Sysmmetric I/O로 갈 수 없기 때문에 어쩔 수 없었습니다. ㅜ_ㅜ)-b 결국 하긴 했군요. 흑흑.... 8259A(PIC) 컨트롤러의 타이머/키보드 인터럽트를 발생 못하도록 mask 했는데도 인터럽트 방식으로 잘 동작하는 화면을 보니 신기하군요. ^^;;;;

 그럼 이만 자야겠습니다. 좋은 밤 되시길~ ;)
 요 며칠째 계속 VMWare하고 Multiple Processor 스펙, 그리고 IO APIC 스펙을 함께 보며 삽질을 하고 있습니다. 그런데 아무리봐도 뭔가 이상하군요.

 Multiple Processor 스펙에 보면 MP Floating Pointer Structure의 Feature 2 정보에 IMCRP 비트가 셋팅되어있지 않으면 IMCR 레지스터가 존재하지 않는 것이고...이런 경우 기본 모드는 Virtual Wire 모드라고 되어있습니다.

 앞서 http://kkamagui.tistory.com/497 에서 설명 드렸듯이 Vritual Wire 모드는 2가지 모드가 존재하고, 테스트해본 결과 Local APIC는 다 Enable 되어있고 IO APIC의 Redirect Table이 모두 Default 값으로 Disable 되어 있으므로 Virtual Wire mode with Local APIC 라고 볼 수 있습니다(아래 그림 참조).

사용자 삽입 이미지

 그런데 웃긴건, BIOS가 MP를 초기화하고 그 정보를 저장해놓는 MP Configuration Table의 I/O Interrupt Assignment Entries 정보를 보면 IO APIC가 활성화 되어있으며 8259 컨트롤러가 IO APIC의 첫번째 pin에 연결되어 있다고 나옵니다. 나머지 타이머나 키보드 등등도 다 IO APIC에 연결된 것으로 설정되있습니다. ㅡ_ㅡa...

 만약 그렇게 연결되어있다면 IO APIC의 Redirect Table에도 동일한 설정으로 저장되어있어야 맞는 것 같은데... IO APIC의 Redirect Table에는 아무것도 안들어있으니... ㅡ_ㅡa... 이게 당체 어디가 맞는 건지 알 수가 없군요. ^^;;;; Redirect Table에 아무런 값이나 막 넣어봐도 별 에러없이 동작하던데... VMWare의 BIOS가 신경을 안쓰는 건지... 아니면 원래 그런 것인지 모르겠습니다. ㅜ_ㅜ

 그리고 Symmetric I/O는 당체 어떻게 ON 하는 것인지... ㅡ_ㅡa... 그냥 Local APIC를 다 활성화 시키고 I/O APIC의 Redirect Table에서 Destination을 손보면 되는 것인지... 이것 참... Redirect Table의 비밀이 풀려야 다음 진도를 나갈 수 있을 것 같은데... 이게 쉽지 않군요. ^^;;;;

 에혀... 죽겠습니다. 혹시 아시는 분 계시면 제보 부탁드립니다. ^^)/~
 그럼 좋은 밤 되시길~ ;)


 예비군 내내 Intel Architecture Volume 3을 봤습니다. 그리고 고향에 내려오는 도중에 PSP로 Multile Processor(MP) Spec을 계속 봤었는데... 뭔가 좀 이상하더군요. Intel 문서에는 I/O APIC에 대해서 아주 조금 언급하고 있습니다. 그냥 APIC와 연결되있다는 정도로 말이지요. ^^;;;;
 
 그런데 MP Spec에 보면 PIC, Virtual PIC, Symmetric I/O의 각 방식에 대해 아래와 같이 자세히 그려놓고 있습니다.
사용자 삽입 이미지
<PIC 모드>
사용자 삽입 이미지
<Virtual Wire Mode With Local APIC>
사용자 삽입 이미지
<Virtual Wire Mode With IO APIC>
사용자 삽입 이미지
<Symmetric IO Mode>

  보시면 아시겠지만 CPU의 Boundary 안쪽에 IO APIC가 있는지 바깥쪽에 있는지 좀 불분명합니다. 어렴풋이 버스 배열 상태나 위치를 봐서 바깥쪽에 있다고 추측합니다만... 이것만 봐서는 확실히 알수가 없었습니다. 그래서 이것 저것 뒤지다보니 intel-82093-apic 문서를 찾았습니다. IO APIC 컨트롤러에 대한 문서더군요. ^^;;; 거의 바깥쪽에 있는게 확실한 것 같습니다. 그런데 이게 왜 중요했던건지... ㅡ_ㅡa;;;;

 생각난 김에 VMWare의 부팅했을때 모드가 위의 그림 중에 어떤 것인지 확인을 좀 해봤습니다. 몇가지 테스트가 있는데... 테스트 과정은 좀 복잡해서 생략하고 결론만 이야기하면 Virtual Wire Mode With Local APIC 인 것 같습니다. 왜냐하면 I/O APIC쪽에 Interrupt Remapping Table인가 하는 녀셕이 Default 값으로 되어있거든요. 즉 안쓴다는 이야기지요. ^^;;; 그동안 다른쪽 코어에는 인터럽트쪽 설정을 안했기 때문에 별 신경을 안쓰고 있었는데, 이제 다른 코어에 인터럽트를 활성화하려면 이것이 중요한 단서가 되서 한번 읽어봤습니다.

 음... 이제 몇가지 코딩을해서 Symmetric IO Mode 로 전환하고 테스트를 좀 더 진행해볼 생각인데... 이것 참... 할일이 많네요. ^^;;; 언제쯤 또 할 수 있을지... 요즘 들어 시간이 부쩍 부족한 것 같습니다. ㅎㅎ 그래도 잘 쪼개서 이것 저것 해봐야겠지요 ;)

 그럼 다음에 또 테스트해서 결과가 나오면 올리겠습니다. ㅎㅎ 다들 좋은 하루 되세요 ;)

ps) APIC 관련 자료가 참 없더군요. 참 불모지(?)스럽다는.... ㅡ_ㅡa...


 그동안 OS를 여러번 만들어봤습니다만, 2002년에 시작한 KKAMAOS 외에는 그렇게 디테일한 레벨까지는 만들지 않았습니다. 프로그래머라면 다들 그렇겠지만 "했던" 일을 다시 한다는 것 자체가 고통이어서 다시 하려니 손이 안가더군요. 그래서 CPU를 ARM이나 DSP 같은 걸로 살살 바꿔가면서 "부팅 -> OS 로딩 -> 멀티태스킹" 정도 구현하고 끝냈습니다.

 그런데 이런 저런 사정으로 한번 더 만들게 됬는데... 이번에는 좀 색다르게 64bit로 만들게 될 것 같습니다. 사실 64bit에 대해서는 대충 알고 있었던지라 한번 볼 필요도 있고 해서 과감히 결정했습니다. 한 며칠동안은 스터디만 죽어라고 할 것 같군요. ^^;;;;

 오늘 예비군 훈련 받으면서 Intel 문서 좀 보려고 PSP에 넣어갔었는데... 바보같이 보안 검색대에서 걸려서 PSP를 압수당했다는.... ㅜ_ㅜ... 결국 예비군 훈련 시간을 거의 다 날려버렸습니다. ㅜ_ㅜ 오늘 좀 봤으면 저녁에 코딩을 어느 정도 할 수 있었을텐데.... 많이 아쉽군요. ㅜ_ㅜ...

 일단 진행 중간 중간에 팁이나 스크린샷 위주로 포스팅 할 예정입니다. 갑자기 또 불이 붙기 시작하는군요. ;)
 다들 기대해 주세요 >ㅁ<)/~


 블로그를 돌다가 스크랩 해놓은지 꽤나 됐는데, 이제서야 포스팅하는군요. ^^;;; 워낙 정신없이 살다보니 ㅎㅎㅎ
 
 자신만의 Network Set-Top Box를 만드는 방법에 대해서 설명해 놓은 자료입니다. YBox2 라는 이름을 가지고 있고 PAL과 NTSC 2가지 방식의 출력을 지원한다는 군요. 원문은 http://ladyada.net/make/ybox2/index.html 에서 보실 수 있습니다.

 아래는 원문에 포함된 스크린샷의 일부입니다. 아주 멋집니다~!! ;)
 







 시간나면 한번 만들어봐야겠군요. ^^
 그럼 좋은 하루 되세요. ;)

 어제 야근을 너무 늦게까지했더니 오늘 완전 몸이 녹아 내렸습니다. 집에와서 그냥 쉴려고 했는데... 취미로 하는 일이 너무 밀려있어서 꾸역꾸했더니 더 몸이 않좋네요. ㅎㅎ;;

 에혀... 일찍 자야하는데... 이거 원 쉽지가 않군요. 목차 쓰는 일이 생각보다 빡셔서...^^;;;; 구현할 것은 많고, 순서는 뒤죽박죽이고... 다시 읽어보니 이게 뭔말인지 모르겠고... ㅡ_ㅡa... 크윽... 역시 글쓰기에는 소질이 없는 것 같습니다.

 그래도 일단 저지른 일이니, 끝까지 한번 해볼겁니다. ^^;;;;
 정 아니다 싶으면 누군가(?)가 도와주겠지요 ㅎㅎ

 피곤해서 언능 자야겠습니다. ^^
 다들 좋은 밤 되세요 ;)


 한 2년 전에 Xnote LW20-35WK라는 모델을 약 200만원이라는 거금을 주고 샀습니다. CPU가 2.13GHz에 램이 2GByte 달린 괴물같은 녀석이었지요. ^^;;;; 그때는 노트북 램이 아무리 커도 느린 HDD 때문에 별로 안빠르다는 사실을 몰랐습니다. ㅜ_ㅜ (결국 스펙 오버....)

 세월이 흘러 프로그램들은 점점 더 무거워졌고,  HDD가 느린 LW20으로 버티기엔 무리더군요. 결국 데스크탑으로 갈아타고 노트북은 저쪽 책꽂이 한켠에 던져놨었습니다. 그런데... 다들 아시겠지만 데스트탑이 열이 장난이 아닙니다. ^^;;; 모니터도 24인치짜리를 쓰고있으니 아래에서 위에서 열이 펄펄.... 결국 견디다 못해 노트북을 집었습니다.

 역시나 노트북이 상당히 느리군요. 예전에 어떻게 사용했는지 모르겠습니다. 데스크탑과 비교하면 이건... 뭐... ㅡ_ㅜ... 그래도 열은 안나니 좋긴한데.... ^^;;;;; 어차피 웹 작업 위주니 작업에는 큰 문제가 없지만... 워드나 기타 개발 툴을 실행할때는 죽을 것 같네요. ㅎㅎ

 그래도 열이 확 줄어들어서 좋습니다. ;) 앞으로 글쓸 일이 좀 많아질 듯 한데... 글쓰는 일과 같이 로드가 적게 걸리는 일은 노트북을 쓰고, 큰 로드가 걸리는 부분은 데스크탑을 켜서 원격으로 하는 방법으로 해야겠습니다. 이렇게 되니 안팔기를 잘한 것 같네요. ^^)/~ 사람 마음이란게 참... ㅎㅎ

 아아~ 오늘부로 가상 HID(Virtual HID)관련 작업이 거의 마무리되서, 앞으로 다른 일을 좀 할 수 있을 것 같습니다. 날아갈것 같군요. 앞으로 더 재미난걸 해볼 생각입니다. ;)
 그럼 다들 좋은 밤 보내시길~ ㅎㅎ

 Immunity Debugger를 만드는 Immunity 사에서 Kernel Exploit 관련 자료들을 공유하고 있습니다. ^^)/~ 원문은 http://immunityinc.com/resources-papers.shtml 에서 보실 수 있습니다.

 아직 보지 않아서 무슨 자료인지는 정확히 알 수 없지만, 제목만 훓어봐도 꽤 괜찮겠다 싶은 내용이 있더군요. 아래는 위 사이트에서 소개한 목차와 내용입니다.
June 11, 2008: Exploiting Kernel Pool Overflows (Kostya Kortchinsky)
ODP

June 11, 2008: The I2OMGMT Driver Impersonation Attack (Justin Seitz)
PDF
ODT

March 28, 2008: The Hacker Strategy (updated for Harvard ABCD meeting)
PDF

February 29, 2008: IO Immunity Style (Sinan Eren)
PDF

January 26, 2008: The Hacker Strategy (S4 SCADA conference keynote)
PDF

January 22, 2008: Going Against The Gradient
PDF
OpenOffice

December 14, 2007: Beyond Fast Flux
OpenOffice (presentation)
PDF

November 23, 2007: Exploit Development with Immunity Debugger
OpenOffice (presentation)

August 10, 2007: Damian Gomez - Intelligent Debugging
PDF (presentation)
Openoffice (presentation)

July 6, 2007: Nicolas Waisman - Understanding and Bypassing Windows Heap Protection
PDF (presentation)
Openoffice (presentation)

July 6, 2007: Justine Aitel - The IPO of 0days
PDF (presentation)
Openoffice (presentation)

April 8, 2007: Dave Aitel - CANVAS Command Line Executer
Openoffice (paper)

April 8, 2007: Kostya Kortchinsky - Macro-Reliability in Win32 Exploits
Openoffice (presentation)

December 6, 2006: Dave Aitel - Remote Language Detection
Openoffice (paper)

August 30, 2006: Dave Aitel - MSRPC Fuzzing
OpenOffice (paper)
OpenOffice (presentation)

February 13, 2006: Dave Aitel - Resilience
PDF
OpenDocument
TGZ source

January 26, 2006: Dave Aitel - Nematodes (updated)
PDF
OpenDocument
VisualSploit Preliminary Flash Demo

September 29, 2005 Dave Aitel - Nematodes
OpenOffice PDF

May 9th, 2005 Dave Aitel - Practical IDS Evasion
OpenOffice

Feb, 28th, 2005 Bas Alberts - Exploiting the PHP_Limit bug
PDF

Jan 29, 2005 Dave Aitel - 0days: How hacking really works
Open Office PDF HTML

Oct 12, 2004 Dave Aitel - The CANVAS Reference Implementation
Open Office

Oct 12, 2004 Dave Aitel - Advanced Ordnance 2
Open Office PDF

August 12, 2004 Dave Aitel - Microsoft Windows, a lower Total Cost of Ownership
Open Office    |   PDF

June 21, 2004 Dave Aitel - Beyond Best Practices (Given at OWASP AppSec 2004)
Open Office

May 19, 2004 Dave Aitel - Rapid Application Development in Linux using pyGTK
Open Office

March 1, 2004 Dave Aitel - Enterprise Secific Software Security Issues:
Open Office

Feb 4, 2003 The Advantages of Block-Based Protocol Analysis for Security Testing:
Open Office   |    HTML   |    Text   |    Post Script   |    PDF

July 29, 2002 Using SPIKE 101
Power Point   |    Real Media

Feb 24, 2003 - Vivisection of an Exploit Development Process
Power Point   |    Real Media

May 1, 2003 - Windows Exploitation for Unix Hackers
Power Point

Sep 29, 2003 - MOSDEF
Power Point

Jan 27, 2004 - Advanced MOSDEF
Open Office

March 1, 2003 Nicolas Waisman - Linux Heap Overflow Techniques
Power Point

Sep 12, 2003 Microsoft Heap Overflows I/II
PDF    |   Open Office

Sep 12, 2003 Microsoft Heap Overflows II/II
PDF    |   Open Office

 완전 득템이군요. ^^;;; 그럼 즐거운 주말 보내시길~ ;)


몇시간 삽질 끝에 드디어 가상 HID(Virtual HID)를 완성했습니다. ^^)/~ 약간 문제가 있긴 하지만 그래도 동작은 하니... ^^;;;;; 하나의 드라이버로 동작하게 할 생각이었습니다만은 보안 프로그램에 따라 특색이 조금씩 달라서 결국 포기했습니다.

이게 희한한게... 하나는 완전히 내렸다가 새로 올리고 다른 하나는 아예 그냥 잘라버립니다. ㅡ_ㅡa... 이것 참... 그래서 한쪽에 맞춰두면 다른 한쪽에서 문제가 발생하더군요. 결국 두가지 버전으로 구성했습니다. 이렇게 되면 버전관리가 힘든데... 흑흑.... ㅜ_ㅜ 어쩔수 없지요 ㅜ_ㅜ...

대충 키보드/마우스 이벤트를 넣어보고 정리하려고 키보드 쪽을 유심히 봤더니, HID 키보드의 값과 전통적으로 사용하는 스캔 코드(Scan Code)의 값이 서로 다르더군요. @0@)/

결국 기존의 LIbrary가 스캔 코드 값을 받도록 되어있었기에, 호환성 유지를 위해 HID 값으로 바꿔줘야 했습니다. 결국 Mapping Table을 만들어야 한다는 이야기!!! 그래도 구글신이 도와주셔서 괜찮은 문서를 구했고, 삽질 끝에 맵핑 테이블을 완성했습니다. ^^)/~

아아~ 일단 만들었으니 내일 테스트 해야겠습니다. ^^)/~ 다들 좋은 밤 되시길~

translate.pdf
0.13MB

문서와 Mapping Table 첨부합니다. ^^)/~

/*Key Name        PS/2 Set 1 Make*        HID Usage ID */    
{/*    DO NOT USE    0x00    */    0x00    ,
/*    Escape    0x01    */    0x29    ,
/*    1 !    0x02    */    0x1E    ,
/*    2 @    0x03    */    0x1F    ,
/*    3 #    0x04    */    0x20    ,
/*    4 $    0x05    */    0x21    ,
/*    0.05    0x06    */    0x22    ,
/*    6 ^    0x07    */    0x23    ,
/*    7 &    0x08    */    0x24    ,
/*    8 *    0x09    */    0x25    ,
/*    9 (    0x0A    */    0x26    ,
/*    0 )    0x0B    */    0x27    ,
/*    - _    0x0C    */    0x2D    ,
/*    = +    0x0D    */    0x2E    ,
/*    Backspace    0x0E    */    0x2A    ,
/*    Tab    0x0F    */    0x2B    ,
/*    q Q    0x10    */    0x14    ,
/*    w W    0x11    */    0x1A    ,
/*    e E    0x12    */    0x08    ,
/*    r R    0x13    */    0x15    ,
/*    t T    0x14    */    0x17    ,
/*    y Y    0x15    */    0x1C    ,
/*    u U    0x16    */    0x18    ,
/*    i I    0x17    */    0x0C    ,
/*    o O    0x18    */    0x12    ,
/*    p P    0x19    */    0x13    ,
/*    [ {    0x1A    */    0x2F    ,
/*    ] }    0x1B    */    0x30    ,
/*    Return    0x1C    */    0x28    ,
/*    Left Control    0x1D    */    0xE0    ,
/*    a A    0x1E    */    0x04    ,
/*    s S    0x1F    */    0x16    ,
/*    d D    0x20    */    0x07    ,
/*    f F    0x21    */    0x09    ,
/*    g G    0x22    */    0x0A    ,
/*    h H    0x23    */    0x0B    ,
/*    j J    0x24    */    0x0D    ,
/*    k K    0x25    */    0x0E    ,
/*    l L    0x26    */    0x0F    ,
/*    ; :    0x27    */    0x33    ,
/*    ' "    0x28    */    0x34    ,
/*    ` ~    0x29    */    0x35    ,
/*    Left Shift    0x2A    */    0xE1    ,
/*    \ |    0x2B    */    0x31    ,
/*    Europe 1 (Note    0x2B    */    0x32    ,
/*    z Z    0x2C    */    0x1D    ,
/*    x X    0x2D    */    0x1B    ,
/*    c C    0x2E    */    0x06    ,
/*    v V    0x2F    */    0x19    ,
/*    b B    0x30    */    0x05    ,
/*    n N    0x31    */    0x11    ,
/*    m M    0x32    */    0x10    ,
/*    , <    0x33    */    0x36    ,
/*    . >    0x34    */    0x37    ,
/*    / ?    0x35    */    0x38    ,
/*    Right Shift    0x36    */    0xE5    ,
/*    Keypad *    0x37    */    0x55    ,
/*    Left Alt    0x38    */    0xE2    ,
/*    Space    0x39    */    0x2C    ,
/*    Caps Lock    0x3A    */    0x39    ,
/*    F1    0x3B    */    0x3A    ,
/*    F2    0x3C    */    0x3B    ,
/*    F3    0x3D    */    0x3C    ,
/*    F4    0x3E    */    0x3D    ,
/*    F5    0x3F    */    0x3E    ,
/*    F6    0x40    */    0x3F    ,
/*    F7    0x41    */    0x40    ,
/*    F8    0x42    */    0x41    ,
/*    F9    0x43    */    0x42    ,
/*    F10    0x44    */    0x43    ,
/*    Num Lock    0x45    */    0x53    ,
/*    Scroll Lock    0x46    */    0x47    ,
/*    Keypad 7 Home    0x47    */    0x5F    ,
/*    Keypad 8 Up    0x48    */    0x60    ,
/*    Keypad 9 PageUp    0x49    */    0x61    ,
/*    Keypad -    0x4A    */    0x56    ,
/*    Keypad 4 Left    0x4B    */    0x5C    ,
/*    Keypad 5    0x4C    */    0x5D    ,
/*    Keypad 6 Right    0x4D    */    0x5E    ,
/*    Keypad +    0x4E    */    0x57    ,
/*    Keypad 1 End    0x4F    */    0x59    ,
/*    Keypad 2 Down    0x50    */    0x5A    ,
/*    Keypad 3 PageDn    0x51    */    0x5B    ,
/*    Keypad 0 Insert    0x52    */    0x62    ,
/*    Keypad . Delete    0x53    */    0x63    ,
/*    UNASSIGNED    0x54    */    0x00    ,
/*    UNASSIGNED    0x55    */    0x00    ,
/*    Europe 2 (Note    0x56    */    0x64    ,
/*    F11    0x57    */    0x44    ,
/*    F12    0x58    */    0x45    ,
/*    Keypad =    0x59    */    0x67    ,
/*    UNASSIGNED    0x5A    */    0x00    ,
/*    UNASSIGNED    0x5B    */    0x00    ,
/*    Keyboard Int'l 6    0x5C    */    0x8C    ,
/*    UNASSIGNED    0x5D    */    0x00    ,
/*    UNASSIGNED    0x5E    */    0x00    ,
/*    UNASSIGNED    0x5F    */    0x00    ,
/*    DO NOT USE    0x60    */    0x00    ,
/*    DO NOT USE    0x61    */    0x00    ,
/*    UNASSIGNED    0x62    */    0x00    ,
/*    UNASSIGNED    0x63    */    0x00    ,
/*    F13    0x64    */    0x68    ,
/*    F14    0x65    */    0x69    ,
/*    F15    0x66    */    0x6A    ,
/*    F16    0x67    */    0x6B    ,
/*    F17    0x68    */    0x6C    ,
/*    F18    0x69    */    0x6D    ,
/*    F19    0x6A    */    0x6E    ,
/*    F20    0x6B    */    0x6F    ,
/*    F21    0x6C    */    0x70    ,
/*    F22    0x6D    */    0x71    ,
/*    F23    0x6E    */    0x72    ,
/*    UNASSIGNED    0x6F    */    0x00    ,
/*    Keyboard Intl'2    0x70    */    0x88    ,
/*    UNASSIGNED    0x71    */    0x00    ,
/*    UNASSIGNED    0x72    */    0x00    ,
/*    Keyboard Int'l    0x73    */    0x87    ,
/*    UNASSIGNED    0x74    */    0x00    ,
/*    UNASSIGNED    0x75    */    0x00    ,
/*    F24    0x76    */    0x73    ,
/*    Keyboard Lang 4    0x77    */    0x93    ,
/*    Keyboard Lang 3    0x78    */    0x92    ,
/*    Keyboard Int'l4    0x79    */    0x8A    ,
/*    DO NOT USE    0x7A    */    0x00    ,
/*    Keyboard Int'l5    0x7B    */    0x8B    ,
/*    DO NOT USE    0x7C    */    0x00    ,
/*    Keyboard Int'l2    0x7D    */    0x89    ,
/*    Keypad ,Brazilian Keypad    0x7E    */    0x85    ,
/*    DO NOT USE    0x7F    */    0x00    }

 오늘 무슨 행사를 한다길래 그냥 앉아 있으면 되는 줄 알고 어제 2시까지 코드를 만지다가 잤습니다. ㅡ_ㅡa... 아 이거 원... 거의 다 됬는데 진짜 한끗 차이로 모 보안 프로그램에 걸리더군요. ^^;;; 사실 걸린다는 표현보다는 이녀석이 HID Keyboard Driver를 내려버린다는 말이 더 맞는 것 같습니다. 그래서 키보드 입력이 안되는 문제가.... ^^;;;;

 그래서 이걸 해결하려고 이것 저것 손보다보니 2시 넘어서 잤습니다. 그래도 일은 안하니까 좀 편한 마음으로 잤지요. 그런데 이게 왠일입니까? 노가다를 시키는 것이 아니겠습니까? ㅜ_ㅜ)/~ 아흑... 잠도 별로 못잤는데 땀 뻘뻘 흘리면서 이상한 걸 했더니 나중에는 머리가 다 아프더군요. 지금도 지끈 거리는 상탭니다. ㅜ_ㅜ....

 불행은 이 상태에서 다시 코드를 보고 있다는 것이고, 그나마 다행인 점은 칼퇴근을 해서 좀 쉬었다는 겁니다. ㅎㅎ 아유... 진짜 머리 아프네요. ^^;;; 당췌 어떻게 해야 해결할 수 있을지....

 오늘도 열심히 한번 파봐야겠습니다. 뭐라도 나오겠지요 ^^)/~
 그럼 다들 좋은 밤 되시길~


 흑흑... 이게 얼마만인지 모르겠습니다. ㅜ_ㅜ)-b 쌩판 모르는 상태로 HID 드라이버를 손보기 시작해서 키보드와 마우스를 생성하기까지 한참 걸렸고, 보안 프로그램에 걸려서 이걸 피해 가는데 또 한참 걸렸네요.

 ㅜ_ㅜ 아아~ 진짜 ㅡ_ㅡa... 간단히 쓸 수 있는 API를 막아놔서 다른 방법을 찾는다고 고생했습니다.  ㅜ_ㅜ 제가 아는 범위에서 테스트 안해본 케이스가 거의 없을 정도로 오만가지를 다 썼는데... 결국 간단한 아이디어로 해결... ^^;;; 그것도 놀다가 깜짝 떠올라서... ㅎㅎㅎ(역시 인생은 타이밍~!!!). 아이디어는 어쩔 수 없이 비공개... 왠지 하면 큰일날듯해서 ^^;;;;;

 가상 HID 드라이버가 HID miniport 드라이버이다 보니 이것저것 제약사항이 많더군요. 뭐 하나 제대로 할 수 있는 것도 없고... 툭하면 재부팅되기 일수이고... 평일 저녁시간과 주말 일부를 올인해서 겨우 해결했습니다. 방금 테스트했는데 큰 문제가 없는 것 같네요. ^^)/~~~

 이제 더러워진 드라이버 코드를 좀 정리하고, 약간 테스트만 더하면 끝날 것 같습니다. 어휴~ 이번 주는 따로 스케줄이 있어서 내일 말고는 시간이 없을 듯한데, 내일 저녁에 완전히 끝내 놓야겠군요. ^^;;;; 어휴... 죽는 줄 알았습니다. 어휴~ 진짜... @0@)/~!!!

 덕분에 HID에 대해서 공부 한번 제대로 했습니다(정말? ㅡ_ㅡa..). 역시 DDK만한게 없군요. 최고입니다. ㅎㅎ DDK 만세~~
 그럼 다들 좋은 밤 되세요 ;)

ps) 이런... ㅡ_ㅡa... 한쪽은 또 다른 수를 써놓았군요. ㅡ_ㅡ;;; 좀 더 파봐야 할 것 같습니다. ㅜ_ㅜ 아우~ 진짜... ㅜ_ㅜ)/~

 아아~ 역시 이거 USB가 만만치 않군요. ㅜ_ㅜ... 잘 모르는 상태에서 시작했던 USB 개발이라... 막히니 해결하는데 시간이 많이 걸리네요. ㅜ_ㅜ...

 가상 USB의 특성상(Bus 드라이버 같은거다보니... ^^;;;) USB API로 드라이버를 찾게되면 맨 상단에 위치한 드라이버가 나오게 되는데... 이걸 직접 찾아서 Open 하려니 드라이버가 또 필요할 것 같고...

 지금 고민에 빠져있는 상태입니다. 일단 간단히 메시지를 보낼 방법을 찾았지만 생각보다 문제가 많더군요. ㅡ_ㅡa... 그래서 결국 다른 방법을 찾아야겠는데... 아아... 이거 원... ^^;;; 결국 드라이버를 하나 더 써야할지...
 
 어찌하면 좋을까요? ㅜ_ㅜ
 좋은 생각 있으신 분 계시나요?


 과로로 며칠 쉬다가 겨우 다시 작업 중입니다. 가상 HID(Virtual HID) 드라이버는 대충 완성됬는데... 글쎄 또 보안 프로그램이 문제군요. ㅡ_ㅡa... 이것 참.... 답답하네요. ㅎㅎ

 다시 오늘부터 열혈 디버깅 들어갑니다. 삽질하다보면 삽이 부러지던지 바닥을 뚫던지 결판이 나겠지요. ;) 아우~ 이거 신경질이 살살 납니다. 이래서야 원... 뭘 할수가 있어야.... 다 만들어 놓고도 써먹질 못하니... ^^;;;;

 이제 또 누가 이기나 해봐야겠군요. ㅎㅎ >ㅁ<)-b

 분석해서 나중에 또 올리겠습니다.

 그럼 다들 좋은 밤 되시길~ ;)


 어제 갑자기 책 한권 써보는게 어떨까하는 생각이 들었습니다. 뭐 미치지 않고서야 이런 생각을 하겠냐만, 마이크로소프트웨어에 올리기에는 좀 복잡하고 양이 많다고 생각하고 있던 주제라서... ^^;;;; 해당 주제에 관한 자료가 인터넷에서 찾기 힘들 뿐더러, 실제로 구현된 사례도 그리 많지 않은 것 같더라구요. ^^;;;;

 일단 될지 안될지는 모르겠지만 한번 출판사에 연락을 취해볼 생각입니다. 기획쪽이나 그런 곳에 연락을 취하면 되겠지요. ㅎㅎ 주제나 자세한 내용은 일단 결정이 나면 올리겠습니다. ^^;;;;

 아아~ 이거 오늘은 작업을 하나도 못하고 그냥 자겠군요. 빨리 가상 HID 드라이버도 완성해야하는데... ㅎㅎ 내일 해야겠습니다. ^^)/~

 그럼 다들 좋은 밤 되세요 ^^)/~
 아우~ 지난주와 이번주, 완전 피곤합니다. ㅜ_ㅜ 만들어 놓았던 필터 드라이버가 특정 상황에서 동작하지 않는 문제가 있어서 디버깅한다고 거의 날밤을 샜습니다. 거짓말 조금 보태서 설치하고 재부팅하고 하는 과정을 거의 200번 정도 한 것 같습니다. ㅜ_ㅜ

 증상 또한 다양했는데... 재부팅이 일어나질 않나, 갑자기 필터 드라이버가 사라지질 않나... 처음에는 프로그램을 잘 못 짠줄 알고 코드를 열심히 수정했습니다. 그런데 가만히 보니 코드의 문제가 아닌 것 같은 느낌이 들어서 다시 커널쪽으로 방향을 틀었습니다.

 역시나... 보안 프로그램이 필터 드라이버의 함수를 수정하거나,  필터 드라이버를 언로딩하고 다시 로딩하는 작업을 수행하더군요. ㅡ_ㅡ;;;; 필터 드라이버가 언로딩 되는 경우는 윈도우가 종료될 때라고 한정하고 있었기때문에 속수무책으로 당했습니다. ㅡ_ㅜ..

 그래서 부랴부랴 언로딩 루틴에 처리하는 부분을 보완하고, 수정된 필터 함수를 좀 손봤더니 잘 되는군요. 내가 쓰겠다는데 왜 내 드라이버를 손보는 것인지... 살짝 기분이 않좋습니다. ㅡ_ㅡa...

 그래도 해결했으니 기분은 좋네요. ^^)/~
 비록 하는 일은 이쪽과 거리가 있지만, 그래도 아직 죽지 않았습니다. @0@)/~!!!


 요즘 필터 드라이버 수정하랴 Virtual HID 드라이버 수정하랴 정신이 없습니다. ^^;;; 뭐랄까요... 필터 드라이버 같은 경우는 완성되긴 했지만... V3가 설치된 PC에서는 제대로 수행되지 않는 문제가 있었습니다.

 일단 수정을 위해서 V3 Internet Security 평가판을 설치하고 부랴부랴 테스트에 돌입했습니다. 결과가 어찌나올지는 모르겠지만 영향을 아주 안주는 것은 아닌 것 같군요. ^^;;;

 아휴... 이거 오늘도 피곤하게 생겼습니다. 그려... ^^;;; 뭔가 알아내면 제보(??) 날리겠습니다. ^^
 그럼 다들 좋은 밤 되시길~ ^^)/~
 아흑... 요즘 뜨는 대세가 가상 HID(Virtual HID)라고 해서 잘 모르는 USB Spec을 뒤지면서 작업을 하고 있습니다. 어휴... 이것 참 진짜 어렵네요. ㅜ_ㅜ...

 그래도 어떻게 어떻게 진행해서 키보드와 마우스로 인식시킨 다음 마우스 데이터를 밀어넣는데 성공했습니다. >ㅁ<)/~ ㅎㅎ 신나는 군요. ;)

 HID Report 구조체를 보면서 발견한건데, Mouse의 좌표 값이 상대값이네요. 하긴... 절대값으로 들어올려면 마우스가 지금 어디에 있었고 얼마만큼 움직였는지 알아야하니까 당연히 상대값으로 가는게 맞겠지요. ^^;;;;

 아휴~ 머리를 썼더니 골치가 다 아픕니다. ^^;;; 이거 원... 취미생활은 하나도 못하고 계속 작업만 하고 있군요. ㅜ_ㅜ)/~ 빨리 마무리해야겠습니다.

 그럼 다들 좋은 밤 되시길~ ;)
 간단히 시작했던 작업이 어느새 필터 드라이버를 동적 로딩하는 단계까지 발전했습니다. ㅜ_ㅜ)/~ 이게 어찌된 영문인가 모르겠습니다. ^^;;;;

 기존의 드라이버가 DDK의 소스를 기반으로 만들어졌는데, 정적으로 로딩되서 실행되는 방식이었습니다. 그런데 갑자기 동적 로딩으로 할 수 있게 해달라는 요청이 있어서 소스를 손보기 시작했습니다. 참고로 동적 로딩과 정적 로딩은 아래와 같은 차이가 있습니다. ^^

  • 정적 로딩 : 윈도우 레지스트리에 등록하여 윈도우 시작 시에 자동으로 로드되는 방식
  • 동적 로딩 : 사용자가 요청하면 로딩하는 방식, 일반적으로 시스템 초기화가 완료된 이후에 로딩됨

 처음에는 간단히 동적 로드만 되면 되겠거니 생각했는데, 이게 일이 점점 많아지는 겁니다. ㅜ_ㅜ 키를 입력하게 하는 주요 루틴을 다른 쪽으로 옮겨야 하더군요. 이때부터 작업 로드가 심하게 걸리기 시작했습니다. 잠도 못자고 분석하고 테스트하고... 후덜덜덜...

 정적 로딩하는 버전은 PNP 메시지를 받아서 드라이버가 등록될 때 상위 Driver의 Callback 함수를 가지고 있다가 그걸 강제로 호출해서 값을 넣도록 하는 방식이었는데, 동적 로딩할 때는 PNP 메시지를 받지 못한 상태로 로딩되기 때문에 MJ_READ 에서 이를 처리하도록 해야했습니다. 삽질 끝에 알았습니다. 이런... ㅜ_ㅜ 더불어 IRP를 Cancel해야 다시 읽는 다는 것두요. ^^;;;

 노트북이 없었더라면 작업 시간이 두배 정도 더 걸릴뻔 했습니다. 어휴... 끔찍하네요. ^^;;;;
 방금 테스트를 해봤는데, 정상적으로 동작하는 것 같습니다.
 신나는 주말입니다. ^^)/~

 오늘 테스트하는데 스캔 코드(Scan Code)가 필요해서 찾다보니 아주 깔끔하게 정리된 내용을 발견했습니다. 원문은 http://blog.naver.com/jesuskth?Redirect=Log&logNo=20005262457에서 보실 수 있습니다.

Const SCANKEY_ESC = 1

Const SCANKEY_1 = 2             ' 1
Const SCANKEY_2 = 3             ' 2
Const SCANKEY_3 = 4             ' 3
Const SCANKEY_4 = 5             ' 4
Const SCANKEY_5 = 6             ' 5
Const SCANKEY_6 = 7             ' 6
Const SCANKEY_7 = 8             ' 7
Const SCANKEY_8 = 9             ' 8
Const SCANKEY_9 = 10            ' 9
Const SCANKEY_0 = 11            ' 0
Const SCANKEY_MINUS = 12        ' -
Const SCANKEY_EQUAL = 13        ' =
Const SCANKEY_BS = 14           ' ←

Const SCANKEY_TAB = 15          'TAB
Const SCANKEY_Q = 16            ' Q
Const SCANKEY_W = 17            ' W
Const SCANKEY_E = 18            ' E
Const SCANKEY_R = 19            ' R
Const SCANKEY_T = 20            ' T
Const SCANKEY_Y = 21            ' Y
Const SCANKEY_U = 22            ' U
Const SCANKEY_I = 23            ' I
Const SCANKEY_O = 24            ' O
Const SCANKEY_P = 25            ' P
Const SCANKEY_SQUARE_OPEN = 26  ' [
Const SCANKEY_SQUARE_CLOSE = 27 ' ]
Const SCANKEY_ENTER = 28        ' ENTER

Const SCANKEY_CTRL = 29         ' CTRL
Const SCANKEY_A = 30            ' A
Const SCANKEY_S = 31            ' S
Const SCANKEY_D = 32            ' D
Const SCANKEY_F = 33            ' F
Const SCANKEY_G = 34            ' G
Const SCANKEY_H = 35            ' H
Const SCANKEY_J = 36            ' J
Const SCANKEY_K = 37            ' K
Const SCANKEY_L = 38            ' L
Const SCANKEY_SEMICOLON = 39    ' ;
Const SCANKEY_QUOTATION = 40    ' '

Const SCANKEY_QUOTATION2 = 41   ' `
Const SCANKEY_LSHIFT = 42       ' LEFT SHIFT
Const SCANKEY_WON = 43          ' \

Const SCANKEY_Z = 44            ' Z
Const SCANKEY_X = 45            ' X
Const SCANKEY_C = 46            ' C
Const SCANKEY_V = 47            ' V
Const SCANKEY_B = 48            ' B
Const SCANKEY_N = 49            ' N
Const SCANKEY_M = 50            ' M
Const SCANKEY_COMMA = 51        ' ,
Const SCANKEY_PERIOD = 52       ' .
Const SCANKEY_SLASH = 53        ' /
Const SCANKEY_RSHIFT = 54       ' RIGHT SHIFT

Const SCANKEY_PRTSC = 55        ' PRINT SCREEN SYS RQ
Const SCANKEY_ALT = 56          ' ALT
Const SCANKEY_SPACE = 57        ' SPACE
Const SCANKEY_CAPS = 58         ' CAPS
Const SCANKEY_F1 = 59           ' F1
Const SCANKEY_F2 = 60           ' F2
Const SCANKEY_F3 = 61           ' F3
Const SCANKEY_F4 = 62           ' F4
Const SCANKEY_F5 = 63           ' F5
Const SCANKEY_F6 = 64           ' F6
Const SCANKEY_F7 = 65           ' F7
Const SCANKEY_F8 = 66           ' F8
Const SCANKEY_F9 = 67           ' F9
Const SCANKEY_F10 = 68          ' F10
Const SCANKEY_NUM = 69          ' NUM ROCK
Const SCANKEY_SCROLL = 70       ' SCROLL ROCK

Const SCANKEY_GRAY_HOME = 71    ' 키패드
Const SCANKEY_GRAY_UP = 72
Const SCANKEY_GRAY_PGUP = 73
Const SCANKEY_GRAY_MINUS = 74
Const SCANKEY_GRAY_LEFT = 75
Const SCANKEY_GRAY_CENTER = 76
Const SCANKEY_GRAY_RIGHT = 77
Const SCANKEY_GRAY_PLUS = 78
Const SCANKEY_GRAY_END = 79
Const SCANKEY_GRAY_DOWN = 80
Const SCANKEY_GRAY_PGDN = 81
Const SCANKEY_GRAY_INS = 82
Const SCANKEY_GRAY_DEL = 83

Const SCANKEY_F11 = 87          ' F11
Const SCANKEY_F12 = 88          ' F12


 에혀~ 일찍 자야하는데 작업을 좀 하다보니 이제야 끝났군요. 급히 좀 쓸일이 있어서 뚝딱뚝딱 드라이버와 DLL을 손봤습니다.

 가끔 생각하는건데... 제가 뭐하는 사람인지 잘 모르겠군요. ^^;;;; 소속도 애매한 것이 이것 저것 안하는게 없는 것 같습니다. ㅜ_ㅜ

 뭐 하나를 진득하게 파긴 파야할텐데 호기심이 많아서 가만히 있지를 못하겠군요. ㅎㅎ 그래도 뭐 아웃풋이 나오니 그나마 다행이지요. ^^;;;

 에혀~ 이제 자야겠군요. 다들 좋은 밤 되시길 ;)


 와우~ 이번에 모 드라이버들이 업데이트가 좀 되서 애를 좀 먹었습니다. ^^;;; 리버싱을 해서 분석하는게 아니라 윈도우 커널이 어떻게 변경되는가를 보고 추측(?)해서 작업하기 때문에 테스트 케이스를 상당히 많이 만들어두는 편입니다.

 어떤 케이스가 무사히 통과할지는 모르는거니까, 상당한 노가다가 필요한 작업이지요. ㅜ_ㅜ)/~ 이거 테스트할려고 오늘 퇴근도 일찍했는데, 나름 보람있군요. ㅎㅎ 잘 돌아가는 걸 확인하고 나니 뿌듯합니다.

 이제 슬슬 정리하고 쉬어야겠습니다. 간만에 머리를 굴렸더니 다리(??)가 아프네요(저도 이유를 모르겠습니다. 이게 무슨... ㅡ_ㅡa...).

ps) 이럴줄 알았으면 툴을 좀 많이 만들어 두는 건데... 이번 주말에 신경 좀 써서 노가다를 피하는 방향으로 좀 가야겠군요. ;)
 분석할 드라이버가 생겨서 당분간 NDS or PSP 홈브루를 개발하기 힘들 것 같습니다. 일단 아웃풋이 나와야해서.. ^^;;;;

 뭐 그리 거창한 것은 아니고, 게임 보안에 관련된 드라이버인데... 원체 실력이 허접한지라 그냥 훓어보는 정도입니다. 예전에 많이 분석하고 배우고 그랬었는데... 그때와는 또 많이 달라졌네요. ㅎㅎ

 예전에 제가 분석할 때는 SDT쪽을 누가 티안나게 잘 훔치는가가 대세였는데... 지금은 한쪽은 SDT를 완전히 포기하고 ntoskrnl쪽을 패치하는 쪽으로 방향을 바꿨고, 다른 한쪽은 아직 SDT쪽에 손을 대고 있더군요. ㅎㅎ

 뭐 어떻게 하고 있는지를 알았으니 이제 파 보는 일만 남았습니다. ㅎㅎ 언능 완료하고 오겠습니다. ;)

 그럼 좋은 밤 되시길~ ^^)/~

ps) 그러고보니 이때까지 분석 드라이버 하나 안가지고 있었군요. 매번 템플릿에 손을 좀 대서 하다보니 귀찮아져서... 이 기회에 만들어둬야겠습니다. ;)


공지사항
많은 분들이 닌텐도 DS용 한글 입력 메모장을 쓰고 계시는데,
주의사항이 있어서 알려드립니다.

한글 입력 메모장은 기존 버전과 호환성을 위해 한 페이지에 쓸 수 있는 글 량이 제한되어 있습니다.
스크롤이 없는 이전 버전은 쓸 수 있는 최대 길이가 한 페이지를 꽉 채우는 정도 였습니다.

따라서 한글로 가득 채운다면 220자 정도, 영문으로 가득 채운다면 440자 정도가 최대이니

적당히 채우시고(?) 다음 페이지로 이동하시기 바랍니다. ㅠㅠ

나중에 시간이 나면 업데이트할 때 이를 표시해주는 기능을 넣을 예정이니
불편하시더라도 주의해서 쓰시기 바랍니다.


 드디어 닌텐도 DS(NDS)용 한글 입력 메모장 프로그램 v1.2가 나왔습니다. 많은 분들이 건의하셨던 커서 이동 기능과 메모 스크롤 기능이 추가되었습니다. 이제 메모를 수정하기위해 전체를 수정하지 않아도 됩니다. ^^)/~

 데이터 파일은 기존의 1.1 버전과 호환되므로 NDS 파일만 교체하시면 정상적으로 수행됩니다. ^^
사용자 삽입 이미지

 다만 에디트 박스 컨트롤이 완전하지가 않아서 커서 이동 시에 한글 처리가 미흡합니다. ^^;;; 그 때문에 한글을 삭제하실 때 주의하실 점이 있습니다.

 1. 한글을 지우실 때 커서를 한글 뒤쪽에 위치시킨다음 백스페이스를 2번 눌러주셔야합니다. 만약 한번만 누르시면 글자가 깨어집니다. 깨어졌을 경우 한번 더 백스페이스를 눌러주시면 정상적으로 표시됩니다.

 2. 커서가 한글의 가운데에 위치했을 때 백스페이스를 누르시면 역시 글자가 깨어집니다. 물론 이때 커서를 오른쪽으로 한칸 이동한 다음 다시 백스페이스를 누르면 깨끗하게 지워집니다.

 한글이 원래 2자리를 차지하기때문에 발생하는 문제인데, 다음 버전에 수정할 계획입니다. 급히 릴리즈하느라 소프트웨어 리셋 부분 또한 완전히 처리하지 못했는데, 다음 버전에 같이 수정하여 릴리즈하겠습니다. ^^;;;

 아래는 홈브루 파일입니다.
DLDI 패치는 필수입니다 ^^ http://kkamagui.tistory.com/469 를 참고하세요 ^^;;


================ Version History ================
Version 1.2 - http://kkamagui.tistory.com/468 참고
1. 커서 표시 및 이동 기능 : 내용을 수정하려면 백스페이스를 이용해서 데이터를 모두 지웠던 불편함 때문에 추가. 윈도우의 에디트박스와 같이 커서를 표시하고 커서 위치를 통해 추가/수정/삭제하도록 변경함. 커서 이동은 왼쪽 방향키로 가능
2. 메모장 스크롤 기능 : 메모를 최대 한 페이지까지 밖에 입력하지 못했던 불편함 때문에 추가. 커서를 이용해서 스크롤 가능하도록 변경함


Version 1.1 - http://kkamagui.tistory.com/410 참고
1. 소프트웨어 리셋 기능 : "START" 버튼을 클릭하여 펌웨어 시작화면으로 돌아가는 기능 추가. 파워를 껏다가 켜야했던 기존의 불편함을 줄임
2. TXT 추가 기능 : 메모 페이지에서 "A"버튼을 누르면 루트 디렉토리에 DATA + 페이지번호 +.txt 형식으로 txt 파일을 생성. PC에서 데이터 파일 공유 가능
사용자 삽입 이미지
3. 메모 페이지 확장 : 메모장의 페이지를 40 페이지를 확장. 기존의 20 페이지용 데이터 파일의 경우, 안전한 사용을 위해 모든 데이터를 백업해 놓고 루트 디렉토리에 있는 NOTEDATA.DAT 파일을 삭제하길 권장

Version 1.0 - http://kkamagui.tistory.com/238 참고
1. 완성형 한글/영문/숫자 입력 기능 : 완성형 한글 오토마타를 이용하여 한글 조합 및 출력 가능. 실제 키보드와 거의 동일하게 자판을 배열하고 구성함. Shift 키와 Delete 키를 지원하고 Space바 좌측의 모드 변환 키를 통해서 키보드의 타입 변경 가능.
2. 메모 입력 기능 : 1줄당 최대 영문 42자 or 한글 21자 입력 가능. 최대 10줄까지 입력가능.
3. 메모 페이지 이동 기능 : 메모 페이지를 최대 20장까지 지원. 키보드 상단의 "<<" or ">>" 버튼으로 메모 페이지 이동가능. 최상단에 현재 페이지 번호 표시.
4. 메모 내용 저장 기능 : 페이지 이동 시 or ""저장" 버튼 클릭 시 메모를 저장하는 기능. NDS 재시작 후에도 이전 메모 기록 확인 가능


 버그는 블로그의 덧글로 부탁드립니다. ^^)/~

 그럼 좋은 하루 되세요 ^^)/~


+ Recent posts