리버싱 기술을 이용하면 기존 어플리케이션의 버그를 수정하거나, 새로운 기능을 추가시킬 수 있습니다. 간단한 실습 예제를 통하여 동작원리를 소개하도록 하겠습니다.





리버싱 기술의 활용



리버싱 기술이 꼭 다른 프로그램을 분석하는 용도로만 사용되는 것은 아닙니다. 약간의 아이디어와 끈기만 있다면 여기서 조금 더 나아가 개발자들이 시도하지 않는 방법으로 작업을 진행할 수 있답니다. '개발 관점' 에서는 어렵게 보이는 문제이지만 오히려 '리버싱 관점' 에서는 쉽게 해결할 수 있는 경우도 있습니다.


* 참고


어플리케이션에 추가 기능을 삽입하는 것은 마치 "API Hooking - 계산기, 한글을 배우다. (1)" 와 비슷한 맥락의 작업 이라고 볼 수 있습니다.


자신이 개발하지 않은 (소스 코드를 가지고 있지 않은) 다른 어플리케이션의 버그 수정이나 전혀 새로운 기능 추가 같은 작업이 바로 그 좋은 예입니다. 이러한 작업의 핵심기술은 "Debugging""Injection" 그리고 "Hooking" 입니다. 또한 어셈블리 언어, PE File Format 등의 지식도 매우 중요합니다.


1) Debugging 


디버깅 기술은 매우 다양하게 사용됩니다. 먼저 작업 설계 단계에서 문제를 파악하고 해결 아이디어를 검증하고 구체화 시키는데 필수적으로 사용됩니다. 구현 단계에서 단위 모듈을 검증하는데에도 사용되고, 마지막 테스트와 버그 파악에 빠져서는 안되는 가장 중요한 기술입니다.


2) Injection


다른 프로세스를 수정하려면 일단 그 프로세스 메모리 영역으로 침투해야 합니다. 이게 바로 인젝션 기술의 역할입니다. 일단 프로세스 메모리에 침투하기만 하면 절반은 성공이라고 볼 수 있습니다.


3) Hooking


기존 코드와 다르게 동작시키려면 후킹 기술을 사용하면 됩니다. 기존에 있던 코드의 흐름을 변경시켜 사용하지 못하게 할 수 도 있고, 새로운 코드를 추가하여 전혀 다르게 동작시킬 수 도 있습니다. 


이제 간단한 실습 예제를 분석하면서 "기존 응용프로그램에 새로운 기능을 추가시키는 방법" 에 대해서 알아보도록 하겠습니다. 제가 아이디어를 내고 구체화 시키고 검증하는 과정, 그리고 실제로 구현하면서 부딪쳤던 문제들과 해결 과정에 대해 자세히 보여드릴 겁니다. 향후 여러분께서 리버싱 기술을 실무에 적용하실 때 작은 도움이 될 것입니다.




실습 프로그램 - HxD.exe 




<그림 1 - HxD.exe>


위 그림은 제가 평소 애용하는 헥스 에디터 HxD.exe 의 실행 화면입니다. dummy32.dll 라는 이름의 PE 파일을 열고 있네요. 


문득 "화면 좌측 하단의 Offset 표시 영역에 RVA 를 계산해서 같이 표시해 주면 어떨까?" 라는 아이디어가 떠올랐습니다. 아이디어의 유용성 여부를 떠나서 일단 재미있어 보였고, 어플리케이션 기능 추가라는 주제에 잘 맞을거 같다는 생각이 들었습니다.


여러차례 시도 끝에 결국 아래와 같이 성공할 수 있었습니다.



<그림 2 - PE 파일의 RVA 표시 기능이 추가된 HxD.exe>


먼저 Offset 과 RVA 를 동시에 표시하기 위해 status bar 의 좌측 하단 영역의 길이를 조금 늘렸습니다. 그리고 글씨를 출력하는 API 를 후킹하기 위한 hxdhook.dll 을 인젝션 시켰습니다. 또한 Offset <-> RVA 변환 계산 모듈 PEInfo.dll 을 로딩하여 계산을 수행하도록 만들었습니다. 이제 HxD.exe 에서 PE 파일을 열고 커서 위치가 변할 때마다 해당 파일 Offset 과 RVA 가 자동으로 표시됩니다.


다음 포스트에서 구체적인 작업 내용과 동작 원리에 대해 알아보도록 하겠습니다.



* 참고


위 실습 예제 파일은 "HxD.exe 기능 추가" 페이지에서 다운 받으실 수 있습니다.




ReverseCore


저작자 표시 비영리 변경 금지
신고
  1. 감염오리 2012.06.23 18:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    ㅎㅎ 다시 포스팅을 올리시는군요
    앞으로도 더 많은 지식을 알려주시기 바랍니다^^

  2. ray 2012.06.27 04:50 신고 댓글주소 | 수정 | 삭제 | 댓글

    좋은 정보 감사합니다.


HxD.exe 기능 추가!

tool 2012.06.14 00:35

리버싱 기술을 조금 응용하면 다른 응용프로그램의 기능을 추가/변경시킬 수 있습니다. 


제가 애용하는 헥스 에디터 HxD.exe 에 필요한 기능을 살짝 추가하였습니다.



HxD.exe



DLL InjectionAPI Hooking 기술을 이용하여 HxD.exe 프로그램에 새로운 기능을 추가하였습니다.



제가 추가시킨 기능은 PE 파일 Offset 의 RVA 값을 계산해서 출력해 주는 것입니다. (위 그림 참고)


키보드나 마우스를 이용하여 커서 위치를 이동하면 Offset 값이 변함에 따라서 자동으로 그에 맞는 RVA 값이 계산되어 표시됩니다.



사용방법



HxD.exe  - Hex Editor

hxdhook.dll  - hooking dll

InjDll32.exe  - Injector

PEInfo.dll  - File Offset <->RVA converter



1. HxD.exe 실행


2. HxD 에서 아무 PE 파일을 오픈


3. InjDll32.exe 를 이용하여 HxD.exe 프로세스에 hxdhook.dll 을 인젝션





HxD.exe 프로세스에 hxdhook.dll 이 정상적으로 인젝션 되었다면 이제부터 프로그램 하단의 Status Bar 에 Offset 과 RVA 가 동시에 표시될 것입니다. 


크게 유용하다고 볼 수 는 없지만 리버싱 기술을 응용하여 기존 프로그램에 새로운 기능을 추가하는 방법을 잘 보여주는 예제라고 생각합니다. 필요하신 분께서는 자유롭게 가져다 쓰실 수 있습니다.



* 블로그에 리버싱 기술 응용편을 올리기 위해 준비한 간단한 시연입니다. 자세한 동작 원리, 후킹 과정, 모듈 개발 과정 등은 따로 포스팅 하도록 하겠습니다.



ReverseCore



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

'tool' 카테고리의 다른 글

PEView.exe  (23) 2013.01.27
HxD.exe 기능 추가!  (12) 2012.06.14
리버싱 현업에서 사용되는 디버거(Debugger)들  (31) 2010.09.29
InjDll.exe – DLL Injection/Ejection 전용 도구  (71) 2010.03.15
Process Explorer - 최고의 작업 관리자  (1) 2009.05.03
www.virustotal.com  (3) 2009.03.20
www.google.com  (2) 2009.03.06
  1. rgs 2012.06.14 19:13 신고 댓글주소 | 수정 | 삭제 | 댓글

    와 제가 댔글 처음인건가요 ?
    주인장님
    블로그 다시 시작하시는군요
    매일 들려보는 사람입니다.
    블로그 정말 재밋어요
    계속 열심히 해주세요

  2. 카이섹이 좋아 2012.06.14 20:33 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스 코어님 ㅠ ㅠ 언제 책이.....

  3. 감염오리 2012.06.15 00:44 신고 댓글주소 | 수정 | 삭제 | 댓글

    드디어!!! 포스팅 재개인가요^^

  4. 마리오 2012.06.15 10:25 신고 댓글주소 | 수정 | 삭제 | 댓글

    오호 포스팅 되었군요ㅎ
    책출판될거보다 포스팅된게 더 반가워요ㅎ

  5. db_click 2012.06.16 10:27 신고 댓글주소 | 수정 | 삭제 | 댓글

    항상 포스팅 감사히 보고 있습니다.

  6. 안녕하세요 2012.06.20 09:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    책이 나오기만을 학수고대하고 있습니다.
    책 나오면 바로 살게요! ^^

  7. reversecore 2012.06.23 00:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    관심 감사드립니다. ^^~

  8. Lr라 2013.03.04 14:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    항상 포스팅 하신글 잘보고있습니다.
    음...~~~ 저걸 이용해서 헥스 만큼 바이트 채우고 시작되는 부분에 call로
    때려서 영역에서 불러와서 인라인 어셈으로 자동인젝션되도록 만들어야겟습니다 ㅎㅎ
    잘쓰겠습니다 ㅎㅎ

  9. absolujin 2013.05.02 15:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    전 이렇게 batch 파일 만들어서 사용하고 있어요.
    잘쓸께요. 감사합니다.
    --------------------------------------------------------------
    @echo off
    start Hxd.exe
    start InjDll32.exe HxD.exe -i hxdhook.dll

  10. yO Kang 2014.03.13 02:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    똑같이 했는데, 저는 "The token does not have the specified privilege" 이런 문구뜨면서 안되네요..
    뭐가 문제일까요?

  11. RBWSN 2016.02.25 06:36 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다



기존 InjDll.exe 유틸리티를 업그레이드(Ver. 1.1.1) 하였습니다.

  1. 64bit 지원

  2. <dll path> 의 상대 경로 지원


☞ InjDll.exe - DLL Injection/Ejection 전용 도구


Windows 7 64bit OS 가 보급됨에 따라 리버싱 분야에도 점차 64bit 지원 여부가 중요한 이슈가 되고 있습니다. 저 또한 최근에 64bit 관련 내용을 공부하면서 흥미로운 내용을 많이 접하였습니다. (이번에 작업 중인 리버싱 책에 64bit 리버싱 챕터를 추가시켰습니다.)

각 플랫폼(32/64bit) 별로 Dll Injection 을 하실 때 다음의 내용을 주의해 주시기 바랍니다.

- Target 프로세스가 32bit 인 경우 : Injector & Dll => 모두 32bit (PE32 포멧)
- Target 프로세스가 64bit 인 경우 : Injector & Dll => 모두 64bit (PE32+ 포멧)

* 64bit OS 에서는 32/64bit 프로세스가 모두 실행 가능하므로, Target 프로세스의 PE 포멧을 확인 하신 후 적절한 Injector(InjDll32/InjDll64) 와 DLL 을 사용하시면 됩니다.

* PE32+ 포멧의 파일을 생성하시려면 Visual C++ 2010 Express & Windows SDK 를 설치하시면 됩니다.


ReverseCore

저작자 표시 비영리 변경 금지
신고
    이전 댓글 더보기
  1. RUIN 2010.12.03 13:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    도대체 책 언제 나와요 ㅠ_ㅠ
    책 Part 1 // Part 2로 나눠서 Part 1부터 먼저 내주셧으면 ㅠㅠ

    • reversecore 2010.12.03 16:14 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      Part 1/2 를 생각해 봤는데요.

      현재로서는 한권에 다 넣는게 좋다고 생각중입니다.

      제 책을 기다려주셔서 감사합니다. ^^

      힘내서 열심히 작업할께요~

    • RUIN 2010.12.03 18:20 신고 댓글주소 | 수정 | 삭제

      네ㅠㅠㅠ........

      최대한 빨리 써주신다면 감사 감사^_^

      감기 조심하세요^^

    • 두둥 2010.12.05 01:31 신고 댓글주소 | 수정 | 삭제

      저도 책 기다리고 있어요..ㅜ.ㅜ

      요새 사이트에 자주 못들어 왔는데 다양한 정보를
      책으로 볼수있는 기회가 빨리 오기를 바랍니다.

    • reversecore 2010.12.10 11:55 신고 댓글주소 | 수정 | 삭제

      네, ^^

      항상 신경써 주시는 두분께 감사드립니다.

  2. Saeglo 2010.12.24 17:48 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    여기서 배운게 정말 많고 항상 잘 보고 있습니다.

    혹시 윈도우가 아닌 다른 OS에서의 리버싱은 다룰 생각이 없으신지 궁금합니다.

    예를 들어 리눅스의 시스템 콜 후킹 같은 -

    실은 제가 최근에 Mac에 대해 공부를 하고 있는데
    국내에서 Mac에 대한 정보는 찾기가 힘들어서
    혼자 공부하기 쉽지 않네요 ㅠㅠ

  3. kaka 2010.12.27 20:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    좋은 글 매일와서 보고 따라해 보고..ㅋㅋ 있습니다.
    일단 책을 좀더 기다려야 한다니..아쉽습니다.
    화이팅~하세요.

    질문인데요..
    올려 놓으신 소스로 win7(32비트) IE8에서 DLL 인젝션을 실행하면 인젝션은 잘됩니다.
    그런데 인젝션된 dll의 DLL_PROCESS_ATTACH 이벤트가 수행되지 않는건
    머가 문젠가요? IE를 관리자 권한으로 실행하면 원하는데로 되던데요...
    직접 인젝션을 시키거나 NewZwResumeThread()을 수행하나 마찬가지네요.

    이것저것 해봐도 DLL_PROCESS_ATTACH 이벤트가 실행되질 안네요 T___T;;

    • reversecore 2010.12.31 00:38 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      어떤 소스 코드를 사용하셨나요?

      제 블로그에 몇 가지 버전의 InjDll 소스가 있습니다. @@~

      제가 http://www.reversecore.com/76 에 있는 InjDll64.exe 와 dummy64.dll 을 가지고 테스트 해보면 잘 되는데요.

      dummy64.dll 소스에 OutputDebugString() 을 추가해서 DbgView 로 확인하면 DLL_PROCESS_ATTACH 가 정확히 뜹니다.

      테스트하신 소스(혹은 실행파일)을 제게 보내주시면 확인해 드리겠습니다.

      감사합니다.

    • kaka 2011.01.03 09:52 신고 댓글주소 | 수정 | 삭제

      새해 복 많이 받으세요..

      아.. 죄송합니다.
      정확히 질문을 하지 못했네요.
      iexplore.exe부모는 DLL_PROCESS_ATTACH가 말씀하신데로 정확히 뜨는데,
      자식 iexplore.exe에게는 DLL_PROCESS_ATTACH나 DLL_THREAD_ATTACH 이벤트가 발생하질 안습니다.

      인젝터는 reversecore님께서 올려놓으신 파일로 했습니다.

    • reversecore 2011.01.07 05:38 신고 댓글주소 | 수정 | 삭제

      아~ iexplore.exe 의 child process 말씀이시군요.

      Global API Hooking 을 써야 하는데요.
      인젝션 시키는 DLL 에 global API Hooking 코드가 준비되어 있어야 합니다. 위 댓글에서 소개한 dummy.dll 에는 그런 기능이 없지요.

      http://www.reversecore.com/79 <- 요기 있는 redirect.dll 파일이 바로 그 파일입니다.

      redirect.dll 을 인젝션 하신 후 IE 의 탭을 마구 띄워서 child process 가 생성되는 순간 자동으로 인젝션이 되면서 DLL_PROCESS_ATTACH 가 뜹니다.

      DbgView 로 확인할 수 있도록 OutputDebugString() 으로 로그를 찍었습니다.

      * Win 7 32bit/64bit 에서 테스트 하였습니다.

      kaka 님께서도 새해 복 많이 받으세요~~~

      감사합니다.

  4. kaka 2010.12.30 17:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    InjDll64.exe와 dummy64.dll로 win7 64 OS에서 테스트해보니
    notepad에 inject(dll_process_attach)후 자동으로 dll_process_detach되던데
    왜그럴까요?

    • reversecore 2010.12.31 00:41 신고 댓글주소 | 수정 | 삭제

      역시 제 환경에서는 잘 되는데요.

      notepad 에 injection 성공하면 DLL_PROCESS_ATTACH 가 뜨고 바로 이어서 DLL_THREAD_DETACH 가 뜹니다. (원격 스레드가 종료되면서 뜨는거죠.)

      메일 주소를 알려주시면 OutputDebugString() 을 추가한 dummy64.dll 을 보내드리겠습니다. 다시 한번 확인해 보시기 바랍니다.

      * 간혹 보안 모듈에서 DLL Injection 을 막는 경우가 있습니다. 근데 그건 인젝션 자체를 막는 거라 올려주신 증상하고도 맞지 않네요.

      감사합니다.

  5. Reversing_H 2011.01.14 10:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    항상 잘보고 잘 배우고 있습니다.
    여기서 질문하나 드릴게요 ~

    제가 리버싱쪽으로 취업을 하고 싶은데,,
    리버싱쪽에서 뽑는거는 잘 못본듯 하고
    다른기술도 같이 병행해야하는 업무인지;

    이쪽에 대해 아는게 없어서 말이죠;;

    조언 부탁드립니다 ^^

    • reversecore 2011.01.14 11:50 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      관리자가 아닌 리버싱 엔지니어를 말씀하시는 거라면...

      제가 알기로는 보안 분야뿐입니다.
      (AV 업체, 온라인 게임 업체...)

      간혹 보안 컨설팅 분야에서 리버싱 관련 지식에 대해 가산점을 부여한다는 얘기만 건네 들은적은 있네요~

      감사합니다.

  6. Reversing_H 2011.01.14 11:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    아,, 한가지더 ;
    보통 악성코드 분석에서 리버싱이
    쓰이는걸로 알고있는데

    그렇다면 악성코드 분석할때
    필요한게 리버싱과
    또 어떤분야가 필요한지
    알고싶습니다.

    질문여러개 드려서
    죄송합니다 ㅠ

    • reversecore 2011.01.14 11:54 신고 댓글주소 | 수정 | 삭제

      회사마다 다르겠습니다만...

      악성코드 분석은 리버싱 지식만 있으면 됩니다. (이것만도 쉽지 않습니다.)

      추가적으로 악성 코드 자체의 지식, 보안 지식 등을 갖춘다면 면접에서 좋은 점수를 받을 수 있겠지요.

      사실 회사마다 사람 뽑는 기준(신규직원의 경우) 은 다 틀려서 말이죠. 어디는 학력을 중시하고, 어디는 성격/기질을 중시하고, 어디는 순수한 실력을 보기도 하고... 그렇답니다. ^^

      감사합니다.

  7. Reversing_H 2011.01.15 20:07 신고 댓글주소 | 수정 | 삭제 | 댓글

    답변 정말 감사드립니다.
    그런데 한가지 더 질문드릴게요;;
    원래 제가 7년전쯤에 프로그래밍쪽이 너무 좋아서
    개발쪽으로 취업을 하려다가 우리나라의 개발직의 종사자분들의
    여러가지 이야기를 들어보니(뭐 IT쪽은 여건이 안좋은건 비슷하지만)
    흥미도 떨어지고 여차저차에서 아예 IT쪽에 손을 놓았다가
    보안쪽에 흥미를 갖고 다시 공부를 시작했습니다.
    하지만 보안이라는 분야에 대해 처음 접하고 보안자체도 워낙 종류가
    많더군요;; 그리고 신입이 바로 들어가기도 쉽지 않은 분야이구요.
    그래서 리눅스 계열의 서버쪽에 우선 취업을 해서 이직하려고 준비하던중에
    리버싱이라는 분야를 알게 됐고 매우 흥미를 가지게 되었습니다.
    정말 이건 충격자체였고, 바로 이거다라는 느낌을 받았습니다.
    하지만 이걸 알게된것이 얼마전이고 말 그대로 실력이 없습니다.
    목표는 리버싱 일을 하는게 제 목표이긴 하지만요.
    여기서 질문을 드리자면
    뭐 물론 제일 좋은것은 처음부터 리버싱 업무를 하는 곳에 취직하는게 제일
    좋겠지만,, 제가 여건상 돈을 벌어야 하기에;; 바로 들어가기에는
    시간적이 여유와 자금적 여유가 없어서 프로그래밍 쪽이나
    서버쪽에 먼저 취직을 해야 할듯 싶은데 ,
    추후 리버싱일을 하려면 개발직 쪽으로 가는것이 더 나을까요?
    또한 개발직 쪽으로 가더라도 개발직도 종류가 많은데
    보안솔루션 개발쪽으로 가는것이 더 좋은 선택인지
    많은 것이 고민됩니다.
    자꾸 질문드려서 죄송하구요;;
    그만큼 이곳을 알게되고 리버싱이란 것을 알게되서
    기쁘구요. 조언좀 주셨으면 좋겠습니다 .
    감사합니다 ^^

    • reversecore 2011.01.20 00:04 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      사실 리버싱일을 하시려면 말그대로 리버싱쪽으로 취직을 하시는게 좋습니다.

      제가 처음 리버싱으로 취업할 때만 해도 국내에 리버싱을 하는 사람들이 없어서 거의 대부분 경력 개발자들을 뽑았습니다. 몇 달을 교육시켜서 실무에 투입했지요.

      요즘은 리버싱 인구가 많이 늘어나서... 회사도 신입을 뽑더군요... 신입들의 리버싱 경험도 상당하더군요. 경력을 뽑을때도 동종 업계의 리버싱 경력자를 뽑구요...

      저와 저희 회사의 사례를 소개해 드린거라서요...
      참고만 하시기 바랍니다.

      제 개인적으로는 개발/리버싱 모두 경험을 가지고 있는 것이 좋다고 생각합니다. (실제로 제가 그렇구요.)

      감사합니다.

  8. 아침햇살 2011.02.07 16:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요^^ 맨날 눈팅만하고...책나오길를 기다리는 사람입니다;;
    매번 조용히 글만읽고 댓글하나 없이 가다가....궁금한게 있어서 염치 없지만 이렇게 질문하나
    드리고 갑니다.

    32비트에서는 전역 후킹시에 ntdll!ZwResumeThread를 이용하면 앞으로 실행될 프로세스에 대해
    서도 모두 후킹이 가능한걸 알았읍니다.. 근데

    64비트에서는 실행되고 있는 프로세드들이 64비트 응용프로그램인지 32비트 응용프로그램인지를
    구분하여 따로 Injector와 DLL을 맞추서 인젝션을 해야 하더군요..

    예를 들어 저는 64bit OS에서 32비트 응용프로그램에만 인젝션을 시도할 예정인데요
    이게 앞으로 실행될 프로세스에 대해서 어떻게 인젝션을 해야 할지 좀 감이 안와서요;;
    쓰레드를 돌려서 새로 생성되는 프로세스를 감시하다가 32비트인지 64비트인지 구분해서 인젝션을 할까도 생각했지만 이건 왠지 아니다 싶은 생각이 들더군요;;
    64비트에서도 ntdll!ZwResumeThread 처럼 뭔가 핵심적인 함수 하나를 후킹해서 전역적으로 후킹할 수 있는 방법이 없을까 해서요.. 물론 저 함수를 64비트에서 후킹 할 수 있겠지만
    제가 돌리는 응용프로그램이 32비트이다보니 explorer.exe에 인젝션을 할 수 가 없는 상황입니다.
    다른 분들의 의견이나 reversercore님의 의견이 한번 듣고 싶네요..~ +.+
    구글링을 해봤지만 딱히 눈에 딱 보이는거 없어서요..(혹시 제가 놓친거 일 수도 있습니다..ㅋ)
    어떻게 생각하세요??

    • reversecore 2011.02.09 21:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      64bit 환경에서 32bit 프로세스만 global hooking(자동 인젝션) 을 하신다는 말씀이시죠~

      제가 직접 시도해 보기 전에는 뭐라 말씀드리기가 어렵군요.

      테스트 후 다시 답변 달아드리겠습니다.

      감사합니다.

    • 아침햇살 2011.02.14 11:34 신고 댓글주소 | 수정 | 삭제

      넵 답변 달아주셔서 감사합니다^^

      지금은 우선 쓰레드에서 프로세스를 감시하여 새로 생성된 프로세스
      를 탐지해 32bit일경우만 Injection하도록 작업하고 있습니다.^^

      좀더 좋은 방법이 나왔으면 좋겠네요~ ㅎ ~
      그럼 수고하세요^^

  9. baboha 2011.02.12 19:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 리버스코어님 글 잘보고있습니다.

    질문이 하나있는데요

    프로세스가 실행중일때 Injection된 dll의 이름들을 얻을려면 어떻게 해야할까요?

    IAT에 써진것말고 프로세스가 LoadLibrary를 통해서 따로 Injection한 것까지 알고싶습니다

    마치 procexp 프로그램처럼요

    • reversecore 2011.02.18 22:44 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      말씀하신 그런 기능을 수행하는 API 가 있습니다. Injection 된 DLL 들을 Ejection 시킬 때 사용됩니다.

      CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID)
      Module32First()
      Module32Next()

      위 API 를 검색해 보시기 바랍니다.

      감사합니다.

  10. harrison 2011.04.16 06:37 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    리버싱 관련 지식이 필요해서 검색을 하다가 이곳에 왔는데,
    굉장한 도움이 도움이 되었습니다.
    감사합니다.

  11. wordboss 2011.05.17 10:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    오늘 오랜만에 강좌에 와보니 새로운 내용 더 생겼네요.
    보 다 흥미로운 내용 더 많이 올려주세요
    자주 방문 하겠어요
    건강에 각별히 류의하시구요

  12. FreeAngel 2011.07.06 03:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    궁금한점이있는데요.ㅠㅠ 글로벌 후킹에ㅓ 실행되는 프로그램, 앞으로 실행될 프로그램을
    제어 할 수 있다고했는데, 흰트조금만주세요.ㅠㅠ 크레이트 프로세스를 써서하는건지;;;;ㅠ

    • reversecore 2011.07.14 05:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      제 블로그에 있는 글이 도움이 되실 것 같습니다.

      Advanced Global API Hooking – IE 접속 제어 (1)
      (http://www.reversecore.com/77)

      API Hooking – '스텔스' 프로세스 (1)
      (http://www.reversecore.com/65)

      감사합니다.

  13. 2011.10.27 10:49 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  14. 2011.10.28 12:51 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  15. 2011.10.28 12:51 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  16. 2012.01.09 02:04 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  17. 따오기d 2012.02.01 10:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    수고하십니다.!! 글잘봤어요
    질문이 있는데요
    Injector = 32bit process
    HookDLL = 64bit dll
    Target Process = 64bit Process
    OS 는 Windows 2008 R2 (64bit) 이구요
    이상황에서 Injector 가 wow 로 돌고있는 상황에서 가능한 방법이 있나요?

  18. 따오기 생각 2012.02.13 13:34 신고 댓글주소 | 수정 | 삭제 | 댓글

    따오기님
    수고하세요.
    오 그거 생각에 system disable wow비슷한 API가 있는데요.
    그걸 참고하시지요.

  19. 2012.05.25 16:16 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  20. 2012.05.29 09:28 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다



제가 개발한 InjDll.exe 프로그램을 소개합니다. 
이 프로그램을 이용해서 원하는 DLL 을 대상 프로세스에 Injection/Ejection 시킬 수 있습니다.



DLL Injection 에 관련된 설명을 아래 링크를 참조하세요.




InjDll.exe (Ver 1.0.0)


제 블로그 study 에서 자주 소개되는 프로그램입니다.
소스를 조금 다듬고 기능을 추가시켜서 정식 버전(1.0.0)으로 배포합니다.

이 프로그램은 공개용이며, 자유롭게 사용하실 수 있습니다.


* 주의!
기본적으로 Windows 2000 이상만 지원합니다. (Windows 7, XP 에서 테스트 되었습니다.)
Windows 9X 계열에서는 사용하실 수 없습니다.


사용방법은 아래와 같습니다.

InjDll.exe <procname|pid|*> <-i|-e> <dll path>

<procname|pid|*>
  procname      Process name (ex: explorer.exe, notepad.exe, etc)
  pid           Process ID

<-i|-e>
  -i            Injection Mode
  -e            Ejection Mode

<dll path>      DLL File Path (relative or full)


사용 예
- PID 2840 프로세스에게 dummy.dll 파일을 Injection 시킬 때



- IE 프로세스에게 dummy.dll 파일을 Injection 시킬 때



- 모든 프로세스에게 dummy.dll 파일을 Injection 시킬 때



Ejection 은 –i 대신 –e 를 사용하면 됩니다.



InjDll.exe (Ver 1.1.1)


InjDll.exe 가 버전업 되었습니다. (2010.10.29)




추가/변경 사항


1. 64bit 지원

InjDll64.exe 를 이용하여 64bit 프로세스에 64bit DLL 파일을 인젝션 시킬 수 있습니다. 

* 64bit 프로세스에 DLL Injection 을 하기 위해서는 Injector(InjDll64.exe) & DLL 파일이 모두 64bit(PE32+) 이어야 합니다.


2. <dll path> 의 "상대 경로" 지원 

아래와 같이 Dll 파일 위치를 상대 경로로 입력할 수 있습니다.

InjDll32.exe notepad.exe -i dummy32.dll
InjDll32.exe calc.exe -i ..\hook.dll
...



주의사항


1) 원격 스레드를 실행시켜 LoadLibrary() 를 호출하는 방식이므로 대상 프로세스에 kernel32.dll 이 로딩되어 있지 않다면 Injection/Ejection 작업은 실패합니다.

2) 접근 권한이 제한된 (보호받는) 프로세스나 Anti-Injection 기법이 적용된 프로세스 들에게도 역시 Injection/Ejection 작업은 실패합니다.

3) 원칙적으로 Injection 을 N 번 시켰을 때 Ejection 도 같은 횟수로 호출해 줘야 해당 DLL 이 제대로 unloading 됩니다.



Bugs


사용하시다가 버그가 발견된다면 댓글로 알려주시면 감사하겠습니다.



ReverseCore

위 글이 도움이 되셨다면 추천(VIEW ON) 부탁 드려요~
저작자 표시 비영리 변경 금지
신고

'tool' 카테고리의 다른 글

PEView.exe  (23) 2013.01.27
HxD.exe 기능 추가!  (12) 2012.06.14
리버싱 현업에서 사용되는 디버거(Debugger)들  (31) 2010.09.29
InjDll.exe – DLL Injection/Ejection 전용 도구  (71) 2010.03.15
Process Explorer - 최고의 작업 관리자  (1) 2009.05.03
www.virustotal.com  (3) 2009.03.20
www.google.com  (2) 2009.03.06
    이전 댓글 더보기
  1. 김대리 2015.09.09 02:55 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  2. 김대리 2015.09.09 02:55 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  3. 무룡꽁머니 2015.09.10 06:50 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  4. 헬로우드림 2015.09.10 21:15 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  5. 김대리 2015.09.11 12:03 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  6. 김대리 2015.09.11 12:03 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  7. 왕재수 2015.09.13 01:26 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  8. 무룡꽁머니 2015.09.14 03:54 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  9. 임투지 2015.09.14 16:07 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  10. 왕재수 2015.09.19 12:29 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  11. hello 2017.01.12 03:17 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  12. 코코킹 2017.01.15 15:32 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  13. 코코킹 2017.01.30 20:38 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  14. 맞짱섯다 2017.02.05 00:55 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  15. 맞짱섯다 2017.02.06 10:26 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  16. 맞짱먹튀 2017.02.07 15:18 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  17. 무료행사 2017.02.09 00:31 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  18. 코코킹 2017.02.26 04:10 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  19. 홍콩명품시계 2017.03.16 08:20 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  20. dfgdfg 2017.04.02 07:26 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다



지금까지 우리가 원하는 DLL 을 "실행중인" 프로세스에 강제로 Injection 시키는 방법에 대해서 알아봤습니다.

이번에는 접근 방법을 바꿔서 아예 대상 프로그램 "파일을 직접 수정"하여 DLL 을 강제로 로딩하도록 해보겠습니다.
이 방법은 한 번 적용해 놓으면 (별도의 Injection 과정없이) 프로세스가 시작할 때마다 원하는 DLL 을 로딩하게 만들 수 있습니다. 일종의 크랙이라고 생각하시면 됩니다.

목표는 notepad.exe 파일을 직접 수정하여 실행 시 myhack3.dll 을 로딩하도록 만드는 것입니다.
이를 위해서는 PE Header 를 자유자재로 다룰 수 있는 실력이 필요합니다.

IDT(Import Directory Table)와 기타 PE File Format 에 대해서는 아래의 글을 참조하시기 바랍니다.

- PE(Portable Executable) File Format (6) - PE Header



myhack3.dll


먼저 로딩 시킬 DLL 의 소스를 보겠습니다.

// myhack2.cpp
// ReverseCore

include "windows.h"

#define DEF_CMD  "c:\\Program Files\\Internet Explorer\\iexplore.exe"
#define DEF_ADDR "www.naver.com"

#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) BOOL start()
{
    char szCmd[MAX_PATH] = {0,};
    STARTUPINFO si = {0,};
    PROCESS_INFORMATION pi = {0,};

    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    // IE 를 hidden window 로 실행시켜 naver 에 접속합니다.
    wsprintf(szCmd, "%s %s", DEF_CMD, DEF_ADDR);
    if( !CreateProcess(NULL, (LPTSTR)(LPCTSTR)szCmd, 
                       NULL, NULL, FALSE,
                       NORMAL_PRIORITY_CLASS,
                       NULL, NULL, &si, &pi) )
        return FALSE;

    if( pi.hProcess != NULL )
        CloseHandle(pi.hProcess);

    return TRUE;
}
#ifdef __cplusplus
}
#endif

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH :
            start();
            break;
    }
  
    return TRUE;
}

myhack3.dll


기능은 지난번과 마찬가지로 IE 를 hidden 속성으로 실행시켜 Naver 초기화면에 접속시키는 것입니다.

가장 눈에 띄는 것은 start() EXPORT 함수입니다.

PE 파일에서 어떤 DLL 을 IMPORT 한다는 것은 코드내에서 그 DLL 의 EXPORT 함수를 호출한다는 의미입니다. 그래서 myhack3.dll 파일은 형식적인 완전성을 위해 EXPORT 함수를 제공해야 합니다. (실제로 notepad.exe 내부에는 myhack3.dll!start() 함수를 호출하는 코드 같은건 존재하지 않습니다.)

프로그래밍에서 DLL 의 IMPORT 는 컴파일러/링커가 해주지만, 저는 이 작업을 PE View 와 Hex Editor 만을 가지고 수동으로 해보겠습니다. (제 환경은 WinXP SP3 KOR 버전입니다. OS 와 SP 버전에 따라서 방법이 약간 틀려질 수 있습니다.)



파일 변경 아이디어 

notepad.exe 파일이 실행될 때 자동으로 myhack3.dll 파일을 로딩하기 위해서는 PE Header 의 IMPORT DIRECTORY TABLE 에 myhack3.dll 을 (IMPORT 하도록) 추가해야 합니다.

notepad.exe 원본과 제가 수정한 notepad_hack.exe 를 첨부합니다.

notepad.exe

notepad_hack.exe


PE View 를 이용하여 notepad.exe 의 IDT 의 주소를 확인해 보겠습니다. IMAGE_OPTIONAL_HEADER 의 IMPORT Table RVA 값이 바로 IDT 의 RVA 입니다.


<Fig. 1>

위 그림에서 IDT 주소는 RVA 로 7604 입니다. 이를 PE View 로 따라가 보겠습니다. (PE View 의 주소 보기 옵션을 "RVA" 로 해주세요.)



<Fig. 2>

IDT 는 <Fig. 2> 와 같이 IMAGE_IMPORT_DESCRIPTOR(이하 IID) 구조체 배열로 되어 있으며, 마지막은 NULL 구조체로 끝납니다. IMPORT 하는 DLL 파일 하나당 IID 구조체 하나가 필요합니다. (IID 구조체 하나의 크기는 14h bytes)

PE View 의 주소 보기 옵션을 "File Offset" 으로 변환하면 IDT 의 file offset 은 6A04 입니다.
Hex editor 를 이용해 6A04 주소를 찾으면 아래 그림과 같습니다.


<Fig. 3>

IDT 는 file offset 으로 6A04 ~ 6ACC 범위에 있으며, 전체 크기는 C8 입니다.
마지막 NULL 구조체를 포함하여 총 10개의 IID 구조체가 있습니다. 

처음에 전 IDT 마지막에 myhack3.dll 을 위한 IID 구조체를 추가하려 했습니다만, 더 이상 추가할 공간이 없습니다. (마지막 NULL 구조체는 꼭 필요하거든요.)

그래서 Hex editor 로 notepad.exe 의 빈 영역(사용되지 않는 영역)을 찾아 보았습니다.
<Fig. 4> 에서 보이는 것처럼 마침 파일 끝부분에 알맞은 크기가 비어 있네요.

* 만약 파일에 빈 영역이 보이지 않는다면 파일 끝에 새로운 섹션을 추가하거나, 또는 마지막 섹션의 크기를 늘리는 방법을 사용해야 합니다.


<Fig. 4>

바로 이 위치(file offset = 10710, RVA = 13310)에 새로운 IID 를 만들것입니다.

주의 하실 점은 저 영역(file:10710 ~ 107FF, RVA:13310 ~ 133FF)이 과연 메모리에 로딩되는 영역인지 확인하는 것입니다.
파일에 존재한다고 해서 반드시 메모리에 로딩되는 것은 아닙니다. 섹션 헤더에 명시된 영역만 메모리에 로딩됩니다.


notepad 의 마지막 섹션 헤더(".rsrc") 를 살펴보겠습니다.


<Fig. 5>

RVA = B000 이고 VirtualSize = 8304 이므로 메모리에 로딩되는 영역은 RVA = 13304 까지입니다.
하지만 <Fig. 4> 의 파란색 영역(RVA:13310 ~ 133FF)은 포함되지 않는 영역입니다.

그렇다면 이부분은 메모리에 로딩되지 않을까요?
실제로는 메모리에 로딩됩니다. 이유는 notepad 에서 IMAGE_OPTIONAL_HEADER 의 SectionAlignment 값이 1000 이기 때문에 마지막 섹션(".rsrc")헤더에 명시된 위치(RVA=13304)는 실제로 14000 까지 확장됩니다. (기본 단위의 배수)

디버거에서 확인해 보겠습니다.

<Fig. 6>

위 그림을 보시면 notepad 프로세스 메모리에서 마지막 섹션(".rsrc")의 VirtualSize 값이 9000 으로 확장된 것을 보실 수 있습니다. <Fig. 5> 의 실제 VirtualSize 값은 8304 였으나 SectionAlignment (1000) 의 배수인 9000 으로 자동 확장된 것입니다.

따라서 RVA = 13310 위치에 새로운 IID 를 만드는 것은 문제가 없습니다.



IDT(Import Directory Table) 변경


notepad.exe 를 복사하셔서 이름을 notepad_hack.exe 로 변경해주세요.
이제부터 notepad_hack.exe 파일을 가지고 변경 작업을 진행합니다.

#1. IMPORT Table 의 RVA 값 변경

PE View 를 기준으로 설명드리겠습니다.
IMAGE_OPTIONAL_HEADER 의 IMPORT Table 구조체 멤버는 IDT 의 위치와 크기를 알려줍니다. <Fig. 1> 을 보시면 현재 IMPORT Table 의 RVA 값은 7604 입니다. Hex editor 에서 이 값을 새로운 IDT 의 RVA 값인 13310 으로 변경합니다. 그리고 Size 값을 기존 C8 에 14 (IID 구조체 크기) 를 더한 값인 DC 로 변경합니다. (Size 멤버는 수정 하지 않아도 됩니다.)


<Fig. 7>

PE View 로 확인하면 아래 그림과 같습니다.

<Fig. 8>

이제 notepad 실행 시 PE Loader 는 IDT 가 RVA = 13310 에 존재한다고 간주합니다.

#2. BOUND IMPORT TABLE 사용 안함


PE HEADER 에서 BOUND IMPORT TABLE 은 DLL 로딩 속도를 조금 향상시킬 수 있는 기법입니다. 이 값을 그냥 놔둬도 문제 없는 경우가 많지만, 제가 테스트할 때는 myhack3.dll 이 정상동작하지 않았습니다. (편하게 작업하시려면 이 값을 무조건 0 으로 밀어버리시기 바랍니다.)

Hex editor 를 이용해서 BOUND IMPORT Table 영역(RVA, Size)을 0 으로 밀어버립니다.

<Fig. 9>

PE View 로 확인해 볼까요?

<Fig. 10>

#3. 새로운 IDT 생성

기존 IDT (file = 6A04 ~ 6ACB, RVA = 7604 ~ 76CB) 를 복사하여 새로운 위치(file = 10710, RVA = 13310)에 붙여넣고, 나머지 지저분한 데이타들은 깔끔하게 NULL 로 밀어버립니다.

<Fig. 11>

이 상태에서 아래와 같이 myhack3.dll 을 위한 IID 를 구성하여 새로운 IDT 끝에 추가시킵니다.
(각 멤버의 데이타에 대해서는 아래에서 따로 설명드리겠습니다.)

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            
        DWORD   OriginalFirstThunk;       // INT(Import Name Table) => 8750
    };

    DWORD   TimeDateStamp;                // => FFFFFFFF

    DWORD   ForwarderChain;               // => FFFFFFFF
    DWORD   Name;                         // library name => 8760
    DWORD   FirstThunk;                   // IAT(Import Address Table) => 1348
} IMAGE_IMPORT_DESCRIPTOR;


아래는 Hex editor 로 작업한 그림입니다. (IDT 마지막에 myhack3.dll 을 위한 IID 를 추가)

<Fig. 12>

#4. IID(IMAGE_IMPORT_DESCRIPTOR) 구성

앞 단계에서 추가한 IID 구조체 멤버들이 정상적으로 동작하기 위해서 적절한 세팅이 필요합니다.

먼저 INT(Import Name Table) 와 Name 멤버 설명입니다. 
이 값들은 각각 RVA = 8750 (file = 7B50), RVA = 8760 (file = 7B60) 입니다.

참고로 이 위치는 첫번째 섹션(".text")의 끝부분으로써 빈 영역입니다. 제가 편의상 이 영역을 선정한 것이며 다른 위치에 선정하셔도 상관 없습니다.

일단 Hex Editor 로 RVA = 8750 (file = 7B50) 위치로 가서 아래 그림과 같이 값을 입력합니다.

<Fig. 13>

위 그림에 나타난 값들의 의미를 설명드리겠습니다.

INT 는 쉽게 말해서 RVA 배열인데요, 배열의 각 원소는 Import 하는 함수의 Ordinal(2 bytes) + Func Name String 구조체의 주소(RVA) 를 나타내며 배열의 끝은 NULL 입니다. 

<Fig. 13> 에서 INT 에는 1 개의 원소가 있고 그 값은 RVA 8770 입니다. RVA 8770 으로 가보면 Import 하려는 함수의 Ordinal (2 bytes) 와 함수 이름 문자열이 나타납니다.

Name 은 Import 하는 함수를 제공하는 DLL 파일의 이름 문자열 입니다. "myhack3.dll" 이라고 보이시죠?

마지막으로 IID 의 IAT(Import Address Table) 멤버에 대해 설명드리겠습니다.

#3 에서 IAT 값을 RVA = 1348 (file = 748) 로 세팅하였습니다. 참고로 이 위치는 원래 notepad 의 IAT 영역의 끝 부분입니다.
(INT 데이타와 IAT 데이타는 각각 뭉쳐서 존재합니다.)


<Fig. 14>

IAT 역시 RVA 배열입니다. 각 원소는 INT 와 같은 값을 가져도 좋고 NULL 을 가져도 좋습니다. INT 가 정확하다면 IAT 는 다른 값을 가져도 상관없습니다. 어차피 실행 시에 PE Loader 에 의해 메모리 상에서 실제 함수 주소로 덮어써집니다. (간혹 NULL 을 넣었을때 에러는 발생하지 않지만 DLL 이 정상 동작하지 않을 때가 있습니다. 확실한 건 INT 와 같은 값을 써주면 정확히 동작합니다.)

* 반드시 IAT 를 기존 IAT 영역에 쓸 필요는 없습니다만, 프로세스에 따라서 혹은 DLL 에 따라서 정상 동작하지 않는 경우가 있습니다. 세심한 테스트가 필요한 부분입니다.

여기까지 제대로 따라 하셨으면 작업끝입니다.



검증 (Test)


새로 만든 notepad_hack.exe 파일을 PE View 로 열어보겠습니다.


<Fig. 15>

마지막 섹션(".rsrc")로 IDT 가 옮겨졌으며, myhack3.dll 을 IMPORT 시키기 위한 IID 구조체가 정상적으로 세팅된 것을 확인 하실 수 있습니다.


<Fig. 16>

<Fig. 16> 에서 추가된 INT 도 확인 하실 수 있습니다.

notepad_hack.exe 와 myhack3.dll 파일을 같은 폴더에 넣고 notepad_hack.exe 를 실행해 보겠습니다.
Process Explorer 로 확인하면 아래 그림과 같습니다.


<Fig. 17>

notepad_hack.exe 에 myhack3.dll 이 로딩되어서 IE 가 정확하게 실행되는 화면을 보실 수 있습니다.

성공입니다!



Epilogue


설명이 길어서 자칫 복잡하게 느끼실 수 있습니다.

Import Directory Table 에 내가 원하는 dll 을 추가시켜서 실행 시 자동으로 로딩하게 한다는 기본 원리만 확실히 이해하시고, 관련된 PE Header 를 참고하시면 쉽게 하실 수 있으실 겁니다.

단, OS 와 SP 버전에 따라서 PE Loader 의 구현이 조금씩 다를 수 있으니 처음 하시는 분들께서는 약간의 시행 착오를 거치셔야 합니다. 또한 대상 프로세스와 DLL 파일의 프로그래밍에 따라서 약간씩 방법을 달리 적용해야 하는 경우도 있습니다.

그러나 위의 원리를 이해하신다면 어렵지 않게 해내실 걸로 생각합니다.


+---+


다음번에는 프로세스에 Injection 된 DLL 을 강제로 꺼내는 기법인 DLL Ejection 에 대해서 알아보도록 하겠습니다.


ReverseCore



저작자 표시 비영리 변경 금지
신고
  1. NIKA 2009.08.14 14:27 신고 댓글주소 | 수정 | 삭제 | 댓글

    멋진글 잘보고 있습니다 ^^

  2. lscpjyoon 2009.09.17 21:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말로 명 강의다.

    이 글을 읽으면서 문득 한가지 궁금한것이 있다면

    무슨일을 하시는분 인지 갑자기 궁금해 지네요 ;

    • reversecore 2009.09.17 22:46 신고 댓글주소 | 수정 | 삭제

      lscpjyoon님, 칭찬 감사합니다. ^^
      저는 Reverse Code Engineer 입니다.
      국내의 리버싱 기술 향상, 교류, 전파에 관심이 많습니다.

  3. juhens 2010.01.20 23:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    아우..제가 궁금해했던것입니다...
    고등학생때 거진 3년정도......전공이 이쪽계열이 아니라
    네이버에 질문을해봐도 대답을 해주는사람은 없고........
    우연히 여기서 궁금증을 해결하네요... 정말 감사합니다.

    • reversecore 2010.01.21 01:28 신고 댓글주소 | 수정 | 삭제

      juhens님, 안녕하세요.

      고등학교 때부터 벌써 리버싱에 관심이 있으셨군요.

      도움이 되셨다니 제가 기쁘네요~ ^^

      감사합니다.

  4. LHS 2010.04.04 17:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    와... 현재 리버싱에 관심이 많은 고2 학생에게는 단비와 같은 곳이네요...

    그런데 질문 하나 드려도 될까요?? 제가 이 글을 읽고 적당한 프로그램을 고르고 직접 시도해 보려고 했는데 위의 사진과 좀 다른 점이 있어서요...

    제가 DLL Injection을 시도한 프로그램에서는 모든 DLL의 IMPORT Directory Table에서 Import Name Table RVA, Time Data Stamp, Forwarder Chain이 모두 00000000이네요... 이 글을 읽고 따라해 봤지만 계속 오류 메시지만 뜨고... 어떻게 해야 하나요??
    (아, 또 이상한 점이 있네요... 제가 시도한 프로그램에서는 IMPORT Directory Table, IMPORT Address Table, IMPORT DLL Names, IMPORTS Hints/Names 항목(?)이 모두 rdata 섹션에 있네요... 원래 rdata섹션은 리소스가 있는 곳 아닌가요??

    • reversecore 2010.04.05 23:04 신고 댓글주소 | 수정 | 삭제

      LHS님, 안녕하세요.
      반갑습니다. ^^

      PE 파일에 따라서는 지적하신 3 가지 항목이 0 인 파일도 있을 수 있습니다. 보통 packer 류에 많지요.

      하지만 그런 파일도 Import Address Table RVA 항목은 값이 있을테니, 그걸 따라가면 Import Name Table RVA 와 같은 역할을 합니다.

      그리고 섹션 이름은 개발 도구에 따라서 달라지고요,
      packer 를 사용하면 변경할 수 있으며, 사용자가 수동으로 조작할 수 도 있습니다. 그리 중요한 의미는 없지요.

      또한 Import Directory Table 이 딱히 어느 섹션에 있어야 한다는 규칙같은건 없습니다. 그리고 그 섹션의 이름도 정해진건 없구요.

      리소스는 보통 .rsrc 섹션에 있는 경우도 많지만 위에서 설명드린바와 같이 다른 섹션 이름을 가지기도 합니다.

      PE File Format 은 상당히 느슨한 편이라서 어떤 절대적인 규칙이라고 할 만한 내용은 몇 개 되지 않습니다. 또한 그 규칙들 또한 OS 버전에 따라서 조금씩 다르게 적용되는 현실입니다.

      다른 질문 있으시면 또 올려주세요~

      감사합니다.

  5. gamjadory 2010.04.11 00:56 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘 보고 갑니다. 혹 dll 파일을 이용한 메모리 영역 변환에 대한 강좌는 없는지요... ㅠㅠ

    • reversecore 2010.04.11 23:04 신고 댓글주소 | 수정 | 삭제

      gamjadory님, 안녕하세요.

      메모리 영역 변환이란게 어떤 의미인지요?

      일단 프로세스에 침투하고 나면 프로세스 메모리의 내용 혹은 메모리 영역의 속성등은 전부 변경 가능해 집니다.

      혹시 질문하신 내용이 이와 다른 것인가요?

      감사합니다.

  6. 리버싱나그네 2010.08.06 12:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 열심히 강좌를 따라가고 있는데..ㅡㅜ 그림처럼 되지 않는 부분이 있어서요 ㅜㅜ 노트패드의 빈영역 그러니까 사용하지 않는 영역을 어떻게 찾죠? ㅜㅜ 그냥 00000 ~~ 이렇게 쭉~ 되어있는 곳에 복사해서 넣고 import table 값을 복사해서 넣은 주소로 바꿧는데, 자꾸 오류가 나구.. 그림처럼 되지를 않아요 ㅜㅜ 설명을 보면, DINGPADDINGXXPAD 라고 써져있는 곳이 있던데 저는 헥사로 봐두 그런 영역은 없어요 ㅜㅜ 문제가 뭘까요 리버스 코어님 ㅜㅜ(환경 : 윈도우 7)

  7. 리버싱나그네 2010.08.09 20:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다 ^^

    • reversecore 2010.08.10 12:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      제가 마침 예전에 월간 마소에 기고한 글이 있는데,
      바로 위 글의 내용을 Windows 7 으로 변경한 것입니다.

      아마 원하시는 내용이 이곳에 있을 것 같네요.

      제가 댓글로 따로 써드릴려고 보니... 아무래도 그림과 같이 보시는게 이해가 쉬우실것 같습니다...

      메일 주소를 알려주시면 해당 문서를 보내드리겠습니다. (잡지사와 협업한 문서라 원본 전체를 보내드릴 수 없음을 양해해 주시기 바랍니다.)

      감사합니다.

  8. 2010.08.10 21:02 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  9. BlueH4G 2010.08.13 21:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    헛,, 이번 글 보고 괜찮은 워게임이 떠올라서, 하나 만들어보네요 ㅋㅋ

    항상 리버스코어에서 많은 정보 얻어갑니다. ㅋ 앞으로도 좋은 글 많이 부탁드려요 xD

  10. binish 2010.08.17 11:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 모든 글에 정성이 깃들여져 있고 내공이 느껴집니다.
    훌륭한 강의에 감사드립니다.

  11. jaew 2011.02.15 16:50 신고 댓글주소 | 수정 | 삭제 | 댓글

    우연히 들어와서 그동안 궁금했던 것들이 해소되네요. 좋은 강의 잘 보았습니다. 감사합니다. !

  12. LinkC 2011.02.16 09:02 신고 댓글주소 | 수정 | 삭제 | 댓글

    IDT를 다른 section 으로 옮길 때 간혹 기존에 IDT가 있던 section 에

    쓰기 속성이 없으면 Access Violation 이 나는 경우가 있더군요.

    좀 더 조사해보면 나올거 같긴 한데 혹시 이 점에 관해 알고 계신가요?

    • reversecore 2011.02.18 22:41 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      수작업으로 IDT 를 변경하고 계신가요?

      ACCESS_VIOLATION 은 아마 IAT 때문일 것으로 생각됩니다. IAT 를 수작업으로 재작성 할때는 쓰기 속성을 주시는 것이 안전합니다. (IAT 는 로딩시에 로더가 실제 주소값을 채워주기 때문입니다.)

      혹시 다른 이유 때문이라면 해당 파일을 간략한 설명과 함께 저에게 보내주시면 제가 한번 봐드리겠습니다.

      reversecore@gmail.com

      감사합니다.

  13. Rony 2011.03.30 11:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    글읽다가 질문이 있어서 글 남깁니다..

    optional_hearer의 import_table 주소를 7604에서 13310으로 변경 한 후에

    왜 size값을 dc로 변경하는지 모르겠습니다. 7606 rva가 가르키는 곳은 import table이고 이곳은

    IDT, 즉 IID구조체의 배열일 탠데요.. 새로 IID를 하나 더 작성한 것도 아닌데 14h를 왜 더해주는거죠?

    • reversecore 2011.04.13 00:11 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      myhack3.dll 을 import 시키기 위해서 실제로 IID 구조체 하나를 추가하였습니다. 그래서 구조체 크기(0x14) 만큼 늘려준 것입니다.

      감사합니다.

  14. SmartSnake 2011.10.27 17:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    위에 virtualAddress는 어디에 명시되있어서 b0000 - (virtualaddress) + 8400 해야되는데
    버추얼 어드레스는어떻게 아셧나요.. ㅠㅠ;;

  15. 알려주세요 2012.06.30 19:06 신고 댓글주소 | 수정 | 삭제 | 댓글

    myhack.dll을 보면은 CreateThread를 통해 ThreadProc을

    호출했는데 이런거를 제외하면 전부 export를 해줘야 하나

    요?

  16. louboutin uk 2013.04.21 00:11 신고 댓글주소 | 수정 | 삭제 | 댓글

    착한 아내와 건강은 남자의 가장 훌륭 한재산이다.

  17. chlehd 2014.01.10 18:17 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 내주신 책 읽고 열심히 공부하는 한 뉴비입니다.
    제가 어떤 패커로 packing된 프로그램을 뚫어보려고 하는데요,
    ollydbg로 하나하나 진행하려다 안되서 dll injection으로 뚫을 수 없을까 하는데,
    아무래도 그 프로그램이 CreateRemoteThread() 함수를 감지하는 것 같아서 이전 방법들은 아예
    쓸 수가 없어서 이 방법으로 시도해보려고 합니다.
    만약 패킹이 다 풀린 그 시점에서 jmp하고 난 바로 그때를 감지하는 방법이 있을까요?

  18. yoo870701 2014.08.16 16:15 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요
    잘 안되는 것이 있어 질문드립니다.
    책 내용대로 INT, IAT 모두 셋팅해서 PeView 로 올바르게 셋팅된것을 확인후
    TestView_Patched.exe 를 실행하니
    프로시저 시작지점 을 DLL myhack3.dll 에서 찾을수 없습니다.
    라는 에러를 뿜어냅니다.

    환경은 xp sp3, visual c++ 2010 express입니다.
    myhack3.dll과 TestView_Patched.exe은 당연히 같은폴더에 있습니다.
    뭐가 문제일까요

  19. ㅇㅇ 2015.05.25 02:39 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다

  20. 리버싱스터디 2017.03.31 18:43 댓글주소 | 수정 | 삭제 | 댓글

    관리자의 승인을 기다리고 있는 댓글입니다





티스토리 툴바