블로그에서 돌아가는 음악 파일 가져오기




음악이 흘러나오는 블로그가 많습니다. 그런데 아쉽게도 "다른 이름으로 저장" 같은 기능이
없는 관계로 그 음악을 듣고 싶으면 꼭 그 블로그에 방문해야만 합니다. mp3 player 등에
넣은 후 들으면서 다니고 싶어도 그럴수가 없습니다. 좋은 방법이 없을까요?

블로그에 접속한 뒤 울려퍼지는 노래는 사실은 내 컴퓨터 어딘가에 저장되어 있습니다.
파일로 저장되어 있겠죠, 그리고 블로그는 인터넷 익스플로러 프로세스입니다. 자 여기까지
보았으면 무언가 감이 빡 오지 않나요? 파일이라면 handle 이 있을겁니다 !
즉, iexplore.exe 의 handle list 를 구하고, 음악 파일 확장자를 찾아본다면
음악 파일이 어디있는지 알 수 있겠죠, 그것을 나의 폴더로 복사하기만 하면 됩니다.

한번 구현해 볼까요 :)

먼저 iexplorer.exe 의 pid 를 구합니다. 인터넷 익스플로러를 여러 개 띄워놓을 수도 있으니
벡터를 썼습니다.


핸들 리스트를 구하기 위해서는 ntdll 의 api 가 필요한데요, 우리가 써야 할 것은
ZwQuerySystemInformation, ZwQueryObject, ZwClose 입니다.

그리고 몇가지 undocument 구조체가 필요합니다 (아, 더이상 undocument 가 아니죠 ㅎㅎ)
얘네들을 선언해놓을 필요가 있습니다 (인터넷을 잘 찾으면 널려 있습니다)

SYSTEM_HANDLE_INFORMATION,
OBJECT_BASIC_INFORMATION,
OBJECT_TYPE_INFORMATION,
OBJECT_NAME_INFORMATION 등입니다.


이제 갑니다. ZwQuerySystemInformation() 을 사용합니다. 첫번째 인자로 
SystemHandleInformation 을 준다는게 요점입니다.



그런데 사실 한 프로세스에 handle 은 엄청나게 많겠죠. 그중에서 우리가 필요한건
file handle 입니다. 따라서 그것만 추려내면 됩니다. 그 속성은 OB_TYPE_DEVICE 로,
OS 마다 값이 다르므로 판별할 필요가 있습니다. 아래는 셋팅 코드입니다. XP에서만
돌아가게 만들거면 강제로 0x1C 로 집어 넣으세요 ㅎ




자 이제 한번 핸들 갯수만큼 루프문을 돌아 볼까요~
고고씽!


Object Type 은 File , Mutant, Event 머 이런걸 가리키는 겁니다.
우리는 당연히 File 만 가져옵니다.
그리고 ZwQueryObject() 를 돌면서 ObjectNameInformation 를 가져옵니다. 이제 수많은
파일 핸들 리스트가 쭈욱 뽑힐겁니다.

근데 경로가.... \Device\HarddiskVolume1\Documents and Settings\.... 이딴식으로
나옵니다. C:\Document and Setting\ 이런식으로 나오면 아주 편할텐데 말이죠...
윈도우즈가 깔린 드라이브를 구해주는 API 아시는 분 혹시 있나요...;
전 무식해서 이렇게 구했습니다.

1. GetWindowsDirectory() 로 C:\WINDOWS 같은걸 구한다.
2. \ 이후의 WINDOWS를 짤라버린다.
3. C:\ 만 남는다.



그것 조차 귀찮으신 분은 이 플그램을 쓰는 모든 유저는 C:\ 에 윈도우즈를 깔아야만 한다 라고
가정하신후 C:\ 로 하드코딩하세요 ㅋㅋ 뭐 돈받고 팔아먹을 플그램도 아닌데요 :)
(아 이런 마인드 진짜 좋지 않습니다 ㅠ ㅠ)

자, 파일의 풀패스가 pOni->Name.Buffer 에 유니코드로 들어옵니다.
음악 파일인지 비교하시고 맞다면 로그 한방 찍어주고~



자 이제 복사하면 끝이죠.

 


실제로 만들어보니 아주 잘 돌아갑니다.
우우우우우우웁스 0.001 입니다.


사용자 삽입 이미지


실제로 이런식의 구현은 어디 남의 서버에 침투해서 파일을 빼오는게 아니고
그냥 자기 PC 의 어딘가에 숨어있는 파일을 내가 아는 폴더로 복사하는 것 뿐입니다.
따라서 해킹툴 제작과는 전혀 상관없음을 말씀드립니다..

학습/연구 목적이므로 툴과 풀 소스는 따로 베포하지 않습니다.
단지 file handle 을 이런식으로 가지고 놀 수 있다는 것을 보여주기 위해 포스팅했습니다.
쉬운 예를 들기 위하여 블로그에서 음악 파일을 가져오는 것에 비유해 보았고요

file handle, 파고들어보면 재미있는 내용이 많습니다 :)





window31. 2009년 4월





ps
당연히 플래시 파일인 swf 도 가져올 수 있겠죠 :)

Posted by window31


트랙백 보낼 주소 : http://window31.com/trackback/261 관련글 쓰기

댓글을 달아주세요

  1. ks
    2009/04/18 23:00
    댓글 주소 수정/삭제 댓글
    더 쉽게 할 수도 있는... 파폭에 DownThemAll이라는 플러그인이 있어서 다운로드 할 수는 있네요...
    그런데 이건 ActiveX가 재생하는 것까지 가능한가요?
    • 2009/04/19 16:27
      댓글 주소 수정/삭제
      아마도 스트리밍 방식의 ActiveX가 아니면 거의 다 받아질 것으로 보입니다. (표준 Wininet API 역시 기본값으로 캐시를 사용하고 있으니...)
    • 2009/04/19 22:05
      댓글 주소 수정/삭제
      핸들만 구할수있으면 다됩니다 : )
  2. 2009/04/19 16:24
    댓글 주소 수정/삭제 댓글
    프로그램 내용과는 상관 없지만... 나루토를 즐겨 보시는 것 같군요...^^;; (저도 개인적으로 재미있고 보고 있는 애니메이션입니다.) :)
    • 2009/04/19 16:30
      댓글 주소 수정/삭제
      그나저나... \\Device\\HarddiskVolume1\\... 를 DOS Logical Drive 로 바꿔주는 API가 있는 것으로 알고 있는데...(아니면, 파일 매핑 객체 생성해서 파일 매핑 후 psapi.dll의 GetMappedFileName API를 쓰면 조금 더 이쁜 모양(?)이 나오죠...^^) 만일 상용화 or 배포하는 경우에는 그걸 쓰는 것이 훨씬 정확할 것 같네요...^^;;
    • 2009/04/19 16:32
      댓글 주소 수정/삭제
      그리고 Object Type Number 는 OS 에 따라 다른데, switch-case 로 버전 별로 넣어주어도 동작하지만, 전방 호환성을 유지하고 싶은 몇몇 프로그래머분들은 CreateFile() 등으로 NUL 파일의 핸들을 연 다음, 해당 핸들의 Object Type Number 를 추출하더라고요...^^;;
    • 2009/04/19 22:06
      댓글 주소 수정/삭제
      ㅎㅎ 나루토를 별로 즐겨보진 않지만 하다보니 나루토 이미지가 멋진게 많아서
      어케 자주 사용하게 되네요 : )
      위 좋은 정보는 감사 드려요 ! ^^
  3. 2009/04/19 20:11
    댓글 주소 수정/삭제 댓글
    옷~ 멋지군요. ;)
    핸들을 이렇게 사용할 수도 있네요. ㅎㅎ 좋은 글 잘 보고 갑니다. ^^
    (인터넷 임시 파일 디렉토리를 뒤져도 비슷한 일을 할 수 있을 것 같다는 예감이 드는군요. ㅎㅎ)
    • 2009/04/19 21:34
      댓글 주소 수정/삭제
      Find***UrlCacheEntry 라는 API가 있으니 어렵지 않게 구현할 수는 있겠죠...^^;;
    • 2009/04/19 22:07
      댓글 주소 수정/삭제
      아하 인터넷 템프 폴더를 뒤져도 되겠군요
      그게 훨씬 쉽겠네요 ㅋㅋㅋ
  4. justlive
    2009/04/20 16:00
    댓글 주소 수정/삭제 댓글
    카카시 선생 ㅜㅜ

    아이디어가 번쩍입니다. +_+

    좋은글 감사합니다.
    • 2009/04/20 19:00
      댓글 주소 수정/삭제
      하하 아이디어는 무슨 ;;
      그냥 꽁수에 불과한 거랍니다 : )
  5. ks
    2009/05/01 20:11
    댓글 주소 수정/삭제 댓글
    하다보니
    ZwQueryObject(hObj, ObjectNameInformation, ObjName, nObjectName, n)
    이 부분에서 몇 번 제대로 돌다가 그 이후로 이 함수 안에서 빠져나오질 않습니다... 왜 그러지...
  6. ks
    2009/05/02 01:14
    댓글 주소 수정/삭제 댓글
    0FA9168C 6A 64 push 64h
    0FA9168E FF 15 AC 14 A9 0F call dword ptr ds:[0FA914ACh]
    0FA91694 80 0D 76 D0 C0 0F 04 or byte ptr ds:[0FC0D076h],4
    0FA9169B EB EF jmp 0FA9168C

    이부분에서 무한루프 ㄱ-;;;
  7. 2009/05/10 20:43
    댓글 주소 수정/삭제 댓글
    비밀댓글 입니다
  8. 2009/05/15 11:03
    댓글 주소 수정/삭제 댓글
    비밀댓글 입니다
  9. justlive
    2009/05/16 01:07
    댓글 주소 수정/삭제 댓글
    PSYSTEM_HANDLE_INFORMATION aHandles = (PSYSTEM_HANDLE_INFORMATION)(pULONG + 1);
    ->
    PSYSTEM_HANDLE_TABLE_ENTRY_INFO aHandles = (PSYSTEM_HANDLE_TABLE_ENTRY_INFO)(pULONG + 1);

    이건것 같아욤..
  10. 2009/06/15 11:30
    댓글 주소 수정/삭제 댓글
    좋은 글 잘 보았습니다.
    시스템 볼륨 얻을때 ShGetFolderPath 를 이용하시면 좋을 것 같네요.
    http://msdn.microsoft.com/ko-kr/library/bb762181(en-us,VS.85).aspx

BLOG main image
by window31

카테고리

분류 전체보기 (272)
Reverse Engineering (21)
C, C++ (20)
Kernel (8)
Guitar (18)
잡담 (74)
etc (6)
who am i (8)
보안 이야기 (85)
Tools (3)
월간 마이크로소프트웨어/.. (28)

글 보관함