리버서들이 가장 많이 사용하는 도구인 디버거(Debugger)에 대해 이야기 해보도록 하겠습니다.


리버싱 현업에서 사용되는 Debugger 들을 간략히 정리해 보겠습니다. 


1. OllyDbg



OllyDbg 는 사용이 편리하고 가볍고 빠른 무료 Debugger 입니다. 도저히 무료라고 보기 힘든 다양한 기능과 많은 Plugin 을 통한 확장성으로 인하여 수 많은 리버서들의 열광적인 지지를 얻고 있습니다. 

OllyDbg 는 리버싱 초보부터 전문가까지 폭넓게 사용되는 가장 인기 있는 디버거입니다.


<그림 1 - OllyDbg>

OllyDbg 의 장점으로는 가볍고 빠르며 상당히 다양한 기능과 많은 옵션을 제공한다는 것입니다. 또한 PlugIn 기능을 통한 확장성을 제공합니다. 가장 사용자가 많고 OllyDbg 를 이용한 리버싱 강좌가 많이 있기 때문에 초보자도 쉽게 배울 수 있습니다. 그리고 무료로 제공된다는 점도 큰 장점입니다.

단점으로는 개인이 혼자서 개발한 거라 업데이트와 후속 제품의 개발 주기가 늦다는 것입니다. 다행히 최근에 OllyDbg 2.0 Final 버전이 릴리즈 되었습니다. 비록 겉모습은 이전 버전과 동일하지만 내부 코드는 완전히 새롭게 프로그래밍 하여 속도와 정확성 등이 크게 향상되었다고 하네요.


2. IDA Pro



Hex-rays 사의 IDA Pro 는 현재 최고의 Disassembler & Debugger 라고 말할 수 있습니다. 과거에는 Disassembler 성격이 강했으나, 수많은 업데이트를 통해 Debugger 기능 또한 막강해 졌습니다. 

수 많은 다양한 기능들을 설명하는 전문 서적이 따로 존재할 정도로 엄청난 기능을 자랑합니다. 또한 Decompiler Plugin 등을 추가로 장착하면 리버싱이 말할 수 없이 편리해 집니다. 그만큼 가격도 비싸지요.

많은 리버싱 전문가들이 IDA Pro 를 주력으로 삼으면서 리버싱 전문 툴로써의 입지를 탄탄히 굳히고 있습니다.

장점으로는 다 써보지도 못할 정도로 다양한 기능과 충실한 업데이트를 들 수 있습니다. 다만 가격이 비싸고 사용법이 비교적 복잡하며 초기 로딩 시간이 좀 걸린다는 것을 단점으로 들 수 있겠습니다. 


<그림 2 – IDA Pro>


3. WinDbg



WinDbg 는 DOS 시절 16 bit 디버거인 debug.exe 의 Windows 버전입니다. 


<그림 3 – Debug.exe>

콘솔 화면에서 키보드만으로 디버깅을 하는 debug.exe 의 사용자 인터페이스를 그대로 가져왔습니다. 저는 이런 스타일의 프로그램을 매우 좋아하지만 반대로 거부감을 갖는 분들도 상당수 계십니다.

유저 모드 디버깅(User Mode Debugging) 분야에서는 사용자 편리성이 뛰어난 OllyDbg 나 IDA Pro 가 꽉 잡고 있습니다. 따라서 WinDbg 는 주로 커널 모드 디버깅(Kernel Mode Debugging)에 주로 사용됩니다. 전설적인 커널 디버거인 SoftICE 의 후속 제품 개발이 중단된 이후 커널 디버깅 분야에서 사실상 독보적인 존재가 되어 버렸습니다. (경쟁 제품이 없는 상태입니다.)

역사가 오래 된 만큼 기능도 다양하고 사용 방법에 대한 전문 서적이 여러 권 나와 있습니다.


<그림 4 - WinDbg>

장점은 커널 디버깅이 가능하다는 것과 Microsoft 에서 직접 만든 디버거라는 점입니다. 시스템 파일에 대한 심볼(Symbol)을 직접 다운 받을 수 있어서 시스템 내부 구조체(Undocumented 포함) 및 API 에 대한 정보를 얻을 수 있습니다. 또한 Windows OS 의 덤프 파일을 읽어 들여 분석할 수 있기 때문에 시스템 크래쉬(Crash)가 발생했을 때 원인을 분석해 낼 수 있습니다. 

단점으로는 다른 디버거들에 비해 좀 떨어지는 사용자 환경과 편의성을 꼽을 수 있겠습니다. (예를 들어 코드에 직접 주석을 입력할 수 없고, Disassembly 코드에서 호출되는 API 이름도 잘 표시되지 않는 등의 불편함이 있습니다.)

그래도 커널 드라이버 개발과 유지보수에 필수적으로 사용되는 디버거 입니다. 리버싱에서는 커널 드라이버 파일 분석에 주로 사용됩니다. 최근에는 대부분 WinDbg 와 VirtualPC(또는 VMWare) 조합으로 커널 디버깅을 수행합니다. 향후 여러분들의 리버싱 실력이 쌓인 후 커널 드라이버(예: Rootkit) 등을 분석할 때 자주 사용될 것입니다.

+---+

지금까지 리버싱 현업에서 사용되는 대표적인 디버거들에 대해서 간략히 살펴보았습니다.

제 경우에는 유저 모드 디버깅에 OllyDbg 1.10 를 사용하고, 커널 모드 디버깅에는 WinDbg 를 사용합니다.

ReverseCore

'tool' 카테고리의 다른 글

리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
(개인) 즐겨찾기  (0) 2009/06/02
Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
www.virustotal.com  (2) 2009/03/20
www.google.com  (2) 2009/03/06

Trackback Address :: http://www.reversecore.com/trackback/91 관련글 쓰기

  1. reversecore 2010/09/30 19:25 댓글주소 | 수정 | 삭제 | 댓글

    - 봉이님 댓글

    ㅁㅁ님!
    제가 리버싱 공부하면서, 안티리버싱, 악성코드 분석에 관심이 생겨서 인터넷 곳곳 돌아 봤는데요..
    안랩 연구원들 분께서 고려대, 서울여대 악성코드 분석 강의를 하시는 것 같더라구요..
    관련 강의자료를 구할수 있을까요?
    꼭 부탁드립니다.

    • reversecore 2010/09/30 19:26 댓글주소 | 수정 | 삭제

      안녕하세요~

      ^^ 제 실명을 거론 하셔서 제가 약간 가렸습니다. 양해바랍니다.

      강의에 대해서 잘 알고 계시군요?

      해당 자료는 수강생 이외에는 비공개 입니다.

      참고로 저도 한 섹션을 맡았습니다. ^^

  2. reversecore 2010/09/30 19:25 댓글주소 | 수정 | 삭제 | 댓글

    - 봉이님 댓글

    core님이 ㅁㅁ님 맞죠?
    혹시 core님 이름이 틀렸을수도 있으니, 제가 위에 표현한 ㅁㅁ님은 core님입니다.

    • reversecore 2010/09/30 18:45 댓글주소 | 수정 | 삭제

      ^^ 네 제가 그님(?) 맞습니다.

      봉이님께서는 혹시 저를 아시는 분인가요?
      너무 친숙하게 물어보셔서요~ ^^
      (비밀 댓글로 답해주시면 됩니다.)

  3. 2010/10/01 15:39 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010/10/03 23:07 댓글주소 | 수정 | 삭제

      안녕하세요.~

      네, 그러셨군요. ^^

      리버싱을 공부하고 싶으시다는 열의가 느껴집니다.

      죄송하지만 강의 자료를 제공해 드릴 수는 없습니다. (제가 작성한 거라도 불가능합니다.)

      그 대신 공부하시다가 막히시는 부분이 있을때 질문 올려 주시면 제 능력껏 답변 달아 드리겠습니다.

      감사합니다.

  4. 김종현 2010/10/02 23:40 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    처음 인사드리는 김종현입니다.
    테스트중 이상한 현상이 있어 문의 드립니다.

    아래와 같이 정말 간단한 DLL을 만들어 Injection하였는데
    이상하게 iexplore의 자식 프로세스들에서는 ::CreateFile()로
    파일이 생성되지 않는데
    그 이유가 심히 궁금하고
    해결방법에 대하여 고수님들께 조언을 구합니다.

    #include "stdafx.h"
    #include <stdio.h>
    #include <tchar.h>

    /////////////////////////////////////////////////////////////////////////////
    // _Inject

    class _Inject
    {
    public:
    static BOOL IsValidModule(LPCTSTR module_name)
    {
    static LPCTSTR valid_module_name_list[] =
    {
    //_T("notepad.exe"),
    _T("iexplore.exe"),
    NULL
    };
    for (int i=0; valid_module_name_list[i]; i++)
    {
    if (!_tcsicmp(module_name, valid_module_name_list[i])) return TRUE;
    }
    return FALSE;
    }
    }; //_Inject

    static BOOL IsValidCurrentModule()
    {
    TCHAR full_name[MAX_PATH];
    HMODULE module_handle = ::GetModuleHandle(NULL);
    ::GetModuleFileName(module_handle, full_name, MAX_PATH);
    TCHAR* module_name = full_name;
    for (int i=0; full_name[i]; i++)
    {
    if (full_name[i] == '\\') module_name = full_name + i + 1;
    if (full_name[i] == '/') module_name = full_name + i + 1;
    }
    if (!_Inject::IsValidModule(module_name)) return FALSE;
    LPCTSTR file_name = _T("c:\\zzz.txt");
    HANDLE file_handle = ::CreateFile(file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (file_handle != INVALID_HANDLE_VALUE) ::CloseHandle(file_handle);
    else
    {
    TCHAR text[256];
    _stprintf(text, _T("ERROR: Cannot create file \"%s\"!!!\nPID: %d"), file_name, ::GetCurrentProcessId());
    ::MessageBox(NULL, text, module_name, MB_OK);
    }
    return TRUE;
    }

    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    if (IsValidCurrentModule())
    {
    }
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }

    EXTERN_C __declspec(dllexport) LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
    {
    return CallNextHookEx(NULL, code, wParam, lParam);
    }

    • reversecore 2010/10/04 00:14 댓글주소 | 수정 | 삭제

      안녕하세요.

      iexplore.exe 의 자식 프로세스라면...
      7 버전 이후의 탭으로 생성되는 서브 프로세스를 말씀하시는 건지요?

      제 경우에는 정상적으로 c:\\zzz.txt 파일이 생성되었습니다.
      (WinXP SP3 & Win7)

      혹시 다른 경우를 말씀하시는 거라면 다시 질문 올려주세요~ ^^

      감사합니다.

    • 김종현 2010/10/04 12:22 댓글주소 | 수정 | 삭제

      테스트해 주셔서 감사합니다.
      그런데 정작 중요한 환경을 알려 드리지 않았네요.
      제가 테스트한 IE는 버전8이고
      말씀하신데로 탭으로 생기는 서브프로세스에서는
      전부 문제가 발생하고 있습니다.
      유독 부모프로세스만 문제 없구요.

      정확한 정보는 gmail로 다시 보내드리니
      IE8에서 다시 한번 더 봐 주시길 부탁드립니다.

    • reversecore 2010/10/05 21:21 댓글주소 | 수정 | 삭제

      네, 제 테스트 환경과 동일하시네요~

      전 보통 최신 .NET Framework 가 설치되지 않은 환경에서의 실행을 보장하기 위해 /MT 옵션으로 빌드합니다.

      제가 테스트한 파일을 김종현님 email 로 보내드릴테니 한번 실행해 보시고 결과를 알려 주시기 바랍니다. ^^

      * 보안 프로그램등에서 차단당하는 경우도 있으니 참고하시기 바랍니다.

      감사합니다.

  5. lain32 2010/10/04 19:53 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 :D
    계속해서 좋은글을 많이 올려주셔서 제가 기초가 부실한 부분들이 있었는데
    많은 도움을 받고 있습니다.
    그리고 정말 자세하게 설명하셔서 너무나도 많은 도움이 되고 있구요.
    이렇게 좋은 자료들을 열정적으로 공개해주셔서 너무 감사드립니다.

    힘내시라고 감사에 글을 적어봤습니다. ㅎㅎ

  6. 2011/02/17 22:47 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011/02/18 22:10 댓글주소 | 수정 | 삭제

      안녕하세요.

      아주 멋진 크랙미 사이트를 만드셨군요~

      구경 잘 했습니다.

      제 경우에 블로그 홍보를 따로 해본 적은 없습니다. ^^

      이곳에 방문 하시는 분들은 대부분 google 과 naver 검색으로 찾아오시는 분들입니다.

      감사합니다.

    • 2011/02/18 23:02 댓글주소 | 수정 | 삭제

      비밀댓글입니다

  7. 2011/09/02 12:01 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011/09/03 14:28 댓글주소 | 수정 | 삭제

      안녕하세요.

      비슷한 시간에 디버거를 만드신 다는 질문이 여러개 등록되어있군요. ^^

      OllyDbg 정도의 범용 디버거는 매우 높은 수준의 개발 실력과 시스템에 대한 이해가 필요하다고 생각하시면 됩니다.

      다만 특정 상황에서만 간단히 사용한다면... (Disassembler 도 필요없고 GUI 도 필요없고... 단순한 명령어만 디버깅한다고 했을때... ) 개발 난이도는 상당히 낮출 수 있습니다.

      커널 디버거는 저도 아직 어떻게 만들어야 할지 어렴풋이 감만 잡고 있는 수준입니다. ^^~

      감사합니다.

  8. 비밀 2011/12/21 15:59 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요? ^-^
    책 원고가 완성되었다고 하셨는데.. 개인적으로. 가능하다면.
    Immunity Debugger 에 대해서도 설명을 넣으면 좋을것 같습니다 :)
    제가 알기로 OllyDbg 를 만들던 분이 Immunity 로 이직하시면서 Python 기반으로 개발하신걸로 알고 있습니다. 물론 무료입니다 :)
    http://debugger.immunityinc.com

    수고하세요~

    • reversecore 2012/01/11 07:53 댓글주소 | 수정 | 삭제

      안녕하세요.

      Immunity Debugger 의 python 스크립트는 아주 좋습니다. 저도 많이 써봤지요.

      근데 OllyDbg 개발자는 다른 직업이 있고 그냥 취미로 OllyDbg 를 만든걸로 알고있는데요.

      Immunity Debugger 는 그냥 OllyDbg 클론이구요. 제가 잘 못 알고 있나요?

      감사합니다.

  9. 2012/02/09 20:13 댓글주소 | 수정 | 삭제 | 댓글

    이뮤니티 디버거 같은경우 올리디버거와 같지만 디버거 자체의 라이브러리가 좋다고 말할수 있을거 같아요. 거기다 파이썬 코드로 스크립트 가능하니까 윗분은 뭐 그런 부분을 집어 달라는게 아닐까요?

  10. 고로아기 2012/04/04 13:12 댓글주소 | 수정 | 삭제 | 댓글

    ollydbg로 분석해서 사진찍으신거 보니 스택보면 arg1이라고 나오고 설명에 무슨 함수 썼는지 옆에 다 나오더라고요... 전 안떠서 그런데 어떻게하나요 ㅠ.. 윈7 64비트인데 플러그인같은거 있던데 깔아도 안나와서요...



제가 개발한 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' 카테고리의 다른 글

리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
(개인) 즐겨찾기  (0) 2009/06/02
Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
www.virustotal.com  (2) 2009/03/20
www.google.com  (2) 2009/03/06

Trackback Address :: http://www.reversecore.com/trackback/76 관련글 쓰기

  1. 늅늅 2010/03/20 19:52 댓글주소 | 수정 | 삭제 | 댓글

    와우~Injection / Ejection 을 편하게 할 수 있게 프로그램까지 제작하셨군요~!

    많은 도움이 될 거 같습니다 *^^*

  2. reversecore 2010/03/22 09:55 댓글주소 | 수정 | 삭제 | 댓글

    예전 댓글 중에 어떤 분께서 GUI 버전을 고려달라고 하셨는데...
    답변해드릴려고 봤더니 그 댓글이 지워졌네요~ ^^

    InjDll.exe 를 GUI 로 꾸몄어도 좋았을겁니다.

    그냥 제 취향상 콘솔을 좋아하는 것이지요.
    개발도 익숙하고 실행파일 크기도 작고
    무엇보다 콘솔에서 키보드를 두드리는 그 느낌이 좋아서 말입니다. ^^

    감사합니다.

    • 늅늅 2010/03/24 19:33 댓글주소 | 수정 | 삭제

      저도 가끔은 콘솔로 작업하는게 더 멋져 보이더라는;;

      그래서 WINDBG 사용할때 심볼이나 덤프파일 연결도 커맨드에서 옵션 붙여서 사용하는 습관이 있어서그런지,WINDBG 실행시킨 상태에서 연결하는 걸 아직도 버벅이네요...ㅋ

    • reversecore 2010/03/25 23:49 댓글주소 | 수정 | 삭제

      늅늅님, 안녕하세요

      저랑 같으시군요. ^^

      감사합니다.

  3. sk 2010/04/29 12:05 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 좋은글, 좋은 프로그램 보고 갑니다.

    한가지 질문이 있는데, 위 프로그램으로는 SetWindowsHookEx 으로 injection 된건 ejection 같은데 맞나요?

    제가 잘못 사용한것이거나 혹시 방법을 알고 계시면 알려주시면 감사하겠습니다^^

    • reversecore 2010/05/01 23:34 댓글주소 | 수정 | 삭제

      네, 맞습니다.

      Ejection 방법의 원리는 FreeLibrary() API 를 호출하는 것인데요.

      static 하게 임포트된 DLL 과 SetWindowsHookEx() 를 이용해서 매핑된 DLL 은 FreeLibrary() 로는 언매핑 되지 않습니다.

      억지로 내리는 방법이 있긴 한데요, undocumented API 를 사용하는 거라서... 제가 테스트 해보니 안정성이 너무 안좋아서 소개해 드리지 않았습니다.

  4. 물여우 2010/05/26 18:41 댓글주소 | 수정 | 삭제 | 댓글

    덕분에 테스트용으로 유용하게 잘 사용하고 있습니다. ^^

  5. Sale 2010/07/06 21:19 댓글주소 | 수정 | 삭제 | 댓글

    Would you release source code for this program???

  6. 사운드사나이 2011/01/25 14:27 댓글주소 | 수정 | 삭제 | 댓글

    32비트후킹을 64비트에서도 지원하기 위해 자료 조사중입니다.
    64비트를 지원하기 위해 InjDll64.exe, dummy64.dll 를 새로 만드셨는데
    InjDll32.exe, dummy32.dll 과 소스가 다른 것입니까? 만약 다르다면
    어떻게 하면 64비트를 지원할 수 있는지요?
    64비트환경에서 32비트/64비트 프로그램으로 인젝션 하려고 합니다.
    부디 좋은 답변 부탁드립니다.
    혹시 참고할만한 소스가 있는지요?

    • reversecore 2011/01/25 22:49 댓글주소 | 수정 | 삭제

      안녕하세요.

      문의하신 두 파일은 32/64 bit 소스는 동일하고 빌드 설정만 차이가 있습니다.

      32 -> 32, 64 -> 64 로만 인젝션이 가능하구요.

      메일을 알려 주시면 위 소스를 보내드리겠습니다.
      (코드 정리가 좀 덜 되서 아직 공개하지 않았습니다.)

      감사합니다.

  7. 알고싶어요 2011/01/25 17:13 댓글주소 | 수정 | 삭제 | 댓글

    Study에 있는 강좌는 PID로 injection할 프로세스를 찾았습니다. Global Hooking강좌에서도 프로그램 이름으로 대상 프로세스를 결정했습니다. 프로그램 이름으로 하는 방법은 Study에 공개되지 않은듯합니다. 프로그램 이름으로 하는 방법에대해 관련 소스를 공개해주실 수 있나요?
    위의소스코드를 요구하시는 분의 글에 대한 답변도 PID로 하는 것입니다. 자식 프로세스 모두에 적용할 때 프로그램 이름으로 하였습니다. 관련 내용을 알려주셨으면 감사합니다.

    • reversecore 2011/01/25 22:54 댓글주소 | 수정 | 삭제

      안녕하세요~

      네, 역시 위 소스를 보시면 될 것 같습니다.

      메일을 알려주시면 보내드릴께요~

      향후 코드를 좀 정리해서 블로그에 올릴 예정입니다.

      감사합니다.

  8. 2011/01/27 15:08 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  9. 사운드사나이 2011/01/26 13:23 댓글주소 | 수정 | 삭제 | 댓글

    reversecore 님 빠른 답변에 감사드립니다.
    저는 그동안 32bit OS에서 후킹을 하기 위해서 IAT 후킹과 Detours(jmp)하는 방법을 혼용해서
    사용하고 있습니다.
    reversecore 님이 작성하신 소스는 어느쪽에 해당되는지요?
    그리고 32->32, 64->64로만 인젝션이 가능하다고 하셨는데 그럼 안되는 것도 있나요?
    이번에 정안되면 기존 소스를 Detours로 완전 교체할까도 생각중입니다.
    우선 제 메일 주소는 nason8@gmail.com 입니다.
    우선 답변 감사합니다.
    아 그리고 메일로도 같은 질문을 하였는데 메일은 잘 확인을 안하시나봐요? ^^

    • reversecore 2011/01/31 11:50 댓글주소 | 수정 | 삭제

      안녕하세요.

      두번째 점프 코드 패치 방법(detour) 입니다.

      인젝션 안되는 경우라 하시면...
      32->64, 64->32 이런식의 인젝션은 실패합니다.

      MS 에서 그러한 DLL 로딩은 아예 막아놓았습니다.

      아, 그리고 메일 확인했습니다. ^^

      InjDll 소스 코드를 보내드렸습니다.
      (책이 출판되기 전까지는 다른 곳에 공개하지 말아주시기 바랍니다.)

      감사합니다.

  10. Alfred 2011/02/04 16:03 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요!

    InjDll32.exe notepad.exe -i dummy32.dll 을 실행시키니

    The token does not have the specified privilege. 가 뜨는데요???

    • reversecore 2011/02/09 21:47 댓글주소 | 수정 | 삭제

      안녕하세요.

      아마 로그인한 계정이 "관리자" 속성이 없어서 그런것 아닐까요?

      계정을 확인해 보시기 바랍니다.

      감사합니다.

  11. Dual 2011/02/20 23:07 댓글주소 | 수정 | 삭제 | 댓글

    우왕 /('ㅅ')/ 64 injector 네용
    테스트용으로 감사하게 쓰겠습니다~~ 만쉐에

  12. 아침햇살 2011/02/24 16:06 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~^^
    reversecore님의 만드신 dll injection코드를 가지고 여러가지로 공부하고 보안쪽을 위해 개발도
    하고 있는데요~~
    dll 인젝션이 않되는 프로세스가 있어서.. 64bit 윈도우7 인데요~
    프로세스명은 LSSrvc.exe 입니다... 이 프로세스에 대해 조사해 보니 lightscribe.com에서 제공하는
    LightScribe 디스크에 이미지를 인쇄하는 라이트 스크라이브 응용프로그램이라고 하네요~
    (네로 및 레코딩 프로그램 설치시 같이 설치될수 있다고 합니다.)
    왜 이놈에 DLL 인젝션이 안되는지..흠;;;; 프로세스 핸들을 못구해오는 것도 아니고..
    인젝션후 WaitForSingleObject 여기서 무한정 기다리는걸로 설정해놨는데...무한정 기다리네요.
    흠... 뭔가 더 정보가 나오면 다시 글 남기겠습니당 ^^ 수고하세요~

    • 아침햇살 2011/02/25 13:19 댓글주소 | 수정 | 삭제

      으윽...아니네요..제가 뭔가 실수를 한거 같습니다...
      우선 제가 제작한걸로 인젝션후에 않되길래 reversecore님이 한걸로 했는데도 안되서...제가 그렇게 생각을 한거 같습니다..

      재부팅후 reversecore님이 만들걸로 먼져 시도하였더니 정상 동작됨을 확인하였습니다...

      아무래도 제가 한 부분에 먼저 문제가 있는거 같습니다.~~

      reversecore님이 만든 인젝터는 정상동작합니다^^

    • reversecore 2011/02/28 15:48 댓글주소 | 수정 | 삭제

      아, 그러셨군요~ ^^

  13. 2011/02/25 17:34 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  14. 2011/06/24 21:35 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  15. 2011/07/07 17:23 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011/07/14 05:35 댓글주소 | 수정 | 삭제

      안녕하세요.

      NtCreateThreadEx() 가 실패할 때 에러값을 확인해보시고요.

      아마 제 생각에는 권한(특권:Privilege) 문제 같습니다.

      BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
      {
      TOKEN_PRIVILEGES tp;
      HANDLE hToken;
      LUID luid;

      if( !OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
      &hToken) )
      {
      _tprintf(L"OpenProcessToken error: %u\n", GetLastError());
      return FALSE;
      }

      if( !LookupPrivilegeValue(NULL, // lookup privilege on local system
      lpszPrivilege, // privilege to lookup
      &luid) ) // receives LUID of privilege
      {
      _tprintf(L"LookupPrivilegeValue error: %u\n", GetLastError() );
      return FALSE;
      }

      tp.PrivilegeCount = 1;
      tp.Privileges[0].Luid = luid;
      if( bEnablePrivilege )
      tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
      else
      tp.Privileges[0].Attributes = 0;

      // Enable the privilege or disable all privileges.
      if( !AdjustTokenPrivileges(hToken,
      FALSE,
      &tp,
      sizeof(TOKEN_PRIVILEGES),
      (PTOKEN_PRIVILEGES) NULL,
      (PDWORD) NULL) )
      {
      _tprintf(L"AdjustTokenPrivileges error: %u\n", GetLastError() );
      return FALSE;
      }

      if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
      {
      _tprintf(L"The token does not have the specified privilege. \n");
      return FALSE;
      }

      return TRUE;
      }

      위 함수를 추가해 주시고요.
      (위 코드는 MSDN 에서 검색 하실 수 있습니다.)

      인젝션 하기 전에 아래와 같이 호출해 주세요.

      SetPrivilege(SE_DEBUG_NAME, TRUE);

      잘 안되시면 다시 질문 올려주시기 바랍니다.

      감사합니다.

  16. 2012/01/07 16:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2012/01/11 07:20 댓글주소 | 수정 | 삭제

      안녕하세요.

      OpenProcess() 호출 실패한다는 뜻인가요?

      www.reversecore.com/44 를 참조해서 해보시구요.

      보통 OpenProcess() 호출 실패는 말씀하신 권한 문제인 경우가 많습니다. 바로 위의 댓글을 참고하셔서 작업해 보세요.

      감사합니다.

  17. 2012/03/12 18:12 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  18. yg 2012/03/14 09:34 댓글주소 | 수정 | 삭제 | 댓글

    점프코드로 메모장 파일저장 후킹을 하고 있습니다.
    64비트 윈도우7에서 하고 있는데요, 제 컴퓨터에선 잘 동작하는데, 다른 컴퓨터만가면 저장할때 메모장이 죽더라구요...
    그래서 디버깅을 해보니, 제 컴퓨터에선 점프주소를 통해 제가 생성한 함수로 잘 찾아가는데 비해 다른 컴퓨터에서는 그 주소에 Memory Access violation이 발생하더라구요... 혹시 주소값을 DWORD로 지정하여서 그런가 싶어 unsigned __int64로 선언하고 진행하여 보아도 안되구요...
    리버스코어님 소스를 바탕으로 하고 있는데 뭐가 문제인가 싶어 이렇게 질문드립니다.
    정말 미치겠네요ㅠㅠ 며칠째 해결 못하고 있어요...
    참..! 32비트에서는 정상 동작 확인 하였습니다!

  19. 2012/04/19 21:24 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  20. 지수경 2012/05/14 10:30 댓글주소 | 수정 | 삭제 | 댓글

    항상 많은 도움을 받고 있습니다.~
    위 소스를 혹시 받을 수 있을까요? 댓글에 올라온 소스를 보니 최신이 아닌듯 해서용~
    부탁드립니다.^_^
    iam1004@gmail.com
    고맙습니다.^_^


(개인) 즐겨찾기

tool 2009/06/02 12:28
구글 네이버 다음 MS

티스토리 이글루스 올블로그 한RSS

옥션 gmarket funshop 1300k yes24

clien slrclub revu 뽐뿌 zdnet 지디넷

gmail calendar docs gtalk gmap

'tool' 카테고리의 다른 글

리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
(개인) 즐겨찾기  (0) 2009/06/02
Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
www.virustotal.com  (2) 2009/03/20
www.google.com  (2) 2009/03/06

Trackback Address :: http://www.reversecore.com/trackback/33 관련글 쓰기




Process Explorer


Windows 최고의 프로세스 관리 도구 Process Explorer 입니다.

https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

저 유명한 sysinternals (현재는 MS에 인수되었음) 의 Mark Russinovich 씨가 만든 프로세스 관리 유틸리티입니다.

이분은 Windows 운영체제에 대해서 매우 해박한 지식을 갖고 있으며,
유용한 유틸리티(FileMon, RegMon, TcpView, DbgView, AutoRuns, Rootkit Revealer, etc) 들을 만들어 공개하였습니다.

언젠가 한번은 FileMon 과 RegMon 의 소스 코드를 공개하신적이 있습니다. (지금은 없어졌지요.)
Windows 운영체제 초창기에 (맨땅에 헤딩하던) 시스템 드라이버 개발자들에게 있어서
그 소스들은 그야말로 사막의 오아시스 같은 존재였습니다.

각설하고 Process Explorer 의 실행화면을 보실까요.


< Fig.1 - Process Explorer 실행화면 >

Windows 작업관리자와는 비교 할 수 없는 아주 뛰어난 화면 구성을 보여주고 있습니다.

화면 위의 좌측에는 현재 실행중인 프로세스들을 Parent/Child 의 트리 구조로 표시하고 있습니다. (무려 아이콘 까지!!!)
우측에는 프로세스 각각의 PID, CPU 점유율, 등록정보 등을 보여줍니다. (Option 을 통해 더 추가 가능)

화면 아래(욥션)에는 선택된 프로세스에 매핑된 DLL 정보 또는 해당 프로세스에서 오픈한 object handle 을 표시합니다.



구체적으로 뭐가 좋은거죠?


좋아 보이기는 하는데 구체적으로 뭐가 좋은건지 궁금하시죠?

저는 리버싱 할 때 항상 Process Explorer 를 같이 띄워놓고 합니다.
제가 Process Explorer 를 좋아하는 이유는 이렇습니다.

  • Parent/Child 프로세스 트리 구조
  • 프로세스 실행/종료시 각각의 색깔(초록/빨강)로 표시
  • 프로세스 suspend 기능 (실행 중지)
  • 프로세스 종료(kill) 기능 (Kill Process Tree 기능 지원)
  • DLL/Handle 검색 (프로세스에 인젝션된 DLL 검색 또는 특정 파일을 오픈한 프로세스 검색)

  • 이외에도 다양한 기능들이 있습니다만, 위 기능들이 특히 리버싱 할 때 많이 사용되는 기능들입니다.
    그리고 꾸준한 업데이트(버그 수정, 기능 추가)도 큰 장점입니다.



    sysinternals


    sysinternals 홈페이지에 가보시면 Process Explorer 의 미니 콘솔 버전들이 있습니다.
    (PsKill, PsSuspend, PsList, etc)

    이 유틸들도 받아서 실행해 보세요. Process Explorer 의 기능을 축소시킨 멋진 콘솔 버전 프로그램들입니다.

    리버싱을 위해 Windows 내부구조를 공부하시는 분들께서는 간단히 이런 콘솔 프로그램을 따라 만들어 보세요.
    프로세스와 DLL 등에 대한 이해를 높일 수 있습니다.
    (제 경험상 따라 만드는 방법이 실력 향상을 위한 가장 좋은 방법입니다. ^^)



    이상으로 최고의 프로세스 관리 유틸리티 Process Explorer 에 대한 소개를 마칩니다.



    'tool' 카테고리의 다른 글

    리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
    InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
    (개인) 즐겨찾기  (0) 2009/06/02
    Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
    www.virustotal.com  (2) 2009/03/20
    www.google.com  (2) 2009/03/06

    Trackback Address :: http://www.reversecore.com/trackback/29 관련글 쓰기


    www.virustotal.com

    tool 2009/03/20 04:55

    "무료 온라인 바이러스/악성 소프트웨어 검사 서비스"

    새로운 파일을 접했을 때 그 파일이 악성 파일인지 검사해 보는 것은 매우 중요한 일입니다.
    자칫하면 OS 를 재설치 해야 하는 상황이 벌어질 수 도 있기 때문이지요.

    쉽고 간단하게 악성 파일 여부를 검사해주는 무료 서비스가 있습니다.

    전세계 유명 Anti-Virus & Anti-Spyware 제품을 사용하여 악성 파일을 검사해주는 virustotal 입니다.
    www.virustotal.com (한국어 서비스도 제공됩니다!)

    홈페이지에 소개된 글을 보면 아래와 같은 특징이 있습니다.

    • 무료이며, 독립된 서비스입니다.
    • 여러 회사의 안티바이러스 엔진을 사용합니다.
    • 바이러스 정의를 실시간으로 자동 업데이트합니다.
    • 어떤 바이러스에 걸렸는지 알려드립니다.
    • 실시간으로 전세계적인 통계를 만들어냅니다.



    웹, 이메일, 전용 프로그램 등을 통해서 검사를 원하는 파일을 전송할 수 있습니다.
    제가 가진 유틸리티 중에서 해킹에 종종 사용되는 파일을 올려보겠습니다.


    이미 검사한 파일이라고 나타납니다.
    마지막 검사 날짜는 2008.11.09 일이고, 결과는 36개 제품 중에서 15개 제품이 악성 이라고 판별했군요.

    [지금 다시 검사하기] 버튼을 눌러서 오늘 날짜의 최신 제품으로 검사를 해보도록 하겠습니다.
    약간의 기다림 후에 아래와 같은 결과 화면이 나타납니다. (너무 길어서 그림을 축소 하였습니다.)


    현재 시점에도 많은 제품에서 진단을 하고 있습니다. (not a virus 라는 진단명이 재미있군요.)

    이처럼 세계 유명 보안 업체의 제품을 이용하여 간편하게 악성 파일 여부를 검사할 수 있다는 것이 최대 장점입니다.

    새로운 파일을 분석하기 전에 virustotal 을 이용하는 습관을 들여보세요.

    검사 결과 악성 파일로 의심된다면 중요한 컴퓨터에서 분석하지 마시고,
    분석용 테스트 컴퓨터 (또는 Virtual Machine) 에서 분석을 진행하세요.

    모두들 안전한 PC 생활을 하시기 바랍니다. ^^



    'tool' 카테고리의 다른 글

    리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
    InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
    (개인) 즐겨찾기  (0) 2009/06/02
    Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
    www.virustotal.com  (2) 2009/03/20
    www.google.com  (2) 2009/03/06

    Trackback Address :: http://www.reversecore.com/trackback/17 관련글 쓰기

    1. eew 2010/02/20 12:37 댓글주소 | 수정 | 삭제 | 댓글

      저기에 리버스 커넥션을 하는 바이러스를 만들어 넣으면 백신업체 서버에서 접속을 합니다 ㅋㅋ


    www.google.com

    tool 2009/03/06 01:17


    Reverse Code Engineering 을 하는데 가장 필요한 것 2 가지만 선택하라고 한다면,
    첫째는 열정 이고, 둘째는 Google 을 선택하겠습니다.

    사실 무슨 일을 하던지 열정이 가장 중요하고
    그 다음으로는 구체적인 작업 진행 방법에 대한 정보의 수집인데,
    역시 최고의 검색엔진 google 이 가장 유용하다고 할 수 있습니다.


    <Fig. 1>

    국내 포탈 사이트에서 제공하는 웹 페이지 검색 기능은 좀 기초적인 수준입니다.
    반면에 세계 최고의 검색 엔진 google 은 원하는 정보를 거의 정확하게 찾아줍니다.

    Reverse Code Engineering 분야는 해외에서 각광받는 분야이기 때문에
    초중급 리버서들에게 필요한 모든 정보들이 이미 웹 사이트에 잘 정리되어 있다고 볼 수 있습니다.
    (즉, 내가 지금 하고 있는 일들은 이미 누군가가 해본 후 잘 정리까지 해뒀다고 생각하시면 됩니다.)

    단 하나의 걸림돌은 외국어 (특히 영어) 인데요, 이것은 SW 엔지니어의 숙명이라고 생각합니다.
    무조건 영어를 잘하기 위해서 노력하지 않으면 안됩니다.

    * 요즘은 중국에서 리버싱 관련 사이트들이 굉장히 많아 졌으며, 새로운 리버싱 강국으로 떠오르고 있습니다.
      영어외에도 중국어를 잘 익혀놓는다면 리버싱에 많은 도움이 될 것입니다.


    이제부터 google 을 이용해서 리버싱에 필요한 정보, 강좌, 유틸리티 등을 얻고 맘껏 공부하시기 바랍니다.

    'tool' 카테고리의 다른 글

    리버싱 현업에서 사용되는 디버거(Debugger)들  (21) 2010/09/29
    InjDll.exe – DLL Injection/Ejection 전용 도구  (37) 2010/03/15
    (개인) 즐겨찾기  (0) 2009/06/02
    Process Explorer - 최고의 작업 관리자  (0) 2009/05/03
    www.virustotal.com  (2) 2009/03/20
    www.google.com  (2) 2009/03/06

    Trackback Address :: http://www.reversecore.com/trackback/12 관련글 쓰기

    1. ㅈㄷㄱ 2011/10/29 11:31 댓글주소 | 수정 | 삭제 | 댓글

      ㅈㄷㄱ

    2. 2012/01/27 13:54 댓글주소 | 수정 | 삭제 | 댓글

      비밀댓글입니다