리버서들이 가장 많이 사용하는 도구인 디버거(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' 카테고리의 다른 글

PEView.exe  (48) 2013.01.27
HxD.exe 기능 추가!  (13) 2012.06.14
리버싱 현업에서 사용되는 디버거(Debugger)들  (31) 2010.09.29
InjDll.exe – DLL Injection/Ejection 전용 도구  (101) 2010.03.15
Process Explorer - 최고의 작업 관리자  (1) 2009.05.03
www.virustotal.com  (3) 2009.03.20
www.google.com  (2) 2009.03.06
  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비트인데 플러그인같은거 있던데 깔아도 안나와서요...

  11. 흠... 2012.10.29 00:19 신고 댓글주소 | 수정 | 삭제 | 댓글

    Cheat Engine 도 추가...
    분석할 때만 유용한 도구가 있더군요.
    요즘엔 올리디버거랑 IDA 안쓰고, CE를 사용중입니다.

    단순한 메모리 에디터 같은 경우 value를 잡고 변화한 value를 넣어 아닌 값들을 걸러내는데...
    이 아이디어를 확장해서...
    CE에서는 함수나 분기문 코드가 실행 되었는지 안되었는지,
    데이터 search 하는 것처럼 걸러내서 목표한 위치에 바로 갈 수 있으니까요.
    이게 핵심인듯...
    기존엔 프로시저들을 분석해야했지만, 이렇게 하니 시간을 대폭 줄일 수 있네요.

    • reversecore 2012.10.30 07:15 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      좋은 정보 감사합니다. ^^~

      업무적으로 분석을 하다보면 시간에 쫒길때가 많은데요.
      Cheat Engine 을 구해서 꼭 살펴봐야 겠습니다.

      감사합니다.

  12. 리버서 2012.12.02 23:35 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    저는 옴니아2에서 주로 어플을 짜는데요.
    옴니아2에서 돌아가는 어플은 올리디버그가 안되는것 같은데요.
    옴니아 같은 스마트폰 어플 디스어셈블 하는 방법 같은 거 있으시면 좀 알려주시면 감사하겠습니다.

    • reversecore 2012.12.04 21:01 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      옴니아2라면 Windows CE 말씀하시는것 같군요.

      그건 아마 ARM 계열의 CPU를 사용하겠죠?
      OllyDbg 는 x86 계열의 CPU만 디버깅 할 수 있습니다.

      옴니아 어플 디버깅 방법은 저도 아는 바가 없습니다. ^^

      감사합니다.

  13. 비비케이 2013.03.02 00:37 신고 댓글주소 | 수정 | 삭제 | 댓글

    Cheat Engine도 확실히 괜찮은 편인데 ... 없는거 보고 약간 흠칫했네요. 올리디버거보다 훨씬 선호하는 편입니다.

    • reversecore 2013.03.04 21:15 신고 댓글주소 | 수정 | 삭제

      안녕하세요~

      그렇군요~ 저희 분석가들도 손에 익은 도구만 쓰는 경향이 있어서 다들 IDA Pro 아니면 OllyDbg 만 쓴답니다. CE 도 꼭 써봐야 겠어요~ ^^

      감사합니다.

  14. 크로우 2013.05.01 18:40 신고 댓글주소 | 수정 | 삭제 | 댓글

    올리디버거에서 주석이나오는 부분들에서
    API주석이 제대로안나오는데 어떻게해야되죠?
    책에서는
    Style = MB_OK|MB_APPLMODAL
    Title = "abex' 1st crackme"
    Text = "Make me think your HD is a co-rom"
    h0wner = NULL
    MessageBoxA
    이런식으로 나오는데
    저가 올리디버거를 켜서보면

    자세하게 안나오고 ASCII "문자열"
    이것만 나와요 ㅠㅠ.. 간혹 주소를 잘못찾은줄알고 헷갈려서 헤메네요 ..

  15. 허허실실 2013.05.02 01:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요 책보고 열심히 따라 하는 잡생 입니다 ^^ 다름이 아니라 저는 올리디버거 실행 시키면
    You do not have administrative rights on this computer, As a result some debugging features may fail. To enable all OllyDbg features, please log in as administrator 라고 뜨네요 ,,,
    관리자 권한이 어쩌구 저쩌구 하는대요 작동은 되는대 뭔가 느낌표 표시랑 같이 떠서 경고문 같아요 .. 리버스코어님도 이런거 뜨나요 ??

  16. substr_sql 2013.07.09 12:08 신고 댓글주소 | 수정 | 삭제 | 댓글

    IDA PRO 와 현 올리디버거 의 디버거 Adminstraitive 를 같이 사용하면
    debugging Error 03 이 뜨는이유는 무엇일까요 ㄷㄷ;; [압박]

  17. 이x철 2015.01.26 10:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    하드웨어로 밥벌이 하다 네트웤 nos 언어를 공부하다 보니 디버깅이 눈에 띄어
    OllyDbg를 찾게 되었네요..(아직 때는 아니지만요^_^)
    책도 있나 보군요..? 디버거들의 개념을 짚어 주셔서 도움 되었습니다.
    감사합니다(__)
    저와 같은 경고문을 보신 허허실실님...두번째 실행은 admin권한으로 실행 하셨겠죠?ㅎㅎ



책소개


제가 요즘 회사일, 집안일 외에 대부분의 시간에 리버싱 서적을 열심히 쓰고 있습니다. 책 홍보를 위해 간략히 소개해 드리자면 타겟 독자층은 "리버싱 입문을 원하는 초보자"와 "리버싱 레퍼런스가 필요한 중급자" 입니다. 컨셉은 "내부 동작 원리를 아주 쉽고 뜨겁게 이야기" 하는 것입니다. 분량은 (제발) 1,000 페이지가 넘지 않도록 노력 중입니다. 책 내용은 블로그 내용을 좀 다듬어서 60% 정도를 채우고, 새로운 주제를 써서 나머지 40% 정도를 채울 예정입니다. 그리고 실습 예제를 많이 넣으려고 합니다.


일정


집필 일정은 늦가을까지로 예정했었습니다. 그런데 쓰면 쓸수록 제 자신이 점점 진지해지면서 입문자에게 필요하다고 생각되는 범위와 분량이 대폭 늘어나고 있습니다. 일정과 분량을 조절할 필요가 있네요. 욕심을 자제하려고 노력도 해봤지만, 진정한 "리버싱 입문서"를 독자에게 제공해야 한다는 사명감(?) 같은 게 생겨서 이젠 굳이 자제하려고 노력하지 않습니다. ^^


조언


제 블로그를 방문하시는 분들 중에서 혹시 제가 책에서 다루면 좋겠다고 생각되는 주제(또는 조언, 건의, 아무거나)가 있으시다면 댓글로 알려주시기 바랍니다. 작업에 큰 도움이 될 것입니다.


블로그


블로그에 글을 많이 올리지 못해서 자주 방문하시는 분들께 죄송하다는 말씀을 드립니다. 집필이 끝나면 제 블로그에는 실전 리버싱 실습 위주로 포스팅을 할 예정입니다. 그리고 책에 미처 쓰지 못한 내용들을 올리게 될 것입니다.

제 블로그는 매일 방문하고 있습니다. 댓글의 질문들에 답변도 올리고, 이메일로 문의하신 내용도 꼭 챙겨읽고 답변 드리고 있습니다. 리버싱 하시다가 궁금한 점 있으시면 부담 갖지 마시고 질문해 주세요. 저는 같이 생각해 보는 것을 좋아합니다. 답변 달면서 제가 더 많이 배우니까요.

그리고 바쁘더라도 종종 글을 올려야겠어요. 예전에는 블로그 포스팅 하는게 저의 즐거움 이었는데 말이죠. 요즘엔 글을 쓰기만 하고 올리지는 않으니 즐거움이 하나 줄었어요.

방문해 주시는 모든 분들께 감사 드립니다.
댓글, 이메일 보내주시는 분들에게도 감사드려요. 여러분께서는 모두 가까운 미래에 '열혈 리버서' 가 되실 것입니다.

감사합니다. 

* 제가 좋아하는 멘트를 하나 남길께요~ 제 트위터에도 쓴 내용입니다. (트위터를 혼잣말 하는 공간으로 활용하기 때문에 Follow, RT 이런거 없어요. ^^)

"똑같은 시기에 비슷한 생각을 하는 사람은 많지만 실천에 옮기는 사람은 드물다. 나는 생각을 행동에 옮겼을 뿐이다. 기회는 도전하고 실천하는 자가 받는 선물 같은 것이다." - 강덕수, STX 그룹 회장 (창업주)

    이전 댓글 더보기
  1. Angelibra 2010.11.21 03:29 신고 댓글주소 | 수정 | 삭제 | 댓글

    매번 혼자 독식하다가 reversecore님의 깔끔하게 정리된 글들을 보면서 다시 복습하게 되는데..
    매번 유용한 글들 올려주셔서 감사합니다 :)
    기대됩니다.. 국내 몇개 안되는 리버싱서적 !
    리버서가되려고 공부하려는 분들께 좋은 바이블책이 될 것 같습니다
    나오면 바로 당장 구입해야겠군요 :)

  2. 2010.12.16 15:28 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.01.25 23:54 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      C 언어 리컴파일링 말씀이신가요?

      음... 그런건 없네요. ^^

      그리고 어셈의 조건분기는 매우매우 다양합니다.
      C 컴파일러는 그 중에서 일부만 사용하는 것이지요. ^^~

      감사합니다,

  3. GGuy 2011.01.20 10:22 신고 댓글주소 | 수정 | 삭제 | 댓글

    책 출판 과정이 얼마나 진행 되었나요? ㅠ

    • reversecore 2011.01.25 23:55 신고 댓글주소 | 수정 | 삭제

      안녕하세요~

      마지막 챕터 작성중이라고만 말씀드릴 수 있겠네요~

      이젠 섣불리 출간 날짜를 예상하는게 무서워요~ ㅠㅠ

      감사합니다.

  4. chum 2011.02.06 17:04 신고 댓글주소 | 수정 | 삭제 | 댓글

    책이 기대되네요.

    저는 리버싱을 그냥 재미로 배워보고 싶은데 책들이 다들 어려운거 같습니다.

    리버스코어님의 책은 그런 책이 아니었으면 좋겠네요.

  5. 아침햇살 2011.02.07 09:40 신고 댓글주소 | 수정 | 삭제 | 댓글

    책이 언제 나올까요 너무너무 기대됩니다.~~ +.+
    얼렁 나왔으면 좋겠어요~~ 바로 질러버리겠습니다~ *.*
    대략 예상 출간 날짜라도 살짝 귀뜸좀..ㅋㅋ

  6. 주황 2011.02.10 13:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    책 출간을 앞두고 있다니 감축 드립니다.
    책에대한 기대감도 크지만 솔직히 걱정과 우려가 앞서네요.

    우선 저같이 지극히 짧은 프로그래밍 경험을 가진 리버싱을 전혀 모르는 쌩초짜의 경우
    100% 동일하게 따라하기식을 원하고 이 싸이트 또한 그리 진행되고 있어 매우 흥미를 갖고
    시작해보았지만 초반 두어 페이지 후 진행 후 꽉막혀 잠시 뎌뎌지다가 아예 포기상황에
    이르게 됐네요.

    문제는 얼추 비슷하게는 가지만 100% 동일하지 못하다는 겁니다.
    이 블로그에서 제시한 동일 버전의 디버거를 사용하지만 블로그의 캡쳐 사진과
    실제 돌아가는 디버거는 조금씩 틀리더군요.
    물론 환경에 따라 조금씩 다른 부분이 발생할 수 있는 부분이 있겠지만
    그 이상 달랐던거 같습니다.

    하다하다 정말 모르겠고 안되서 문서로 정리하여 질문드리려던 찰나
    업무에 쫓겨 지금까지 손놓고 있었네요.

    잠시 여유가 생겨 처음부터 다시 보려고 하는데
    이번엔 안되는 부분 만나면 바로바로 정리해 보려고 합니다.
    아무쪼록 정말 쉽게 따라할 수 있고 이해할 수 있는 명저서가 되길 바랍니다.

    여기를 알게된 Inject DLL 의 경우는 VC6 에서 작업하면 되는데, VC2005 나 VC2008 에서 하면
    안됐었네요.. 제 컴퓨터가 이상했던건지.. 이것도 참 궁금하고..

    님은 누굴까 정말 궁금했는데 책이 나오면 드디어 님 정체를 알 수 있겠군요..^^

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

      안녕하세요.

      좋은 지적 감사합니다.

      책의 완성도를 높이기 위해서 말씀하신 대로 모든 실습 예제들에 대해서 전부 확인해 봐야겠습니다.

      제 정체(?)는 평범한 회사원이랍니다. ^^

      감사합니다.

  7. blackrus 2011.02.22 23:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    드디어 책이나오는군요 ㅠㅠ너무기대됩니다...
    빨리 만나고싶네요 1권 2권 둘다 소장하겠습니다 ㅎ

  8. SERiALK 2011.02.23 13:24 신고 댓글주소 | 수정 | 삭제 | 댓글

    reversecore님의 글에서 리버싱에 대해 많은걸 배운 저로선 책이 너무 기대되는군요.
    혹시 커널모드 디버깅에 대한 내용도 있을런지 궁금하네요.
    커널모드의 내용이 방대하고 Undocument된 내용이 많기는 하지만, 맛이라도 보고 시작할 수 있는 원동력이 될 만한 것을 찾고 있었거든요.

    • reversecore 2011.02.28 15:59 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      아쉽게도 제가 지금 작업하는 책의 내용은 유저 영역만 다루고 있습니다. 향후 블로그에 유저 영역의 내용이 충실해졌다 싶으면 커널 내용을 슬슬 올릴 계획입니다.

      감사합니다.

  9. Atlantic 2011.03.10 11:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.. 코어님 책만 눈빠지게 기다리고있습니다.. 언제나오나요? ㅜㅜ

  10. hansjang 2011.03.11 12:09 신고 댓글주소 | 수정 | 삭제 | 댓글

    네 저도 기다립니다.

  11. Rony 2011.03.17 22:32 신고 댓글주소 | 수정 | 삭제 | 댓글

    아.. 코어님 정말 기대하고 있습니다.. 윈도 인터널 5판 보다가 막혀서 방황하던 찰나에 다시한번 불씨를 붙혀주신 코어님글들 너무 감사합니다... 제가 술이라도 한잔 대접하고 싶은마음이네요!

    부담감도 있으시겠지만.. 그래도 기대하겠습니다^^

  12. ㅎㅎ 2011.06.19 00:41 신고 댓글주소 | 수정 | 삭제 | 댓글

    블로그에도 이렇게 유익한 내용이 많은데........
    책은 어떨지 기대됩니다~~
    책 나오면 바로 사겠습니다
    하루빨리 나오기르1

  13. RUIN 2011.08.14 10:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    책 언제쯤 출간 되는지 여쭤봐도 될까요ㅠㅠ

    아니면 현재 상황이라도 궁금합니다

  14. GDCrow 2011.09.03 13:18 신고 댓글주소 | 수정 | 삭제 | 댓글

    책제목이 궁금하네요 ㅇ_ㅇ;;

    회사에서 IDA 툴을 제공해줘서.. 툴에 의존하여 작업을 하다가

    기본 실력이 너무 딸리는 관계로... (기본적인 어셈블 언어만 조금 읽는정도...)

    아직 IDA라이센스 기간이 남아 있는 IDA에 관련된 내용도 마니 나오는지 궁금 하네요 +ㅁ+

    • reversecore 2012.09.16 19:48 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      디버거는 OllyDbg 를 이용하구요.
      IDA 세부 내용은 거의 다루지 않습니다.
      저 또한 그 많은 기능을 다 써보지도 못하였습니다. ^^~

      감사합니다. ^^~

  15. Scavenger 2011.09.14 09:44 신고 댓글주소 | 수정 | 삭제 | 댓글

    지나가다 들릅니다. 쓰시는 책 꼭 구매하고 싶네요.

  16. zzangRC 2011.09.23 02:41 신고 댓글주소 | 수정 | 삭제 | 댓글

    고생 많으신데...저두 오늘부터 입문 예정입니다..좋은책 기대하겠습니다.

  17. superid 2012.04.05 16:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    늦은글 이지만 꼭 책 을 사서 보겟습니다 개인소장 도 할꺼같네요 너무 좋아서 ㅎㅎ..

  18. 2012.05.22 06:07 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  19. 2012.07.13 18:23 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  20. 정희훈 2012.12.27 23:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱 책을 찾던중
    제가 정말 원하던걸 찾은거 같아요!!
    읽고 실습하고.. 열심히 배워가도록 하겠습니다!!
    궁금한거 있으면 자주 질문하겠습니다 +_+!!



제가 개발한 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  (48) 2013.01.27
HxD.exe 기능 추가!  (13) 2012.06.14
리버싱 현업에서 사용되는 디버거(Debugger)들  (31) 2010.09.29
InjDll.exe – DLL Injection/Ejection 전용 도구  (101) 2010.03.15
Process Explorer - 최고의 작업 관리자  (1) 2009.05.03
www.virustotal.com  (3) 2009.03.20
www.google.com  (2) 2009.03.06
    이전 댓글 더보기
  1. sdfsdf 2017.12.15 11:34 댓글주소 | 수정 | 삭제 | 댓글

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

  2. 우리 오라클 순하 2017.12.15 13:40 댓글주소 | 수정 | 삭제 | 댓글

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

  3. FDGDFGDF 2017.12.18 03:24 댓글주소 | 수정 | 삭제 | 댓글

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

  4. sdfsdf 2017.12.18 05:34 댓글주소 | 수정 | 삭제 | 댓글

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

  5. 우리 오라클 순하 2017.12.19 14:49 댓글주소 | 수정 | 삭제 | 댓글

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

  6. fghfghfgh 2017.12.20 01:24 댓글주소 | 수정 | 삭제 | 댓글

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

  7. sdfsdf 2017.12.20 01:26 댓글주소 | 수정 | 삭제 | 댓글

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

  8. 우리 오라클 순하 2017.12.20 11:47 댓글주소 | 수정 | 삭제 | 댓글

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

  9. 우리 오라클 순하 2017.12.21 00:02 댓글주소 | 수정 | 삭제 | 댓글

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

  10. fghfghfgh 2017.12.21 10:31 댓글주소 | 수정 | 삭제 | 댓글

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

  11. sdfsdf 2017.12.21 10:42 댓글주소 | 수정 | 삭제 | 댓글

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

  12. fghfghfgh 2017.12.23 10:44 댓글주소 | 수정 | 삭제 | 댓글

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

  13. 우리 오라클 순하 2017.12.27 05:15 댓글주소 | 수정 | 삭제 | 댓글

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

  14. fghfghfgh 2017.12.29 23:28 댓글주소 | 수정 | 삭제 | 댓글

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

  15. fgfgfgfgffg 2018.01.02 21:38 댓글주소 | 수정 | 삭제 | 댓글

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

  16. dfgfhghgjh 2018.01.05 03:00 댓글주소 | 수정 | 삭제 | 댓글

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

  17. jhbhjhj 2018.01.06 14:46 댓글주소 | 수정 | 삭제 | 댓글

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

  18. bvvbvbvvbv 2018.01.10 21:01 댓글주소 | 수정 | 삭제 | 댓글

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

  19. asasasdada 2018.01.12 11:12 댓글주소 | 수정 | 삭제 | 댓글

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

  20. gdkghdg 2018.01.14 08:45 댓글주소 | 수정 | 삭제 | 댓글

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



질문/답변 코너를 만든 이후로 많은 분들께서 질문을 해주시고, 답변도 도와 주셨습니다.

모든 분들께 정말로 감사를 드립니다.

댓글로 질문/답변을 진행하고 있는데요, 너무 댓글이 길어져서 사용하기 불편해졌습니다.
그래서 새로 추가하였습니다.

이후부터는 이쪽에 질문/답변을 올려주세요~
감사합니다.

* 예전 질문/답변 코너 링크입니다. (원하시는 내용이 있는지 검색해 보세요~)

질문/답변 코너입니다.

=======================================================

리버스 엔지니어링 분야에 대해 질문이 있으시면 아래의 댓글로 올려주세요. 역시 댓글로 답변을 올려드리겠습니다. 공개하기 어려운 내용은 '비밀글' 에 체크해주세요.

"비도덕적, 불법적" 인 내용은 답변 드릴 수 없음을 이해해 주시기 바랍니다.


댓글, 방명록, 이메일 등으로 많은 분들께서 여러 가지 질문들을 해주십니다. 
그중에 정말 좋은 질문들이 많아서 여러분들과 공유하면 좋겠다고 생각하였습니다.

이제부터 저에게 들어오는 모든 질문과 답변들을 이곳으로 모을 것입니다.
앞으로 질문과 답변은 이곳에서 해주세요~

질문에 대한 답변은 저 뿐만 아니라 제 블로그에 오시는 모든 분들께서 하실 수 있습니다.
문제 해결을 위한 방법은 다양합니다. 저 말고도 다른 분들의 답변은 언제나 환영입니다.

"질문은 좋은 것 입니다. 많이 해주세요. ^^ "

* 댓글로 질문하기 어려운 내용들(긴내용, 첨부파일 등)은 제 이메일(reversecore@gmail.com)로 문의해 주세요.

* 제가 사용하는 GMail 은 PE 파일을 첨부하면 전송 거부를 합니다. (압축을 시켜도 그걸 열어서 확인하지요.)
   => 실행 파일을 첨부해서 보내실때는 확장자를 exex, dllx, zipx 등으로 변경해서 보내주세요.

* 댓글이 너무 많이 달리면 제가 질문/답변 빈 포스트를 또 올릴 겁니다. 그쪽으로 계속 질문 댓글 달아주시면 됩니다.

감사합니다.


ReverseCore

'q&a' 카테고리의 다른 글

질문/답변 코너입니다. (3)  (394) 2011.04.13
질문/답변 코너입니다. (2)  (233) 2010.01.28
질문/답변 코너입니다.  (295) 2009.09.21
    이전 댓글 더보기
  1. 안녕하세요 2010.12.01 12:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~
    Dll 을 다른 프로세스에 injection 시킨 후 DllMain이 전부 실행된 후에 바로 ejection 시키려고 하는데요, DllMain이 전부 끝났는지를 어떻게 검사해야할지 모르겠습니다. Dll쪽을 건드려서 DllMain의 끝부분에 IPC로 Dll Injecter에 끝났다는 것을 알리는 코드를 추가하는 방법이 있을 것 같기는 한데 제가 작성한 Dll말고 모든 Dll에서 범용적으로 사용될 수 있도록 Dll은 그대로 놔두고 Injecter 쪽에서 DllMain이 끝났는지를 검사하게 하고 싶은데 방법이 없을까요?

    • reversecore 2010.12.03 15:47 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      hThread = CreateRemoteThread(xxxxx);
      WaitForSingleObject(hThread, INFINITE)

      위와 같이 DLL Injection 을 시키면 DllMain() 함수가 리턴할 때까지 WaitForSingleObject() 함수에서 대기합니다.

      DllMain() 에 메시지 박스를 넣고 간단히 테스트해보시면 됩니다.

      감사합니다.

  2. 2010.12.05 15:11 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010.12.10 15:51 신고 댓글주소 | 수정 | 삭제

      안녕하세요. ReverseCore 입니다. ^^

      보내주신 코드를 보았습니다.

      Inject -> patch -> Inject 흐름이더군요.

      2번째 Inject 시에 왜 DllMain() 이 호출되지 않느냐는 질문이신거죠?
      (제가 잘 이해했는지 모르겠군요? ^^)

      저 myhack.dll 이 제 블로그의 파일이라면... 소스코드는 아래와 같을겁니다.

      DWORD WINAPI ThreadProc(LPVOID lParam)
      {
      char szPath[MAX_PATH] = {0,};
      char *szProcess = NULL;

      if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
      return 1;

      if( !(szProcess = strrchr(szPath, '\\')) )
      return 1;

      szProcess++;
      if( !stricmp(szProcess, "notepad.exe") )
      URLDownloadToFile(NULL, DEF_NAVER_ADDR, DEF_INDEX_PATH, 0, NULL);

      return 0;
      }

      BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
      {
      HANDLE hThread = NULL;

      switch( fdwReason )
      {
      case DLL_PROCESS_ATTACH :
      hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
      CloseHandle(hThread);
      break;
      }

      return TRUE;
      }

      즉, DLL_PROCESS_ATTACH 인 경우에 스레드가 실행되는 것이죠.

      같은 DLL 파일을 같은 프로세스에 연속 Injection 시켜도 DLL_PROCESS_ATTACH 는 한번만 뜨게되고...
      이후부터는 DLL_THREAD_ATTACH 가 뜹니다. 그래서 2 번째 Injection 에는 ThreadProc() 이 실행되지 않은 것이지요.

      Injection 마다 ThreadProc() 을 실행시키려면 myhack.dll 소스코드의 DllMain() 함수를 수정하시면 됩니다.

      * 코드를 보면 DLL 의 RVA 254A 위치에 "EB" 로 한바이트 패치를 하셨는데요..
      제가 그 의도를 잘 이해 못 하겠네요. 이걸 왜 하신 건가요?
      어쩌면 가지고 계신 myhack.dll 파일과 제가 테스트한 myhack.dll 파일이 서로 틀릴 수 도 있겠네요.
      제가 가진 파일에서는 그 주소는 패치할만한 코드가 없거든요. ^^

      감사합니다.

  3. 2010.12.10 16:43 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010.12.16 15:39 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      매번 Inject 시 DLL_PROCESS_ATTACH 로 뜨게 하려면...

      Inject -> Eject -> Inject 순으로 해주셔야 합니다.

      정상적으로 Eject 되었다면 메모리에 패치한 내용도 사라지겠죠?

      감사합니다.

  4. 2011.01.08 03:53 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.01.11 10:48 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      매우 재밌는 아이디어입니다~ ^^

      화면 처리용 Win32 API 를 후킹해도 될 것 같고,
      관련 메시지를 후킹해도 될 것 같군요.

      가능하고 안하고의 문제라기 보다는...
      어떤 방법이 좀 더 쉽고 간단할까 하는 문제일것 같습니다.

      감사합니다.

  5. jdi 2011.02.04 18:30 신고 댓글주소 | 수정 | 삭제 | 댓글

    C언어로 간단한 프로그램을 작성하고 main함수를 디버깅해서 어셈코드를 보면
    제가 이론상으로 알고있는 함수 프로로그(ebp백업..) 외에도 아래와 같은 긴 작업을 하는것을
    확인 할 수 있습니다.

    0040D3F0 55 push ebp
    0040D3F1 8B EC mov ebp,esp
    0040D3F3 83 EC 4C sub esp,4Ch
    0040D3F6 53 push ebx
    0040D3F7 56 push esi
    0040D3F8 57 push edi
    0040D3F9 8D 7D B4 lea edi,[ebp-4Ch]
    0040D3FC B9 13 00 00 00 mov ecx,13h
    0040D401 B8 CC CC CC CC mov eax,0CCCCCCCCh
    0040D406 F3 AB rep stos dword ptr [edi]

    ebx, esi, edi를 push하는건 callee saved 레지스터의 백업 절차인거 같긴 한데,
    4ch만큼의 스택영역을 CC로 초기화 하는건 설명이 잘 안되네요..ㅠㅠ
    그냥 컴파일러가 일정한 영역을 지정해서 초기화 한다고 생각하면 되나요??
    저 4ch라는 수치도 vs2005로 컴파일 하면 e4h가 되네요;;

    그리고 어떤 책을 보다 보니 함수의 메인을 캡쳐한 코드에 제가 확인한 CC로 초기화 하는 코드가 존재하지 않더라구요.. 이건 또 어떻게 된 일인지 궁금하기도하고 ;;

    질문이 너무 정리가 안되네요~~ 설연휴 잘보내시구요 답변 부탁드릴게요 ㅎ;;

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

      안녕하세요.

      아마 VC++ 에서 DEBUG 모드로 빌드하셨나 봅니다.

      VC++ 특징이 DEBUG 모드 빌드인 경우 스택의 일정 부분 크기를 "CC" 즉 INT3 명령어로 채워버립니다. 이유는 혹시나 프로그램의 버그(버퍼 오버플로우) 발생시에 바로 예외가 발생하여 프로그램이 멈추도록 하려는 것입니다. 만약 저게 없다면... 스트링 처리를 잘 못하여 버퍼 오버플로우가 살짝 일어난 경우 그대로 계속 실행될 수도 있거든요. 그럼 버그를 못잡는 거지요.

      RELEASE 빌드에서는 그러한 과정이 생략되어 있습니다.

      감사합니다.

  6. 봉이 2011.02.10 13:34 신고 댓글주소 | 수정 | 삭제 | 댓글

    코어님 안녕하세요!
    pe 공부하다 어떤건 그냥 그림으로 이해하는게 좋은거 같아서 그러는데요..
    코어님이 포스팅할때 어떤 이미지 편집툴 쓰시는건가요?
    여담입니다만 16진수 계산기 추천해주신거 아주 잘쓰고 있어서 그래픽툴도 추천받아보려구요..
    그럼 좋은 하루 되세요!

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

      안녕하세요.

      제가 사용하는 이미지 캡쳐 프로그램은 OpenCapture 입니다. 이걸로 간단한 편집도 하지요. 간혹 윈도우 그림판을 사용할 때도 있습니다.

      감사합니다.

  7. 2011.02.19 02:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.02.28 15:52 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      윈도우의 움직임을 모니터링 하고 계시는군요~

      가장 좋은 방법은 메시지 후킹이지요.

      SPY++ 을 생각해 보시면 됩니다.

      GUI 관련 모든 행위는 메시지 기반입니다. 따라서 이러한 메시지만 모니터링 하면 윈도우가 어떻게 움직이고 있는지 다 볼 수 있습니다. 몇몇 API 를 직접 후킹 하는 것 보다 훨씬 좋은 방법이라 생각됩니다.

      감사합니다.

  8. 2011.02.23 14:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.02.28 15:56 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      찾으시는게 혹시 이거 아니신가요?

      인젝션된 test.dll 에서 GetModuleHandle(NULL) 을 호출하시면 그 리턴값이 바로 프로세스(notepad.exe)가 로딩된 이미지 베이스 주소입니다.

      감사합니다. ^^

  9. 황순용 2011.03.10 17:19 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요..
    글은 자주 보고 있는데..
    댓글 다는게 익숙치가 않은 터라.. 이제야 처음 인사를 드립니다.
    (아 이쪽이 신규 질문방인거 같아서 ㅎㅎㅎ 다시 한번 올립니다.)

    API 후킹 쪽에 아무리 풀려고 해도 풀리지 않는 숙제가 있어 이렇게 질문을 드립닏.
    socket 후킹 부분입니다.
    mswsock.dll에 있는 NSPStartup을 후킹하여.
    내부에 LPNSP_ROUTINE이 가지고 있는 NSPLookupServiceBegin, NSPLookupServiceNext, NSPLookupServiceEnd의 주소값을 변경하고자 합니다.

    redirect.cpp 코드를 사용하여 NSPStartup을 후킹하려고 했스니다만
    iexplore.exe에 적용을 해보아도 NSPStartup으로 들어오지 않는 것입니다.

    이곳을 소스가 아닌 다른 예제로 해도 그부분은 해결하기가 너무 힘들더라구요..

    어느 시점이 NSPStarup 으로 들어오는지 알 수가 없습니다. 아무래도 dll Injection전에 한번만 로드가 되는거 같은데 이런경우 NSPStartup을 어떻게 찾아서 후킹 할 수가 있을까요?

    아니면 직접 LPNSP_ROUTINE의 NSPLookupServiceBegin 값들을 후킹하는 방법은 없을까요?

    바쁘시겠지만 조그만 조언이라도 부탁드립겠습니다.

    • 황순용 2011.03.11 09:41 신고 댓글주소 | 수정 | 삭제

      하녕하세요.
      아주 조금은 해결이 된 듯 합니다.
      프로세스가 만들어질 당시 한번만 호출이 되는듯 합니다.
      그래서 explorer.exe 나 서비스에서 시작되는 경우 해당 서비스에다가 Injection을 하니 가능하더라구요..

      그런데 또 하나 궁금한게 생겼습니다.
      방법이 이것 뿐이냐 하는 겁니다. 프로세스가 로드될때 젤 먼저 제가 만든 dll를 로드하게 한다던지 하는 방법은 없는 것인가요?

      너무 궁금한게 많아서 죄송합니다. ㅎㅎㅎ

    • reversecore 2011.03.16 23:07 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      질문하신 내용을 잘 읽어 보았습니다.
      일부 해결을 하셨다니 다행이네요~ ^^

      먼저 DLL Injection 의 조건은 kernel32.dll 이 로딩되어야 합니다. (사용자 DLL 은 시스템의 kernel32.dll 보다 먼저 로딩될 수 없습니다.)

      프로세스가 생성되는 순간에 DLL Injection 을 하기 위해서는 Global API Hooking 을 사용하시면 되는데요...

      제 블로그의 "DLL Injection" 파트를 죽 읽어보시면 몇 가지 방법이 있습니다.

      http://www.reversecore.com/38
      (레지스트리 등록 방법, SetWindowsHooks() 이용 방법, ZeResumeThread() 이용 방법)

      궁금한게 많으시다는 것은 좋은겁니다. 그만큼 열정이 있으시다는 뜻이지요. 또 질문 올려주세요~

      감사합니다.

  10. 2011.03.10 21:08 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.03.16 22:32 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      EXECrypter 라면 매우 고급 프로텍터입니다. 언팩이 매우 어렵습니다. 정확한 언패커가 있는지는 모르겠습니다만... 분명 언팩하시는 분들은 계시더군요. 제가 잘 모르는 전용 프로그램을 이용하는 것 같았습니다.

      감사합니다.

  11. 2011.03.12 01:17 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2011.03.16 22:35 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      ^^ 21세기는 엉뚱, 기발, 창의적인 사람이 대우받는 시대랍니다. J 님께서는 시대를 잘 타고 나신겁니다. 저도 그런게 좋아요~

      말씀하신대로 얼마든지 가능합니다.

      일단 대상 프로세스에 inject.dll 을 침투시켰다면... inject.dll 에서 간단히 LoadLibrary("test.dll") 만 호출해줘도 test.dll 을 메모리에 로딩시킬 수 있습니다.

      물론 또다른 프로세스에게 RemoteThread() 를 이용하여 test.dll 을 인젝션 시킬 수 도 있지요.

      감사합니다.

  12. 2011.03.21 13:11 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

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

      안녕하세요.

      사실 LoadLibrary() 리턴값이 로딩 주소입니다. ^^
      (GetModuleHandle() 도 마찬가지 입니다.)

      CreateToolhelp32Snapshot() 는 원격 프로세스에 로딩된 DLL 들의 로딩 주소를 얻을 때 사용합니다.

      모두 같은 프로세스내에 있잖아요?

      같은 논리로 WriteProcessMemory() 를 쓰셔도 되지만 그 보다는 memset() 을 쓰셔도 좋습니다. ^^

      아마 지금쯤 잘 해결 하셨을걸로 생각됩니다.

      요청하신대로 질/답 게시판을 하나더 추가해야 겠습니다.

      감사합니다.

  13. 유상윤 2011.11.13 15:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요? 유상윤입니다. 포스팅된 글들을 읽고 도움이 많이 되었습니다.
    특히 DLL Injection과 관련된 글은 쉽게 이해할 수 있도록 써 주셔서 큰 도움이 됐어요.
    궁금한 점이 있습니다. PE 구조에서의 각 섹션을 파일 별로 가지고 있습니다.
    그 파일들을 조합하여 실행 파일로 만들려면 어떤 작업이 필요한가요?
    헥스 에디터로 열어봤지만 막막하네요.
    아무래도 선행 지식이 부족하다 보니 문제가 막막해진거 같은데요
    필요한 지식이 있다면 소개해주셔요! 미리 답변에 대해서 감사하다는 말 전합니다.
    수고하세요!

  14. 추광 2013.02.15 02:13 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요~ stealthprocess을 제 프로그램에 적용중인데요.. 다른 경우는 대부분 숨겨지는 듯 한데, ctrl + alt + delete를 통해서 나오는 작업 관리자의 프로세스창에는 프로그램명이 뜨더군요.. 이것의 해결 방법은 없을까요??

  15. longchamp bags uk 2013.04.25 07:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    내가 성공을 했다면 오직 천사와 같은 어머니의 덕이다.Topics related articles:


    http://highflyer.tistory.com/category/travel 新建文章 4

    http://violettalove.tistory.com/53 新建文章 1

    http://juyayang.tistory.com/53 新建文章 7

    http://minamichiaki.tistory.com/130 新建文章 6

  16. prosn 2013.12.09 18:38 신고 댓글주소 | 수정 | 삭제 | 댓글

    인젝션을 시키지 않고 다른 프로세서의 이미지 베이스 주소를 가져오는 방법이 있나요?

  17. 초보 2014.08.07 21:16 신고 댓글주소 | 수정 | 삭제 | 댓글

    이런 질문 드리기에는 너무 죄송하지만 도저히 몰라서 질문합니다 ㅠㅠ
    금방 리버싱 핵심원리 책을 사서 실습하려고 하는 학생입니다.
    그런데 release모드로 빌드해서 exe파일을 만들어서 ollydbg로 돌렸는데 책에 나오는 예제랑
    다르게 나옵니다... 이건 컴파일러 종류가 달라서 그런건가요? 만약에 컴파일러 종류가 다르면
    어떤 컴파일러로 빌드했는지 알수 있을까요? 제가 사용하는 컴파일러는 visual c++ 2010 express입니다

    • Backer 2014.08.08 02:52 신고 댓글주소 | 수정 | 삭제

      컴파일러 종류가 아니라 아마 빌드 옵션에 따라 다른걸로 알고있습니다.
      제 생각엔 http://reversecore.com/104 에서 해당 소스코드와 예제파일을 다운받아 공부하시는걸 추천드립니다.

  18. 쿠크다스ss 2015.04.15 02:28 신고 댓글주소 | 수정 | 삭제 | 댓글

    34장 IE접속제어(553page) 부분을 공부하고있는데요 ollyDbg110 을 이용하여 익스플로어를 attach 하였는데 internetConnectW함수에 BP를 걸걸었는데도 불구하고 멈추질 않네요 그런데 또 올려주신 dll 인젝션 하면 또 후킹이 되고... 뭐가 문제인지 도통 모르겠습니다.

  19. sammysl 2015.05.05 17:49 댓글주소 | 수정 | 삭제 | 댓글

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

  20. 바이낸 2018.02.10 20:46 댓글주소 | 수정 | 삭제 | 댓글

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



Global API Hooking 개념과 구현 방법에 대해서 알아보도록 하겠습니다.


<Fig - Global API Hooking>

본 내용은 이전 포스트에서 이어지는 내용입니다.

API Hooking – ‘스텔스’ 프로세스 (3)

* 참고!
모든 소스 코드는 MS Visual C++ 2008 Express Edition 으로 개발 되었으며, Windows XP SP3 & Windows 7 환경에서 테스트 되었습니다.



Global API Hooking


Global API Hooking 이란 1) 현재 실행중인 모든 프로세스2) 앞으로 실행될 모든 프로세스에 대해서 API Hooking 을 시키는 것입니다.

지난번에 설명한 예제 프로그램(HideProc.exe, stealth.dll)은 global hooking 이 아닙니다. 위에서 설명한 2) 번 조건이 만족되지 않기 때문입니다.

HideProc.exe 를 실행 하여 notepad.exe 프로세스를 은폐시켜도 이후에 Process Explorer (혹은 task manager) 를 실행시키면 이들 프로세스에서는 notepad.exe 프로세스를 볼 수 있습니다.

그 이유는 HideProc.exe 실행 이후에 생성된 프로세스들에게는 stealth.dll 파일이 (자동으로) 인젝션 되지 않기 때문입니다.

아래 링크를 참조하여 직접 실습해 보세요.

API Hooking – ‘스텔스’ 프로세스 (2)


이러한 문제를 해결하기 위한 다양한 방법이 있을 수 있습니다.
그 중에서 또 다른 API 를 Hooking 하여 Global API Hooking 을 구현하는 방법에 대해서 설명 드리겠습니다.


 
Kernel32!CreateProcess() API


새로운 프로세스가 생성되려면 kernel32!CreateProcess() API 를 사용해야 합니다. WinExec(), ShellExecute(), system() 등의 API 도 내부적으로는 CreateProcess() 를 호출합니다.

BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

* 출처 : http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

따라서 현재 실행중인 모든 프로세스에 stealth.dll 을 인젝션 하고, stealth.dll 에서 CreateProcess() API 를 후킹하면 이후 실행되는 프로세스에게도 자동으로 stealth.dll 을 인젝션 시키도록 만들 수 있습니다.

다시 설명 드리면 모든 프로세스는 부모 프로세스에서 (CreateProcess() 를 이용하여) 생성시켜주기 때문에 부모 프로세스의 CreateProcess() API 를 후킹하여 자식 프로세스에게 stealth.dll 을 인젝션 하도록 만들면 됩니다. (보통 부모 프로세스는 explorer.exe 가 될 것입니다.)

어떤가요? 좋은 아이디어 이지요?
이와 같이 Global API Hooking 의 개념은 어렵지 않습니다.

하지만 CreateProcess() API 를 후킹하면 아래와 같이 고려해야 할 사항들이 있습니다.

1) CreateProcess() API 를 후킹할 때는 kernel32!CreateProcessA(), kernel32!CreateProcessW() 두 개의 API 를 각각 후킹해야 합니다. (ASCII 버전과 UniCode 버전)

2) CreateProcessA(), CreateProcessW() 는 각각 내부적으로 CreateProcessInternalA(), CreateProcessInternalW() 를 호출합니다. 실제 MS 제품들 중에서 일부는 CreateProcessInternalA/W 를 직접 호출하기도 하지요. 따라서 좀 더 정확히 Global API Hooking 을 구현하기 위해서는 이 두 함수를 더 후킹해줘야 합니다.

3) 후킹 함수(NewCreateProcess) 는 원본 함수(CreateProcess) 를 호출 한 후 생성된 자식 프로세스에 대해서 API 를 후킹 해야 합니다. 따라서 아주 짧은 시간동안 자식 프로세스가 후킹 되지 않은 채로 실행될 수 있습니다.


많은 리버싱 선배님들에 의하여 kernel32!CreateProcess() 보다 더 후킹하기 좋은 함수가 발견 되었습니다.
바로 ntdll!ZwResumeThread() API 입니다.

NtResumeThread(
    IN    HANDLE    ThreadHandle,
    OUT   PULONG    SuspendCount OPTIONAL
);

* 유저 모드에서는 NtXXX 계열과 ZwXXX 계열은 동일합니다.

* 출처 : http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/NtResumeThread.html


ZwResumeThread() 는 프로세스가 생성 된 후 메인 스레드 실행 직전에 호출되는 함수입니다. 따라서 이 함수 하나만 후킹하면 자식 프로세스의 코드가 하나도 실행되지 않은 상태에서 API 를 후킹시킬 수 있습니다.

단점은 ZwResumeThread() 는 undocumented API 라서 언제 바뀔지 알 수 없으며, 그만큼 안정성을 보장 할 수 없습니다. 따라서 ZwResumeThread() 같은 undocumented API 를 후킹 할 때는 OS 가 패치되면서 변경될 수 있다는 것을 항상 염두에 두어야 합니다. 하위 버전에서는 잘 되던 후킹이 최신 버전에서는 갑자기 안 되는 일이 많기 때문입니다.



실습


HideProc2.exe

stealth2.dll



* 참고
위 stealth2.dll 는 CreateProcess 후킹 버전입니다.
ZwResumeThread 후킹 버전을 원하시는 분께서는 따로 요청해 주시면 보내드리겠습니다.

실습을 간단히 하기 위해서 은폐 프로세스를 notepad.exe 로 고정하였습니다. 참고하시기 바랍니다.

#1. stealth2.dll 파일 -> %SYSTEM% 폴더에 복사


<Fig. 1>

실행 중인 모든 프로세스에 stealth2.dll 파일을 인젝션 시킬 예정입니다. 따라서 모든 프로세스에서 공통적으로 인식할 수 있는 path 인 %SYSTEM% 폴더에 stealth2.dll 파일을 복사합니다.

#2. HideProc2.exe –hide 실행


<Fig. 2>

기존 HideProc.exe 와 비교해서 실행 파라미터가 변경되었습니다. 은폐 프로세스 이름이notepad.exe 로 하드코딩 되어있습니다.
HideProc2.exe 를 –hide 옵션으로 실행시키면 이제부터 글로벌 후킹이 시작됩니다.

#3. ProcExp.exe & notepad.exe 실행

Process Explorer(혹은 작업관리자) 와 notepad 를 여러 개 실행 해 주세요.

 
<Fig. 3>

위 그림을 보시면 ProcExp.exe 와 notepad.exe 프로세스가 각각 2개씩 실행되고 있습니다.
하지만 ProcExp.exe 에서는 notepad.exe 프로세스가 은폐되어 있습니다.

추가로 ProcExp.exe 를 몇 개 더 실행해 보시기 바랍니다. 마찬가지로 새로 생성된 ProcExp.exe 프로세스에서도 notepad.exe 프로세스가 은폐되어서 보이지 않을 것입니다.

이것이 바로 Global API Hooking 의 효과입니다.

#4. HideProc2.exe –show 실행

Global API Hooking 을 해제 합니다.

 
<Fig. 4>

이제 Process Explorer(혹은 작업관리자) 에서 notepad.exe 프로세스가 보일 것입니다.



소스 코드


# HideProc2.cpp

HideProc2.cpp


HideProc2.cpp 는 기존 HideProc.cpp 에서 실행 파라미터를 줄인 것뿐이므로, 기존 설명을 참고하시면 되겠습니다.

API Hooking – ‘스텔스’ 프로세스 (3)


# stealth2.cpp

stealth2.cpp


stealth2.cpp 는 기존 stealth.cpp 에서 은폐 프로세스 이름을 "notepad.exe" 로 하드 코딩 하였고, global hooking 을 위해서 CreateProcessA() API 와 CreateProcessW() API 를 후킹 하는 코드가 추가 되었습니다.


DllMain()

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    char            szCurProc[MAX_PATH] = {0,};
    char            *p = NULL;

    // HideProc2.exe 프로세스에는 인젝션 되지 않도록 예외처리

    GetModuleFileName(NULL, szCurProc, MAX_PATH);
    p = strrchr(szCurProc, '\\');
    if( (p != NULL) && !_stricmp(p+1, "HideProc2.exe") )
        return TRUE;

    // change privilege
 
   SetPrivilege(SE_DEBUG_NAME, TRUE);

    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH :
            // hook
            hook_by_code("kernel32.dll", "CreateProcessA",
                         (PROC)NewCreateProcessA, g_pOrgCPA);
            hook_by_code("kernel32.dll", "CreateProcessW",
                         (PROC)NewCreateProcessW, g_pOrgCPW);
            hook_by_code("ntdll.dll", "ZwQuerySystemInformation",
                         (PROC)NewZwQuerySystemInformation, g_pOrgZwQSI);
            break;

        case DLL_PROCESS_DETACH :
            // unhook
            unhook_by_code("kernel32.dll", "CreateProcessA",
                           g_pOrgCPA);
            unhook_by_code("kernel32.dll", "CreateProcessW",
                           g_pOrgCPW);

            unhook_by_code("ntdll.dll", "ZwQuerySystemInformation",
                           g_pOrgZwQSI);
            break;
    }

    return TRUE;
}

위 DllMain() 함수를 보시면 CreateProcessA, CreateProcessW 를 후킹하는 코드가 추가되었습니다.


NewCreateProcessA()

CreateProcessA() API 의 후킹 함수인 NewCreateProcessA() 코드를 살펴 보겠습니다. (NewCreateProcessW() 코드도 거의 동일합니다.)

BOOL WINAPI NewCreateProcessA(
    LPCTSTR lpApplicationName,
    LPTSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCTSTR lpCurrentDirectory,
    LPSTARTUPINFO lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
)
{
    BOOL bRet;
    FARPROC pFunc;

    // unhook

    unhook_by_code("kernel32.dll", "CreateProcessA", g_pOrgCPA);

    // original API 호출

    pFunc = GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateProcessA");
    bRet = ((PFCREATEPROCESSA)pFunc)(lpApplicationName,
                                     lpCommandLine,
                                     lpProcessAttributes,
                                     lpThreadAttributes,
                                     bInheritHandles,
                                     dwCreationFlags,
                                     lpEnvironment,
                                     lpCurrentDirectory,
                                     lpStartupInfo,
                                     lpProcessInformation);

    // 생성된 자식 프로세스에 stealth2.dll 을 인젝션 시킴

    if( bRet )
        InjectDll2(lpProcessInformation->hProcess, STR_MODULE_NAME);

    // hook

    hook_by_code("kernel32.dll", "CreateProcessA",
                 (PROC)NewCreateProcessA, g_pOrgCPA);

    return bRet;

}

코드는 매우 단순합니다.
일단 후킹을 풀고 원본 함수를 실행해서 생성된 자식 프로세스에 stealth2.dll 을 인젝션 시킵니다.
그 후 다음 실행을 위해서 다시 후킹해 줍니다.

제 글을 꾸준히 읽어오셨다면 쉽게 이해하실 수 있으실 겁니다.

한가지 눈여겨 볼 사항은 인젝션 함수인 InjectDll2() 입니다.
기존 InjectDll() 함수는 프로세스 ID (PID) 를 이용하여 프로세스 핸들을 얻어 인젝션 시키는 방법이었습니다. (OpenProcess() API 이용)

하지만 위의 경우는 CreateProcessA() API 를 호출하면서 자연스럽게 자식 프로세스의 핸들(lpProcessInformaiton->hProcess)을 얻을 수 있습니다. 이 내용도 같이 참고하시면 좋을 것 같습니다.



+---+

지금까지 Global API Hooking 에 대해서 알아보았습니다.

시스템 전체 프로세스에 대해서 후킹을 하는 기술이기 때문에 예상치 못한 에러가 발생할 수 있습니다. 따라서 사전에 꼼꼼한 테스트가 필요합니다. 그리고 undocumented API 를 후킹할 때는 현재 OS 버전에서 예상대로 동작하는지 반드시 확인하셔야 합니다.


다음번에는 API Hooking 시리즈의 마지막 테마인 Code Injection 기법에 대해서 설명드리도록 하겠습니다.

많이 기대해 주세요.

ReverseCore

위 글이 도움이 되셨다면 추천(VIEW ON) 부탁 드려요~
    이전 댓글 더보기
  1. kmslife 2011.04.15 18:02 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    질문이 있어서 이렇게 글을 올립니다.
    첨부되어 있는 프로그램으로 실행은 잘 되는데요
    문제는 vs2008로 만들어진 프로그램들, 그리고 vs2008 툴 자체는 위 dll을 injection 시키면
    프로그램 자체가 실행되지 않습니다.
    vs2003이나, 그외 프로그램들은 잘 동작하는데 말이죠
    ASLR기능 인가 찾아 보았지만 제 pc의 환경은 xp sp3환경이어서 문제가 되지는 않을 것 같습니다.
    원래 vs2008관련되어서는 dll injection 기능이 동작하지 않는것인가요?
    동작하게 하려면 어떻게 해야 할지요?

    • reversecore 2011.04.20 10:41 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      지금 제 환경은 Win7 64bit, WinXP SP3 32bit 인데요.

      말씀하신 VS2008 은 없어서 Visual C++ 2008 Express (VCExpress.exe 프로세스)에 테스트 해본 결과 정상동작 하네요.

      VS2008 로 제작된 파일에 인젝션 시키면 동작 안한다고 하셨는데요.
      그 파일을 제게 보내주시면 테스트 해보겠습니다.

      실행 파일을 zip 압축 하신 후 확장자를 zipx 로 변경하셔서 아래 메일로 보내주시기 바랍니다.

      reversecore@gmail.com

      감사합니다.

  2. jjengae 2011.09.28 20:06 신고 댓글주소 | 수정 | 삭제 | 댓글

    스텔스 프로세스(2)에서 올려주셨던 HideProc.exe는 XP기반에서만 작동하는 것 같더라구요

    윈도우 7(Enterprise 32bit)에서 vmware-vmx.exe라는 프로세스를 숨기기 하고 싶은데

    이번에 포스팅에 올려주신 파일은 notepad.exe로 고정되어 있는것 같아서요

    제가 임의의 프로세스를 숨기려면 어떤 부분을 수정해서 어떻게 컴파일 해야 하는건가요?

    .exe와 .dll은 한번도 컴파일해보지 않아서...

    또, 수정하려면 무조건 Visual Studio가 설치되어 있어야 하는건가요?

    기초 지식 없이 이렇게 물어봐서 죄송합니다

    가능하시다면 jjengae@nate.com 으로 메일 부탁드릴게요

    • reversecore 2011.09.28 20:36 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      위 예제에서 은폐프로세스 이름은 notepad.exe 로 하드코딩 되어 있습니다.

      소스코드에서 "notepad.exe" 문자열을 "vmware-vmx.exe" 문자열로 수정 후 빌드 하시면 됩니다.

      Visual C++ 을 한번도 사용해보지 않으셨다면 조금 어려움이 있을 수 있습니다.

      감사합니다.

  3. jjengae 2011.09.29 23:32 신고 댓글주소 | 수정 | 삭제 | 댓글

    빌드를 해야된다고 하셔서 VS2008 설치했습니다.

    "notepad.exe"를 수정해야 한다고 하시는건 "stealth2.cpp"에 있는 내용을 수정하고 빌드해야 된다는 말씀이시죠?

    "HideProc2.cpp"는 "멀티 바이트 문자 집합" 설정하고 컴파일 했더니 debug폴더에 실행파일이 생성되더군요. 문제는 stealth2.cpp 파일입니다.

    여차여차해서 stealth2.cpp 파일을 컴파일 하려고 프로젝트 생성시에 응용프로그램 종류에서 콘솔 응용프로그램 대신 "DLL"로 셋팅하고 멀티바이트 문자 집합으로 설정했더니 오류가 나지 않더군요.

    근데 컴파일 후에 나타나는 창이 무엇인지 잘 모르겠습니다. "디버그 세션이 사용할 실행 파일"이라는 창이 뜨고 "실행 파일 이름"과 "프로젝트에 액세스할 수 있는 URL"을 입력하라고 하는데 그것을 무엇으로 해야할지 잘 모르겠습니다.

    요약하자면 stealth2.cpp 파일을 어떻게 .dll로 컴파일하는지 좀 알려주시면 감사하겠습니다.

    혹시 .dll로 컴파일하는 포스팅은 없는건가요? 시간 되신다면 vmware-vmx.exe로 적용하여 jjengae@nate.com으로 보내주시면 감사하겠습니다. ㅜㅜ

    도움 주시면 감사하겠습니다.

  4. jjengae_father CPP 2011.09.30 10:47 신고 댓글주소 | 수정 | 삭제 | 댓글

    글 보고 메일 발송하였는데요.

    • jjengae 2011.09.30 11:38 신고 댓글주소 | 수정 | 삭제

      관심 감사합니다.
      그런데 메일을 확인해보니 메일이 도착하질 않았네요..
      죄송하지만 다시한번 메일 보내주셨으면 감사하겠습니다

  5. jjengae 2011.10.01 14:31 신고 댓글주소 | 수정 | 삭제 | 댓글

    제발 누가 stealth2.cpp dll로 빌드하는 방법좀 알려주실 수 없나요 ....

  6. jjengae_father CPP 2011.10.06 22:32 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하셰요.
    메일 확인하니 주소가 틀렸어요.
    VS키고 dll프로젝트를 하나 창조하지요.
    다음 dll main에서 stealth2.cpp를 코피하다놓고 빌드하면 되겠지요.

    • jjengae 2011.10.08 00:58 신고 댓글주소 | 수정 | 삭제

      전에 보내셨던 메일이 어떤 내용이었는지는 모르겠지만
      보낸메일함에서 전달로 다시한번 보내주실 수 없나요?

      그리구 제가 일반 콘솔 프로젝트는 많이 해봤는데
      dll은 컴파일을 하면 이상한 창이 하나 뜨더라구요
      "디버그 세션이 사용할 실행 파일"이라고...
      실례가 안된다면 프로젝트 생성부터 과정을 좀 자세하게 설명좀 부탁드릴 수 있을까요?

  7. jjengage_father CPP 2011.10.11 20:20 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하셰요.
    VS를 켜시고 File/New/Project/Win32를 선택하시지요.
    dll옵션을 체크하시고 empty를 선택하세요.
    그렇게하군서 stealth2.cpp를 코피하다가 빌드하세요.
    dll컴파일을 하구선 loadlibrary를 사용하셰야 디버그를 할수잇어요.

  8. jjengae 2011.10.13 07:05 신고 댓글주소 | 수정 | 삭제 | 댓글

    드디어 빌드를 완료했습니다.

    그런데 아래와 같은 증상이 나타나면서 프로세스는 사라지지 않는데, 무엇이 문제인가요 ?

    C:\Work>HideProc2.exe -hide stealth.dll
    OpenProcess(968) failed!!!
    OpenProcess(1572) failed!!!
    OpenProcess(2296) failed!!!

  9. jjengage_father CPP 2011.10.13 14:14 신고 댓글주소 | 수정 | 삭제 | 댓글

    와 정말 장하시네요.
    근데 또 에러가 있군요.
    오~~~~그거 권한문제때문같아요.
    안녕하셰요.

  10. jjengae 2011.10.14 04:35 신고 댓글주소 | 수정 | 삭제 | 댓글

    father님 항상 조언 감사합니다.
    덕분에 dll 빌드하는 방법을 알았네요.
    전 항상 컴파일만 돌릴생각만 하고 안된다고 생각했었는데 빌드를 해야했군요.

    reversecore님 이게 권한문제때문에 발생하는 에러인가요?
    만약 권한문제라면 권한 문제는 어떻게 해결해야 하나요?

  11. kimpilgu 2012.05.12 15:36 신고 댓글주소 | 수정 | 삭제 | 댓글

    질문있습니다.
    1. 새로 생성(기존x)되는 하나의 모든 exe 프로세스만 감지(CreatePocess 함수)해서 후킹할려면 어떻게 하나요
    2. 그리고 후킹후에 제가 원하는 프로세스 실행할려면
    무슨 함수가 있어야하나요?
    3. 디바이스 드라이버 파일에 dll파일을 로드시켜 사용할수 있나요??
    ...답변해주시면 정말 감사하겠습니다.

  12. 셔벳클록 2012.12.02 17:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    CreateRemoteThread() 가 잘 안먹히는 경우 어떻게 하는게 좋을까요?
    Sleep(2000)을 넣으면 전역후킹이 되긴 하는데,
    예를 들어 시작메뉴에서 프로그램을 시작시키면
    시작메뉴에서 일정 시작 렉을 보이네요.
    환경은 xp sp3를 깔았습니다.

    • reversecore 2012.12.02 19:07 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      CreateRemoteThread() 가 안먹히는 경우가 몇 가지 있습니다.
      그래서 NtCreateThreadEx() 를 사용(Vista 이상)하기도 하지요.

      Sleep() 을 넣으면 전역후킹이 된다는 말씀이 잘 이해가 안되는데요.
      실행중 뚜렷한 딜레이가 발생한다면 구조를 좀 변경하는 것이 좋을 것 같습니다. (물론 전역 후킹 자체가 시스템에 부하를 주는 방식이라 어느정도의 딜레이는 감수해야 합니다.)

      감사합니다.

    • 셔벳클록 2012.12.04 09:56 신고 댓글주소 | 수정 | 삭제

      노트패드 같은건 올려놓으신 소스코드로 충분히 전역후킹이 잘되는데요,
      윈도우 미디어나 다른 프로그램 같은경우 잘 안되더라구요??
      (해당 라이브러리가 인젝션 되지 않았더라구요)
      그래서 찾아보니까, 적당한 딜레이를 주면 전역후킹이 된다고 하더라구요?
      ( http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=507700&ref=507700 )
      실제도 잘 먹힌거 같구요.
      단순히 일정시간 지연 후 전역후킹만 되면 괜찮겠는데..
      렉까지 잠깐동안 발생해서 말이죠.. 제 지식수준으로는 잘 이해가 안되었구요..

      http://blog.naver.com/siam18/172501113 에 첨부를 올렸는데
      실행해보하고 프로그램을 열면, 시작메뉴나 탐색기가 잠깐 멈춤니다
      (세 파일을 c:\에 놓고, 실행파일을 실행시키면 injection되고, Ejection시는 practice.exe -unexe입니다)

    • reversecore 2012.12.04 22:02 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      일반적인 DLL Injection 의 경우 Sleep() 의 유무와 상관없이 잘 먹혀야 정상입니다.

      인젝션된 DLL 에서 다시 인젝션하는 구조인가요?
      제가 디버깅을 좀 해본 후 답변 달아드리도록 하겠습니다.

      감사합니다.

    • 셔벳클록 2012.12.04 22:23 신고 댓글주소 | 수정 | 삭제

      http://blog.naver.com/siam18/172501113
      여기에 소스도 같이 올렸습니다
      enumwindows.dll은 api 후킹 중 실행되는 다이얼로그에 들어가는 프로그램이 들어있습니다.
      기본적으로 리버스코어님의 예제 소스와 구조가 같습니다.

  13. 조영용 2013.01.29 10:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    게시글에 올려주신
    HideProc2.exe 와 stealth2.dll를 다운받아서 실행해보면 아무 문제가 없는데
    첨부하신 소스파일로 빌드해서 같은 방법으로 실행해보면 최초 인젝션 후에
    실행하는 프로세스에 대해서는 프로세스은폐가 이루어 지지 않습니다.

    또한 최초 인젝션 후에 작업관리자나 프로세스익스플로러를 두 번실행해야
    그때부터 정상적으로 실행되네요.

    확인부탁드릴께요.

  14. ugg baratas 2013.04.13 23:38 신고 댓글주소 | 수정 | 삭제 | 댓글

    번, 생각할 시간이 필요하다고 할 경우 하루만 생각할 시간을 주고 당장
    골라

  15. nike shox sko 2013.04.23 03:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    나도 용기가 없어서 아플 것 같아서 아무 말 못 하네요

  16. 난나놔 2013.07.07 07:00 신고 댓글주소 | 수정 | 삭제 | 댓글

    잘보고 갑니다. 글을 참 깔끔하게 잘 쓰시네요.

  17. 2014.03.23 17:04 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  18. 2014.05.11 19:25 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  19. cr 2014.07.02 14:46 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 현재 책을 도서관에서 빌려 보고있습니다. 한 가지 질문드릴게 있는데.
    IE를 사용하며 파일 업로드 같은 행동을 할 때 FileDialog가 불려지는데, IE에 dll을 심은 후 이 FileDialog가 불려질 때마다 자동으로 메세지박스를 띄운다던지 행동을 취하고 싶습니다.
    해서 Process Explorer로 살펴보았더니 FileDialog event명은 db!rwWriterEvent 더군요.
    여기까지만 파악이되고 정작 이 event가 작동할 때 마다 어떻게 체크해야할 지 감이 잘 오지 않네요.

    책의 어느 부분을 보면 도움이 될 까요 ?

  20. 암드래 2014.08.14 17:09 신고 댓글주소 | 수정 | 삭제 | 댓글

    여러 프로그램을 한꺼번에 후킹할려면 코드를

    어떤식으로 수정해야좋을까요?





티스토리 툴바