티스토리 뷰

반응형

사실 이걸 여기메뉴에 쓰는게 맞나 싶기는하다.. 쨋든 써보자 !! 헤헿..

( 진짜 2시간걸려서 자세하게 써놨는데.. 이거 실습하다가 Chrome에 DLL Injection 되면서 날려먹어서 너무너무 속상한 마음으로 다시 쓴다... 흑흑 )

 

날려먹어서 귀찮으니까 SetWindowsHookEx API를 이용한 Message Hooking에 대한 자료는 구글에 따로 알아보도록 하자. 사실 나뭇잎책에도 자세하게 나와있으니 이해하는데 어려움은 없을 것이다.

 

SetWindowsHookEx API의 모양만 잠깐 확인하고 넘어가자.

 

 

 

Point !!

Message Hook이 설치되면 해당 윈도우 이벤트가 발생하면 OS는 이벤트가 발생한 Process에 Message Hook Function이 포함된 DLL 파일을 강제로 인젝션한다. ( 사실 이게 제일 중요 ;; )

 

 

그럼 바로 코드로 들어가보자~~~ Message Hooking을 진행하는 DLL 파일과 Message Hooking을 진행하는 함수를 호출해주기 위한 Injector 파일로 구성된다.

 

 

mydll_64.asm

 

 

5-6: 기본 DLL을 해당 코드에서 사용하기 위한 Include (MASM32와 다르게 파일명만..)

      아마 환경변수에 의해서 자동적으로 경로를 찾아주는 것 같다. (찬준이 뇌피셜~~~)

8-11: .data 섹션은 초기화된 전역변수가 저장되는 섹션이다.

        db는 byte 자료형을 뜻하고, word, dword, qword 등의 자료형이 존재한다.

13-16: .data? 섹션은 초기화되지 않은 변수들이 저장되는 섹션이다.

        흔히 알고있는 bss 섹션이라고 생각하면 된다.

        13번 라인은 byte형 50칸짜리 배열을 만든 후 ?로 초기화하라는 명령문이다.

20-22: 굉장히 중요한 라인이다. 왜냐면 32bit 코드와의 차이점이기 때문이다.

         64bit에서는 모든 함수가 fastcall로 호출되기 때문에 인자를 Register로 부터 꺼내와야한다.

         MASM은 Windows 기반이기 때문에 rcx, rdx, r8, r9 총 4개의 Register을 사용한다.

27-35: 해당 DLL이 Injection되든 뭐든 Attach되었을 때 내가 지정한 Target Process면 szAttach에

         저장한 문자열을 아니라면 szAttach2에 저장한 문자열을 MessageBoxA API로 띄운다.

 

 

 

 

41-44: 여기서 중요한 포인트는 함수의 인자의 자료형이다.

         64bit로 넘어오면서 8byte의 데이터를 처리하는 qword가 생겼는데,

         인자를 사용할때 32bit에서는 int형이든 주소값이든 모두 dword로 통일해서 편했지만,

         64bit에서는 int형은 dword, 주소값은 qword로 분리해서 사용해야한다.

70: 솔직히 없어도 된다고 생각했는데 없으면 안된다. (DLL생성시 필수로 넣어주자)

 

 

 

injector_64.asm

 

 

injector_64.asm 에는 특별하게 어려운 코드는 없다.

단, 15번 라인에서 내가 만든 DLL을 Import하는 과정에서 상대경로가 아니라 절대경로를 통해 Import시켜줘야 한다는 것을 반드시 기억하자. 그리고 경로에 한글이 있으면 안되더라...

 

 

실습

우선 DLL 파일의 컴파일에 앞서 dll.def 파일을 작성해주어야 한다.

 

 

 

컴파일한 결과로 이와같은 파일들이 생성되는 것을 확인할 수 있다. (DLL, EXP, LIB)

 

내가 injector_64.asm 에서 해당 DLL을 Import할 때 경로를 C:\ 하위로 지정했기 때문에 해당 Library 파일을 해당 경로로 복사한 후 injector_64.asm 파일의 컴파일을 진행해야 한다.

 

 

이제 injector_64.asm 파일의 컴파일을 진행한다.

 

 

 

injector_64.asm 을 컴파일한 결과로 위 두가지 파일이 생성되는 것을 확인할 수 있다.

 

 

injector_64.exe 파일을 실행하면 해당 injector 프로세스에 DLL이 Attach 되었다는 MessageBox가 뜨고, start window hooking 문구가 뜨며 Injector가 정상적으로 동작하는 것을 확인할 수 있다.

 

이 상태에서 다른 Process들을 실행시켜 보자.

 

 

notepad.exe를 실행하자 MessageBox가 먼저 뜨고, 확인 버튼을 누르자 본래 실행되야 했던 notepad.exe가 실행되는 것을 확인할 수 있다. 제대로 DLL Injection이 수행되는 것을 확인할 수 있다.

 

 

calculator.exe의 경우에도 마찬가지로 정상적으로 동작하는 것을 확인할 수 있다.

 

 

 

이 상태에서 Process Explorer을 통해 mydll64.dll을 검색해본 결과는 아래와 같다.

 

 

 

Injector가 동작하고난 이후에 실행된 여러 Process에 해당 dll이 Injection 되어있는 것을 확인할 수 있다.

 

이제 이 것을 이용해 Windows API Hooking 까지 동작시킬 수 있는지 확인해 보고 싶다.

 

 

[ 출처 ]

https://note.heyo.me/asm-tutorial-0/

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함